Credits
Xebeka is drawn with art shared by many artists under open and free licences. Every piece used in the game is credited below with its authors, its licence and where it comes from, together with what was changed to fit it into the game.
Credits
Player character — public/hero-*.png (layered)
The player sprite is composed from the Universal LPC Spritesheet Character Generator and trimmed to just the frames the game uses.
Reproducible character configuration (open in the generator to get the exact same character):
The generator’s full export was repacked into a 9x5 grid of 64px cells
(see src/gfx/heroSheet.ts): the walk cycle for four facings, a two-frame
idle for four facings, and the last frame of the death animation used as the
on-ground corpse.
To let the in-game Wardrobe recolor the hero, the character is kept as separate
layers: hero-base.png (body + head + eyes, never dyed) plus grayscale
hero-hair.png, hero-shirt.png, hero-pants.png and hero-shoes.png, which
are tinted and composited at runtime. (The earlier single public/hero.png is
no longer used and may be deleted.) The attribution below covers exactly these
layers.
Licence: OGA-BY 3.0
Every layer in this character is multi-licensed. Six of the seven layers offer
OGA-BY 3.0 / CC-BY-SA 3.0 / GPL 3.0; the Long Pants layer offers only
OGA-BY 3.0 / GPL 3.0 (no CC-BY-SA). The single licence available for every
layer is OGA-BY 3.0, so the combined sheet — a derivative work — is
distributed under OGA-BY 3.0. Licence notice with links: OGA-BY-3.0.txt
in this repo; authoritative full text:
https://static.opengameart.org/OGA-BY-3.0.txt (FAQ:
https://opengameart.org/content/oga-by-30-faq).
OGA-BY 3.0 is CC-BY 3.0 with the anti-DRM clause removed. Practically:
- Attribution is mandatory — every artist listed below must be credited wherever the sheet is distributed, and this file must stay reachable from inside the game (the in-game Credits screen, plus this file in the repo).
- No share-alike — unlike CC-BY-SA, derivatives are not forced to stay under the same licence.
- No anti-DRM clause — safe for a future release on stores that mandate DRM (iOS App Store, consoles), where CC-BY-SA / CC-BY / GPL art would be a problem.
Attribution follows OpenGameArt’s recommended form: “[Title]” by [authors], licensed OGA-BY 3.0, hosted by OpenGameArt.org.
Artists, per layer
Base body — “Body Color” (male) bluecarrot16, JaidynReiman, Benjamin K. Smith (BenCreating), Evert, Eliza Wyatt (ElizaWy), TheraHedwig, MuffinElZangano, Durrani, Johannes Sjolund (wulax), Stephen Challener (Redshrike) — OGA-BY 3.0 / CC-BY-SA 3.0 / GPL 3.0
Head — “Human Male” bluecarrot16, Benjamin K. Smith (BenCreating), Stephen Challener (Redshrike) — OGA-BY 3.0 / CC-BY-SA 3.0 / GPL 3.0
Expression — “Neutral” JaidynReiman, Eliza Wyatt (ElizaWy), Stephen Challener (Redshrike) — OGA-BY 3.0
Hair — “Plain” JaidynReiman, Manuel Riecke (MrBeast), Joe White — OGA-BY 3.0 / CC-BY-SA 3.0 / GPL 3.0
Shirt — “Shortsleeve” (male) bluecarrot16, Eliza Wyatt (ElizaWy), JaidynReiman, Stephen Challener (Redshrike) — OGA-BY 3.0 / CC-BY-SA 3.0 / GPL 3.0
Legs — “Long Pants” JaidynReiman, Eliza Wyatt (ElizaWy), bluecarrot16, Johannes Sjolund (wulax), Stephen Challener (Redshrike) — OGA-BY 3.0 / GPL 3.0
Shoes — “Basic Shoes” JaidynReiman, bluecarrot16, Johannes Sjolund (wulax) — OGA-BY 3.0 / CC-BY-SA 3.0 / GPL 3.0
Sources
All layers were authored for the Liberated Pixel Cup / Universal LPC project and are hosted on OpenGameArt.org. Primary collections these layers draw from:
- LPC Base Assets — https://opengameart.org/content/liberated-pixel-cup-lpc-base-assets-sprites-map-tiles
- LPC Medieval Fantasy Character Sprites — https://opengameart.org/content/lpc-medieval-fantasy-character-sprites
- LPC Character Bases — https://opengameart.org/content/lpc-character-bases
- LPC Revised Character Basics — https://opengameart.org/content/lpc-revised-character-basics
- ULPC Expanded Expressions — https://opengameart.org/content/ulpc-expanded-expressions
- Ponytail and Plain Hairstyles — https://opengameart.org/content/ponytail-and-plain-hairstyles
- LPC Expanded Hair — https://opengameart.org/content/lpc-expanded-hair
- LPC Expanded Simple Shirts — https://opengameart.org/content/lpc-expanded-simple-shirts
- LPC Expanded Pants — https://opengameart.org/content/lpc-expanded-pants
- LPC Expanded Socks & Shoes — https://opengameart.org/content/lpc-expanded-socks-shoes
Player character, female — public/hero-female-*.png (layered)
The female body of the player character, picked when a character is created. Built exactly like the male set above, from the Universal LPC Spritesheet Character Generator, and trimmed to just the frames the game uses.
Reproducible character configuration (open in the generator to get the exact same character):
Files: hero-female-base.png (body + head + eyes, never dyed) plus grayscale
hero-female-hair.png, hero-female-shirt.png, hero-female-pants.png and
hero-female-shoes.png.
Changes made for the game: the generator’s full export was repacked into the same 9x5 grid of 64px cells as the male set (the walk cycle and a two-frame idle for four facings, and the last frame of the death animation as the corpse); the hair, shirt, pants and shoes were converted to grayscale so the Wardrobe can dye them; and the shirt was cut away where the head covers it, because the game draws the dyed layers over the head.
Licence: OGA-BY 3.0, except the hair: CC-BY-SA 3.0
Six of the seven layers are used under OGA-BY 3.0, as in the male set
(see above for what that allows). The Loose hair is offered only under
CC-BY-SA 3.0 / GPL 3.0 and is used under CC-BY-SA 3.0
(https://creativecommons.org/licenses/by-sa/3.0/). So hero-female-hair.png,
and the female character as drawn in the game, are distributed under
CC-BY-SA 3.0:
- Attribution is mandatory, as for every layer.
- ShareAlike: anyone may reuse
hero-female-hair.pngand the combined character, and whatever is made from them must stay under CC-BY-SA 3.0. - No DRM: CC-BY-SA forbids technical restrictions on these files. A release on a store that mandates DRM (iOS App Store, consoles) would need this hair swapped for one offered under OGA-BY or CC0.
Artists, per layer
Base body — “Body Color” (female) Benjamin K. Smith (BenCreating), bluecarrot16, TheraHedwig, Evert, MuffinElZangano, Durrani, Pierre Vigier (pvigier), Eliza Wyatt (ElizaWy), Matthew Krohn (makrohn), Johannes Sjolund (wulax), Stephen Challener (Redshrike) — OGA-BY 3.0 / CC-BY-SA 3.0 / GPL 3.0
Head — “Human Female” bluecarrot16, Benjamin K. Smith (BenCreating), Stephen Challener (Redshrike) — OGA-BY 3.0 / CC-BY-SA 3.0 / GPL 3.0
Expression — “Neutral” (female face) JaidynReiman, Eliza Wyatt (ElizaWy), Stephen Challener (Redshrike) — OGA-BY 3.0
Hair — “Loose” JaidynReiman, Manuel Riecke (MrBeast) — CC-BY-SA 3.0 / GPL 3.0; used under CC-BY-SA 3.0
Shirt — “Shortsleeve” (female) bluecarrot16, Eliza Wyatt (ElizaWy), JaidynReiman, Stephen Challener (Redshrike) — OGA-BY 3.0 / CC-BY-SA 3.0 / GPL 3.0
Legs — “Long Pants” (thin) Eliza Wyatt (ElizaWy), JaidynReiman, Johannes Sjolund (wulax), Stephen Challener (Redshrike) — OGA-BY 3.0
Shoes — “Basic Shoes” (thin) JaidynReiman, Joe White, Johannes Sjolund (wulax) — OGA-BY 3.0 / CC-BY-SA 3.0 / GPL 3.0
Sources
- LPC Base Assets — https://opengameart.org/content/liberated-pixel-cup-lpc-base-assets-sprites-map-tiles
- LPC Character Bases — https://opengameart.org/content/lpc-character-bases
- LPC Medieval Fantasy Character Sprites — https://opengameart.org/content/lpc-medieval-fantasy-character-sprites
- LPC Ladies — https://opengameart.org/content/lpc-ladies
- LPC 7 Women’s Shirts — https://opengameart.org/content/lpc-7-womens-shirts
- LPC Revised Character Basics — https://opengameart.org/content/lpc-revised-character-basics
- ULPC Expanded Expressions — https://opengameart.org/content/ulpc-expanded-expressions
- LPC Expanded Hair — https://opengameart.org/content/lpc-expanded-hair
- LPC Expanded Pants — https://opengameart.org/content/lpc-expanded-pants
- LPC Expanded Sit, Run, Jump & More — https://opengameart.org/content/lpc-expanded-sit-run-jump-more
- ElizaWy’s LPC clothing — https://github.com/ElizaWy/LPC/tree/main/Characters/Clothing
- LPC Clothing Updates — https://opengameart.org/content/lpc-clothing-updates
- LPC Expanded Socks & Shoes — https://opengameart.org/content/lpc-expanded-socks-shoes
Player character, Ranger outfit — public/hero-ranger-*.png, public/hero-female-ranger-*.png (layered)
The Ranger outfit (Etap 92), bought at Grizelda’s shelf and worn at Vito’s
Wardrobe. Built like the two bodies above, from the Universal LPC Spritesheet
Character Generator, and drawn over the same skin bases (hero-base.png,
hero-female-base.png), which the generator reproduces pixel for pixel.
Reproducible configurations (open in the generator to get the same characters):
- male: https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&expression=Neutral_light&shoes=Basic_Shoes_black&hair=Loose_white&hat=Hood_gray&head=Human_Male_light&sash=Obi_gray&clothes=Cardigan_gray&legs=Pants_gray&gloves=Gloves_cloth.gray
- female: https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=female&body=Body_Color_light&expression=Neutral_light&shoes=Basic_Shoes_black&hair=Loose_white&hat=Hood_gray&clothes=Cardigan_gray&legs=Pants_gray&gloves=Gloves_cloth.gray&head=Human_Female_light&sash=Obi_gray
Files, male: hero-ranger-hair.png (the hood, with the loose hair under it),
hero-ranger-shirt.png (the cardigan), hero-ranger-pants.png and
hero-ranger-shoes.png (the shoes, the gloves and the obi sash, which the
Wardrobe dyes together as “Details”). Female: hero-female-ranger-hair.png,
hero-female-ranger-shirt.png, hero-female-ranger-pants.png and
hero-female-ranger-shoes.png, the same four.
Changes made for the game: the same 9x5 grid of 64px cells as the bodies above; every layer cut away wherever a layer drawn above it covers it, so each pixel belongs to exactly one dye row; converted to grayscale and normalised to the row’s own mean, so the Wardrobe can dye them. The male configuration first supplied also carried a Cape Trim; it is left out, because without a cape it is a strip hanging in the air at the feet.
Licence: OGA-BY 3.0, except the hood file: CC-BY-SA 3.0
The hood, cardigan, pants, gloves, obi and shoes are used under OGA-BY 3.0.
The Loose hair is offered only under CC-BY-SA 3.0 / GPL 3.0 and is used
under CC-BY-SA 3.0 (https://creativecommons.org/licenses/by-sa/3.0/). It
shares its file with the hood, so hero-ranger-hair.png and
hero-female-ranger-hair.png, and either character as drawn in the Ranger
outfit, are distributed under CC-BY-SA 3.0, on the same terms as the female
hair above: attribution, ShareAlike, and no DRM.
Artists, per layer
- Hood — Johannes Sjölund (wulax), JaidynReiman. OGA-BY 3.0 / CC-BY-SA 3.0 / GPL 3.0.
- Cardigan (long sleeve) — ElizaWy, JaidynReiman, Stephen Challener (Redshrike), Johannes Sjölund (wulax). OGA-BY 3.0.
- Pants — bluecarrot16, JaidynReiman, ElizaWy, Matthew Krohn (makrohn), Johannes Sjölund (wulax), Stephen Challener (Redshrike); the female (thin) cut also Joe White. OGA-BY 3.0 / GPL 3.0 / CC-BY-SA 3.0.
- Gloves — Michael Whitlock (bigbeargames), Matthew Krohn (makrohn), Johannes Sjölund (wulax), bluecarrot16, JaidynReiman. OGA-BY 3.0 / CC-BY-SA 3.0 / GPL 3.0.
- Obi — JaidynReiman. OGA-BY 3.0+ / CC-BY 3.0+ / GPL 3.0.
- Basic Shoes — JaidynReiman, bluecarrot16, Johannes Sjölund (wulax); the female (thin) cut JaidynReiman, Joe White, Johannes Sjölund (wulax). OGA-BY 3.0 / CC-BY-SA 3.0 / GPL 3.0.
- Loose hair — JaidynReiman, Manuel Riecke (MrBeast). CC-BY-SA 3.0 / GPL 3.0.
- Body, head and face: as credited for the two bodies above.
Source for every line: the generator’s sheet_definitions,
https://github.com/LiberatedPixelCup/Universal-LPC-Spritesheet-Character-Generator.
Bandit — public/mob-bandit.png, public/mob-bandit-walk.png, public/mob-bandit-dead.png
The bandit is composed from the same Universal LPC Spritesheet Character Generator as the player, under the same licences as the layers listed above.
Reproducible character configuration:
Beyond the collections listed under the player, this character also draws on the hat, coat, gloves and formal-trouser layers of the ULPC project; the generator’s own credits export is authoritative for the per-layer author list.
From the generator’s full export only the walk block was kept — rows 8-11
(up, left, down, right), nine frames each — repacked into a 9x4 grid and
cropped to one rectangle shared by every frame (see src/gfx/mobSheet.ts).
mob-bandit.png is the standing pose from that same grid, and
mob-bandit-dead.png is the last frame of the hurt row (row 20, column 6),
cropped to the body.
ShareAlike: these three files are derivative works of CC-BY-SA 3.0 artwork and are themselves published under CC-BY-SA 3.0. They must stay publicly available on those terms even if this repository is later made private.
The human ranks — eighteen men and one woman of the road
public/mob-beggar-walk.png, mob-vagrant-walk.png, mob-thief-walk.png,
mob-poacher-walk.png, mob-smuggler-walk.png, mob-cutthroat-walk.png,
mob-deserter-walk.png, mob-brigand-walk.png, mob-highwayman-walk.png,
mob-mercenary-walk.png, mob-corsair-walk.png, mob-amazon-walk.png,
mob-wildWarrior-walk.png, mob-hunter-walk.png, mob-gladiator-walk.png,
mob-barbarian-walk.png, mob-raider-walk.png, mob-warlord-walk.png,
mob-chieftain-walk.png, and a body apiece:
mob-beggar-dead.png, mob-vagrant-dead.png, mob-thief-dead.png,
mob-poacher-dead.png, mob-smuggler-dead.png, mob-cutthroat-dead.png,
mob-deserter-dead.png, mob-brigand-dead.png, mob-highwayman-dead.png,
mob-mercenary-dead.png, mob-corsair-dead.png, mob-amazon-dead.png,
mob-wildWarrior-dead.png, mob-hunter-dead.png, mob-gladiator-dead.png,
mob-barbarian-dead.png, mob-raider-dead.png, mob-warlord-dead.png,
mob-chieftain-dead.png. Every human in the bestiary is here. The dragon was
the last creature on a procedural placeholder — LPC has no dragon to give it —
and it now has artwork of its own from a different source; see the dragon
section below.
All of them are composed from the same Universal LPC Spritesheet Character
Generator as the player and the bandit, under the same licences as the layers
listed above. Seventeen share one body base (Body_Color_light) and one head
(Human_Male_light) with the player himself — they are men of the same island,
and only the clothing, the beard and the weapon tell one rank from the next.
The mercenary and the barbarian are built on the muscular base and the amazon
on the female one.
Reproducible character configurations:
- Beggar — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&beard=Winter_Beard_gray&mustache=Big_Mustache_gray&hair=Buzzcut_gray&legs=Cuffed_Pants_maroon&shoes=Ghillies_walnut&clothes=Cardigan_leather&hat=Tricorne_leather
- Vagrant — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&beard=Trimmed_Beard_light_brown&mustache=Chevron_Mustache_light_brown&hair=Buzzcut_gray&legs=Formal_Pants_gray&shoes=Basic_Shoes_black&clothes=Longsleeve_gray&bandana=Pirate_Bandana_brown
- Thief — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hair=Mop_light_brown&facial_eyes=Eyepatch_Ambidextrous_black&clothes=Shortsleeve_walnut&jacket=Frock_coat_black&legs=Leggings_red&shoes=Basic_Shoes_black&gloves=Gloves_bronze
- Poacher — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hair=Bob_chestnut&hat_accessory=Cavalier_feather_black&clothes=Shortsleeve_forest&jacket=Frock_coat_leather&legs=Leggings_forest&shoes=Basic_Shoes_forest&weapon=Slingshot_slingshot
- Smuggler — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hairextl=Left_Braid_orange&hair=Halfmessy_orange&bandana=Bandana_green&backpack=Backpack_green&jacket=Frock_coat_green&legs=Pants_red&shoes=Basic_Boots_red&weapon=Dagger_dagger
- Cutthroat — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hair=High_and_tight_dark_brown&bandana=Bordered_Bandana_purple&clothes=Sleeveless_2_red&legs=Leggings_gray&shoes=Basic_Boots_black&weapon=Hammer_iron
- Deserter — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&beard=Trimmed_Beard_black&mustache=Handlebar_Mustache_black&shoes=Basic_Boots_black&legs=Leggings_black&jacket=Frock_coat_blue&armour=Leather_walnut&hair=Relm_Short_black&weapon=Dagger_dagger
- Brigand — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hair=Bedhead_gray&hat=Spangenhelm_steel&shoulders=Legion_steel&armour=Legion_steel&legs=Armour_steel&shoes=Armour_steel&weapon=Spear_medium
- Highwayman — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hair=Cowlick_dark_brown&facial_mask=Plain_Mask_leather&armour=Leather_brown&weapon=Dagger_dagger&shoes=Basic_Boots_leather&legs=Cuffed_Pants_leather
- Mercenary — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=muscular&body=Body_Color_light&head=Human_Male_light&expression=Angry_light&hair=Messy1_raven&accessory=Crest_steel&earrings=Moon_earrings_silver&shoes=Armour_all.lpcr.emerald&weapon=Spear_steel&shoulders=Legion_all.lpcr.swamp&legs=Striped_Formal_Pants_forest
- Corsair — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hair=Bangslong_black&bandana=Pirate_Bandana_black&bandana_overlay=Skull_Bandana_Overlay_white&jacket=Frock_coat_black&legs=Pants_black&shoes=Basic_Boots_black&weapon=Saber_saber
- Amazon — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=female&body=Body_Color_light&head=Human_Female_light&expression=Neutral_light&hair=Loose_red&earrings=Moon_earrings_copper&legs=Legion_skirt_orange&armour=Leather_orange&weapon=Slingshot_slingshot&eyes=Eye_Color_green
- Wild Warrior — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hair=Curly_long_dark_gray&shoulders=Legion_steel&armour=Legion_steel&legs=Armour_steel&shoes=Armour_steel&weapon=Arming_Sword_steel
- Hunter — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hair=Page2_raven&gloves=Gloves_all.lpcr.mustard&armour=Leather_green&shoes=Basic_Boots_forest&legs=Shorts_forest&weapon=Crossbow_crossbow
- Gladiator — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hat=Greathelm_steel&armour=Plate_steel&arms=Armour_steel&legs=Armour_steel&shoes=Armour_steel&gloves=Gloves_steel&shield=Round_Shield_black&weapon=Halberd_halberd
- Barbarian — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=muscular&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hair=Dreadlocks_short_green&facial_mask=Plain_Mask_red&gloves=Gloves_all.lpcr.emerald&wrists=Cuffs_red&shoulders=Pauldrons_forest&legs=Legion_skirt_red&shoes=Sandals_green&shield=Heater_Shield_Base_all.lpcr.green&weapon=Spear_red
- Raider — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hair=Parted_2_black&hat=Barbarian_Viking_bronze&chainmail=Chainmail_bronze&gloves=Gloves_bronze&shoes=Armour_bronze&legs=Armour_bronze&shield=Spartan_Shield_spartan&weapon=Saber_saber
- Warlord — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hair=Parted_2_black&gloves=Gloves_silver&shoes=Armour_silver&legs=Armour_silver&weapon=Longsword_longsword&shield=Plus_shield_plus&armour=Plate_silver&arms=Armour_silver&shoulders=Mantal_tan&hat=Horned_helmet_silver
- Chieftain — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hair=Bedhead_red&hat=Close_helm_copper&visor=Horned_visor_silver&accessory=Centurion_Plumage_slate&shoes=Armour_copper&legs=Armour_silver&armour=Legion_copper&ring=Stud_Ring_red&arms=Armour_silver&bauldron=Bauldron_red&shoulders=Epaulets_red&gloves=Gloves_copper&weapon=Longsword_longsword&shield=Crusader_shield_crusader
Beyond the collections listed under the player, these characters draw on the beard, moustache and a long list of hair layers (buzzcut, mop, bob, high-and-tight, Relm short, halfmessy with a left braid, bedhead, cowlick, messy, bangslong, page, loose and curly long); the tricorne, spangenhelm, pirate-, bordered- and plain-bandana with skull overlay, cavalier feather, eyepatch, plain leather mask, steel crest and moon earrings; the cardigan, longsleeve, shortsleeve, sleeveless, frock coat, backpack, legion armour and shoulders, leather armour, legion skirt, cuffed, formal, striped formal and plain trousers, shorts and leggings; the ghillie, basic shoe, basic boot and armour footwear and sandals; the bronze, mustard, steel, silver, copper and emerald gloves; the greathelm, close helm, horned helm, horned visor, viking helm, centurion plumage, epaulets, bauldron, mantle, pauldrons, cuffs and stud ring; the steel, silver and copper plate, legion and chainmail armour; the round, heater, spartan, plus and crusader shields; and the dagger, iron hammer, slingshot, medium, steel and red spear, saber, arming sword, longsword, halberd and crossbow weapon layers of the ULPC project. The generator’s own credits export is authoritative for the per-layer author list.
From each export only the walk block was kept — rows 8-11 (up, left, down,
right), nine frames each — repacked into a 9x4 grid and cropped to one rectangle
shared by every frame, symmetric about the source cell’s centre line (see
src/gfx/mobSheet.ts). No pixel was repainted in any walk frame. Frame sizes:
32x53 beggar, 32x49 vagrant, 32x52 thief, 46x56 poacher, 40x55 smuggler,
54x49 cutthroat, 40x50 deserter, 64x52 brigand, 40x50 highwayman,
64x54 mercenary, 50x53 corsair, 46x50 amazon, 58x51 wild warrior, 44x49 hunter,
64x51 gladiator, 64x52 barbarian, 50x53 raider, 64x56 warlord, 64x59 chieftain.
The widths are the weapons: a levelled spear fills the whole 64px cell, a hammer
held out sideways takes 54, and the poacher’s height is his hat feather.
The bodies are the last frame of the hurt row (row 20, column 6) of each export, cropped to the body — 34px wide for all but the wild warrior, whose hair spreads to 40. Unlike the orc and minotaur ranks these are not shared: what tells one man of the road from the next is his clothing, so a single anonymous heap would have made the ladder unreadable on the ground.
These are the only files in the project with pixels deleted. LPC’s death frame lets a character drop what he was holding, and gear lying beside a corpse reads as loot the game will not hand over, so a weapon thrown clear of the body was cut: the deserter’s and smuggler’s and highwayman’s daggers, the hunter’s crossbow, the ends of the brigand’s and mercenary’s spears. The corsair’s saber came to rest under his own hand, where a straight cut would have taken the hand with it, so it was lifted out by colour instead — the two greys the blade is painted in appear nowhere else on that frame. The last five ranks die holding two things apiece, a weapon and a shield, and both fall beside them: all five were cut back to the body’s own edge. Nothing was added, and gear still tangled with the body was left alone — the wild warrior’s sword under his hand, the length of spear the two spearmen came to rest on, and the few pixels of shield and blade that overlap the outlines of the top five. Those five could not be lifted by colour: their shields are painted in the same palette as their armour, so a colour lift would have taken the corpse with it.
TODO before release: download “Credits (CSV)” from the generator for each of these nineteen configurations and paste the per-layer author lists here. The URLs reproduce the characters, but a URL is not an attribution.
ShareAlike: these thirty-eight files are derivative works of CC-BY-SA 3.0 artwork and are themselves published under CC-BY-SA 3.0. They must stay publicly available on those terms even if this repository is later made private.
Minotaurs — public/mob-minotaur-walk.png, public/mob-minotaur-archer-walk.png, public/mob-minotaur-guard-walk.png, public/mob-minotaur-mage-walk.png, public/mob-minotaur-dead.png
All four minotaur ranks are composed from the same Universal LPC Spritesheet
Character Generator as the player and the bandit, under the same licences as
the layers listed above. They share one body (muscular, fur tan) and one head
(Minotaur_fur_tan); only the gear differs.
Reproducible character configurations:
- Minotaur — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=muscular&body=Body_Color_fur_tan&head=Minotaur_fur_tan&expression=Neutral_fur_tan&gloves=Gloves_iron&legs=Wide_pants_black
- Minotaur Fletcher — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=muscular&body=Body_Color_fur_tan&head=Minotaur_fur_tan&expression=Neutral_fur_tan&weapon=Crossbow_crossbow&gloves=Gloves_iron&legs=Wide_pants_black
- Minotaur Guard — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=muscular&body=Body_Color_fur_tan&head=Minotaur_fur_tan&expression=Neutral_fur_tan&gloves=Gloves_iron&legs=Wide_pants_black&weapon=Saber_saber&shield=Scutum_shield_scutum
- Minotaur Arcanist — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=muscular&body=Body_Color_fur_tan&head=Minotaur_fur_tan&expression=Neutral_fur_tan&gloves=Gloves_iron&legs=Wide_pants_black&weapon=S_staff_iron&cape=Tattered_teal
Beyond the collections listed under the player, these characters draw on the minotaur head, the muscular body base, and the iron-glove, wide-trouser, saber, crossbow, iron-staff, scutum-shield and tattered-cape layers of the ULPC project; the generator’s own credits export is authoritative for the per-layer author list.
From each generator export only the walk block was kept — rows 8-11
(up, left, down, right), nine frames each — repacked into a 9x4 grid and
cropped to one rectangle shared by every frame, symmetric about the source
cell’s centre line (see src/gfx/mobSheet.ts). No pixel was repainted.
public/mob-minotaur-dead.png is the last frame of the hurt row (row 20,
column 6) of the plain minotaur export, cropped to the body. All four ranks
share it: the fletcher’s, guard’s and arcanist’s own death frames leave their gear
lying beside the corpse, which reads as loot the game will not let you take.
ShareAlike: these five files are derivative works of CC-BY-SA 3.0 artwork and are themselves published under CC-BY-SA 3.0. They must stay publicly available on those terms even if this repository is later made private.
Skeleton, goblin, ghoul and the five orc ranks
public/mob-skeleton-walk.png, mob-goblin-walk.png, mob-ghoul-walk.png,
mob-orc-walk.png, mob-orc-warrior-walk.png, mob-orc-berserker-walk.png,
mob-orc-archer-walk.png, mob-orc-shaman-walk.png, plus the bodies
mob-skeleton-dead.png, mob-goblin-dead.png, mob-ghoul-dead.png and
mob-orc-dead.png.
All eight are composed from the same Universal LPC Spritesheet Character
Generator as the player, the bandit and the minotaurs, under the same licences
as the layers listed above. The five orc ranks share one body base
(Body_Color_dark_green) and one head (Orc_male_dark_green); only the gear
differs.
Reproducible character configurations:
- Skeleton — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Skeleton_skeleton&head=Skeleton_skeleton&expression=Neutral_light
- Goblin — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_pale_green&head=Goblin_pale_green&expression=Neutral_pale_green&legs=Shorts_black
- Ghoul — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_zombie&head=Zombie_zombie&expression=Neutral_zombie&legs=Shorts_slate
- Orc — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_dark_green&head=Orc_male_dark_green&expression=Neutral_dark_green&shoulders=Legion_iron&legs=Shorts_black
- Orc Warrior — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_dark_green&head=Orc_male_dark_green&expression=Neutral_dark_green&shoulders=Legion_iron&legs=Armour_iron&arms=Armour_iron&gloves=Gloves_iron&shoes=Armour_iron&weapon=Dagger_dagger
- Orc Ravager — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_dark_green&head=Orc_male_dark_green&expression=Neutral_dark_green&legs=Shorts_orange&arms=Armour_iron&gloves=Gloves_copper&shoes=Armour_copper&weapon=Mace_mace&armour=Plate_copper&shoulders=Epaulets_orange
- Orc Archer — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_dark_green&head=Orc_male_dark_green&expression=Neutral_dark_green&legs=Shorts_forest&gloves=Gloves_steel&shoes=Armour_steel&shoulders=Epaulets_forest&weapon=Crossbow_crossbow
- Orc Evoker — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_dark_green&head=Orc_male_dark_green&expression=Neutral_dark_green&weapon=Gnarled_staff_bronze&shoes=Sandals_tan&legs=Legion_skirt_tan&cape=Tattered_orange&earrings=Moon_earrings_copper
Beyond the collections listed under the player, these characters draw on the skeleton, goblin, zombie and orc bases and heads, and on the shorts, legion shoulder, iron/copper/steel armour, dagger, mace, crossbow, gnarled-staff, legion-skirt, sandal, tattered-cape and moon-earring layers of the ULPC project; the generator’s own credits export is authoritative for the per-layer author list.
From each export only the walk block was kept — rows 8-11 (up, left, down,
right), nine frames each — repacked into a 9x4 grid and cropped to one rectangle
shared by every frame, symmetric about the source cell’s centre line (see
src/gfx/mobSheet.ts). No pixel was repainted. Frame sizes: 32x47 skeleton,
32x49 goblin, 32x48 ghoul, 32x46 orc, 40x47 warrior, 52x47 ravager (the mace
held out sideways, the widest sprite in the game until the demonic skeleton’s
wings arrived), 44x47 archer, 38x46 evoker.
The bodies are the last frame of the hurt row (row 20, column 6) of each export,
cropped to the body. All five orc ranks share mob-orc-dead.png, taken from the
bare orc: the geared ranks’ own death frames leave the dagger, mace, crossbow
and staff lying beside the corpse, which reads as loot the game will not let you
take, and stretches the archer’s body to 60px against the bare corpse’s 40px.
TODO before release: download “Credits (CSV)” from the generator for each of these eight configurations and paste the per-layer author lists here. The URLs reproduce the characters, but a URL is not an attribution.
ShareAlike: these twelve files are derivative works of CC-BY-SA 3.0 artwork and are themselves published under CC-BY-SA 3.0. They must stay publicly available on those terms even if this repository is later made private.
Skeleton Warrior and Demonic Skeleton
public/mob-skeleton-warrior-walk.png, public/mob-demon-skeleton-walk.png.
Neither has a body file of its own — both reuse public/mob-skeleton-dead.png,
credited in the section above.
Both are composed from the same Universal LPC Spritesheet Character
Generator as everything above, under the same licences as the layers listed
under the player. They share the plain skeleton’s body and head
(Skeleton_skeleton) with the skeleton already in the game, so the three read
as one family; only the gear and the wings differ.
Reproducible character configurations:
- Skeleton Warrior — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Skeleton_skeleton&head=Skeleton_skeleton&expression=Neutral_light&hat=Barbarian_steel&gloves=Gloves_steel&legs=Armour_steel&weapon=Dagger_dagger
- Demonic Skeleton — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&head=Skeleton_skeleton&expression=Neutral_all.lpcr.red&gloves=Gloves_steel&legs=Armour_steel&body=Skeleton_skeleton&wings=Bat_Wings_fur_white&shoulders=Epaulets_gray
Beyond the collections listed under the player, these two draw on the skeleton base and head and on the barbarian-helm, steel-glove, steel-legplate, dagger, grey-epaulet and bat-wing layers of the ULPC project; the generator’s own credits export is authoritative for the per-layer author list.
From each export only the walk block was kept — rows 8-11 (up, left, down,
right), nine frames each — repacked into a 9x4 grid and cropped to one rectangle
shared by every frame, symmetric about the source cell’s centre line (see
src/gfx/mobSheet.ts). No pixel was repainted. Frame sizes: 40x49 warrior,
64x49 demonic skeleton, the widest creature in the game and by some margin:
its spread wings fill the source cell edge to edge, so the crop could not be
narrowed without clipping them.
TODO before release: download “Credits (CSV)” from the generator for both configurations and paste the per-layer author lists here. The URLs reproduce the characters, but a URL is not an attribution.
ShareAlike: both files are derivative works of CC-BY-SA 3.0 artwork and are themselves published under CC-BY-SA 3.0. They must stay publicly available on those terms even if this repository is later made private.
Snake — public/mob-snake-walk.png, public/mob-snake-dead.png
The snake is not an LPC asset. It comes from the “Snake Sprites” pack by carysaurus: https://carysaurus.itch.io/snake-sprites
Licence: pack terms, attribution required
Verbatim from the pack: “This asset pack can be used in both free and commercial projects; you cannot redistribute or resell these assets. Credit must be given.”
Three consequences worth spelling out, because they run the opposite way to the LPC art above:
- Attribution is mandatory — carysaurus must be credited in this file and on the in-game Credits screen.
- No redistribution. Shipping the sprite inside a running game is ordinary licensed use; publishing the sheet as a standalone file where anyone can take it is not. That makes a public source repository the exposure, not the deployed game. This repo is to go private before commercial release.
- No share-alike. Unlike the LPC art, nothing here has to stay openly available, and nothing may.
What was changed
Only the green snake of the six in the pack is used, and only its walk strip
(SnakeGreen-Walk.png, 224x32 — seven 32px frames in a single row).
The pack’s four-colour palette was swapped for a cooler, deeper green so the
creature reads as its own animal rather than as the pack’s stock sprite:
outline #101c14, body #4f9e5a, underside #2f6b3c, back #1d3d26. No
shape was altered — this is a palette substitution, pixel for pixel.
The strip was repacked into a 7x4 grid cropped to one 32x21 rectangle shared by
every frame. The pack contains a side view and nothing else, so row 3 (right) is
the source, row 1 (left) is its mirror, and rows 0 and 2 (up, down) carry the
side view too — a monster spawns facing “down” before it has taken a step. In
play a snake turns only on horizontal movement and holds its facing through a
vertical one, so a pose that was never drawn is never shown (SIDE_ONLY in
src/gfx/mobSheet.ts).
mob-snake-dead.png (30x7) is original artwork drawn for this game, not
part of the pack: the pack ships no death frame. It is a slack, uncoiled body in
the same four-colour palette, with a dark back, a lit flank, a pale underside, a
dead eye marked in outline and a lolling tongue. It contains no pixels from the
pack and carries no external obligation, but it is a recognisable derivative of
the pack’s creature and should be treated as covered by the same terms.
Borin the Smith — public/npc-smith.png
The town smith is composed from the same Universal LPC Spritesheet Character Generator as the player and the bandit, under the same licences as the layers listed above.
Reproducible character configuration:
Beyond the collections listed under the player, this character also draws on the beard, moustache, epaulet, brass-armour and mace layers of the ULPC project; the generator’s own credits export is authoritative for the per-layer author list.
Packed exactly like the bandit: only the walk block was kept — rows 8-11 (up, left, down, right), nine frames each — repacked into a 9x4 grid and cropped to one rectangle shared by every frame, here 52x51 px. Column 0 of each row is the standing pose the NPC shows while talking to you.
TODO before release: download “Credits (CSV)” from the generator for this configuration and paste the per-layer author list here. The URL above reproduces the character, but a URL is not an attribution.
ShareAlike: this file is a derivative work of CC-BY-SA 3.0 artwork and is itself published under CC-BY-SA 3.0. It must stay publicly available on those terms even if this repository is later made private.
The other four townsfolk
public/npc-herbalist.png, npc-elder.png, npc-taskmaster.png and
npc-tailor.png come from the same Universal LPC Spritesheet Character
Generator under the same licences, and are packed identically to the smith:
walk rows 8-11 only, repacked into a 9x4 grid, cropped to one rectangle shared
by every frame of that sheet. Column 0 of each row is the standing pose.
Frame sizes differ because the outfits do — 34x51 for Mira, 34x50 for Oswin, 34x55 for Grizelda (cape and topknot), 32x51 for Vesper.
Reproducible character configurations:
- Mira the Herbalist — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=female&body=Body_Color_olive&head=Human_Male_olive&expression=Neutral_olive&neck=Scarf_brown&gloves=Gloves_cloth.gray&clothes=Tunic_slate&shoes=Sandals_gray&legs=Belle_skirt_green&ring=Stud_Ring_green&hair=Long_messy_light_brown
- Elder Oswin — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hair=Pixie_platinum&ring=Stud_Ring_sky&legs=Long_Pants_sky&shoes=Basic_Shoes_sky&jacket=Tabard_sky&headcover=Thick_Headband_sky&necklace=Necklace_gold
- Grizelda the Huntress — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&bandana_overlay=Skull_Bandana_Overlay_green&hair=Long_Topknot_red&ring=Stud_Ring_red&gloves=Gloves_cloth.green&cape=Solid_forest&armour=Legion_all.lpcr.peach&legs=Armour_all.lpcr.peach&shoes=Armour_all.lpcr.ivory
- Vesper the Tailor — https://liberatedpixelcup.github.io/Universal-LPC-Spritesheet-Character-Generator/#sex=male&body=Body_Color_light&head=Human_Male_light&expression=Neutral_light&hair=Messy1_gray&jacket=Frock_coat_blue&legs=Leggings_navy&shoes=Sara_Shoes_navy
Between them these four add the scarf, tunic, belle-skirt, sandal, tabard, headband, necklace, bandana-overlay, topknot, cape, Legion-armour, frock-coat, leggings and stud-ring layers of the ULPC project to the collections already listed above.
TODO before release: download “Credits (CSV)” from the generator for each of these five configurations and paste the per-layer author lists here. The URLs reproduce the characters, but a URL is not an attribution.
ShareAlike: all four files are derivative works of CC-BY-SA 3.0 artwork and are themselves published under CC-BY-SA 3.0. They must stay publicly available on those terms even if this repository is later made private.
Chronos the Time Sage
public/npc-timesage.png comes from the same Universal LPC Spritesheet
Character Generator under the same licences, packed the same way: walk rows
8-11 only, repacked into a 9x4 grid, cropped to one 38x58 rectangle shared by
every frame. Column 0 of each row is the standing pose. He appears twice in the
game — pacing the western plaza in Bonetown and rooted in his cellar — from
this single sheet.
Reproducible character configuration:
He adds the elderly-male head, winter beard, French moustache, celestial wizard hat, moon earrings, tattered cape, robe belt, cardigan and diamond staff layers of the ULPC project to the collections already listed above.
TODO before release: download “Credits (CSV)” from the generator for this configuration and paste the per-layer author list here. The URL reproduces the character, but a URL is not an attribution.
ShareAlike: this file is a derivative work of CC-BY-SA 3.0 artwork and is itself published under CC-BY-SA 3.0. It must stay publicly available on those terms even if this repository is later made private.
Morgan the Changer
public/npc-morgan.png comes from the same Universal LPC Spritesheet
Character Generator under the same licences, packed the same way: walk rows
8-11 only, repacked into a 9x4 grid, cropped to one 32x55 rectangle shared by
every frame. Column 0 of each row is the standing pose he shows while you are
at his counter. He runs the gold/platinum exchange in Bonetown.
Reproducible character configuration:
He adds the chevron-moustache, cowlick-hair, scoop-longsleeve and formal-tophat layers of the ULPC project to the collections already listed above; the frock coat, long pants and basic shoes are shared with the townsfolk above.
TODO before release: download “Credits (CSV)” from the generator for this configuration and paste the per-layer author list here. The URL reproduces the character, but a URL is not an attribution.
ShareAlike: this file is a derivative work of CC-BY-SA 3.0 artwork and is itself published under CC-BY-SA 3.0. It must stay publicly available on those terms even if this repository is later made private.
Terrain and props
public/home-terrain.png, public/town-terrain.png, public/cellar-terrain.png,
public/reach-terrain.png, public/orcdeep-terrain.png,
public/minodeep-terrain.png, public/deaddeep-terrain.png and
public/deaddeep2-terrain.png are exported from Tiled maps painted with tile
packs by Szadi art. (szadiart), some bought and some taken from his free
demo packs:
Licence: Szadi art., one licence covering everything he publishes
The terms are posted on his profile page and are stated to govern all of his assets, so the demo packs and the paid ones sit under the same rules. In summary: the art may be edited, cut and modified for commercial purposes; work made with it — games, animations, film — may be sold; and it may be published on sites concerned with graphics and games. Two things are ruled out: using it in a logo, trademark or service mark, and reselling it, whole or in part, original or modified. He asks for no credit, though he appreciates it.
Correction. An earlier version of this file summarised these terms as forbidding redistribution of the assets. That was stricter than what the licence actually says: the prohibition is on reselling, and publishing on game-related sites is expressly allowed. A public source repository is neither a resale nor a logo, so the terrain exports are not the problem this file previously implied they were. Reselling remains firmly out.
TODO before release: name the individual packs. The licence question is settled; what is still missing is the inventory — which of Szadi’s packs each map is painted with, paid or demo, and the purchase dates for the paid ones. The Tiled project for the Bone Reach references
Water_tafle_4A,32x32_DEMO,MainLev2.0,namiot,floor_and_deorativesandkosci; the filenames alone do not say which storefront pack each came from, and whether every one of them is Szadi’s has not been confirmed.
public/prop-tree.png, prop-rock.png, prop-stump.png, prop-rubble.png,
prop-tree-dead.png and prop-tree-felled.png were drawn from scratch for
this game in the palette of those packs. They contain no third-party pixels
and carry no external obligations.
The two dead trees are deliberately built to the same rules as the live tree
and the stump, both of which turned out to be clean 2x upscales of
half-resolution art: they are authored on a 26 x 40 logical grid and doubled,
they reuse the live tree’s four-step bark ramp and its ground shadow (black at
alpha 77) without adding a single new colour, and they follow its lighting
convention of mid brown on the left edge, highlight inside, dark brown on the
right. prop-tree-felled.png is the same trunk and root flare as
prop-tree-dead.png taken off above the lower branch stub, capped with the
ringed end grain that prop-stump.png uses, so the pair reads as one tree
before and after the axe. Both are padded so the base of the trunk sits under
the centre of the image, which is where drawSprite() anchors.
Chests — public/prop-chest-red.png, prop-chest-purple.png, prop-chest-wood.png
Cut from Fantasy RPG Chests 32 x 32 px for RPG Maker (“Fantasy RPG (Toony) 32x32.png”) by Francisco Téllez (franjatesa), a name-your-own-price asset pack of eight animated chests:
https://franjatesa.itch.io/free-rpgmaker-chests
Licence: author’s own terms — attribution to franjatesa
The pack ships no separate licence file; the terms are stated on the download page and permit use in any project, including commercial ones, on the single condition that the author is credited as franjatesa. There is no ShareAlike obligation and no anti-DRM clause, so unlike the LPC artwork above these three files stay usable on storefronts that wrap the build in mandatory DRM (iOS, consoles), and they place no licence requirement on this repository or on the game’s source.
The terms do not grant permission to redistribute the pack itself, so the original sheet is deliberately not committed here — only the three single frames the game draws.
What was taken and how it was changed
The sheet uses the RPG Maker character layout: 12 x 8 cells of 32 px, read as four chests per half, each chest occupying four consecutive rows. The three identical columns in every group are the walk cycle, which a chest has no use for; the four rows are the opening animation, frame 1 being the closed chest.
| File | Source cell (row, column) | Frame | Size after trim |
|---|---|---|---|
prop-chest-red.png |
row 1, column 2 | closed | 28 x 25 |
prop-chest-purple.png |
row 5, column 2 | closed | 28 x 21 |
prop-chest-wood.png |
row 5, column 5 | closed | 28 x 24 |
Each file is one 32 px cell trimmed to its opaque bounding box. The trim is
symmetric — two transparent columns fell away on each side — so the artwork
stays horizontally centred for drawSprite(), which anchors bottom-centre.
No pixel was recoloured, rescaled or redrawn. The remaining three frames of
each opening animation are still available in the source pack if the chests
are ever animated.
Campfire — public/prop-campfire.png
Twelve 32 x 32 frames in one 384 x 32 strip, packed here from the twelve separate PNGs of Fire Animation by NYKNCK, bought by the project owner from itch.io:
https://nyknck.itch.io/fire-animation
Licence: purchased asset, no published terms
The store page carries no licence text — it states what the pack contains and what it costs, and nothing about attribution, commercial use or redistribution. So no credit is contractually owed here; this entry exists as the project’s own record of where the art came from and on what footing.
Open question before release: because the pack ships no terms, there is also no written permission to redistribute the frames. This repository is public and serves the PNG unencrypted, which is redistribution in every sense that matters. Two things settle it: whether
fire_animation_nyknck.zipcontains a readme or licence file, and failing that, one line in writing from the artist. The purchase receipt is the only proof of licence that exists — keep it.
What was changed
The source files are 512 x 512 but are a clean 16x nearest-neighbour upscale
of 32 x 32 art, verified block by block, so they were taken back down to their
native 32 x 32 rather than being resampled. Beyond that the pack was shifted
one pixel right — as a whole, so the frames stay registered to each other —
because the logs sat a pixel left of the cell centre and drawSprite()
anchors bottom-centre. No pixel was recoloured or redrawn; the pack’s six
colours are intact and its frame order is untouched.
The twelve frames are drawn as a loop: the jump from the last frame back to the first is no larger than any step inside the cycle, so they play straight through with no seam to hide.
Skull totem — public/prop-skullpole.png
The drawn version of SPR.skullPole, the baked pole the wilderness camps
already plant. Supplied by the project owner as a 32 x 64 file (totem-czaszka .png, the same name as a tileset in the island’s Tiled project) and trimmed
here to its opaque bounds, 22 x 49, with the base centred under the image so
drawSprite() plants it on the tile it owns. Native resolution, 30 colours,
no pixel changed.
At 49 px it is a tile and a half tall, which is the point: it owns one solid tile and overhangs the one above, so the depth-sorted draw list puts it in front of anyone standing north of it.
TODO before release: record the author, pack and licence. Like the first campfire, this arrived without provenance, so it is the one asset in the repo whose terms are unknown.
The Bone Reach terrain — public/reach-terrain.png
A 3200 x 3200 export of mapa_srednia.tmx, the project owner’s own Tiled
composition of the island behind the Time Sage’s fourth pad. The layout is his
work; the tiles it is painted with are credited below.
The file is committed exactly as exported; nothing was resampled or recoloured.
Its dimensions are load-bearing — terrainImage.ts drops any export that is
not exactly the grid size in tiles times 32, and falls back to the procedural
bake.
Tilesets
The Tiled project references Water_tafle_4A, 32x32_DEMO, MainLev2.0,
namiot, floor_and_deoratives and kosci. 32x32_DEMO is one of Szadi
art.’s demo packs, covered by the licence recorded under “Terrain and props”
above — which permits exactly this: modified tiles composed into a commercial
game and published on a game-related site. The remaining five still need
pinning to specific packs.
The floors under the Bone Reach — public/orcdeep-terrain.png, public/minodeep-terrain.png
A 1280 x 1600 export of -1_orki_srednia_mapa.tmx and a 1920 x 1600 export of
-1_minotaury_srednia_mapa.tmx — the project owner’s own Tiled compositions of
the pit under the Bone Reach’s southern descent and the labyrinth under its
western one. The layouts are his work; the tiles they are painted with are
credited below.
The file is committed exactly as exported; nothing was resampled or recoloured.
As with every other export, its dimensions are load-bearing — terrainImage.ts
drops anything that is not exactly the grid size in tiles times 32.
Tilesets
Both Tiled projects reference a single tileset, MainLev2.0hhh — a variant of
the MainLev2.0 pack already recorded under “Terrain and props” above, by
Szadi art. (szadiart). The exact pack this variant was cut from still needs
pinning, same as the other five listed for the Bone Reach.
The dead’s descent — public/deaddeep-terrain.png, public/deaddeep2-terrain.png
A 1920 x 1920 export of -1_szkielety.tmx and a 960 x 960 export of
-2_szkielety.tmx — the project owner’s own Tiled compositions of the maze
under the Bone Reach’s northern descent and the dragon’s hollow below it. The
layouts are his work; the tiles they are painted with are credited below.
Both ship unmodified, exactly as exported, at native tile resolution with
the object layers hidden. Nothing was resampled or recoloured. The dimensions
are load-bearing: terrainImage.ts refuses any image that is not exactly the
grid size in tiles times 32, rather than draw a map shifted against its own
collision.
Tilesets
Both reference a single tileset, MainLev2.0hhh — the same Szadi art.
(szadiart) variant the other Tiled maps here are painted with, recorded under
“Terrain and props” above and under the same licence, with the same question of
which pack the variant was cut from still outstanding.
Bone Reach objects — prop-tent.png, prop-well.png, prop-boulder-a.png, prop-boulder-b.png
Cut from the same Szadi art. sheets the island’s terrain is painted with, under the licence recorded above, which permits cutting and modifying the art for commercial use.
| File | Source sheet | Size | Footprint |
|---|---|---|---|
prop-tent.png |
namiot.png |
53 x 59 | 2 x 2 |
prop-well.png |
floor_and_deoratives.png |
52 x 48 | 2 x 2 |
prop-boulder-a.png |
32x32_DEMO.png |
60 x 44 | 2 x 1 |
prop-boulder-b.png |
32x32_DEMO.png |
60 x 44 | 2 x 1 |
Each was lifted as a single connected component rather than as a rectangle, so no fragment of a neighbouring object on the sheet came with it, and each was trimmed to its own bounds. No pixel was recoloured or rescaled.
The two boulders are the same size and carry the same colours in the same proportions, which is why they look like one sprite stamped twice; they are not. They differ on 1528 pixels, so both were taken and the island alternates between them.
These are drawn as scenery rather than baked into the terrain export: they stand taller than the square they occupy, and the player has to be able to walk behind them.
Bandit Deep terrain — public/banditdeep-terrain.png, public/banditdeep2-terrain.png, public/banditdeep3-terrain.png
Exported from piwnica_bandit.tmx, piwnica_bandit-2.tmx and
bandit_piwnica_-3.tmx, which reference MainLev2.0hhh and
32x32_DEMO — both Szadi art. (szadiart) packs already recorded under
“Terrain and props” above, under the same licence and with the same pinning
still outstanding as the other Tiled exports here.
Native tile resolution, object layers hidden: 3360 x 3200 for the two 105 x 100 floors and 1280 x 1280 for the 40 x 40 cell. The -3 export arrived as a BMP and was re-encoded to PNG unchanged, pixel for pixel.
banditdeep2-terrain.png is a second export of the same map: the first drawing
sealed a 297-square corridor in the west with no door in it, and the map was
redrawn with doorways at y=53-54 and y=80-82. The re-export changed exactly
those 297 squares and nothing else on the floor.
All three ship unmodified. An earlier pass resampled the two large floors,
because the wall tileset had been stamping its band half a tile off the grid —
a vertical band’s rock measured x=16..47 across the two columns the TMX marked
as wall, one tile’s worth of stone centred on the seam between them, so sealing
both columns put a whole phantom square of bare floor beyond reach. The maps
have since been redrawn with a second rock layer widening every band to fill
both squares (sciany cd on -1, skaly cd on -2, scian cd on -3), which
takes the maze walls from 0.41 ink per sealed square to 0.66 and makes the
resampling both unnecessary and harmful. It is gone.
Gallows Coast buildings — prop-barn.png, prop-house-a.png, prop-house-b.png, prop-smithy.png, prop-windmill.png
Source: CraftPix.net, Top-Down Simple Autumn Props and Top-Down Simple Summer Props, under the CraftPix standard licence — commercial use in a released game is permitted; redistribution of the source files as source files is not. What ships here are not those files. Each is a derivative cut down by roughly a quarter in each dimension and re-quantised to a 28-colour palette, which is what the game’s tile size can carry.
| File | Source prop | Size | Footprint | Blocks |
|---|---|---|---|---|
prop-barn.png |
Autumn — Barn | 128 x 160 | 4 x 5 | 4 x 2 |
prop-house-a.png |
Autumn — House | 128 x 160 | 4 x 5 | 4 x 2 |
prop-house-b.png |
Summer — House | 128 x 160 | 4 x 5 | 4 x 2 |
prop-smithy.png |
Autumn — Blacksmith Workshop | 128 x 128 | 4 x 4 | 4 x 2 |
prop-windmill.png |
Summer — Windmill | 160 x 160 | 5 x 5 | 5 x 2 |
Cutting method
The originals are ~480 px cartoon illustrations with a flat drop shadow baked
in at rgba(4,7,7,51). That shadow is stripped first — the engine draws its
own, and once prop art has loaded artShadow is a no-op, so the sprite has to
carry one itself. The remainder is cropped to its own bounds, resized with
Lanczos to fit the tile box, alpha-thresholded so the silhouette reads as
pixels instead of a soft smear, unsharp-masked to bring the black outline back
after the shrink, quantised to 28 colours, and given a soft elliptical ground
shadow sized to whatever part of the building actually meets the floor.
Sizes were chosen from each prop’s own proportions rather than forced to one box: the barn and both houses come out at 1.27-1.48 tall for every tile wide, which lands on 4 x 5; the smithy is the squattest of the five and takes 4 x 4; the windmill is wider than it is tall because of its sails, and cropping those to four tiles left a shed with sticks on it, so it takes 5 x 5.
Like the Bone Reach objects, these are scenery rather than terrain: they stand taller than the squares they occupy and the player walks behind the roof.
Town buildings, stalls and windmills — public/prop-town-*.png
Source: CraftPix.net, standard (non-Enterprise) licence — https://craftpix.net/file-licenses/
Same grant as the Home Isle buildings and the spell effects: commercial use and sale of the game are permitted outright, attribution is a courtesy rather than an obligation, and clause 3.1.1 forbids feeding these files to a model as training data.
These files must not sit in a public repository. 1.1.3 forbids distributing source files and 1.2.1 forbids redistributing the art in any form another end user could take and use; a public GitHub repo is exactly that. Serving them from Vercel as part of the running game is fine. Git keeps every blob it has ever stored, so a file that has been pushed once is not removed by deleting it in a later commit.
Thirty settlement props. They arrived as native pixel art cut to a whole number of tiles and nothing was requantised or restyled, but twenty-seven of the thirty are now drawn at twice the size they shipped at — a plain 2x nearest-neighbour scale, so the pixels are square blocks and no colour was invented. At the original scale a four-by-three manor stood barely two player-heights and its doorway came up to the character’s shoulder; a street of them read as a row of models. The three market stalls were left alone, a stall being the one thing in the set that was already person-sized.
Each file is exactly its footprint times 32 pixels, with the art seated flush
against the bottom edge — which is the contract src/gfx/sceneryArt.ts draws
against, and which the smoke suite checks file by file.
| File | Size | Footprint | Blocks |
|---|---|---|---|
prop-town-stall-grey.png |
96 x 64 | 3 x 2 | 3 x 1 |
prop-town-stall-open.png |
96 x 64 | 3 x 2 | 3 x 1 |
prop-town-stall-red.png |
96 x 64 | 3 x 2 | 3 x 1 |
prop-town-shrine.png |
128 x 128 | 4 x 4 | 4 x 2 |
prop-town-chapel.png |
128 x 192 | 4 x 6 | 4 x 4 |
prop-town-shop.png |
128 x 192 | 4 x 6 | 4 x 4 |
prop-town-shophouse.png |
192 x 128 | 6 x 4 | 6 x 2 |
prop-town-shoprow.png |
256 x 128 | 8 x 4 | 8 x 2 |
prop-town-storefront.png |
256 x 128 | 8 x 4 | 8 x 2 |
prop-town-townhouse.png |
128 x 256 | 4 x 8 | 4 x 4 |
prop-town-watchtower.png |
128 x 256 | 4 x 8 | 4 x 4 |
prop-town-bank.png |
192 x 192 | 6 x 6 | 6 x 4 |
prop-town-cottage.png |
192 x 192 | 6 x 6 | 6 x 4 |
prop-town-market.png |
320 x 128 | 10 x 4 | 10 x 2 |
prop-town-apothecary.png |
256 x 192 | 8 x 6 | 8 x 4 |
prop-town-guildhall.png |
384 x 128 | 12 x 4 | 12 x 2 |
prop-town-inn.png |
256 x 192 | 8 x 6 | 8 x 4 |
prop-town-keep.png |
256 x 192 | 8 x 6 | 8 x 4 |
prop-town-manor.png |
256 x 192 | 8 x 6 | 8 x 4 |
prop-town-temple.png |
256 x 192 | 8 x 6 | 8 x 4 |
prop-town-warehouse.png |
256 x 192 | 8 x 6 | 8 x 4 |
prop-town-workshop.png |
256 x 192 | 8 x 6 | 8 x 4 |
prop-town-observatory.png |
192 x 320 | 6 x 10 | 6 x 4 |
prop-town-stonehouse.png |
320 x 192 | 10 x 6 | 10 x 4 |
prop-town-tavern.png |
320 x 192 | 10 x 6 | 10 x 4 |
prop-town-tradehouse.png |
320 x 192 | 10 x 6 | 10 x 4 |
prop-town-towerhouse.png |
256 x 256 | 8 x 8 | 8 x 4 |
prop-town-greattemple.png |
320 x 320 | 10 x 10 | 10 x 4 |
prop-town-windmill-cloth.png |
384 x 384 | 12 x 12 | 12 x 4 |
prop-town-windmill-lattice.png |
384 x 384 | 12 x 12 | 12 x 4 |
The footprints in that table are read off the images rather than chosen: the
files were delivered pre-cut to a whole number of tiles, and the smoke suite
now checks that every one of them is exactly its footprint times 32 — so a file
re-exported at the wrong scale is caught rather than silently shifting the
building off its own plot. The block column is what ships in
src/gfx/sceneryArt.ts. TOWN-BUILDINGS.md says what each one is and where it
stands.
The three stalls block one row rather than two so a vendor can stand behind the
counter. The two windmills are 6 x 6 and are not the 5 x 5 Gallows Coast
prop-windmill.png; their mills are only about three tiles wide, so a 6 x 2
block seals bare ground either side — deliberate, matching what the 5 x 5
already does, and the reason they belong outside the walls.
On the missing ground shadow
The Gallows Coast props carry a soft elliptical shadow baked in during their
cut. These do not, and none was added. Once prop art has loaded artShadow is
a no-op (src/main.ts), so nothing is drawn beneath them at all.
That was checked rather than assumed: composited onto town-terrain.png beside
prop-house-a.png, none of them floats. Every one is a flat elevation with a
hard dark outline along its bottom edge, and that outline does the seating a
shadow would otherwise do — while prop-house-a’s own baked ellipse is barely
visible on that ground anyway. A soft gradient under crisp pixel art would read
worse than nothing. The files are already at final size, so if a future terrain
proves otherwise the shadow can be baked in later in one pass.
Black Knight — public/mob-black-knight-walk.png, public/mob-black-knight-dead.png
Source: Universal LPC Spritesheet Character Generator, CC-BY-SA 3.0 — the same terms, and the same ShareAlike obligation, as every other LPC creature in this project. See the LPC section above for the full attribution list and the per-layer note.
Reproducible generator URL (paste it in and the exact character loads):
Layers used: black body, human male head, neutral expression, cowlick hair, flattop helm, short horns, simple left earring, chainmail, lace cuffs, legion shoulders, stud ring, plate arms, cape with trim (solid black), plate legs, plate shoes, grey kite shield, longsword.
Cutting method
The standard recipe every LPC creature here uses, unchanged: rows 8-11 of the full export are the walk (up, left, down, right, nine frames each) and row 20 is the death sequence, whose last frame is the corpse. One crop rectangle is shared by all thirty-six walk frames and kept symmetric about the source cell’s centre line, x=32, so the body cannot drift as the cycle plays or as it turns.
The drawn sword reaches both cell edges, so the crop comes out at the cell’s full width: 64 x 55 per frame, two tiles across. Nothing was recoloured, rescaled or redrawn — the generator output is used as exported.
ShareAlike applies. This sheet is an adaptation of CC-BY-SA 3.0 artwork and is itself CC-BY-SA 3.0; anyone may take it from this repository under those terms. The per-layer CSV attribution still owed before release covers these layers too.
Redcap — public/mob-redcap-walk.png, public/mob-redcap-dead.png, public/item-blood-cap.png
Source: Universal LPC Spritesheet Character Generator, CC-BY-SA 3.0 — the same terms and the same ShareAlike obligation as every other LPC creature here. See the LPC section above for the full attribution list and the per-layer note.
Reproducible generator URL (paste it in and the exact character loads):
Layers used: taupe body, troll head, neutral expression, large nose, dark grey winter beard, grey moustache, grey balding hair, red wizard hat base, red santa trim, red scarf, leather shorts, brown high socks, leather basic boots, scythe.
Cutting method
The standard recipe, unchanged: rows 8-11 of the full export are the walk (up, left, down, right, nine frames each) and row 20 is the death sequence, whose last frame is the corpse. One crop rectangle is shared by all thirty-six walk frames and kept symmetric about the source cell’s centre line, x=32, so the body cannot drift as the cycle plays or as it turns. The scythe reaches past the body on both sides, so the crop comes out at 60 x 58 per frame; the corpse is 46 x 36, cropped to the body. Nothing was recoloured, rescaled or redrawn.
The cap icon
item-blood-cap.png is not cut out of the composed character — cropping the
head off a finished sprite would have taken face and hair pixels with it. It is
the two hat layers on their own, composited and cropped to their own bounds
(28 x 23) and centred in a 32 x 32 icon:
spritesheets/hat/magic/wizard/base/adult/walk/base_red.pngspritesheets/hat/holiday/santa/adult/walk/red.png
taken from the generator’s own repository at the paths above, front-facing standing frame (row 2, column 0). Same source, same licence, no repainting.
ShareAlike applies. These three files are adaptations of CC-BY-SA 3.0 artwork and are themselves CC-BY-SA 3.0; anyone may take them from this repository under those terms. The per-layer CSV attribution still owed before release covers these layers too.
Liddesdale and the redcap’s lair — map layouts
Two files: public/liddesdale-terrain.png (2560x2560) and
public/hermitage-terrain.png (960x960). Both are Tiled “Export as Image” of
maps authored by the project owner (redcaplewyspa.tmx, 80x80, and
redcapleboss.tmx, 30x30), at native tile size with object layers hidden, and
they are blitted straight into the world exactly like the other fourteen
terrain exports above.
The tilesets painted into them (32x32_DEMO, MainLev2.0hhh,
Water_tafle_4A) are commercial assets held under the project’s own licences;
the .tsx files and source sheets are NOT in this repository, only the
flattened picture. Everything standing on top — dead trees, felled wood,
tents, skull poles — is the prop-* set already credited above.
Draugr — public/mob-draugr-walk.png, public/mob-draugr-dead.png, public/item-grave-helm.png
Source: Universal LPC Spritesheet Character Generator, CC-BY-SA 3.0 — the same terms and the same ShareAlike obligation as every other LPC creature here. See the LPC section above for the full attribution list and the per-layer note.
Reproducible generator URL (paste it in and the exact character loads):
Layers used: zombie body, zombie head (all.lpcr heather), red brain wound, brown mouth wound, purple left-eye wound, brown arm wound, leather rib wound, redhead thick eyebrows, brown frock coat, walnut shorts, walnut basic boots, iron barbarian helmet, iron axe.
Cutting method
The standard recipe, unchanged: rows 8-11 of the full export are the walk (up, left, down, right, nine frames each) and row 20 is the death sequence, whose last frame is the corpse. One crop rectangle is shared by all thirty-six walk frames and kept symmetric about the source cell’s centre line, x=32, so the body cannot drift as the cycle plays or as it turns. The axe swings clear of the body on both sides, so the crop comes out at 56 x 50 per frame; the corpse is 34 x 35, cropped to the body. Nothing was recoloured, rescaled or redrawn.
The helm icon
item-grave-helm.png is not a crop of the composed character — cutting the
head off a finished sprite takes face and hair pixels with it, which is the same
problem the redcap’s cap had. It is lifted by MASK instead:
- the helmet layer’s own file,
spritesheets/hat/helmet/barbarian/adult/walk.png, is taken from the generator’s repository and its alpha channel used as a stencil; - the pixels are then copied out of the composed export through that stencil, front-facing standing frame (row 2, column 0).
The helmet sits at zPos 130, above the head and hair, so every pixel inside its own silhouette is the helmet and nothing else — the result is the layer exactly as the generator recoloured it to iron, with no repainting and no neighbouring layer bleeding in. Cropped to its own bounds (24 x 21) and centred in a 32 x 32 icon.
That layer is credited by the generator as hat/helmet/barbarian, “original version by bluecarrot16, color reduction by Napsio (Vitruvian Studio)”, authors bluecarrot16, JaidynReiman and Napsio (Vitruvian Studio), offered under CC-BY 3.0 / CC-BY 4.0 / OGA-BY 3.0 / GPL 2.0 / GPL 3.0, from https://opengameart.org/content/lpc-helmets and https://opengameart.org/content/lpc-expanded-hats-facial-helmets. Those are narrower terms than the sheet as a whole, but the icon is distributed as part of the same CC-BY-SA 3.0 set and nothing here relies on the difference.
ShareAlike applies. These three files are adaptations of CC-BY-SA 3.0 artwork and are themselves CC-BY-SA 3.0; anyone may take them from this repository under those terms. The per-layer CSV attribution still owed before release covers these layers too.
Viking — public/mob-viking-walk.png, public/mob-viking-dead.png
Source: Universal LPC Spritesheet Character Generator, CC-BY-SA 3.0 — the same terms and the same ShareAlike obligation as every other LPC creature here. See the LPC section above for the full attribution list and the per-layer note.
Reproducible generator URL (paste it in and the exact character loads):
Layers used: light body, light human male head, neutral expression, blonde long-bangs hair, copper short horns, copper bascinet, brown left eyepatch, bronze gloves, honey chainmail, spartan round shield, iron axe, fern armour legs, iron armour boots.
Cutting method
The standard recipe, unchanged and identical to the draugr’s: rows 8-11 of the full export are the walk (up, left, down, right, nine frames each) and row 20 is the death sequence, whose last frame is the corpse. One crop rectangle is shared by all thirty-six walk frames and kept symmetric about the source cell’s centre line, x=32, so the body cannot drift as the cycle plays or as it turns. The shield and the axe reach past the body on opposite sides, so the crop comes out at 56 x 55 per frame; the corpse is 43 x 36, cropped to the body. Nothing was recoloured, rescaled or redrawn.
ShareAlike applies. Both files are adaptations of CC-BY-SA 3.0 artwork and are themselves CC-BY-SA 3.0.
Haramsey and Kárr’s howe — map layouts
Two files: public/haramsey-terrain.png (2560x2560) and
public/haugr-terrain.png (960x1280). Both are Tiled “Export as Image” of maps
authored by the project owner (Draugr0.tmx, 80x80, and Draugr-1.tmx, 30x40),
at native tile size with object layers hidden, and they are blitted straight
into the world exactly like the sixteen terrain exports above.
Same tilesets as Liddesdale (MainLev2.0hhh, Water_tafle_4A), the same
commercial licences, and the same rule: the .tsx files and source sheets are
NOT in this repository, only the flattened picture.
Worth writing down because it changed how the map was authored: unlike
Liddesdale’s export, which carries mud, tracks and stonework, Draugr0 has two
layers and nothing else — sea and land. Everything readable on that island is
therefore a prop-* object the glyph grid plants, already credited above, and
the scatter is correspondingly heavier: 3832 land squares carrying roughly two
hundred objects against Liddesdale’s hundred and eighty-seven over 3923.
Dragon — public/mob-dragon-walk.png, public/mob-dragon-dead.png
Source: CraftPix.net, standard (non-Enterprise) licence — https://craftpix.net/file-licenses/
The same terms as the buildings below: commercial use granted outright, no royalty, no attribution owed on a paid product, and the same clause 1.1.3 / 1.2.1 restriction on public source files. The warning in the buildings section applies to these two files in full.
What was changed
The pack ships nineteen 256 x 256 frames as separate PNGs — Attack x4, Death x5, Hurt x2, Idle x3, Walk x5 — of a PURPLE dragon in side view. Three things were done to them:
-
Recoloured to green. The art is a hard 31-colour palette with no anti-aliasing, so this is a palette map and not a filter: every source colour has exactly one destination colour, chosen by rotating hue and raising saturation while leaving value untouched, so the shading ladder survives intact. Only the purple family moved; the gold wing membrane, the pale belly plates and the red mouth are the pack’s own colours.
-
Scaled to 0.567 and re-centred, giving a 110 x 43 frame. The animal inside it is 90 px wide — 2.8 tiles — and the surplus is transparent padding, for a reason worth writing down. The pack draws the dragon with its feet at x=147 while the source cell’s centre is x=128, so a crop centred on the cell centres the BOUNDING BOX, which is mostly tail, and the body drew off to one side of the tile it stood on. Centring on the feet instead fixes the anchor but forces the padding: the tail reaches 97 px left of the feet and the snout only 61 px right, and the crop has to stay symmetric about the anchor or the creature jumps sideways every time it turns around.
Downscaling is a majority vote over the source pixels behind each destination pixel, ties broken toward the darkest survivor. Plain nearest drops the one-pixel outline along the spine. Two earlier cuts were rejected in play: half scale (80 x 38) stood shorter than the player, whose own sprite is 64 x 80; full 1:1 (160 x 75) was five tiles wide on a one-tile creature and swallowed whatever it stood next to.
-
Packed into the engine’s sheet layout. One 6 x 4 grid: column 0 is
Idle1(the standing pose), columns 1-5 areWalk1-Walk5. The crop rectangle is shared by all six frames and kept symmetric about the source cell’s centre line, so the body cannot drift sideways as the cycle plays. Rows are up / left / down / right; the pack has only a right-facing view, soleftis its mirror and the two vertical rows carry the side view — the snake’s arrangement, for the snake’s reason.
Hurt1 and Hurt2 are byte-for-byte duplicates of Death1 and Death2, so
the pack has no hurt animation despite the filenames. The four attack frames
are unused: monsters have no attack animation in this engine yet. The corpse
is Death5, the last frame of the death sequence, cropped to its own bounds
and scaled by the same factor so the body matches.
Fire field — public/fx-fire-1-field.png
Derived from public/prop-campfire.png — Fire Animation by NYKNCK. All
of that section’s terms and its open question about redistribution apply here
unchanged; this is the same twelve frames, edited.
What was changed
The campfire is the right animation with the wrong furniture. The three log
browns were deleted outright, each frame was slid down so the flame sits on the
tile’s bottom edge instead of hovering where the logs used to be, and the three
flame colours were remapped onto the palette fx-fire-1-wave.png already uses
so that a field and a bolt read as the same element. A dark rim was added along
the silhouette edge, matching how the wave is drawn. Frame count and frame
order are untouched.
Home Isle buildings — public/build-*.png
Source: CraftPix.net, standard (non-Enterprise) licence — https://craftpix.net/file-licenses/
Commercial use is granted outright: unlimited free and commercial projects (1.1.5), the right to sell and distribute games containing the art (1.1.4), no royalty, and continued use of anything already downloaded after a subscription ends (1.1.6). The licence imposes no attribution requirement on paid products, so this section is a record of provenance rather than an obligation.
Clause 3.1.1 forbids using these assets to train, develop or improve AI or ML systems. Editing them with an AI tool for use in this game is not that — it is the adaptation right granted by 1.1.1 — but the distinction is worth keeping in mind, since it is the assets as training data that the clause is about.
These files must not sit in a public repository. Clause 1.1.3 — “Distribution of source files is NOT permitted” — and 1.2.1, which forbids redistributing the art “in a manner that would make some or all of the art files useable to another end user”. A public GitHub repo hands the PNGs to anyone who clicks; the deployed game does not, and 1.2.1 says so explicitly: “An app that uses the art as part of the game is fine.” Serving these from Vercel is fine. Hosting them in a public repo is not — and deleting them later does not help, because git keeps every blob it has ever seen.
Modifications made here (resizing, re-seating, Scale2x) are permitted by 1.1.1, which grants the right to adapt and prepare derivative works.
| File | Structure | Tier | Size | Footprint |
|---|---|---|---|---|
build-forge-1.png |
Forge | I — timber | 96 x 96 | 2 x 2 |
build-forge-2.png |
Forge | II — stone | 96 x 96 | 2 x 2 |
build-forge-3.png |
Forge | III — steel | 96 x 96 | 2 x 2 |
build-tower-1.png |
Alchemy Tower | I — timber | 64 x 96 | 2 x 2 |
build-tower-2.png |
Alchemy Tower | II — stone | 64 x 96 | 2 x 2 |
build-tower-3.png |
Alchemy Tower | III — amber | 64 x 96 | 2 x 2 |
build-dummy-1.png |
Training Dummy | I | 256 x 256 (4 x 4 cells of 64) | 1 x 1 |
build-dummy-2.png |
Training Dummy | II | 256 x 256 (4 x 4 cells of 64) | 1 x 1 |
build-dummy-3.png |
Training Dummy | III | 256 x 256 (4 x 4 cells of 64) | 1 x 1 |
build-range.png |
Archery Range | (single tier) | 32 x 32 | 1 x 1 |
build-chest-1.png |
Storage Chest | I | 64 x 64 | 2 x 2 |
build-chest-2.png |
Storage Chest | II | 64 x 64 | 2 x 2 |
build-chest-3.png |
Storage Chest | III | 64 x 64 | 2 x 2 |
Authored at world scale — TILE (32) px per tile — anchored bottom-centre, with no painted ground shadow (the renderer draws its own, sized off the footprint rather than the sprite: a two-tile forge is three tiles of roof, and a shadow as wide as the roof would put the whole pad in shade).
The stills ship exactly as they were drawn. The three training-post sheets do not: they arrived as 32 x 32 cells, which put the post at roughly waist height beside the player, and were doubled to 64 with Scale2x (EPX) the same way the chests were — so they too are twice the pixel size of the buildings around them. Redrawing them at 64 at source would be sharper.
The same pass fixed the alignment. The generator placed the fourth facing seven pixels left of the other three, which slid the plinth sideways whenever the post changed which way it leaned; each row is now centred on its own plinth and seated so the lowest pixel meets the edge the renderer anchors to. Frames are composed one cell at a time rather than shifted in place, which is what keeps a row’s offset from bleeding a column into the frame beside it. Nothing was recoloured or redrawn, and the small plinth wobble inside rows 1 and 2 is the original animation, left alone.
The post’s sheet is four facings down the rows — north, east, west, south — by
four frames across: column 0 is the rest pose, columns 1-3 are the lean. It is
the only building that animates, and it plays once per blow rather than looping;
see src/gfx/buildingArt.ts.
The forge and the tower are stills that the renderer animates on top of:
firelight and embers in the hearth, smoke off the flue, and motes lifting from
the basin in that tier’s colour. Those effects are code, not artwork
(src/gfx/buildingFx.ts), but their anchor points were measured off these
files — the hearth mouth, the chimney and the middle of the pool — so replacing
an image means re-measuring them.
The three Storage Chests are the one set that is not shipped as drawn. They arrived at 32 x 32 — a single tile, on a structure that occupies four — and were enlarged to fill the plot with Scale2x (EPX), the pixel-art doubling that rounds a diagonal instead of stepping it. That makes them derivative works of the originals: same provenance, same licence, and they are twice the pixel size of every other building here, which is visible if you look for it. Redrawing them at 64 x 64 at source would be sharper. Each was then trimmed and seated on the anchor line so the box sits on the ground rather than hovering over its own shadow.
One-tile fields — public/fx-earth-1-field.png, public/fx-ice-1-field.png, public/fx-storm-1-field.png, public/fx-shadow-1-field.png
Source: generated, by tools/fx/gen_field_fx.py in this repository.
These four are not CraftPix. They match the fx-*.png glob and they sit
next to the bought art, but nothing in them came from anyone else, so the
public-repository warning in the section below does not reach them. Same as the
attunement circles: no attribution owed, no ShareAlike, no DRM clause, and
re-running the script reproduces them byte for byte.
Drawn at 32 x 32 with hard pixels on the palettes sampled out of the sheets already here, so they read as part of the same set rather than as a visitor:
earth #170c04 #3a2311 #5c3c20 #8a6037 #bd8d55, plus a warm ember
ice #4d7593 #8fb4cf #b5d5e8 #ddeef9 #ffffff
storm #2b1c05 #45300a #ffb416 #ffd84a #ffe97e #fff29b #ffff81
wind #3a4070 #5f6796 #8f96c4 #b9bfe0 #d8dcf2 #eef0ff #ffffff
Twelve frames each, the same count as fx-fire-1-field.png.
They loop, because field is the slot that has to. Every other slot plays
once and stops; a field outlives its own animation, so a seam would tick on
screen every twelve frames for as long as the tile burns. Every moving part
here has a period that twelve divides — the earth’s embers pulse twice a loop,
its rubble hops on sixes, its dust makes one whole rise; the ice throws two
crowns half a loop apart and drifts its ripples on a triangle wave. Measured,
not assumed: frame twelve differs from frame one by less than the average
frame-to-frame step in both sheets.
Earth is a fissure, not a slab. Only the crack itself is opaque, with the lit lip broken along its length and embers breathing inside the widest part — the ground it splits has to keep showing through, or a field reads as a hole cut in the terrain.
Storm strikes three times a loop rather than twice. At fifteen frames a second, six frames between bolts is nearly half a second of a tile that is supposed to be lethal standing there doing nothing; four frames keeps a bolt, its afterburst or its ground discharge on screen at every moment. Three different paths, so no strike is the previous one played again. The scorch and its crawling arcs are drawn on all twelve frames — what makes a field read as a field is that it is never off.
Two details that are easy to get wrong at this size. The flash is a dithered
halo composited onto the frame, not an ellipse drawn into it: ImageDraw
replaces pixels including their alpha, so a translucent ellipse painted
straight on erases the scorch underneath instead of lighting it, and a solid
wash reads as a rounded rectangle rather than as light. And the bolt lights
only every other flank pixel — a solid three-pixel band reads as a rope, and
the broken edge is the whole crackle.
Wind is a new tornado, not a copy of the burst. fx-shadow-1-burst.png is
already a tornado and copying it across would have cost nothing, so it was
measured first: sixteen lit pixels on its first frame, two hundred and fifty at
its peak, thirty on its last. It is a one-shot — the funnel gathers, tops out
and blows apart. Looped as a field it would materialise and evaporate every
eleven frames, which is the one thing a field must never do. The funnel here is
drawn to turn forever instead: an open mouth with a stroke revolving inside it,
and a stem that never gathers or disperses.
It is white, not violet. The element reads as Wind on screen and only its
ID still says shadow; a violet funnel reads as smoke rising, not as moving
air. The shadows keep a lavender cast so the shape still belongs to the
element’s colour without the body going grey.
The body is solid, with the coils drawn on it as light. An earlier version made the coils the whole funnel and let the ground show between them, which left it looking torn rather than dense. What sells it now is that the body is shaded a step darker than the coils across its whole width, that each coil has one darker pixel under it so it is a rope and not a stripe, and that the mouth is painted BETWEEN the body and the front coils — drawn last, it laid a dark dish over the top third of the funnel.
Ice is a slick with the surface breaking in it. Its body is deliberately semi-transparent rather than dithered: at this size a checkerboard wash reads as a mesh, and alpha is what makes water look like water lying on grass.
Vertical weights measure 0.78 for earth, 0.79 for ice, 0.67 for storm and 0.40
for the tornado, so weightY calls the first three grounded and the tornado
not — it is top-heavy by design, since the mouth is the widest thing in the
frame. That costs nothing here: SCALE.field is 1.05, so a field is drawn 34 px
across on a 32 px tile and the grounded and centred branches of drawField
land one pixel apart. Worth knowing before anyone reshapes a field to chase the
0.58 threshold — on the wider slots, where the scale is 1.35 or 1.4, the same
difference is five or six pixels and does matter.
Element attunement circles — public/fx-attune-*.png
Source: generated, by tools/fx/gen_element_fx.py in this repository. No
third-party asset went into these files — no trace, no sample, no recolour of
anyone else’s art.
That is the whole licence note. Unlike every other sheet on this page there is
no attribution to make, no ShareAlike to honour, no DRM clause to trip over on
iOS, and no reason to keep these out of a public repository. Re-running the
script reproduces them byte for byte; every constant that shapes them lives at
the top of the file and in the ELEMENTS table, so a palette change is one line
and a sixth element is one entry.
Five sheets, one per element, each a horizontal strip of twelve 64 x 64 frames —
two tiles by two at TILE = 32. Drawn at 128 and halved on the way out, which
is what keeps the glow smooth at the zooms the camera actually reaches
(f = 2 .. 3.2). The frame count is read off the image exactly as
src/gfx/spellArt.ts reads it, so a redrawn strip of a different length needs no
code change.
Anchor 0.72. The ring centre sits at half the frame’s width and 72% of its height: the ring is the ground plane and everything above it is airborne. That stands the circle on the caster’s tile with the column rising over the character, the same way the ice spike stands on 0.70.
The loop is seamless. Every animated quantity advances by a whole period across the twelve frames — the star turns exactly one step of its own symmetry, the motes rise a whole number of column heights, the twinkles run whole cycles. Frame twelve leads back into frame one with no seam, so the loop can hold for as long as a choice screen is open instead of needing a fade.
| Element | Ring | Rising motes | Colour |
|---|---|---|---|
| Fire | tongues licking the rim, 9-point star | flame tongues, embers | orange, cream core |
| Ice | double ring, hexagram, a ripple pulsing outward | droplets | cyan, white core |
| Earth | ring broken into ten slabs, 8-point star | irregular dust chips | brown, cream core |
| Storm | solid ring, 7-point star, three bolts firing in turn | sparks, streaks | yellow, white core |
Wind (shadow) |
five blades, swooshes orbiting up the column | curved swipes | white, lavender halo |
Wind is filed under shadow for the same reason its crystals are: the id builds
item keys and save data and is frozen, while the name the player reads lives in
ELEMENT_LABEL. A file called fx-attune-wind.png would be the one that never
loads.
Earth is the one to watch on brown ground. The slabs are deliberately brown rather than the sandier gold they started as, which reads well on grass and loses contrast on a dirt or cave floor; the cream core of the star is what still carries it. If a mission ever stands this circle on bare earth, lift the rim rather than the whole ramp.
Spell effects — public/fx-*.png
Source: CraftPix.net, standard (non-Enterprise) licence — https://craftpix.net/file-licenses/
Same licence, same grant and the same one hard limit as the Home Isle buildings above: commercial use and sale of the game are permitted outright, attribution is a courtesy rather than an obligation, and clause 3.1.1 still forbids feeding these files to a model as training data.
These files must not sit in a public repository. The warning on the buildings applies here word for word — 1.1.3 forbids distributing source files, 1.2.1 forbids redistributing the art in any form another end user could take and use, and a public GitHub repo is exactly that. Serving them from Vercel as part of the running game is explicitly fine. Note that git keeps every blob it has ever stored, so a file that has been pushed once is not removed by deleting it in a later commit.
Every sheet is a horizontal strip of 32 x 32 frames. The frame count is read
off the image at load time rather than declared anywhere, so a redrawn strip of
a different length needs no code change (src/gfx/spellArt.ts).
| Element | bolt — projectile |
burst — tile bloom |
Tier colours |
|---|---|---|---|
| Fire | comet, 8 fr | starburst, 9 fr | orange / blue / black |
| Ice | snowflake, 13 fr | rising spike, 12 fr | pale / blue / deep blue |
| Earth | tumbling rock, 12 fr | ground spikes, 11 fr | earth / slate / dark |
| Storm | arrowhead, 12 fr | starburst, 17 fr | yellow / violet / grey |
Wind (shadow) |
crescent scythe, 12 fr | tornado, 11 fr | violet / black / white |
Fire and Storm also ship a wave strip — a rising column and a starburst
respectively. The other three do not: wave falls back to burst, and nova
falls back through wave to the same place, so two files are a complete
element and a third is an element choosing to look different.
What was changed
Nothing was recoloured or redrawn. Two edits, both permitted by 1.1.1:
Bolts were mirrored where they faced the wrong way. The renderer rotates a
projectile toward its target from a single convention — artwork points RIGHT,
and the rotation is the raw atan2 with no correction term. Earth, Wind and
Storm arrived facing left and each frame was flipped horizontally, individually
rather than flipping the strip, so frame order survives. Fire and Ice were
already right-facing and ship untouched.
Storm’s sheets were renamed. They arrived as fx-storm-1-wave_png.png and
so on; the doubled extension meant the loader never found them. The pixels are
unchanged. Storm’s nova strip was byte-identical to its wave and is not
shipped at all, since the loader already falls back.
The anchor — whether a bloom stands on the tile or blooms around its centre —
is measured from the pixels, not stored here. Art whose weight sits low in the
frame (Fire’s column at 0.68, Earth’s spikes at 0.70) is seated on the tile’s
bottom edge; art centred in its frame (Storm’s starburst at 0.50) is centred on
the tile. See GROUNDED_AT in src/gfx/spellArt.ts.
The coloured halo behind every effect is code, not artwork
(src/gfx/spellFx.ts): a silhouette of each frame flooded with the element’s
colour and spread outwards, baked once at load. It is what keeps Fire’s
near-black tier III and Wind’s black tier II legible against grass.
The Knell — public/fx-*-rune.png, public/item-*-rune.png
Source: CraftPix.net, standard (non-Enterprise) licence — https://craftpix.net/file-licenses/
Two originals: a nine-frame skull impact at 128 x 128 and one 32 x 32 stone
(Icon38). Same licence, grant and limit as the spell effects and the Home Isle
buildings above — commercial use and sale of the game are permitted outright,
attribution is a courtesy rather than an obligation, and clause 3.1.1 forbids
feeding these files to a model as training data.
These files must not sit in a public repository. The warning on the spell effects applies here and it reaches further than it looks: 1.1.3 forbids distributing source files, 1.2.1 forbids redistributing the art in any form another end user could take and use, and a recolour is still the art. So the clause covers the thirty derived sheets in
public/exactly as it covers the ten originals — reducing a skull to 32 px and mapping it onto an elemental ramp is a derivative, not a new work. Serving them from Vercel as part of the running game is explicitly fine. Git keeps every blob it has ever stored, so a file pushed once is not removed by deleting it in a later commit.
The ten originals are not committed at all — tools/fx/src/ is gitignored.
Only the derived sheets in public/ ship, which is the same split the spell
effects already run on.
Thirty files, generated by tools/fx/gen_rune_art.py in this repository:
fx-<element>-<tier>-rune.png— 288 x 32, nine frames in one horizontal strip, read bysrc/gfx/spellArt.tsexactly as every other sheet is.item-<element>-<code>-rune.png— 32 x 32, the stone in the bag.
What was changed
The impact was reduced 128 -> 32 and recoloured. Alpha-weighted box average, so an edge pixel is the mean of the pixels that had ink in them rather than a mean against transparent black; alpha comes back out hard, because the source has no partial alpha anywhere and a 32-px frame with soft edges reads as fog. Strays with no orthogonal neighbour are dropped — the halo of spikes is the part that does not survive a 4x reduction, and what reads as a crown at 128 reads as dirt at 32.
Fifteen tints from one animation. Luminance is mapped onto a five-stop ramp
per element and tier, so the skull’s lit brow and its eye sockets survive into
every variant instead of flattening to two tones. The ramps are sampled off
the crystal icons already in public/ rather than invented, so a Knell is the
colour of the Shard it doubles. Two are nudged: Ember redder and Spark
yellower, because straight off the icons they came out the same orange and
“which element just went off” has to be answerable in one frame.
The stone was tinted and a mark cut into it. Five marks — flame, snowflake, mountain, bolt, cyclone — drawn at 8x and thresholded rather than typed out as pixel maps, so their symmetry cannot drift when one is edited. The stone body is held to the ramp’s middle: a Knell should read as carved rock in the bag and save the lurid colour for the strip. Each mark gets a one-pixel groove under it, which is the whole reason one glyph works on all fifteen stones — a bright mark alone vanishes on a pale Frost, a dark one vanishes on a near-black Pyre, and a mark with a shadow under it survives both.
Wind takes a spiral rather than the three hooked streaks of the weather glyph. Below about twenty pixels each hook either merges with its own line or runs off the box; a spiral is one stroke all the way round, and this element’s tiers are Zephyr, Squall and Cyclone anyway.
The utility runes — public/item-{heal,haste,mire,aegis,fury}-rune.png
Source: CraftPix.net, standard (non-Enterprise) licence — https://craftpix.net/file-licenses/
Three 32 x 32 originals: a rounded nugget (Icon8), a faceted gem (Icon12)
and a flat slab (Icon17). Same licence, grant and limit as the Knells and the
spell effects above — including the public-repository warning, which reaches
the recolours as well as the originals. The three are not committed;
tools/fx/src/ is gitignored.
Five files, generated by tools/fx/gen_rune_art.py alongside the Knells.
What was changed
Grey, and not by accident. Fifteen elemental ramps have between them taken red, blue, pale blue, amber, violet, magenta, navy, silver and dark brown. What is left unclaimed is grey, green and teal — so these five are grey rock with a coloured mark, which is exactly what Life and Recall already are. The family reads as the older, plainer shelf it belongs to, and the mark carries the meaning rather than the colour: greens and teals for the four that help you, acid yellow-green for the one that does not.
The marks are drawn, not sourced. Cross, triple chevron, hourglass, shield, three claw slashes — the same 8x-and-threshold construction as the elemental glyphs, with the same one-pixel groove underneath, so one mark stays legible on a pale nugget and on the near-black slab alike. The shield is drawn as an outline: filled solid at fifteen pixels it reads as a gemstone.
Bodies are assigned by role, not by looks. Mending and Aegis share the nugget, Swiftness and Mire share the gem, and Fury gets the slab to itself — it is the one-off, the expensive one, and the only one with a drawback, so it is the only one that does not look like anything else in the bag.
The crystal auras — public/fx-aura-*.png
Source: CraftPix.net, standard (non-Enterprise) licence — https://craftpix.net/file-licenses/
A sixteen-frame “Leaf Shield” particle animation at 720 x 720. Same licence,
grant and limit as everything else on this page, public-repository warning
included, and it reaches the recolours. Not committed; tools/fx/src/ is
gitignored.
Six files, generated by tools/fx/gen_rune_art.py, each 256 x 32 — eight
frames in one horizontal strip. Five for the utility crystals and a sixth,
lilac, for the Recall Crystal, which had shipped years earlier with no visual
of any kind.
What was changed
Sixteen frames became eight. Frames 9-16 of the source are a byte-identical copy of 2-8 with only frame 1 differing, so the loop is eight long and shipping sixteen would have doubled every file to say the same thing twice.
720 became 32, from a centred 560-pixel crop. The motes range over roughly the middle 560 of the frame; reducing the raw 720 would have spent a quarter of every tile on empty margin.
Coloured by ALPHA, not by the source’s own colour — the opposite of how the Knells were done, and the exception exists for a concrete reason. The source draws its motion trails as near-white at low opacity, so mapping luminance the usual way sent every trail to the top of the ramp and all five palettes came out with the same grey smear through them. Alpha already encodes what the ramp wants to know — faint edge or solid core — so it drives the colour directly, and the Fury aura ends up with no grey in it anywhere.
Six colourways, and Mending is not green. Protective keeps the leaf green it was drawn as; Fury is reds into violet and is the only one of the five with neither a green nor a blue in it, which is the point. The big heal takes pale gold rather than a second green, because Protective and Mending would otherwise be two green flickers around the same character.
Alpha is kept SOFT here, unlike every other generated sheet in this repo. The Knell is hard-edged pixel art and had to stay that way; an aura is light around a character, and light with a one-bit edge reads as a sticker.
Sidebar button icons — public/icon-*.png
The five buttons at the top of the docked sidebar — Build, Skills, Equipment,
Backpack and Quest — are 16x16 pixel icons: icon-build.png, icon-skill.png,
icon-eq.png, icon-backpack.png, icon-quest.png.
icon-atk.png joins them on the same 16x16 grid: the crossed-swords glyph on
the attack-nearest button, which replaced a procedurally drawn pair of blades.
icon-options.png (Etap 73) is the gear on the OPTIONS button — on the map’s
bar in the docked sidebar, in the phone menu and in the ≡ column. Drawn for
Xebeka in code on the same 16x16 grid, in the black, grey and white of its
row; no third-party source.
icon-battle.png (Etap 91) is the battle mark: two crossed swords that show
while a fight blocks logging out — on the STATUS bar in the docked sidebar, and
after the location on the phone and in the floating HUD. Drawn for Xebeka in
code on the same 16x16 grid, silver blades with gold hilts; no third-party
source.
Four more, on the same grid, for the combat controls:
icon-chase.png,icon-stand.png— a running figure and a standing one, the two faces of the chase toggle. They replaced the words CHASE and STAND, which were the widest labels on the phone’s utility row.icon-skull-white.png,icon-skull-red.png— the PvP marks. Both are drawn twice over: as the switch that says whether you mean to fight other players, and beside the head of somebody who already has.
The chase and stand figures are drawn in black and two greys, so on a button
face they are re-coloured at runtime — the alpha channel is used as a stencil
and flood-filled with the state’s colour (stencil() in src/ui/icons.ts).
The shape is the file’s; only the colour is the interface’s. The skulls are
already coloured and are drawn as they were authored.
Drawn by the project author. Original work, no third-party licence attaches to them, so they carry no attribution or redistribution conditions.
They are drawn at whole multiples of their 16px source only — 1x, 2x or 3x
depending on display and device pixel ratio — with image smoothing switched
off, so the pixels stay square. ICON_SRC in src/ui/icons.ts is the one
number that says what grid they are authored on.
If a file fails to load, the button falls back to a procedural glyph drawn with
plain rectangles (GLYPHS in the same file). An empty button would be worse
than a plain one, so those shapes are kept rather than deleted.
Home-screen icons
icon-192.png, icon-512.png and icon-maskable-512.png are the icons the
launcher shows once Xebeka is installed from the browser, listed in
public/manifest.webmanifest.
The X emblem, by the project author — the same mark the website uses as its favicon, snapped to a 24x25 pixel grid and set on the website’s sea colour at a whole multiple of its size. Original work, no third-party licence attaches, so they carry no attribution or redistribution conditions.
The maskable variant keeps its art inside the middle 80% of the square, because a launcher is free to crop a maskable icon to a circle, a squircle or a rounded square depending on the platform, and anything outside that safe zone may be cut off.
Black Annis — public/mob-black-annis-walk.png, public/mob-black-annis-dead.png
Source: Universal LPC Spritesheet Character Generator, CC-BY-SA 3.0 — the same terms and the same ShareAlike obligation as every other LPC creature here. See the LPC section above for the full attribution list and the per-layer note.
Reproducible generator URL (paste it in and the exact character loads):
Layers used: blue body, blue elderly female head, blue angry expression, black extra-long hair, blue straight nose, red eyes, leather cardigan, leather plain skirt, black sandals, black bauldron.
The palette is doing a job here rather than only describing her. The county never described anything about Black Annis except the colour of her face, so the skin, nose and expression are all the same blue and the clothes are all leather — and in a room lit by six fires and painted in cold stone she is the only WARM thing on the screen. That inversion is deliberate: outside is brown and dead, inside is blue and dead, and she is brown in the middle of the blue.
Cutting method
The standard recipe, unchanged: rows 8-11 of the full export are the walk (up, left, down, right, nine frames each) and row 20 is the death sequence, whose last frame is the corpse. One crop rectangle is shared by all thirty-six walk frames and kept symmetric about the source cell’s centre line, x=32, so the body cannot drift as the cycle plays or as it turns. She carries no weapon and no shield, so nothing pushes the crop wide: it comes out at 38 x 50 per frame, the narrowest of the three bosses. The corpse is 38 x 35, cropped to the body. Nothing was recoloured, rescaled or redrawn.
The effigy icon
item-hair-effigy.png is not LPC. It is Radek’s own artwork, drawn for
this game and shipped unchanged — see “Relic and jewellery icons” below, where
it is the one of the three relic icons that carries no third-party terms at
all.
It replaced a procedural stand-in that was generated by a script in tools/.
That script has been deleted rather than kept: a generator whose output path
now holds hand-drawn artwork is a loaded gun, and the first person to run the
whole tools/ directory would overwrite the icon with a drawing of it.
The mask trick that produced the redcap’s cap and Kárr’s helm was no use for this one either way — the effigy is not a thing the character is wearing, so there is no layer to stencil it out of. What the icon draws is the decoy itself: the plaited black hair, the red of the leathers, and a green face, which is the county’s “livid blue” read one turn round the colour wheel.
Dane Hills and Annis’ Bower — public/danehills-terrain.png, public/bower-terrain.png
Both are flattened “Export as Image” pictures out of Tiled, at native tile size:
blackannispowieschnia.tmx (90x90, 2880x2880) and blackanni-1.tmx (30x30,
960x960). The tilesets painted into them (32x32_DEMO, MainLev2.0,
MainLev2.0hhh, Water_tafle_4A) are commercial assets held under the
project’s own licences; the .tsx files and source sheets are NOT in this
repository, only the flattened pictures. Everything standing on top — live
trees, dead wood, felled wood, tents, skull poles, boulders, campfires — is the
prop-* set already credited above.
Black Annis — the folklore behind lore.blackannis
The chronicle is written for the game, not quoted from anywhere, but the facts in it are all attested and worth being able to trace. The sources used:
- the cave in the Dane Hills, the pollard oak growing from a cleft above it, the claim that she scooped the bower out of the sandstone with her nails, and the small windows on the cottages around Leicester — Katharine Briggs, A Dictionary of British Folk-Tales, and the correspondence in the Leicester Chronicle of 1874;
- her first appearance in print — John Heyrick’s poem, 1794, quoted in John
Nichols’ History and Antiquities of the County of Leicester, which is where
the “livid blue” face and the talons come from and why
lore.title.blackanniscarries that date; - the Easter Monday drag hunt from her bower to the mayor’s door, with a dead cat soaked in aniseed, running from 1668 to 1842;
- the two competing origins — Anu/Danu by way of T. C. Lethbridge’s Gogmagog: The Buried Gods, and Agnes Scott the anchoress by way of Ronald Hutton’s The Triumph of the Moon, which rejects the goddess reading;
- the locals filling the cave in during the nineteenth century, which is the
last beat of the page and the reason
resist.earthis her weakness.
No text is reproduced from any of them. The page is told in the game’s own beats and the Polish is the primary, with English and Spanish rebuilt to the same beat count rather than translated line by line.
Asterion, the Minotaur — public/mob-asterion-walk.png, public/mob-asterion-dead.png
Source: Universal LPC Spritesheet Character Generator, CC-BY-SA 3.0 — the same terms and the same ShareAlike obligation as every other LPC creature here. See the LPC section above for the full attribution list and the per-layer note.
Reproducible generator URL (paste it in and the exact character loads):
Layers used: muscular build, fur-tan body, fur-tan minotaur head, neutral fur-tan expression, iron gloves, red legion skirt, mace, solid red cape, red sandals, red epaulets, green stud ring, copper simple necklace, red cuffs.
He is deliberately built out of the SAME generator parts as the four minotaur ranks that walk Crete above him and the Bone Reach’s western descent — same head, same fur — and then dressed in things none of them have: the muscular build, a legion skirt, epaulets, a cape, and metal on both wrists. That is the errand’s whole argument in one sprite. A beast does not put a copper necklace and a green stud on itself. Somebody dressed the thing at the middle of the labyrinth, and the relic the player carries out of there is the ring from its ear.
Cutting method
The standard recipe, unchanged, and run by tools/cut_asterion.py: rows 8-11 of
the full export are the walk (up, left, down, right, nine frames each) and row
20 is the death sequence, whose last frame is the corpse. One crop rectangle is
shared by all thirty-six walk frames and kept symmetric about the source cell’s
centre line, x=32, so the body cannot drift as the cycle plays or as it turns.
The mace swings well clear of the body, which is what pushes the crop out to
52 x 56 per frame — the widest of the four bosses. The corpse is 47 x 38,
cropped to the body. Nothing was recoloured, rescaled or redrawn.
He is the one minotaur in the game that does not share the plain minotaur’s corpse. The other four ranks do, because stripped of crossbow, shield and staff they are the same animal; this one is half again their size and still wearing the cloak, and a boss whose body is indistinguishable from the forty ordinary horns on the island above would undo the fight.
The ring and the earring
item-guard-ring.png and item-minotaur-earring.png are not LPC. Both are
CraftPix.net, standard licence, shipped as purchased — see “Relic and
jewellery icons” below for the pack names and the public-repository warning
that comes with them.
Both replaced procedural stand-ins, and both of those scripts are deleted for the reason given under the effigy above.
The earring’s icon settled a question the item text had left open. The stand-in
drew the ring with a scrap of hide on it; the real one draws the ear — the
whole torn lobe, in the boss’s own fur-tan, with the bronze inside it. That is
the better reading and the item comment in src/items.ts now says so, because
what the player carries to Chronos is not jewellery somebody lost. It is the
part of the animal that proves somebody had been handling it.
The two are also unmistakable side by side in a bag at twelve pixels, which matters because they come out of the same chest: the ring is a banded three-quarter hoop in cold teal and bone, and the ear is a tall warm curl with no straight edge anywhere on it.
Crete and the Labyrinth — public/crete-terrain.png, public/labyrinth-terrain.png
Both are flattened “Export as Image” pictures out of Tiled, at native tile size:
minoqxp.tmx (100x100, 3200x3200) and labiryntmino.tmx (100x100, 3200x3200).
The tilesets painted into them (32x32_DEMO, MainLev2.0, MainLev2.0hhh,
Water_tafle_4A) are commercial assets held under the project’s own licences;
the .tsx files and source sheets are NOT in this repository, only the
flattened pictures. Everything standing on top — olive, limestone, dead wood,
felled wood, tents, poles, boulders, campfires — is the prop-* set already
credited above.
Both collision grids are traced from those same two .tmx files by
tools/gen_minotaur_maps.py, which also places every prop and every creature
post and writes src/world/creteSpec.ts and src/world/labyrinthSpec.ts
whole. Those two files are generated and should not be hand-edited.
The Minotaur chronicle — sources
lore.minotaur is written from the standard classical account and from the
archaeology that argues with it. Nothing is quoted:
- Apollodorus, Bibliotheca III.1 and Epitome I, for Pasiphae, the bull of Poseidon, Daedalus and the labyrinth;
- Plutarch, Life of Theseus, for the Athenian tribute, Ariadne and the thread;
- the excavation of Knossos and the reading of its plan as the origin of the “labyrinth” — the point the page turns on, and the reason its last beats are a question rather than a fact;
- the name Asterion, which is what the sources call the creature before the epithet “Minotaur” replaced it. It is on the corpse and nowhere in Chronos’ mouth, which is deliberate: he tells the player the story they grew up with.
The Polish is Radek’s and is primary; English and Spanish are rebuilt to the same beat count rather than translated line by line. The last four paragraphs of the page — the “three things” that name the fight’s levers — are the only part not in his draft, added because every other boss chronicle ends that way and because they are the only place in the game a player can learn that cold is the answer.
Relic and jewellery icons — item-hair-effigy.png, item-guard-ring.png, item-minotaur-earring.png
Three 32x32 item icons, from two different places, and the split matters because only one of the two carries obligations.
The effigy — Radek’s own work
item-hair-effigy.png, the relic Black Annis leaves, was drawn by the
project owner for this game. Not LPC, not CraftPix, not procedural: no
attribution owed to anybody, no ShareAlike, no DRM clause, and nothing in this
file has to travel with it.
What it draws is the decoy itself — plaited black hair, the red of the leathers, and a green face, which is the county’s “livid blue” read one turn round the colour wheel.
The ring and the ear — CraftPix
Source: CraftPix.net, standard (non-Enterprise) licence — https://craftpix.net/file-licenses/
| file | item | pack |
|---|---|---|
item-guard-ring.png |
Guard Ring | craftpix-net-539335-ring-earring-and-amulet-pixel-art-icons |
item-minotaur-earring.png |
Minotaur’s Earring | craftpix-net-530890-chaos-monster-loot-32x32-icons |
The assignment above is read off the artwork: the ring is a ring and comes from the jewellery pack, and the earring’s icon is not a ring at all but a torn ear, which is monster loot. If the two are in fact the other way round in the purchase, swap the rows — it is one edit and nothing in the code depends on it.
Same terms as the dragon and the buildings: commercial use granted outright, no royalty, no attribution owed on a paid product, and the same clause 1.1.3 / 1.2.1 restriction on public source files. The public-repository warning in the buildings section applies to these two files in full. Both ship exactly as purchased — no recolour, no rescale, no redraw; the only change made was re-saving the ring from an indexed palette to RGBA so it matches the other icons in the folder byte-format-wise.
They replaced procedural stand-ins, and those scripts are deleted
All three shipped first as drawings generated by scripts in tools/. Those
scripts are gone, not left in place with a warning. A generator whose
output path holds bought or hand-drawn artwork destroys that artwork the first
time anybody runs the directory, and “do not run this one” is not a safeguard.
The smoke suite asserts all three stay deleted, so one cannot quietly come
back in a later pass.
Gorak — public/mob-gorak-walk.png, public/mob-gorak-dead.png
Source: Universal LPC Spritesheet Character Generator, CC-BY-SA 3.0 — the same terms and the same ShareAlike obligation as every other LPC creature here. See the LPC section above for the full attribution list and the per-layer note.
Reproducible generator URL (paste it in and the exact character loads):
Layers used: muscular build, dark-green body, dark-green male orc head, neutral dark-green expression, charcoal wide pants, steel gloves, steel bracers, steel legion shoulders.
He is deliberately built on the SAME generator parts as the five orc ranks that walk the island above him — same body colour, same head — so the only things telling you which one is the warlord are his size and his steel. The first cut dressed him in leather trousers and iron gloves; that was replaced in the same Etap, because the chronicle claims he is behind more iron than anyone in the game and a sprite in work clothes makes the page a lie.
The legion shoulders sit inside the arm silhouette rather than out past it, so adding all four steel layers left the union bounding box unchanged and the sheet is still 405 x 256. Worth knowing before anyone swaps a pauldron set that does spill.
Cutting method
Rows 8-11 of the full export are the walk (up, left, down, right, nine frames
each) and row 20 is the death sequence, whose last frame is the corpse. One
crop rectangle is shared by all thirty-six walk frames and kept symmetric about
the source cell’s centre line, x=32. Run by tools/cut_gorak.py.
He is the one creature in this repository that is rescaled, and it is the whole reason the script exists. At native size his crop is 32 x 46 — the plain orc’s frame to the pixel, because he is the same generator parts — so he is drawn at 1.4x, 45 x 64 per frame, which is Radek’s forty per cent. The corpse is 48 x 48, cropped to the body and scaled the same way.
The whole assembled sheet is resized in one call rather than frame by frame. The target is chosen so both divisions are exact (405 = 9 x 45, 256 = 4 x 64), which makes nearest-neighbour on the sheet arithmetically identical to nearest-neighbour on each frame: no seams and no chance of two frames rounding differently. 1.4 is not an integer scale, so some source pixels come out one screen pixel wide and some two — visible if you go looking for it, and not at this size on a top-down map. 2x was the only clean alternative and would have made him taller than the tent he stands beside.
He does not share the plain orc’s corpse, which the other five ranks all do. Stripped of axes and crossbows those five are the same animal; this one is half again their size, and a body indistinguishable from the seventy ordinary orcs on the island above would undo the fight.
The Orc Isle and Gorak’s Hall — public/orcisle-terrain.png, public/gorak-terrain.png
Both are flattened “Export as Image” pictures out of Tiled, at native tile size:
orkipowieschnia.tmx (110x110, 3520x3520) and orkiboss-1.tmx (40x100,
1280x3200). The tilesets painted into them (32x32_DEMO, MainLev2.0hhh,
Water_tafle_4A) are commercial assets held under the project’s own licences;
the .tsx files and source sheets are NOT in this repository, only the
flattened pictures. Everything standing on top — wood, stone, dead and felled
timber, tents, totems, boulders, campfires — is the prop-* set already
credited above.
Both collision grids are traced from those same two .tmx files by
tools/gen_orc_maps.py, which also places every prop and every creature post
and writes src/world/orcIsleSpec.ts and src/world/gorakSpec.ts whole. Those
two files are generated and should not be hand-edited.
Unlike every mission ground before it, the island’s export carries no object
layer, so the two doors are chosen by the generator rather than read off the
picture — see the header of orcIsleSpec.ts for the rule they are chosen by.
The Gorak chronicle — no sources
lore.orc is the only chronicle in the game with nothing behind it, and that is
the point rather than an omission. The four before it are the Border ballads,
Grettis saga, the Leicestershire records and Apollodorus; Gorak is Radek’s own
invention, made for this game, and his instruction was to write something
fascinating rather than to borrow a myth and file the name off.
So the page does not invent a past for him. It inverts the form: Chronos has
read everything, and this is the first thing he has no page for. He checks the
way a time traveller would — forward rather than back — and the banner is not
in the future either, which leaves him two readings and a choice about which
one to make true. lore.title.orc carries no date where all four before it do.
All six of Chronos’ lines for this errand are Radek’s Polish, verbatim. The only line added to them is the door number at the top of the offer, because he has counted every door since Hermitage. English and Spanish are rebuilt to the same beat count rather than translated line by line. The last four beats of the chronicle are the three levers of the fight, added for the reason every other boss page ends that way: they are the only place in the game a player can learn that the dark is the answer.
Gorak’s tusk and the Health Ring — item-gorak-tusk.png, item-health-ring.png
Source: CraftPix.net, standard (non-Enterprise) licence — https://craftpix.net/file-licenses/
Same terms as the dragon, the buildings and the two icons above: commercial use granted outright, no royalty, no attribution owed on a paid product, and the same clause 1.1.3 / 1.2.1 restriction on public source files. The public-repository warning in the buildings section applies to both of these files in full.
item-health-ring.png ships exactly as purchased; the only change made was
re-saving it from an indexed palette to RGBA so it matches the other icons in
the folder, which is the same one change the Guard Ring got.
item-gorak-tusk.png is recoloured, the first bought icon in the
repository to be (the shelf’s two rings, below, followed it). The purchased artwork is a warm brown horn whose drawing is
carried entirely by its luminance ramp; tools/recolor_gorak_tusk.py measures
each pixel’s luminance, normalises it across the icon’s own range and looks the
result up in a bone ramp. Shading, edges, dither and alpha come through
untouched and only the hue moves — repainting it by hand would have been a
different drawing, not a recolour.
That script takes its source path as a required argument rather than a default, and the smoke suite asserts it. The rule set in Etap 53 is that no generator may destroy bought artwork the first time somebody runs the tools directory; this one writes to exactly such a path, so it is made incapable of running without the file it is meant to be transforming.
Grizelda’s shelf — item-fang-necklace.png, item-horn-necklace.png, item-trophy-necklace.png, item-stalker-ring.png, item-bowyer-ring.png, item-warden-ring.png, item-huntress-signet.png, item-blessing-scroll.png
Source: CraftPix.net, standard (non-Enterprise) licence — https://craftpix.net/file-licenses/
Same terms as the Health Ring above, and the public-repository warning in the buildings section applies to all eight files in full. They were supplied as 32x32 PNGs under the names in the right-hand column.
| file | item | supplied as |
|---|---|---|
item-fang-necklace.png |
Fang Necklace | icons_8_43.png |
item-horn-necklace.png |
Horn Necklace | icons_8_46.png |
item-trophy-necklace.png |
Trophy Necklace | icons_8_50.png |
item-stalker-ring.png |
Stalker’s Ring | icons_8_10.png, repainted |
item-bowyer-ring.png |
Bowyer’s Ring | icons_8_05.png |
item-warden-ring.png |
Warden’s Ring | icons_8_06.png |
item-huntress-signet.png |
Huntress’ Signet | icons_8_17.png, repainted |
item-blessing-scroll.png |
Huntress’ Blessing | bless.png |
Six ship exactly as supplied, re-saved as RGBA. Two are recoloured by
tools/recolor_shelf_rings.py, with the tusk’s method (a luminance ramp, so
only the hue moves): icons_8_10.png is the very picture item-health-ring.png
wears, so the Stalker’s Ring keeps every pixel of it and moves to green; the
Signet’s red band moves to gold, its green stone and its outline untouched.
The Golden and Vampire sets — item-golden-{helm,body,legs,boots,shield}.png, item-vampire-{helm,body,legs,boots,shield}.png, item-sunspear.png, item-bloodletter.png
Source: CraftPix.net, standard (non-Enterprise) licence — https://craftpix.net/file-licenses/
Twelve 32x32 item icons: the tier-7 armour added in Etap 64, and its shields and weapons added in Etap 66, bought from CraftPix like the rest of the set icons. The pack they came from is not recorded yet; its name belongs on this line once it is read off the purchase.
Same terms as the dragon, the buildings and the icons above: commercial use granted outright, no royalty, no attribution owed on a paid product, and the same clause 1.1.3 / 1.2.1 restriction on public source files. The public-repository warning in the buildings section applies to all twelve files in full.
All twelve are modified, under the adaptation right of clause 1.1.1:
- Recoloured, one ramp per set. The purchased Golden set mixed orange, red, gold and grey from piece to piece; every colour now maps onto a single gold ramp, with one ruby accent on the helmet’s crest and the gem on the breastplate. The Vampire set was teal, with cream legs; it is now a black ramp with blood red on the visor slit, the chest gem, the knee guards and the rim of each boot. Silhouette and shading steps are untouched: every colour was swapped one for one, and only the Vampire’s red accents were placed by position — the visor slit (outline-dark in the purchase), the lit edge of the chest gem and the band at the top of each boot.
- The boots are a pair. The purchase draws one boot per set, where every
other set in the game shows two. The boot was shrunk to about two thirds of its
width by dropping whole rows and columns of the drawing (never resampled),
given a fresh one-pixel outline and mirrored for the left foot, with the
right one set two pixels lower — the arrangement every other pair in
public/uses. - The shields and weapons (Etap 66) went onto the same ramps. The Golden Shield was quartered red and teal: the teal quarters are gold now and the red ones ruby, with the emblems on the gold quarters lifted a step so they still read against them. The Sunspear’s shaft is gold and its red streamer ruby. The Vampire Shield is black with a blood-red rim where the purchase had brown and gold, and the Bloodletter — a fiery orange blade on a teal grip in the purchase — is crimson on black.
No script in tools/ produces or rewrites these files, so there is nothing
that could overwrite the purchase by being run.
The Zephyr set — item-zephyr-{helm,body,legs,boots}.png
Source: CraftPix.net, standard (non-Enterprise) licence — https://craftpix.net/file-licenses/
Four 32x32 item icons, the speed set added in Etap 65, cut from the purchase’s
icons_14_01 (mask), icons_14_11 (tunic), icons_14_33 (legs) and
icons_14_41 (boot). Same terms, same clause 1.1.3 / 1.2.1 restriction and
the same public-repository warning as every CraftPix entry above.
All four are modified, under the adaptation right of clause 1.1.1:
- Recoloured onto one sky-blue ramp and one white one, where the purchase was peach and cream with red stripes, teal and brown. Colour for colour, except on the legs: there the browns become a white belt at the waist and white wraps below the knee, and blue in between.
- Wings added, drawn by hand in the same outline and palette: one pair on the mask, one small wing on the ankle of each boot.
- The boots are a pair, made the way the Golden and Vampire pairs were: whole rows and columns dropped, a fresh outline, mirrored for the left foot and the right set two pixels lower.
No script in tools/ produces or rewrites these files either.
The Hunter set — item-snakeskin-{helm,body,legs,boots}.png
Source: CraftPix.net, standard (non-Enterprise) licence, like the rest of the set icons — same terms, same clause 1.1.3 / 1.2.1 restriction and the same public-repository warning as every CraftPix entry above.
The four pieces of what was the Snakeskin set, recoloured in Etap 67 when it became the Hunter set, and settled on a green-and-brown forest look: a forest-green hood, a green jerkin with brown panels and tan lacing, green leggings over brown wraps, green shoes on brown soles. Colour for colour, under the adaptation right of clause 1.1.1, with two things drawn in by hand in the same outline: a red feather tucked into the hood, and a quiver strap with a gold buckle across the jerkin. The files keep their snakeskin names, as the item ids do.
item-snakeskin-shield.png, the Snakeskin Buckler, is retired: no item uses
it any more, and it stays on disk only because the upload path cannot delete.
Everything else
All remaining artwork is procedural — baked at runtime from character maps in
src/gfx/sprites.ts and src/gfx/adventurer.ts, with no external files. The
baked sprites also remain the fallback for every PNG above: if an image fails
to load, the game draws its procedural stand-in instead.