1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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) }
|