diff options
| author | Somhairle H. Marisol <[email protected]> | 2026-09-21 10:58:30 +0800 |
|---|---|---|
| committer | Somhairle H. Marisol <[email protected]> | 2026-09-21 10:58:30 +0800 |
| commit | e91a4a7ed0a55e9406623d1649cc432369bc0834 (patch) | |
| tree | 40de4d948158146cd1bd4c14a683829055ecd989 /src/LivingVillage.Desktop/VillageArt.fs | |
| parent | 9df2da41289f4d0852f86e86eae81ca7f7e7b598 (diff) | |
| download | living-village-e91a4a7ed0a55e9406623d1649cc432369bc0834.tar.gz | |
feat(desktop): 民居正面完整化与图集足迹
新增屋脊/檐口/木构粉墙/格窗/木门五个地块图块,可进屋民居以门为锚点绘制四宽三高完整立面(黛瓦正脊、檐口层次、木构白墙、格窗与木门);新增 planFootprint 供生成阻挡判定,村民不会刷在建筑图块上。
Diffstat (limited to 'src/LivingVillage.Desktop/VillageArt.fs')
| -rw-r--r-- | src/LivingVillage.Desktop/VillageArt.fs | 47 |
1 files changed, 39 insertions, 8 deletions
diff --git a/src/LivingVillage.Desktop/VillageArt.fs b/src/LivingVillage.Desktop/VillageArt.fs index 03cd22e..5883a97 100644 --- a/src/LivingVillage.Desktop/VillageArt.fs +++ b/src/LivingVillage.Desktop/VillageArt.fs @@ -97,6 +97,11 @@ module VillageArt = | BridgeSprite | BambooSprite | GardenSprite + | RoofRidgeSprite + | RoofEaveSprite + | WallWoodSprite + | WallWindowSprite + | DoorSprite type private XnaColor = Microsoft.Xna.Framework.Color type private XnaRectangle = Microsoft.Xna.Framework.Rectangle @@ -158,7 +163,7 @@ module VillageArt = ground StonePath 6 6 ground StonePath 6 7 ] Props = - [ renderProp House 6 4 + [ renderProp House 6 5 renderProp Bridge 10 5 renderProp BambooGrove 3 2 renderProp VegetablePatch 8 7 ] @@ -173,6 +178,23 @@ module VillageArt = { X = plan.Origin.X + localPosition.X Y = plan.Origin.Y + localPosition.Y } + /// Every tile a prop paints over, in world coordinates. Used by draw ordering and by + /// spawn-overlap assertions so villagers never start inside a painted prop. + let planFootprint (plan: JiangnanRenderPlan) : TilePosition list = + let many positions = positions |> List.map (worldTile plan) + plan.Props + |> List.collect (fun prop -> + let x, y = prop.Position.X, prop.Position.Y + match prop.Kind with + | House -> + [ for dx in -2 .. 1 do + for dy in -2 .. 0 do + yield position (x + dx) (y + dy) ] + | Bridge -> [ position x y; position x (y + 1) ] + | BambooGrove -> [ position x y; position x (y + 1); position (x + 1) y ] + | VegetablePatch -> [ position x y; position (x + 1) y ]) + |> many + let private positiveModulo divisor value = let remainder = value % divisor if remainder < 0 then remainder + divisor else remainder @@ -249,7 +271,8 @@ module VillageArt = let characterAtlasRelativePath = "Assets/jiangnan-characters.png" let interiorAtlasRelativePath = "Assets/jiangnan-interior.png" - let worldAtlasWidth = Sim.tilePixels * 8 + let worldTileCount = 13 + let worldAtlasWidth = Sim.tilePixels * worldTileCount let worldAtlasHeight = Sim.tilePixels let characterAtlasWidth = 32 * 4 * 4 * 2 let characterAtlasHeight = 48 @@ -285,6 +308,11 @@ module VillageArt = | BridgeSprite -> 5 | BambooSprite -> 6 | GardenSprite -> 7 + | RoofRidgeSprite -> 8 + | RoofEaveSprite -> 9 + | WallWoodSprite -> 10 + | WallWindowSprite -> 11 + | DoorSprite -> 12 XnaRectangle(index * Sim.tilePixels, 0, Sim.tilePixels, Sim.tilePixels) let private tilePosition x y : TilePosition = @@ -342,12 +370,15 @@ module VillageArt = | StonePath -> StonePathSprite draw position sprite - let drawHouse localPosition = - let position = worldTile plan localPosition - for dx in -1 .. 1 do - draw (offsetTile position dx 0) RoofSprite - draw (offsetTile position dx 1) WallSprite - draw (offsetTile position 0 1) BridgeSprite + let drawHouse doorTile = + let position = worldTile plan doorTile + for dx in -2 .. 1 do + draw (offsetTile position dx -2) RoofRidgeSprite + draw (offsetTile position dx -1) RoofEaveSprite + draw (offsetTile position -2 0) WallWoodSprite + draw (offsetTile position -1 0) WallWindowSprite + draw (offsetTile position 0 0) DoorSprite + draw (offsetTile position 1 0) WallWoodSprite let drawBridge localPosition = let position = worldTile plan localPosition |
