Scripts/enchanted-forest.ps1

$esc = [char]27
$reset = "$esc[0m"
$width = 74
$ansiPattern = "$([char]27)\[[0-9;]*m"

function Write-Centered {
    param([string]$text)
    $visible = ([regex]::Replace($text, $ansiPattern, '')).Length
    $padLeft = [math]::Max(0, [int](($width - $visible) / 2))
    $padRight = [math]::Max(0, $width - $visible - $padLeft)
    Write-Host ((' ' * $padLeft) + $text + (' ' * $padRight) + $reset)
}

$map = @{
    'A' = "$esc[38;2;40;130;60m" + '✿'
    'B' = "$esc[38;2;60;180;90m" + '❀'
    'C' = "$esc[38;2;90;200;140m" + '✤'
    'D' = "$esc[38;2;140;230;160m" + '✣'
    'E' = "$esc[38;2;220;255;220m" + '✧'
    'F' = "$esc[38;2;255;240;180m" + '✶'
    'G' = "$esc[38;2;160;255;225m" + '❉'
    'H' = "$esc[38;2;120;200;255m" + '✺'
    '|' = "$esc[38;2;120;72;48m" + '║'
    'm' = "$esc[38;2;255;160;200m" + 'ღ'
    '.' = ' '
    ' ' = ' '
    '_' = "$esc[38;2;30;80;50m" + '▂'
    '~' = "$esc[38;2;60;110;70m" + '▃'
}

$twilight = @(
    @(22, 30, 48),
    @(30, 42, 70),
    @(38, 54, 90),
    @(48, 72, 110)
)
foreach ($band in $twilight) {
    Write-Host("$esc[48;2;$($band[0]);$($band[1]);$($band[2])" + 'm' + (' ' * $width) + $reset)
}

$pattern = @'
............F...........G.....F...........G............
.........F....AABBBBAA....G.....F....AABBBBAA....G......
......AABBBBAAABBCCCBBAABBCCCBBAABBCCCBBAABBBAA........
.....AABBCCCDDDCCBBCCDDDCCBBCCDDDCCBBCCDDDCCBBAA......
....AABCCDDEEEEDCCBCCDDEEDCCBCCDDEEDCCBCCDDEECCBA.....
...AABCCDDEEFFFGEDDCCEFFGGEDDCCEFFGGEDDCCEFFGGECBA....
....AABBCCDEEFFGGEDDFFGGGGFFEDDGGGGFFEDDGGFFEECCBA....
......||....||........||....||........||....||.........
.....||||..||||......||||..||||......||||..||||........
......mm....mm........mm....mm........mm....mm.........
_____~~~___~~~____~~~~~____~~~____~~~~~____~~~____~~~~_
'@


Write-Host
foreach ($line in ($pattern -split "`n" | Where-Object { $_.Length -gt 0 })) {
    $sb = [System.Text.StringBuilder]::new()
    foreach ($ch in $line.ToCharArray()) {
        $symbol = [string]$ch
        if ($map.ContainsKey($symbol)) {
            $null = $sb.Append($map[$symbol])
        }
        else {
            $null = $sb.Append($symbol)
        }
    }
    Write-Centered $sb.ToString()
}

Write-Centered ("$esc[38;2;140;255;200m❖ ENCHANTED FOREST ❖")
Write-Host $reset