diff options
Diffstat (limited to 'src/LivingVillage.Desktop/TitleScreen.fs')
| -rw-r--r-- | src/LivingVillage.Desktop/TitleScreen.fs | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/src/LivingVillage.Desktop/TitleScreen.fs b/src/LivingVillage.Desktop/TitleScreen.fs new file mode 100644 index 0000000..8b1c5d5 --- /dev/null +++ b/src/LivingVillage.Desktop/TitleScreen.fs @@ -0,0 +1,85 @@ +namespace LivingVillage.Desktop + +module TitleScreen = + + type ColorRgb = + { R: int + G: int + B: int } + + type TitleLayout = + { SkyBands: ColorRgb list + RoofTileSlots: int list + RidgeY: int + EaveY: int + WaterRows: int list + Lanterns: (int * int) list + TitleText: string + TitleX: int + TitleY: int + TitleScale: int + MenuX: int + MenuTopY: int + MenuLineHeight: int + PanelX: int + PanelY: int + PanelWidth: int + PanelHeight: int } + + // Palette mirrors the VillageArt atlas: roof (45,49,57)/(30,33,38), water (54,116,145), + // lantern paper (212,92,74). Purely decorative reuse of existing art colors. + let private skyBands : ColorRgb list = + [ { R = 16; G = 26; B = 42 } + { R = 20; G = 36; B = 52 } + { R = 24; G = 46; B = 62 } + { R = 28; G = 56; B = 68 } + { R = 32; G = 64; B = 72 } ] + + let private roofRidgeSlot = 8 + let private roofEaveSlot = 9 + let private waterTileSlot = 1 + let private lanternColor = { R = 212; G = 92; B = 74 } + let private lanternHalo = { R = 252; G = 216; B = 148 } + + let lanternColors : ColorRgb * ColorRgb = lanternColor, lanternHalo + let skyBandCount = skyBands.Length + let waterSlot = waterTileSlot + let roofSlots = roofRidgeSlot, roofEaveSlot + + let layout (viewportWidth: int) (viewportHeight: int) : TitleLayout = + let width = max 320 viewportWidth + let height = max 240 viewportHeight + let tilePixels = 32 + let columns = width / tilePixels + let roofTileSlots = + [ 0 .. columns - 1 ] + |> List.map (fun column -> + if column % 4 = 0 || column % 7 = 3 then roofRidgeSlot else roofEaveSlot) + let waterRows = + [ height - 96 + height - 64 ] + let lanternCount = max 3 (columns / 10) + let lanterns = + [ 1 .. lanternCount ] + |> List.map (fun index -> + let x = index * width / (lanternCount + 1) + let y = (List.head waterRows) - 44 + (if index % 2 = 0 then 12 else 0) + x, y) + let panelWidth = min 460 (width - 64) + { SkyBands = skyBands + RoofTileSlots = roofTileSlots + RidgeY = 44 + EaveY = 76 + WaterRows = waterRows + Lanterns = lanterns + TitleText = "江南水乡" + TitleX = (width - 4 * (4 * 16)) / 2 + TitleY = 120 + TitleScale = 4 + MenuX = (width - panelWidth) / 2 + 40 + MenuTopY = height / 2 - 40 + MenuLineHeight = 30 + PanelX = (width - panelWidth) / 2 + PanelY = height / 2 - 64 + PanelWidth = panelWidth + PanelHeight = min 360 (height - height / 2 - 40) } |
