# 第三方像素素材来源与许可 P33 开始把「程序几何绘制」的样例村庄逐步替换为**真实像素素材**(统一像素风格), P34 扩展到水面 / 屋顶 / 墙体 / 栏杆等构件。仍是竖直切片,不做全村,其余走原程序绘制 江南图集作为 fallback。 - **开关**:`LV_ASSET_PACK=cc0` 时启用真实素材包;未设置或取其它值一律回退到程序绘制 图集(`Assets/jiangnan-*.png`)。图集选择入口见 `src/LivingVillage.Desktop/VillageArt.fs` 的 `useCc0Pack` / `selectedGroundAtlasRelativePath` / `selectedCharacterAtlasRelativePath`。 - **构建命令**(确定性,二次运行 byte-identical): ```bash python3 scripts/make-cc0-art.py # -> src/LivingVillage.Desktop/Assets/cc0-tiles.png 672x32 (21 个 32x32 格) # -> src/LivingVillage.Desktop/Assets/cc0-characters.png 3840x48 (5 变体 x 4 向 x 6 帧, 32x48 格) ``` `cc0-tiles.png` 前 4 格来自 Kenney(源 16x16,**整数 2x NEAREST** 到 32x32),后 17 格为 自绘(P34 的 8 格 + P39 的 7 格 + P40 的 2 格,详见第 3、4、5 节);角色图为 Puny 源 16x24 整数 2x 到 32x48。缩放断言见 `src/LivingVillage.Desktop.Tests/AssetPackTests.fs`。 ## 1. Kenney Tiny Farm(地块) - 名称/版本:Tiny Farm(1.0),作者 Kenney。 - 来源页: - 直链: - 许可:**CC0 1.0**(包内 `License.txt` 已保留于 `third_party/kenney_tiny-farm/License.txt`)。 - 本地原始包:`third_party/kenney_tiny-farm.zip` - SHA-256:`a06f75f312c27eff15a2288475612e6f6699411be7259d408323cd15a790decc`(191128 bytes) - 获取日期:2026-09-21 - 用法:取 `Tilemap/tilemap_packed.png`(192x176,12x11 格,**无间距、16px pitch**;带间距的 `tilemap.png` 为 203x186/17px)。取 (9,8)/(10,8) 两档草 + (4,8)/(4,9) 石板,整数 2x 生成 `Assets/cc0-tiles.png` 的 0-3 格。**Tiny Farm 是农场包,无水面 / 屋顶 / 墙体 / 栏杆素材** (已逐格核查:无蓝色水面格),故这些构件自绘,见第 3 节。 ## 2. Puny Characters(角色) - 名称:Puny Characters,作者 Shade。 - 来源页:(附件直链 `puny-characters.zip`) - 许可:**CC0 1.0**(OpenGameArt 页面 License(s): CC0,itch.io 发布页同为 CC0;包内无独立 许可文件,以发布页为准)。 - 本地原始包:`third_party/puny-characters.zip` - SHA-256:`971d7b07eea18fb2cce475cd6554a176ebf783bb064dec5a637ba33c7829320e`(235985 bytes) - 获取日期:2026-09-21 - 用法:每个角色图 768x256(8 行 x 24 列,约 32px pitch);取南向 16x24 取带,整数 2x 放到 32x48 格。包只提供南向姿态,北向复用南向、东/西为镜像(限制沿用 `scripts/make-cc0-art.py` 注释)。生成 `Assets/cc0-characters.png`。 ## 3. 自绘补绘构件(P34,原创,无第三方来源) Kenney Tiny Farm 无合适的瓦屋顶 / 白墙 / 木格窗 / 栏杆 / 水波 / 门素材,按任务要求用仓库 自绘 32px 像素图补入 `cc0-tiles.png` 的 4-11 格(**原创,无外部来源,无需第三方许可**), 统一江南调色板:青灰瓦、白灰墙、暖木构件、碧水。逐格: | 索引 | 内容 | 说明 | | --- | --- | --- | | 4 | 水面 A | 自绘 2 相位水波之一 | | 5 | 水面 B | 相位相对 A 位移 4px(两相位差 256px) | | 6 | 屋顶正脊 | 青灰瓦脊 + 亮脊线 | | 7 | 屋顶檐口 | 青灰瓦 + 檐口高光/滴水 | | 8 | 墙体(木构) | 白灰墙 + 上下暖木梁 | | 9 | 木格窗 | 白灰墙 + 中心木格窗 | | 10 | 栏杆 | 木栏杆(用于桥面) | | 11 | 门 | 暖木双扇门 | - 自绘代码位于 `scripts/make-cc0-art.py`(`draw_water`/`draw_roof_*`/`draw_wall`/`draw_railing`/`draw_door`), 确定性、可复现,无外部素材。 - 水网/水田(生成器 `code=4`)与样例河道共用同一自绘 2 相位水面。 ## 4. 自绘中式元素补绘(P39,原创,无第三方来源) 在不引入新付费素材的前提下扩展 cc0 图集自绘部分,让江南味道更足:追加 7 个 32px 自绘格到 `cc0-tiles.png` **尾部(索引 12-18)**,**旧格 0-11 索引与像素逐字节不变**(向后兼容)。与 P34 同一江南调色板(青灰瓦、白灰墙、暖木构件、碧水),全部**原创、无外部来源、无需第三方许可**。 逐格: | 索引 | 内容 | 说明 | | --- | --- | --- | | 12 | 石桥中段 | 拱桥石桥面 + 木栏杆,下层留透明拱洞露出水波 | | 13 | 石桥桥台 | 岸边石阶(上桥台阶)+ 端柱 | | 14 | 乌篷船(左半) | 深色船体 + 竹篷篷顶;浮在水面画法(船帮以下留水面波纹) | | 15 | 乌篷船(右半) | 与左半连续成 2 格整船 | | 16 | 石灯笼 | 石座/石身 + 暖色发光窗芯(夜帧接光晕) | | 17 | 路摊/菜摊 | 红白条纹棚 + 柜台 + 果蔬筐 | | 18 | 芦苇 | 多株茎秆 + 叶 + 穗,贴水岸格 | - 自绘代码位于 `scripts/make-cc0-art.py`(`draw_bridge_center`/`draw_bridge_end`/`draw_boat`/ `draw_stone_lantern`/`draw_stall`/`draw_reeds`),确定性、可复现,无外部素材;全部在最终 1x 分辨率下直接落像素(无重采样),故 2x NEAREST 放大后无混色。 - 生成器:`python3 scripts/make-cc0-art.py` -> `cc0-tiles.png` **608x32(19 格)**; 二次运行 byte-identical。 - 摆放规则(`src/LivingVillage.Desktop/VillageArt.fs`,均为 (map, seed) 纯函数,不写瓦片、不改可达性): - 桥(12/13):每座桥列的最上一格铺中段、再上一格铺桥台——桥跨河,桥台贴岸。 - 船(14/15):开阔水面泊 2 格船,优先靠近某座桥(桥/船/苇常同框),距离平局按 hash 裁决。 - 石灯笼(16):沿主路中心线每隔 12 列一盏;并入 `nightLightTiles`,复用 P29/P32 夜晚光晕路径。 - 路摊(17):主路灯笼之间(错开 6 列)一格,仅美术,不接交互逻辑。 - 芦苇(18):陆地格且上下邻格为水(贴岸),每 4 列一格。 - **fallback(非 cc0)模式不摆放这些新元素**,仍走原程序绘制江南图集。 ## 5. 自绘美术深化(P40,原创,无第三方来源) P40 深化 P39 切片:石板路衔接、乌篷船特征、石灯笼/红灯笼形态区分。图集由 19 格扩到 **21 格(672x32)**,追加索引 19-20,并**重绘 14/15(乌篷船)与 16(石灯笼)**;其余索引 0-13、17-18 逐字节不变。全部**原创、无外部来源**。 | 索引 | 内容 | 说明 | | --- | --- | --- | | 19(新) | 石板路格 | 石板块 + 错缝接缝 + 明暗高光,拼成连贯石板带 | | 20(新) | 红灯笼 | 红纸圆身 + 竖向竹骨 + 暖芯 + 金穗 + 木顶盖(三段:底座/灯室/顶盖) | | 14/15(重绘) | 乌篷船左右半 | 放大到满格、船体加高,醒目**拱形竹篷**(篷顶高拱 + 竹骨 + 脊线),桥上/岸上一眼可辨 | | 16(重绘) | 石灯笼 | 三段石结构强化:宽石座/石室(暖芯)/外挑石顶盖 + 宝顶,与红灯笼形态明确区分 | - 自绘代码新增 `draw_paving` / `draw_red_lantern`,`draw_boat` / `draw_stone_lantern` 重绘;均在最终 1x 分辨率直接落像素(无重采样),2x NEAREST 放大无混色。 - 生成器:`python3 scripts/make-cc0-art.py` -> `cc0-tiles.png` **672x32(21 格)**;二次运行 byte-identical。旧索引复验:`git show HEAD:...` 比对新图前 448px(0-13)与 544-608px(17-18) 逐字节一致。 - 摆放规则(`src/LivingVillage.Desktop/VillageArt.fs`,纯函数,不写瓦片、不改可达性): - **石板路(19)**:`cc0PavingTiles map` 返回「本身或四邻属于 `map.Paths`(主路/桥引道/门口) 或 `map.Bridges`(桥面)」的石板格;cc0 模式下只有这些格铺连贯石板带,稀疏 `DecorativeStones` 孤立散布石板改画草地,故场地上不再出现游离石板。fallback 保持原样。 - **红灯笼(20)**:`cc0RedLanternTiles map` 在每户民居门口(门格)挂一盏,与主路石灯笼形态区分; 并入 `nightLightTilesWith`,与石灯笼复用同一条 **P14 预乘 alpha 径向光晕**路径,不新增光照系统。 - **fallback(非 cc0)模式不摆放新元素**,仍走原程序绘制江南图集。 ## 说明 - Kenney/Puny 原始 zip 均随仓库记录于 `third_party/`(`PROVENANCE.md` 为总来源记录),仓库 分发的只是上述再生成图集,不声称拥有未包含素材;自绘构件为原创。 - 版权/许可复核:见 `third_party/` 内原始文件与发布页;重跑 `make-cc0-art.py` 前后对 `third_party/*.zip` 重新 `sha256sum` 校验。 - 范围仍为切片:动画全套 / 全村 / 更多中式元素补绘留待后续。