summaryrefslogtreecommitdiff
path: root/src/LivingVillage.Desktop/VillageArt.fs
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-29 06:12:57 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-29 06:12:57 +0800
commitec49a835361fd0f6d92a41204dcc9547073b46ee (patch)
treee487c692e327484bfc813db2f65cb6a43a13b4cc /src/LivingVillage.Desktop/VillageArt.fs
parent166fbeb4efd1c36c5c8289defdf480c89835d540 (diff)
downloadliving-village-ec49a835361fd0f6d92a41204dcc9547073b46ee.tar.gz
p64: 整改桥梁栏杆可辨(深墨栏体/亮扶手/望柱)与内景四角布局(Hermes vision 复核)
Diffstat (limited to 'src/LivingVillage.Desktop/VillageArt.fs')
-rw-r--r--src/LivingVillage.Desktop/VillageArt.fs65
1 files changed, 34 insertions, 31 deletions
diff --git a/src/LivingVillage.Desktop/VillageArt.fs b/src/LivingVillage.Desktop/VillageArt.fs
index 031b577..76abc4a 100644
--- a/src/LivingVillage.Desktop/VillageArt.fs
+++ b/src/LivingVillage.Desktop/VillageArt.fs
@@ -278,16 +278,17 @@ module VillageArt =
renderProp FlowerBush 2 3
renderProp FlowerBush 6 1 ]
Interior =
+ // P64 整改:家具改排至全屋四角/沿墙(左上窗、右上床、右墙屏风、左中桌+椅、
+ // 桌旁壶、左下凳),两两不重叠且不压角色进场中央通道。
{ Elements =
- [ interiorElement Window 2 2
- interiorElement Table 4 4
- interiorElement Bed 7 3
- interiorElement Screen 7 6
- // P64 内景下半部家具补件:椅/凳/床尾凳/柜旁壶。
- interiorElement BedFoot 5 4
- interiorElement Chair 2 5
- interiorElement Stool 6 5
- interiorElement Teapot 4 5 ] } }
+ [ interiorElement Window 18 1
+ interiorElement Bed 33 2
+ interiorElement BedFoot 33 5
+ interiorElement Table 5 8
+ interiorElement Chair 8 8
+ interiorElement Teapot 9 8
+ interiorElement Stool 5 11
+ interiorElement Screen 34 11 ] } }
let worldTile (plan: JiangnanRenderPlan) (localPosition: TilePosition) : TilePosition =
{ X = plan.Origin.X + localPosition.X
@@ -1447,6 +1448,29 @@ module VillageArt =
{ PixelPosition.X = float32 (layout.RoomX + tileX * Sim.tilePixels + Sim.tilePixels / 2)
Y = float32 (floorY + (tileY + 1) * Sim.tilePixels) }
+ /// P64 整改:内景单个元素在屏幕上的矩形(纯函数,供绘制与「不重叠/不挡道」回归共用)。
+ let interiorElementScreenRect (layout: InteriorLayout) (element: InteriorElement) : Microsoft.Xna.Framework.Rectangle =
+ let floorY = interiorFloorY layout
+ let baseY = floorY + (element.Position.Y + 1) * Sim.tilePixels
+ match element.Kind with
+ | Window ->
+ XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels - 8, layout.RoomY + 24, 48, 40)
+ | Table ->
+ XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels - 16, baseY - 48, 64, 48)
+ | Bed ->
+ XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels - 8, baseY - 96, 48, 96)
+ | Screen ->
+ XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels, baseY - 96, 32, 96)
+ // P64 补件按其像素体量落位(低矮家具贴近地面线)。
+ | Chair ->
+ XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels - 8, baseY - 44, 28, 44)
+ | Stool ->
+ XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels - 8, baseY - 22, 24, 22)
+ | BedFoot ->
+ XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels - 16, baseY - 14, 56, 18)
+ | Teapot ->
+ XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels - 8, baseY - 16, 20, 16)
+
let drawInterior
(spriteBatch: SpriteBatch)
(pixel: Texture2D)
@@ -1481,29 +1505,8 @@ module VillageArt =
let rugY = floorY + 96
spriteBatch.Draw(textures.InteriorAtlas, XnaRectangle(rugX, rugY, 96, 64), rugSource, tint)
- let elementDestination (element: InteriorElement) : XnaRectangle =
- let baseY = floorY + (element.Position.Y + 1) * Sim.tilePixels
- match element.Kind with
- | Window ->
- XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels - 8, layout.RoomY + 24, 48, 40)
- | Table ->
- XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels - 16, baseY - 48, 64, 48)
- | Bed ->
- XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels - 8, baseY - 96, 48, 96)
- | Screen ->
- XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels, baseY - 96, 32, 96)
- // P64 补件按其像素体量落位(低矮家具贴近地面线)。
- | Chair ->
- XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels - 8, baseY - 44, 28, 44)
- | Stool ->
- XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels - 8, baseY - 22, 24, 22)
- | BedFoot ->
- XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels - 16, baseY - 14, 56, 18)
- | Teapot ->
- XnaRectangle(layout.RoomX + element.Position.X * Sim.tilePixels - 8, baseY - 16, 20, 16)
-
for element in plan.Elements |> List.sortBy (fun element -> element.Position.Y, element.Position.X) do
- spriteBatch.Draw(textures.InteriorAtlas, elementDestination element, interiorSourceRectangle element.Kind, tint)
+ spriteBatch.Draw(textures.InteriorAtlas, interiorElementScreenRect layout element, interiorSourceRectangle element.Kind, tint)
let chestX = layout.RoomX + layout.RoomWidth - 44
let chestY = layout.RoomY + layout.RoomHeight - 36