Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
0.1.10.110021 - Alpha

I've added the clay tiles and timber roof trim I've been trying out on the Rye cottages.

- Build with weathered clay tile slopes and matching ridge caps. The slopes turn hips
and valleys like the existing roofs.
- Hang the same tiles on gables and upper walls. Thin panels line up with half-depth
timber walls and leaded windows.
- Finish straight eaves with dark oak fascia boards. Matching verge and ridge end pieces
give a projecting gable a continuous timber edge and a thin underside.
- Start with bricks and sticks, then turn the slopes into ridge caps, trim or hanging
panels. The clay pieces are in the Late Medieval & Tudor palette.

0.1.8.110021 - Alpha

This update adds openable leaded windows and tidies up the timber framing. The village
Expand Down
6 changes: 4 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,9 @@ close studding and diagonal braces. You choose the spacing and pattern, from a m
to a richly framed townhouse. Matching timbers join around corners and through intersections.

All six vanilla wood types are available. Cob comes in blocks, slabs and stairs, and smooth
thatch and slate roofs have automatic corners and separate ridge caps.
thatch, slate and clay tile roofs have automatic corners and separate ridge caps.
Clay tiles also come as full and half-depth hanging panels for gables and upper walls.
Finish clay roofs with timber fascia boards at the eaves and matching trim along the gable and ridge.

Leaded windows bring some light into the houses. Choose diamond or rectangular leading,
match the timber and daub to your walls, then stack sections to make taller casements.
Expand All @@ -35,7 +37,7 @@ floor edges, and matching corner pieces let the overhang continue around the sid

## Getting started

The **0.1.8.110021 alpha** is for **Minecraft 1.10.2 with Forge**. Everything is crafted from vanilla
Iron Age Architecture targets **Minecraft 1.10.2 with Forge**. Everything is crafted from vanilla
ingredients, and the main content families can be enabled or disabled in the configuration.

