Skip to content
Felucca Online

Docs

UO Renaissance objects (statics and items)

The catalog of world objects to bake as sprites: housing pieces, furniture, lights, crafting stations, decoration, dungeon and civic props, nature, and items lying on the ground. It covers what a player saw in Britannia around the Renaissance release (2000): pre-made houses and keeps, towns, dungeons, the Lost Lands. It is our own modelling of those object types (no UO art is used). The ground terrain is in uo-base-tiles.md.

Every object is a procedural Blender script baked by uo-baker (format: sprite-format.md, pipeline: asset-pipeline.md). Each group owns a manifest file assets/manifest.d/<group>.toml and a script folder tools/blender/models/<group>/; shared helpers are in tools/blender/models/object_kit.py. Review with python3 tools/gallery.py --group assets/manifest.d/<group>.toml -o sheet.png.

Conventions

  • Scale (1 unit = 1 tile): human 1.8, wall 2.12 (48 px storey), door 1.89 (42 px), chair seat 0.45 / back 1.0, table top 0.77 (level 17), counter 1.0 (level 22), bed top 0.5, bookcase/armoire 2.0, barrel 0.9, chest 0.5, candle 0.15.
  • Facings: objects with a front bake directions = 4 (frames North, East, South, West; the model is built facing south, −Y). UO had separate art per facing; the client picks the frame. Wall-mounted items (paintings, sconces, shelves) are built against the north edge facing south: the South frame hangs on a north (x) wall, the East frame on a west (y) wall.
  • Walls and fences follow the wall convention (decision #16, #22): a piece sits inside its tile, flush with the north edge (_x, runs east–west) or the west edge (_y), corners/posts at the north-west corner; origin at the tile centre.
  • Multi-tile objects: origin at the centre of the north-west-most tile, the object extends east (+X) and south (−Y); manifest footprint = [w, h]. Multi-tile objects with a front (marked 4 below with a footprint) are baked as two assets instead of four facings, <name>_s and <name>_e (front south / east, footprints [w, h] / [h, w]), as UO did.
  • Pixel art: every model sits on the texel lattice (pixel_kit.py, decision #60, rules in docs/asset-pipeline.md). Silhouettes bold, details whole texels, colour contrast over fine geometry; muted, warm UO palette (object_kit.PALETTE).

Legend: 4 = 4 facings; WxH = footprint; p: = one script, assets selected by params.

Wave 1

walls — housing wall sets (wall_<material>_<piece>)

One script per material (tools/blender/models/walls/wallset_<material>.py), the piece picked by params = { piece = "..." }. Pieces: x, y, corner, post, window_x, window_y, doorway_x, doorway_y (doorway = opening for a door sprite, 12 texels wide × 42 levels high). Height 48 levels (one storey, 2.12 units), 2 texels thick.

The full sets (all but cave and palisade) also have the pieces the building generator (crates/uo-buildings, #101) orders in assets/requests/wall-pieces.md, built by walls_kit from each set's own wall and post code (decision #102):

  • diag_a (/, north-east to south-west: a camera-facing horizontal run) and diag_b (\, edge-on), plus _window variants: full height, run between the corner posts of the wall grid (1 texel inside the north and west tile edges), so they meet the straight walls and posts of a cut corner exactly; the frame is sheared (2 texels thick along Y, ends on X planes), so it stays on the lattice and joins the next diagonal tile. Window u -3..3 (8.5 texels along the slant). They block their tile, no edge. Their outlines sit on half-pixel rows and stay softer than straight walls.
  • low_x, low_y, low_corner, low_post: parapets of balconies and terraces, the set's wall cut at level 16 under a 2-level coping (posts cap one level higher).
  • slit_x, slit_y: an arrow slit 2 texels wide at levels 22..36 through the back half of the wall, splayed one texel and one level on the front half.
  • crenel_x, crenel_y, crenel_corner, crenel_post: tower-top parapets, solid to 10 under a string course to 12, merlons 12..22 capped to 24, 4 texels merlon and 4 gap (x runs at u -8..-4 and 0..4, y runs mirrored), so both runs have a merlon at the north-west corner and the corner piece an L-shaped corner merlon; posts are merlons.
MaterialLook (UO houses / places)Pieces
stonegrey cut ashlar blocks (stone house, tower, keep, castle)all 22
brickred brick with mortar, stone sill/lintel (brick house)all 22
woodvertical/horizontal planks on a frame (wooden house, shops)all 22
logstacked round logs with notched corners (log cabin)all 22
plasterwhite plaster with dark timber framing (two-story plaster, Tudor)all 22
sandstonetan sandstone blocks (sandstone patio house, desert towns)all 22
marblepolished white marble, pilasters (villa, Nujel'm palace)all 22
fieldstonerough round fieldstones in mortar (fieldstone house, farms)all 22
dungeondark rough-cut dungeon masonry, mossy baseall 22
cavenatural rock wall, irregular top (caves, mines)x, y, corner, post
palisadesharpened upright logs (orc forts, camps)x, y, corner, post, doorway_x, doorway_y

doors_fences — doors, gates, fences

SpriteNotes
door_<kind>_<axis>_<state>p: kind ∈ wood, wood_iron (iron bands), dark, light (pale wood), metal, barred (iron bars), secret (stone, flush with a stone wall); axis x/y (in an x / y doorway); state closed/open (open = swung 90° inward on its hinge)
gate_<kind>_<axis>_<state>p: kind ∈ wood (fence gate), iron (wrought iron gate)
fence_<kind>_<piece>p: kind ∈ wood (split rail), picket (white pickets), iron (wrought iron), stone (low dry-stone wall ~0.8), hedge (clipped box hedge ~1.1), rope (posts and rope); piece ∈ x, y, corner, post

furniture

SpriteNotesSpriteNotes
chair_wood4, plain ladder-backarmoire4, tall wardrobe, two doors
chair_fancy4, padded seat and back, carvedarmoire_fancy4, dark wood, carved crown
chair_straw4, rush seat, rusticdresser4, chest of drawers
throne4, high back, red cushion, giltbookcase_full4, rows of coloured books
stoolthree-leggedbookcase_empty4
footstoollow paddedshelf_wall4, wall shelf with jars/pottery
bench_wood4, plain benchnightstand4
bench_fancy4, backrest benchchest_wood4, iron-bound wooden chest
table_smallsquare side tablechest_metal4, metal chest with rivets
table_writing4, desk with ink and paperchest_fancy4, gilt treasure chest
table_long4, 2x1, plain long tablestrongboxsmall iron box
table_large2x2 heavy dining tablebox_woodsmall wooden box
table_roundround pedestal tablecrate_smallsmall crate (crate exists)
counter4, shop/bar counterbarrelclosed barrel
bed_small4, 1x2, single bedbarrel_openopen barrel with water
bed_large4, 2x2, double bed, canopy postskegbarrel on its side on a cradle
bedroll4, rolled-out bedrollbasketwicker basket
dressform4, tailor's dummybasket_roundround basket with apples
screen4, folding screencradle4

lights_crafting — light sources and crafting stations

SpriteNotesSpriteNotes
candlesingle lit candle (emissive)forgestone forge with glowing coals
candlescluster of candlesforge_large4, 2x1
candlesticktable candlestickanvil4
candelabra3-arm table candelabraloom4, with cloth on it
candelabra_standtall standing candelabraspinning_wheel4
lamp_poststreet lamp post with glass lanternflour_mill2x2, millstone and sacks
lanternlantern on the groundoven4, stone oven/hearth
lantern_wall4, lantern on a wall bracketwater_trough4, 2x1
sconce_wall4, candle sconcescalemerchant scales
torch_wall4, wall torchdye_tubtub of dye
torch_standingtorch on a polecooking_potpot on a tripod over a fire
brazier_talltall iron brazierhide_stretcher4, hide on a frame
campfirelogs, flames, stone ringtraining_dummy4
fireplace_stone4, 2x1, stone fireplacearchery_butte4, straw target
fireplace_brick4, 2x1pickpocket_dip4, dummy with a pouch
sawhorse4, carpentry sawhorse with a plank

decor_home — household decoration

SpriteNotesSpriteNotes
rug_red1x1 patterned rugglobeglobe on a stand
rug_blue_large2x2hourglass
rug_furbear-skin rug, life size (2 x 2 tiles, ≈ 2.2 m, #83)bookspile of books
painting_portrait4, walllectern4, open book on a stand
painting_landscape4, wallscrollspile of scrolls
tapestry4, wall hanginggobletsgoblets and a jug
banner4, heraldic wall bannerdinner_setplates of food
statue_smallfigure on a pedestalkettle
statue_large1x1, life-size human statuewine_rack4, wall rack with bottles
bustbust on a columnbottlesgroup of bottles
vaseflour_sack
urnlarge amphora/urnsackspile of grain sacks
potteryjars and potswheat_sheaf
potted_planthay_bale
potted_flowerspitcher_bowlwater pitcher and bowl
flower_vasebirdcageon a stand
harpstanding harplutelute leaning
drumchess_table4, table with a chessboard

civic_dungeon — town, graveyard, dungeon and magic

SpriteNotesSpriteNotes
wellstone well with roof and bucketchains_wall4, shackles on a wall
fountain2x2 stone fountain with wateriron_maiden4
signpost4, crossroads signpostguillotine4
shop_sign4, hanging sign on a bracketstocks4
gravestone_crossgallows4, 2x1
gravestone_roundmoongateblue emissive gate
gravestone_obeliskmoongate_redred (Felucca)
coffin4, closedteleporterglowing floor glyph
coffin_open4, with skeletonstalagmite
sarcophagus4crystalsemissive crystal cluster
altar4, stone altar with clothmine_cart4, with ore
pentagram3x3 floor pentagrammine_railsp: x/y rail piece
ankh_shrine4, 2x1, large ankh (virtue shrine)tent2x2 canvas tent
bone_pilemarket_stall4, 2x1, awning
skeletonlying skeletoncobweb4, corner web
skullspile of skullsgibbet4, hanging cage

nature — trees, plants, rocks

Trees, bushes, shrubs, ferns, tall grass, flowers, mushrooms and the single rocks are built from the Quaternius CC0 nature packs (decision #74): tools/blender/models/nature/packs.py imports the converted models in assets/models/nature/ (one pack model per variant, the client picks one per tile), scales them to real size (1 unit = 1 m: grown trees 10-17 m, apple 6.5-8, sapling 3.5-4.5), cuts them at the ground and recolours the leaf cards per species. tree_willow adds hanging leaf-card curtains to a pack crown. rocks (cluster), mushroom_giant, cacti, reeds, vines, lily pads, stump and logs stay procedural (plants.py, rocks.py; the procedural trees.py is retired). Trees keep footprint = [1, 1] (the trunk's tile). Every tree with leaves (all but tree_dead) has bare = true: its bare twin in bare/ is the same variant without leaves and fruit, which the client shows while the crown is hidden near the player (decision #98).

SpriteNotesSpriteNotes
tree_oakbroad crownbushround bush
tree_ashbush_flowering
tree_birchwhite barkshrubsmall
tree_walnutfern
tree_willowdroopinggrass_talltuft of tall grass
tree_cedarlayered coniferflowers_red
tree_pinetall coniferflowers_white
tree_yewdark, denseflowers_yellow
tree_palmmushroomscluster
tree_junglebuttress roots, broad leavesmushroom_giantdungeon giant mushroom
tree_deadbare branchescactus_saguaro
tree_applefruit treecactus_barrel
tree_cypressnarrowcactus_pricklyprickly pear
tree_saplingyoung treereeds
rock_smallvines4, wall vines
rock_mediumlilypadson water (flat)
boulderstump
rocksclusterlog_fallen4, 2x1

items_gear — weapons, armour, tools (lying on the ground)

Small items lying flat or propped; read at 32 px by silhouette and colour.

sword_long, sword_broad, katana, dagger, axe_battle, axe_double, mace, war_hammer, spear, halberd, quarterstaff, bow, crossbow, shield_heater, shield_buckler, armor_plate, helm_plate, armor_chain, pickaxe, shovel, hatchet, saw, smith_hammer, tongs, fishing_pole, sewing_kit, scissors, pitchfork, scythe, mortar_pestle, skillet, backpack, pouch.

Wave 2

items_goods — resources, reagents, potions, food

ingots (p: iron, copper, gold, silver), ore_pile, logs_pile, boards, hides, cloth_bolt, gems, gold_coins; reagents reg_black_pearl, reg_mandrake, reg_garlic, reg_ginseng, reg_nightshade, reg_spider_silk, reg_sulfurous_ash, reg_blood_moss; potion_<colour> (p: red, yellow, orange, purple, green, black); food bread, apples, cheese, ham, fish, pie, wine_bottle, ale_mug, meat_leg, carrots.

roofs_stairs_floors

Roofs roof_<material>_<piece> (p: material ∈ slate, thatch, shingle, tile; piece ∈ slope_s, slope_n, slope_e, slope_w, ridge_x, ridge_y, corner_se, corner_sw, corner_ne, corner_nw). Roof contract: a piece's base is at Z = 0 and the client places it at wall height; slopes rise 32 levels across a tile (ROOF_COURSE = 32 px ≈ 1.41, a 55° pitch, so course edges draw as 1:1 lines or verticals; slope_s low on the south edge), so each further course of roof tiles sits 32 px higher; the roof script takes rise for other pitches. Stairs stairs_<material>_<piece> (p: wood, stone; step_s, step_e, block; one tile rises 12 levels, four tiles = one 48-level storey); floors floor_<material> (stone, marble, marble_checker, wood_light, wood_dark, sandstone, brick, carpet_red, carpet_blue, carpet_gold).

misc_extra — mechanisms, magic, shops, harbour, seasonal

SpriteNotesSpriteNotes
trap_spikesfloor spike trap (raised spikes)weapon_rack4, wall rack with weapons
trap_platepressure platearmor_stand4, stand with plate armour
lever_wall4, wall levershield_display4, wall with crossed swords and shield
switch_floorfloor switchdisplay_case4, glass-topped case with goods
spellbook_stand4, open spellbook on a standanchorship's anchor lying
crystal_ballon a stand, faint glowrope_coil
magic_orbglowing orb on a pedestalfishing_netnet heaped with floats
runebookrune book lyingdock_planksp: x/y, plank deck tile
rune_stonerecall rune on the grounddock_postmooring post
alchemy_table4, table with flasks and burnerbuoy
cauldroniron cauldron on legs, bubbling (faint glow)ship_wheel4
treasure_pileheap of gold and gemschristmas_treedecorated tree
gold_ingot_stackpumpkin
skull_candleskull with a candlejack_o_lanterncarved, glowing
bell4, hanging bell on a framesnowman
clock4, grandfather clockgift_boxwrapped present

Status

All groups baked, reviewed in contact sheets and committed on feat/uo-objects (484 sprites; 610 with the diagonal, low, slit and crenel wall pieces of #102). Review a group with python3 tools/gallery.py --group assets/manifest.d/<group>.toml -o sheet.png.

GroupSpritesNotes
walls20811 materials; diagonals, low walls, slits, crenels for the 9 full sets; doorways meet the doors contract; cave repeats one rock profile per tile (variants later)
doors_fences60door leaves fit the doorways; gates hinge on the fence post (y gates at the north end)
furniture41table_long, bed_small, bed_large as _s/_e
lights_crafting35fireplaces, forge_large, water_trough as _s/_e
decor_home36wine_rack stands against the wall; lute lies flat
civic_dungeon36ankh_shrine, gallows, market_stall as _s/_e; mine_rails_x/y
nature37log_fallen_x/y; giant mushroom spots glow faintly
items_gear33
items_goods35ingots_<metal>, potion_<colour>
roofs_stairs_floors5610 roof pieces × 4 materials (no separate ridge cap between back-to-back slopes yet)
misc_extra33dock_planks_x/y

Weakest reads noted in review (candidates for a polish pass): gravestone_cross, skulls/bone_pile detail, iron_maiden face, cobweb, cactus_prickly, tree_jungle crown, flour_mill hopper, cheese wedge, ship_wheel, armor_stand, helm_plate.

UO objects: a selection

In the client

The client places objects as uo_proto::objects::StaticObjects (sprite, tile, absolute z, facing) on a static layer of impostors; see docs/rendering.md › Static objects.

Demo village

The offline demo (crates/uo-client/src/village.rs) is a village of 90 x 56 tiles in the middle of a 128 x 128 map that places every object of the catalog (a test checks it against assets/manifest.d; 2222 statics of 484 sprites):

BuildingWallsStoreys, roofInside
player's homestone1, slatetable set for dinner, fireplace, bed, bookcase; secret back doors
tavernwood2, shingle (ridge)bar with kegs and bottles, tables, musicians; inn rooms above
mage towermarble3, tile (ridge)alchemy lab, study with books and globe, archmage's hall with throne
weaverplaster2, thatch (ridge)loom, spinning wheel, dye tub, dress form; bedroom above
bakerybrick1, tile (ridge)ovens, flour mill, sacks, bread and pies
gaoldungeon1, slate (ridge)barred doors, chains, iron maiden, traps, lever
smithyfieldstone1, slatelarge forge, anvil, armour, ingots; metal doors
provisionersandstone2, shingle (ridge)counter with scales and coins, display case; strongroom above
hunter's cabinlog1, thatch (ridge)fireplace, furs, bedroll, bows; open doorways
stockadepalisade—training dummies, archery range (rope fence), tents, camp
minecave—rails, mine cart, crystals, stalagmites, giant mushroom

Around them: cobbled streets and a flagstone plaza (fountain, well, statues, market stalls, bell, a seasonal corner), a justice square (gallows, stocks, guillotine, gibbet), a mage garden behind a hedge (pentagram, moongates, shrines, teleporter), a graveyard behind a wrought-iron fence, a paddock (split rail), a vegetable patch (pickets), a farm field (dry-stone wall), a desert garden, an orchard, a pond with a dock and, in the south-east, a mason's yard with one exhibit per full wall set (crenellated and low corners with their posts, a \ and a / diagonal run, slits in an x and a y wall). All 28 doors, 8 gates, 6 fence and 11 wall sets, 40 roof pieces (ridges come from roofs with an odd short side), 6 stair pieces and 10 floors are used.

  • Storeys: storey s stands at z + WALL_HEIGHT · s (48 px each); its floor covers the interior except the stairwell of the flight from below. A flight is four stair tiles (step_s climbing north or step_e climbing west) rising 12 px each, with stairs_*_block pieces stacked under the higher steps; the top step ends level with the next floor.
  • Wall rings: corner piece on the north-west tile, _x along the north and south rows, _y along the west and east columns, posts at the other three corners; a window on every wall tile whose offset along the wall is 2 mod 3; doorway pieces (with a door, or open) where the plan says. Fences use the same ring with gates replacing pieces.
  • Roofs: uo_proto::objects::hip_roof(material, x, y, w, h, z) gives every tile of a w x h building the piece of its nearest outer edges (slopes, hip corners, ridges), one course (+1.0) higher per tile inwards, eaves at the top storey's wall height. With an even short side the roof is a clean hip without ridge pieces; with an odd short side a ridge runs along the middle row (or column) and its end tiles, where three slopes would meet and the set has no piece, leave a small gable. The village uses both. Roofs and upper storeys hide while the player is inside (UO style).
  • Lights: objects with glowing texels (candles, sconces, braziers, fireplaces, lamp posts, campfires, moongates, crystals) get a point light at their flame automatically; walls (glowing window panes) don't.

The demo village: the plaza by day; the tavern and the three-storey mage tower with roofs off; ground floors only; the gaol, graveyard, bakery and stockade

Follow-ups

  • Open doors swing into the tile they stand on (south for _x, east for _y), so a door in a building's south or east wall opens outwards. Doors opening the other way need a second open state (e.g. open_out).
  • The south and east walls stand just outside the roof's tiles (walls sit on the north/west edge of their tile), so their tops show a 0.09-unit ledge below the eaves on the camera side. A roof edge piece or a wider eave overhang on the south and east would hide it.
  • A hip-end piece (three slopes) would allow hip roofs with an odd short side; gable-end wall pieces would allow gable roofs.
  • Players can't climb stairs yet (walking is 2D on the terrain), so upper storeys are only seen, not visited; RoofView decides what is drawn.
  • Statics are client-side only (the demo builds them); the server still has to own and send them (a statics list in Welcome or per region), and multi-tile blocking should come from the manifest footprint.
  • Seasonal or rare variants of statics (e.g. cave walls) could use variants = N like the ground tiles; the client already picks a variant per tile for such sheets.