See the [CurseForge files](https://www.curseforge.com/minecraft/mc-mods/ironagearchitecture/files/all)
Expand Down
4 changes: 4 additions & 0 deletions art/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ Per-material prompt additions:
The historical modeltemplates/ directory retains the 2019 drafts and their authorship.
The new runtime geometry uses local templates and the shared Java roof mesh.

The two 32×32 clay tile sprites were drawn on a pixel grid. The main sprite staggers
four overlapping courses and is shared by the roof and hanging tiles. The cap
sprite shades across the ridge and repeats the joints along its length.

## Timber beam revision

Six new beam-side textures were generated with the built-in image-generation tool for the
Expand Down
27 changes: 20 additions & 7 deletions docs/BUILDING-GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
Permanent building components for the Iron Age series, starting on Minecraft 1.10.2 Forge.
Architecture runs independently of Iron Age Furniture.

Version 0.1.8.110021 contains raw and limewashed cob blocks,
Version 0.1.10.110021 contains raw and limewashed cob blocks,
stairs and slabs; modular wattle-and-daub walls in all six vanilla woods; and smooth
thatch/slate roofs with automatic corners and separate ridge caps, plus jettied-storey walls,
timber floors, support brackets and openable leaded windows. There are 510 visible
thatch, slate and clay tile roofs with automatic corners and separate ridge caps, plus jettied-storey walls,
timber floors, support brackets, hanging clay tiles and openable leaded windows. There are 517 visible
variants including the wood and finish choices. Architecture remains standalone.

## Wattle and daub
Expand Down Expand Up @@ -65,6 +65,16 @@ faces that direction. Adjacent matching slopes form hips and valleys using stair
Ridges run along the direction the player looks; place them one row above the high ends
of the last slopes. Their half-block apex completes the 45-degree roof profile.

For a timber fascia along a straight clay eave, craft a slope with a stick and
place it facing uphill. At a gable, craft a slope with a dark oak plank to make
a verge. Face uphill and click the half that will overhang the wall. Its thin
underside covers a half-block projection. Craft a clay ridge cap with a dark oak
plank for the matching ridge end and place it while looking inward along the ridge.

Use full hanging tiles to fill the stepped gable beneath a clay roof. Thin hanging
tiles share the half-block plane with straight thin timber panels and thin leaded windows.
Place against one of these pieces to inherit its occupied half. Sneak to choose the half manually.

## Leaded windows

Use full-depth surrounds in full walls and half-depth surrounds in thin walls. Both come
Expand Down Expand Up @@ -160,8 +170,11 @@ or six from L-shaped corners. Either inside/outside pattern can be recovered thi
- Three quarter floors in an L: one L-shaped floor. Craft an L-shaped floor alone to recover three quarters.
- One full timber floor plus one stick, shapeless: two full-reach brackets in that wood.
One full-reach bracket alone makes two half-reach brackets; two halves side by side make one full bracket.
- Three wheat above three sticks: six thatch roof slopes. Use stone instead of wheat for slate.
- Three wheat above three sticks: six thatch roof slopes. Use stone for slate or bricks for clay tile.
- Two matching slopes vertically: four ridge caps. Two ridge caps side by side: one slope.
- Craft a clay tile slope alone to turn it into a full hanging panel, or craft the full panel
alone to get the slope back. Two full panels vertically make four thin panels.
Two thin panels side by side rejoin into one full panel.

### Limewashing

Expand All @@ -174,7 +187,7 @@ shaped corners follow this rule too.

The creative tabs follow building eras. **Iron Age** currently holds the shared cob,
plain daub and thatch pieces. **Late Medieval & Tudor** holds the full timber-framed
village kit, including leaded windows, jetties, brackets and slate roofs, along with those shared materials.
village kit, including leaded windows, jetties, brackets, slate and clay tiles, along with those shared materials.
The Iron Age palette is a starting selection; a dedicated roundhouse kit is still to come.

Choose which eras can be crafted in survival in `config/ironagearchitecture.cfg`:
Expand All @@ -200,9 +213,9 @@ switches still apply separately.
All content families are enabled by default. Framed panels require the cob family.
The `blocks.leadedWindows` switch controls both glazing and windows and requires timber
frames and cob. Era recipe filtering is separate from this content switch.
The `blocks.clayTiles` switch controls the clay slopes, ridge caps, trim and both hanging panels.
Thatch and timber-bearing walls burn; plain daub, cob and slate do not. There is no world generation or collapse simulation.

See [development instructions](DEVELOPMENT.md) for builds, Eclipse and disposable runtime checks.
This is an early alpha. Automated checks and manual visual/gameplay review are recorded separately.
The current test world is Horizontal Rails Preview; earlier preview saves are retained separately.
See [the current candidate handoff](HORIZONTAL-RAILS-CANDIDATE.md) for the verification record.
The Rye Roof Trim Preview shows how the fascia and gable trim fit on three houses stepping down a cobbled street.
16 changes: 10 additions & 6 deletions docs/DEVELOPMENT.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ rail search joins structural intersections; vertical/diagonal neighbours supply
The client listener invalidates the dependent render range after updates without polling/ticking.
Walls use full-cell lighting classification with opaque light blocking and non-opaque face culling, so
recessed plaster samples the lit adjacent cell rather than its own dark interior in Forge 1.10.
Roof blocks save facing only. Inner/outer corners and ridge caps derive from same-material neighbours.
Roof blocks save facing. Clay verges also save which half overhangs the gable.
Inner/outer corners and ridge caps derive from same-material neighbours.
Slopes rise one block per block; ridge caps rise half a block and belong one row above the adjacent slopes.
The roof mesh is smooth; collision is a conservative approximation within 1/16 of the surface.
No architectural block needs a tile entity or scheduled ticking.
Expand Down Expand Up @@ -131,7 +132,7 @@ bracket face winding; the native check covers both reaches and every saved direc

EraCatalog supplies both creative membership and survival recipe eligibility. Basic cob,
plain daub and thatch are shared by Iron Age and Late Medieval & Tudor; timber framing,
jetties, brackets and slate belong to the latter. Add future palettes to Era and assign membership
jetties, brackets, slate and clay tiles belong to the latter. Add future palettes to Era and assign membership
in the catalog. Shared items expose every relevant creative tab through their Item implementations.

ArchitectureConfig parses recipes.survivalEras at startup. All recipe registration passes through
Expand Down Expand Up @@ -163,7 +164,7 @@ resource generator and item tooltips.

Run scripts/invoke-runtime-probe.ps1 after prepareProbe. Modes cover core, reload, furniture,
disabled, windows-disabled, legacy, legacy-daub, legacy-jetties, iron-age, late-medieval,
mixed-eras, no-eras and invalid-era.
mixed-eras, no-eras, invalid-era, clay-disabled and clay-only.
Only Forge/server libraries and the explicitly named Furniture JAR are read from retained runtimes;
no existing worlds or configs are copied or changed. Each mode has an isolated runtime except reload,
which verifies the saved core world. Servers bind to loopback. Keep failed logs when correcting failures.
Expand All @@ -181,11 +182,14 @@ Known starter recipes also reject mixed wood. Receipts bind both matrices to the
Window checks cover 2,304 metadata states, 576 directional columns, 144 saved columns,
placement/alignment, independent columns, blocked bridges, hand/power transitions, swept
entity clearance, owner/helper rays, player passage, harvesting, explosions and link repair.
Use a fresh runtime root for each candidate; current default is manual-testing/horizontal-rails-0.1.8.
Clay tile checks cover cap joining, four wall orientations, half-depth collision and
placement alongside windows. Roof trim checks cover both verge hands in every facing,
clearance behind the fascia and the ridge end join. The clay-only mode checks that crafting works with the
other building families switched off. Use a fresh runtime root for each candidate.

The optional client probe requires iaa.probe=true, iaa.clientProbe=true and iaa.keepRunning=true.
It creates its own Horizontal Rails Preview, checks all mesh/material variants and both
actual creative-tab contents, captures twenty native screenshots, then shuts down.
It creates its own Rye Roof Trim Preview, checks mesh and material variants and both
creative tabs, captures three views of the clay tile street and then shuts down.
Every visible item must also provide a translated crafting hint without tooltip errors.
The client script's PreviewName argument selects a separate save without replacing an earlier preview.
After verification copy the preview save into the ordinary run/saves directory and launch without the probe.
Expand Down
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ org.gradle.parallel=false
net.minecraftforge.gradle.merge-source-sets=false
minecraft_version=1.10.2
forge_version=12.18.3.2511
mod_version=0.1.8.110021
mod_version=0.1.10.110021
mod_group=zone.moddev.mc
mod_id=ironagearchitecture
mod_name=Iron Age Architecture
Expand Down
45 changes: 36 additions & 9 deletions scripts/generate-resources.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,11 @@ for (const [key, text] of Object.entries({
'bracket.reach':'One full bracket makes two halves; two halves rejoin.',
'roof.ridge':'Cut two slopes vertically for four ridge caps.',
'roof.slope':'Two ridge caps side by side make one roof slope.',
'clay.fascia':'Place facing uphill for a timber edge along the low side.',
'clay.verge':'Face uphill and click the left or right half that projects past the gable.',
'clay.ridge_end':'Look along the ridge from outside to finish its exposed end.',
'clay.swap':'Craft alone to swap a clay slope and a full hanging tile panel.',
'clay.place':'Match the neighbouring wall half, or sneak to choose it yourself.',
'cob':'Craft alone to make plain wattle and daub.',
'slab':'Two slabs side by side recover one cob.',
'wall.short':'Two short walls side by side make one thin wall.',
Expand Down Expand Up @@ -118,16 +123,38 @@ for(const wood of woods) {
item(name,name);lang[`item.${ns}.${name}.name`]=`${names[woods.indexOf(wood)]} ${reach==='half'?'Half':'Full'}-reach Jetty Bracket`;
}
}
for (const material of ['thatch','slate']) {
for (const [material,label] of [['thatch','Thatch'],['slate','Slate'],['clay_tile','Clay Tile']]) {
model(`${material}_mesh`,{parent:'minecraft:block/block',textures:{particle:`${ns}:blocks/${material}`},elements:[]});
for (const ridge of [false,true]) {
const name = `${material}_${ridge?'ridge':'roof'}`, variants = {};
const mesh = material === 'clay_tile' && ridge ? 'clay_tile_cap_mesh' : `${material}_mesh`;
if (mesh === 'clay_tile_cap_mesh') model(mesh,{parent:'minecraft:block/block',textures:{particle:`${ns}:blocks/clay_tile_cap`},elements:[]});
for (const facing of Object.keys(facings)) for (const shape of ridge?['single','start','middle','end']:shapes)
variants[ridge?`ends=${shape},facing=${facing}`:`facing=${facing},shape=${shape}`] = {model:`${ns}:${material}_mesh`};
state(name,variants); item(name,`${material}_mesh`);
lang[`tile.${ns}.${name}.name`] = `${material==='thatch'?'Thatch':'Slate'} ${ridge?'Ridge Cap':'Roof'}`;
variants[ridge?`ends=${shape},facing=${facing}`:`facing=${facing},shape=${shape}`] = {model:`${ns}:${mesh}`};
state(name,variants); item(name,mesh);
lang[`tile.${ns}.${name}.name`] = `${label} ${ridge?'Ridge Cap':'Roof'}`;
}
}
for (const [part,label] of [['fascia','Fascia'],['verge','Verge'],['ridge_end','Ridge End']]) {
const name = `clay_tile_${part}`, variants = {};
const mesh = part === 'ridge_end' ? 'clay_tile_cap_mesh' : 'clay_tile_mesh';
for (const facing of Object.keys(facings)) for (const right of [false,true])
variants[`facing=${facing},right=${right}`] = {model:`${ns}:${mesh}`};
state(name,variants); item(name,mesh);
lang[`tile.${ns}.${name}.name`] = `Clay Tile ${label}`;
}
model('clay_tile_hanging',{parent:'minecraft:block/cube_all',textures:{all:`${ns}:blocks/clay_tile`}});
const tileFaces = Object.fromEntries(['down','up','north','south','west','east'].map(face =>
[face, face === 'south' ? {texture:'#tile'} : {texture:'#tile',cullface:face}]));
model('clay_tile_hanging_thin',{parent:'minecraft:block/block',
textures:{tile:`${ns}:blocks/clay_tile`,particle:`${ns}:blocks/clay_tile`},
elements:[{from:[0,0,0],to:[16,16,8],faces:tileFaces}]});
for (const [name,label] of [['clay_tile_hanging','Hanging Clay Tiles'],['clay_tile_hanging_thin','Hanging Clay Tiles (Thin)']]) {
state(name,Object.fromEntries(Object.entries(facings).map(([facing,y]) =>
[`facing=${facing}`,{model:`${ns}:${name}`,...(name.endsWith('_thin')&&y?{y}:{})}])));
item(name,name);
lang[`tile.${ns}.${name}.name`] = label;
}
model('window_mesh',{parent:'minecraft:block/block',textures:{particle:'minecraft:blocks/glass_silver'}});
for(const [w,wood] of woods.entries()) for(const finish of [0,1]) for(const thin of [false,true]) for(const diamond of [true,false]) for(const right of [false,true]) for(const back of [false,true]) {
if(back&&!thin) continue;
Expand All @@ -145,7 +172,7 @@ lang[`hint.${ns}.pane.use`]='Add to a matching post panel; craft alone to swap l
lang[`message.${ns}.window.blocked`]='There is not enough clear space to open this window.';
lang[`message.${ns}.window.join`]='Close the adjoining windows before joining these sections.';
for (const locale of ['en_US','en_GB']) expected.set(`${assets}/lang/${locale}.lang`,Object.entries(lang).map(([k,v])=>`${k}=${v}`).join('\n')+'\n');
expected.set('src/main/resources/mcmod.info',JSON.stringify([{modid:ns,name:'Iron Age Architecture',description:'Cob walls, timber frames, thatch and slate roofs for the Iron Age series.',version:'${version}',mcversion:'${mcversion}',url:'https://github.com/MinecraftModDevelopmentMods/IronAgeArchitecture',authorList:['SkyBlade1978','FoxNekitsune'],credits:'Original 2019 scaffold and model drafts retained in repository history.',dependencies:[]}],null,2)+'\n');
expected.set('src/main/resources/mcmod.info',JSON.stringify([{modid:ns,name:'Iron Age Architecture',description:'Cob walls, timber frames, leaded windows and traditional roofs for the Iron Age series.',version:'${version}',mcversion:'${mcversion}',url:'https://github.com/MinecraftModDevelopmentMods/IronAgeArchitecture',authorList:['SkyBlade1978','FoxNekitsune'],credits:'Original 2019 scaffold and model drafts retained in repository history.',dependencies:[]}],null,2)+'\n');
expected.set('src/main/resources/pack.mcmeta',JSON.stringify({pack:{pack_format:2,description:'Iron Age Architecture resources'}},null,2)+'\n');
let failures=[];
// Remove only the exact generated frame meshes superseded by the shared wall model.
Expand All @@ -158,10 +185,10 @@ for(const name of obsolete) {
else fs.unlinkSync(file);
}
}
for(const wood of woods) {
const file=path.join(root,assets,'textures/blocks',`beam_${wood}.png`);
if(!fs.existsSync(file)) failures.push('missing beam texture '+wood);
else {const png=fs.readFileSync(file);if(png.readUInt32BE(16)!==32||png.readUInt32BE(20)!==32) failures.push('beam texture must be 32x32: '+wood);}
for(const name of [...woods.map(wood=>`beam_${wood}`),'clay_tile','clay_tile_cap']) {
const file=path.join(root,assets,'textures/blocks',`${name}.png`);
if(!fs.existsSync(file)) failures.push('missing material texture '+name);
else {const png=fs.readFileSync(file);if(png.readUInt32BE(16)!==32||png.readUInt32BE(20)!==32) failures.push('material texture must be 32x32: '+name);}
}
for (const [file,content] of expected) {
const dest=path.join(root,file);
Expand Down
8 changes: 6 additions & 2 deletions scripts/invoke-client-preview.ps1
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
param(
[string]$Runtime='D:\IronAgeArchitecture\manual-testing\horizontal-rails-0.1.8\native-client',
[string]$PreviewName='Horizontal Rails Preview',
[string]$Runtime='D:\IronAgeArchitecture\manual-testing\rye-roof-trim-0.1.10\native-client',
[string]$PreviewName='Rye Roof Trim Preview',
[string]$ServerTemplate='D:\IronAgeArchitecture\manual-testing\jetties-0.1.2-final\core',
[string]$GradleHome='D:\GradleCaches\minecraft-mods-shared',
[string]$AssetsDirectory='',
[string]$Java8='C:\Users\johnb\.gradle\jdks\temurin-8-amd64-windows.2\bin\java.exe'
)
$ErrorActionPreference='Stop'
if (Test-Path -LiteralPath (Join-Path $Runtime "saves/$PreviewName")) {
throw 'Use a fresh runtime or preview name to keep the earlier save.'
}
$repo=Split-Path $PSScriptRoot -Parent
$version=((Select-String -LiteralPath (Join-Path $repo 'gradle.properties') -Pattern '^mod_version=').Line -split '=',2)[1]
$runtimeJar='iron-age-architecture-'+$version+'.jar'
Expand Down Expand Up @@ -48,6 +51,7 @@ foreach($library in $metadata.libraries) {
}
@'
pauseOnLostFocus:false
showInventoryAchievementHint:false
renderDistance:8
guiScale:2
fancyGraphics:true
Expand Down
Loading
Loading