Advertisement
T3RRYT3RR0R

Game of Life Customizable

Jun 26th, 2021 (edited)
845
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Batch 41.96 KB | None | 0 0
  1. @Echo off & CD /d "%~dp0"
  2.  
  3. CLS
  4.  
  5. ====================:# OS Requirement tests
  6. :# Verify NTFS drive ** ADS Used to store Settings applied in demo function ColorMod
  7.  (Echo(verify.NTFS >"%~f0:Status") || (
  8.   Echo(This file must be located on an NTFS drive as it utilises Alternate Data Streams.
  9.   Pause
  10.   Exit /B 1
  11.  )
  12.  
  13. :# Windows Version control. Assigns flag true if system is windows 10 build GTR 10586
  14. :# https://en.wikipedia.org/wiki/ANSI_escape_code#DOS,_OS/2,_and_Windows
  15. :# Version 1511 build number = 10.0.10586
  16.  Set "Win10="
  17.  For /f "tokens=3 delims=." %%v in ('Ver')Do if %%v GTR 10586 Set "Win10=True"
  18.  
  19. :# If Win10 true ; Test if virtual terminal codes enabled ; enable if false
  20. :# removes win10 flag definition if version does not support Virtual Terminal sequences
  21. :# Reg values: https://devblogs.microsoft.com/commandline/understanding-windows-console-host-settings/
  22.  If defined Win10 (
  23.   Reg Query HKCU\Console | %SystemRoot%\System32\findstr.exe /LIC:"VirtualTerminalLevel    REG_DWORD    0x1" > nul || (
  24.     Reg Add HKCU\Console /f /v VirtualTerminalLevel /t REG_DWORD /d 1
  25.   ) > Nul && (
  26.     Echo(CMD restart required to complete Virtual terminal sequence Initialization.
  27.     Pause
  28.     EXIT
  29.   ) || Set "Win10="
  30.  )
  31.  
  32. :# Buttons Based on: https://www.dostips.com/forum/viewtopic.php?f=3&t=9222
  33.  
  34. :# Script Structure:
  35. :#
  36. :# Variable and macro Setup
  37. :#  - Functions
  38. :#   - [Script Break - Main Label]
  39. :#    - Embedded Exe for Mouse and Key Inputs
  40. :#     - Main script body
  41.  
  42.  MD "%TEMP%\Games_By_T3RRY" 2> nul
  43.  If not exist "%TEMP%\Games_By_T3RRY\BG.exe" Certutil -decode "%~f0" "%TEMP%\Games_By_T3RRY\BG.exe" > nul
  44.  
  45.  Set BG.exe="%TEMP%\Games_By_T3RRY\BG.exe"
  46.  Set "reg.restore=(Call )"
  47.  
  48. :# disable QuickEdit if enabled. Restored at :end label if disabled by script
  49.   reg query HKEY_CURRENT_USER\console\ /v Quickedit | findstr.exe /l "0x1" > nul && (
  50.    (Reg add HKEY_CURRENT_USER\console\ /v QuickEdit /t REG_DWORD /d 0x0 /f) > nul
  51.    Set "reg.restore=Reg add HKEY_CURRENT_USER\console\ /v QuickEdit /t REG_DWORD /d 0x1 /f"
  52.   )
  53.  
  54.  For /f "tokens=4 Delims=: " %%C in ('CHCP')Do Set "active.cp=%%C"
  55.  chcp 65001 > nul
  56.  
  57.  For /f %%e in ('echo prompt $E^|cmd')Do Set \E=%%e
  58.  <nul Set /P "=%\E%[!p"
  59.  
  60.  If "!!" == "" (Echo DelayedExpansion must not be enabled before macro definitions&Pause & Exit /B 1)
  61.  
  62. :# Screen Buffer macro:
  63. :# Alt: %Buffer:@=Alt%
  64. :# Main: %Buffer:@=Main%
  65.  Set "Buffer=<nul set /p "=!@!""
  66.  Set "Alt=%\E%[?1049h%\E%[?25l"
  67.  Set "Main=%\E%[?25h%\E%[?1049l%\E%[?25l"
  68.  
  69. :# button sound fx. disable by undefining buttonsfx below ; prior to definition of OnCLick macro
  70.  Set "buttonsfx=On"
  71.  %BG.exe% Play "%WINDIR%\Media\Windows Feed Discovered.wav"
  72.  Set "OnClick=(Call )"
  73.  Set "OnType=(Call )"
  74.  If defined buttonsfx (
  75.   For /f "Delims=" %%G in ('Dir /b /s "%WINDIR%\SystemApps\*KbdKeyTap.wav"')Do If exist "%%~G" Set "OnClick=(Start /b "" %BG.exe% Play "%%~G")"
  76.   Set "OnType=(start /b "" %BG.exe% Play "%WINDIR%\Media\Windows Feed Discovered.wav")"
  77.  )
  78.  
  79. :# return button click coords in c{pos} variable n Y;X format
  80.  Set "GetClick=Set "Clicked="& Set "ValidClick="& for /f "tokens=1,2" %%X in ('%BG.exe% mouse')Do (Set /A "c{pos}=%%X+1"&Set "c{pos}=%%Y;!c{Pos}!")"
  81.  
  82. :# test substituted button # if click is within btn[#][coords] defines variables: Clicked [value eq string] ; ValidClick [value eq button number / undefined]; btn{State}[#] [value eq true/false]
  83.  Set "If.Button=For /f "Tokens=1,2 Delims=;" %%X in ("!c{pos}!")Do If not "!btn[#][Coords]:[%%Y;%%X]=!" == "!btn[#][Coords]!" Set "Clicked=!btn[#][string]!"& Set "ValidClick=#"& (If defined btn[#]{t} Call :Toggle #)& "
  84.  
  85. :# tests all buttons in same way as if.clicked ; exclude a button via substring modification substituting 'exc' for 'button#'
  86.  Set "qClicked=(For /l %%i in (1 1 !btns[i]!)Do If not "%%i"=="Exc" For /f "Tokens=1,2 Delims=;" %%X in ("!c{pos}!")Do If not "!btn[%%i][Coords]:[%%Y;%%X]=!" == "!btn[%%i][Coords]!" Set "Clicked=!btn[%%i][string]!"& Set "ValidClick=%%i"& %OnClick% & (If defined btn[%%i]{t} Call :Toggle %%i))& "
  87.  
  88. :# Id if button is an input bar. Requires additional Args. Optional -f switch forces input
  89. :# Usage: %qInput% <Prompt> [-f]
  90.  Set qInput=Set "Input="^& Echo({!Clicked!}^|findstr /RC:"\<[{][ ]*[}]\>" ^> nul ^&^& Call :InputBar !ValidClick!
  91.  
  92. :# display all buttons
  93.  Set "Show.All.Btns=For /l %%i In (1 1 !btns[i]!)Do <nul Set /P "=!btn[%%i]!""
  94.  
  95. :# display specified buttons
  96. :# Example; Show buttons 1 3 and 5: %Show.These.Btns% 1 3 5
  97.  Set "Show.These.Btns=Set "Params="&For %%n in (1 2)Do if %%n==2 (For %%i in (!Params!)Do <nul Set /P "=!btn[%%i]!")Else Set Params="
  98.  
  99. :# Undefine all buttons. Use substring modification to exclude a specific button or states from being undefined.
  100. :# IE Preserve button 1: %clrButtons:$EXC=btn[1]%
  101.  Set "clrButtons=(For /f "tokens=1 Delims==" %%G In ('Set btn')Do Echo("%%G"|findstr /Lic:"$EXC" || Set "%%G=") 2> nul & Cls"
  102.  
  103. :# displays all selected button or input values
  104.  Set "dValues=For /l %%i in (1 1 !btns[i]!)Do if defined btn{State}[%%i] (set "value=%\E%[0;7m!btn{State}[%%i]:true=%\E%[0;32mtrue!"& Echo(%\E%[33mButton[%%i]%\E%[36m=!value:false=%\E%[0;90mfalse!%\E%[0m)"
  105.  
  106. :#  menu macro for easily creating multiple buttons simultaneously
  107.  Set "CHash=Col"
  108.  set "bMenu=Set "m{\c}="& For %%n in (1 2)Do if %%n==2 ((If "!CHash!"=="Col" (Set "m{\c}="&Call:createmenu !Params! 2> nul )Else (Set /A "m{\c}=Col"&Call :Createmenu ^!Params^! 2> nul ))& Set "m{\c}="&Set "m{x}=2")Else Set Params="
  109.  
  110. ==========
  111. Goto :Main
  112. ==========
  113.  
  114. :# FUNCTIONS
  115.  
  116. ====
  117. :end
  118.  cls
  119.  (%Reg.Restore%) > nul
  120.  (Title )
  121.  <nul set /p "=%\E%[?25h"
  122.  CHCP %active.cp% > nul
  123.  Endlocal
  124. Goto :Eof
  125.  
  126. =================
  127. :Toggle <button#>
  128.  If "!btn{State}[%~1]!"=="true" (
  129.   <nul set /P "=!btn[%~1]!"
  130.   Set "btn{State}[%~1]=false"
  131.  )Else (
  132.   If not "%~2" == "0" (
  133.    <nul set /P "=!btn[%~1]:48=7;48!"
  134.    Set "btn{State}[%~1]=true"
  135.   )Else (
  136.    <nul set /P "=!btn[%~1]!"
  137.   )
  138.  )
  139. Exit /b 0
  140.  
  141. :createGrid <Character> <Min> <Max> <FGcol> <BGcol> <BTNcol>
  142.  Set "Char=%~1"
  143.  For /L %%Y in (%~2 3 %~3)Do For /L %%X in (%~2 3 %~3)Do Call:CreateButton "!Char:~0,1!" %%Y %%X "%~4" "%~5" "%~6" -t
  144. Goto :Eof
  145.  
  146. ==========================================================
  147. :createbutton <string> <y> <x> <FGcol> <BGcol> <BTNcol> -t
  148. :# Arg Structure: 1,2,3 =  Mandatory ; 4,5,6 = Optional ; -t = Optional switch. Must be Last arg if present.
  149.  
  150. :# Button Border ; Recommended font: Lucida Console
  151. :# Codepage:         65001
  152. :# alt 201 alt 205 alt 187 ╔═╗
  153. :# alt 186  space  alt 186 ║ ║
  154. :# alt 200 alt 205 alt 188 ╚═╝
  155.  
  156.  Set "l[Y]=!btn[Y]!"
  157.  If not "%~2"=="!btn[Y]!" Set /A "btn[Y]=%~2+3"
  158.  Set /A "btn[X]=%~3"
  159.  
  160.  If "%~3" == "" Exit /b 1
  161.  Set /a "btns[i]+=1+0"
  162.  Set "btn[%btns[i]%][p]=%~2;%btn[X]%"
  163.  Set "btn[%btns[i]%][string]=%~1"
  164.  
  165.  If /I "%~4" == "-t" (set "btn[BG]=%\E%[48;2;230;230;200m")Else (If "%~4" == "" (set "btn[BG]=%\E%[48;2;230;230;200m")Else set "btn[BG]=%\E%[38;2;%~4m")
  166.  If /I "%~5" == "-t" (set "btn[FG]=%\E%[38;2;;;m")Else (If "%~5" == "" (set "btn[FG]=%\E%[38;2;;;m")Else set "btn[FG]=%\E%[48;2;%~5m")
  167.  If /I "%~6" == "-t" (set "btn[Col]=%\E%[90m")Else (If "%~6" == "" (set "btn[Col]=%\E%[90m")Else set "btn[Col]=%\E%[%~6m")
  168.  
  169. :# defines variable identifying button as toggle button; used by %If.Button% and %qClicked% macros
  170.  Echo("%*"|findstr /lic:"-t" > nul && Set "btn[%btns[i]%]{t}=true" || Set "btn[%btns[i]%]{t}="
  171.  
  172. :# Constrain button creation to console dimensions
  173.  For /f "Tokens=1,2 Delims=: " %%G in ('Mode^|findstr /lic:"Columns" /lic:"Lines"')Do (
  174.   Set /A "%%G=%%H"
  175.   If /I "%%G"=="Columns" (
  176.    Set /A "%%G[max]=%%H+%btn[X]%+2"
  177.   )Else Set /A "%%G[max]=%%H"
  178.  )
  179.  Set "len="& set "s=#%~1" & ( for %%P in (8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do ( if "!s:~%%P,1!" NEQ "" ( set /a "len+=%%P" & set "s=!s:~%%P!" ))) & set /a "btn[%btns[i]%][Len]=len" 2>nul
  180.  If !len! GTR !Columns[Max]! (
  181.   Echo(Button length exceeds display width. Button width must be LSS than console Columns
  182.   Pause
  183.   Exit
  184.  )
  185.  If %~2 GEQ !Lines[Max]! (
  186.   Echo(Button height exceeds display height. Button height must be LSS than console Lines
  187.   Pause
  188.   Exit
  189.  )
  190.  
  191. :# define button click coords and button Upper / lower border display values
  192. :#  - border is not defined as clickable.
  193.  
  194.  Set /A "btn{Xmin}=%btn[X]%+1", "btn{Xmax}=%btn[X]%+len", "l[X]=btn{Xmax}+2"
  195.  Set "btn[%btns[i]%][Len]=" & Set "btn[%btns[i]%][S]=" & Set "btn[%btns[i]%][coords]="
  196.  
  197.  For /l %%i in (!btn{Xmin}! 1 !btn{Xmax}!)Do (
  198.   Set /A "btn[%btns[i]%][Len]=%%i-3", "Xoffset=%%i-1"
  199.   Set "btn[%btns[i]%][coords]=!btn[%btns[i]%][coords]![%2;!Xoffset!]"
  200.   Set "btn[%btns[i]%][Bar]=!btn[%btns[i]%][Bar]!═"
  201.   Set "btn[%btns[i]%][S]=!btn[%btns[i]%][S]! "
  202.  )
  203.  
  204. :# define toggle state variable
  205.  If defined btn[%btns[i]%]{t} Set "btn{State}[%btns[i]%]=false"
  206.  
  207. :# Button Graphic. Toggle is effected by substituting Background color VT code 48 with 7;48 to invert button text color.
  208.  Set "btn[%btns[i]%]=%\E%[%2;%btn[X]%H%Btn[col]%%\E%7║%\E%8%\E%[1A╔!btn[%btns[i]%][Bar]!╗%\E%8%\E%[1B╚!btn[%btns[i]%][Bar]!╝%\E%8%\E%[1C%\E%[0m!btn[FG]!!btn[BG]!!btn[%btns[i]%][String]!%\E%[0m%btn[col]%%\E%[0m%\E%[2E%\E%7"
  209.  Set "btn[%btns[i]%][t]=%\E%[0m!btn[FG]!!btn[BG]!!btn[%btns[i]%][String]!%\E%[0m%btn[col]%%\E%[0m%\E%[K"
  210. Exit /b 0
  211.  
  212. ==========================================
  213. :createMenu <"list" "of" "button strings">
  214. :# Associated Macro: %bMenu%
  215. :#  - Uses default values for button color schemes m{fg} m{bg} and m{olc}
  216. :#    - Define the value of those variables prior to calling :createMenu
  217. :#      to the desired color scheme if you wish to override default values.
  218. :#  - Defaults to Row 3 [button base] unless m{yo} defined with value to overide default
  219. :#  - Defaults to Column 1 if m{x} is not defined with a column value.
  220. :#    - m{\c} overides m{x} to value of the new column. %bMenu% macro resets m{x} to 2 as default x pos after use.
  221. :#  - Button count is reset unless m{\c} is defined using substring modification of
  222. :#    - %bMenu% macro: Ie: %bMenu:Col=15% list of options
  223. :#      - Int X pos value for new column
  224. :# ! Note: Columns are not automatically padded for options of different lengths.
  225. :#  - Use white space in options list to pad options for buttons of equal size.
  226. :#    IE: %bMenu% "      short button       " "A Very Much Longer Button"
  227.  
  228.  If not defined m{\c} (
  229.   cls
  230.   Set "btns[i]="
  231.   Set "display.menu=Call Echo("
  232.   Set "b{i}=0"
  233.  )
  234.  If not defined m{yo} (Set "m{y}=3")Else Set /A "m{y}=m{yo}"
  235.  If not defined m{fg} (Set "m{fg}=;160;200")
  236.  If not defined m{bg} (Set "m{bg}=150;;150")
  237.  If not defined m{olc} (Set "m{olc}=33")
  238.  If defined m{\c} (Set "m{x}=!m{\c}!")
  239.  If not defined m{x} (Set "m{x}=2")
  240.  For %%v in (%*)Do (
  241.   Call :CreateButton "%%~v" !m{y}! !m{x}! "!m{fg}!" "!m{bg}!" !m{olc}! -t 2> nul
  242.   Set "display.menu=!display.menu!%%button[!b{i}!]%%"
  243.   Set /a "m{y}+=3", "b{i}+=1"
  244.  )
  245.  %display.menu%
  246. Exit /b 0
  247.  
  248. =================================
  249. :InputBar <button#> <Prompt> [-f]
  250. :# Force Input via switch     -f
  251. :# Constrains display of input to the dimensions of the inout bar. Longer input may still be entered; input display
  252. :# is limited to the last n characters, where 'n' is the length of the input bar
  253.  
  254.  set "input="
  255.  Set /A "CurrIn=0", "MaxIn=!btn[%1][Len]!"
  256.  <nul Set /P "=%\E%[!btn[%1][p]!H%\E%[1C%\E%7"
  257.  For /f "delims=" %%v in ('Set /A "MaxIn+1"')Do <nul Set /P "=%\E%[%%vX%\E%8%\E%[?25h%\E%[?12h"
  258.  %BG.exe% cursor 100
  259. :entryloop
  260.  Title %~2
  261.  %BG.exe% kbd
  262.  Set "key=!k[%Errorlevel%]!"
  263.  If not "!Key!" == "" (
  264.   If not "!Key!"=="Enter" (
  265.    If "!Key!"=="Backspace" (
  266.     If not !CurrIn!==0 (
  267.      %OnType%
  268.      Set "Input=!Input:~0,-1!"
  269.      Set /A "CurrIn-=1"
  270.      <nul set /p "=%\E%[1D %\E%[1D"
  271.     )Else Start /b "" %BG.exe% play "%WINDIR%\Media\Windows critical stop.wav"
  272.    )Else (
  273.     If not "!Key!"=="?" (
  274.      Echo("!Key!"|findstr.exe /lic:"home" /lic:"end" /lic:"pageup" /lic:"pagedown" /lic:"space" /lic:"tab" /lic:"left" /lic:"right" /lic:"up" /lic:"down" /lic:"delete" /lic:"escape" > nul && (
  275.       If /I "!Key!"=="escape" (Start /b ""  %BG.exe% play "%WINDIR%\Media\Windows critical stop.wav")
  276.       If /I "!Key!"=="delete" (
  277.        Start /b ""  %BG.exe% play "%WINDIR%\Media\recycle.wav"
  278.        Goto :InputBar
  279.       )
  280.       If /I "!Key!"=="Space" (
  281.        Set "Input=!Input! "
  282.        Set /A "CurrIn+=1"
  283.       )
  284.      ) || (
  285.       Set "Input=!Input!!Key!"
  286.       Set /A "CurrIn+=1"
  287.      )
  288.     )Else (%!! help output. =%
  289.       Set "Input=!Input!?"
  290.       Set /A "CurrIn+=1"
  291.     )
  292.     %OnType%
  293.    )
  294.    If not "!input!"=="" <nul set /p "=%\E%8!Input:~-%MaxIn%!"
  295.    Goto :entryloop
  296.   )
  297.  )
  298.  
  299. :# Key is Enter. Test -f force input switch; force input if true
  300.  If /I "%~3" == "-f" If "!input!" == "" (
  301.   Start /b "" %BG.exe% play "%WINDIR%\Media\Windows Error.wav"
  302.   Goto :InputBar
  303.  )
  304.  <nul Set /P "=%\E%[?25l%\E%8%\E%[K!btn[%1][t]:255;255;255=180;180;250!"
  305.  %BG.exe% play "%WINDIR%\Media\Windows Navigation Start.wav"
  306.  <nul Set /P "=%\E%8!btn[%1][t]!%\E%[?25l%\E%[?12l"
  307.  
  308.  Set "btn{State}[%1]="
  309.  If not "!Input!"=="" Set "btn{State}[%1]=!Input!"
  310.  
  311. :# 255 char title length limit
  312.  If "!Input:~0,237!"=="" (%= Double Quote string at output to prevent code insertion =%
  313.   Title You Entered: "!Input!"
  314.  )Else If not "!Input!"=="" (
  315.   Title You Entered: "!Input:~0,239!"
  316.  )Else Title ^^! No input entered.
  317. Exit /B 0
  318.  
  319. ======================================
  320. :InputCon <!Clicked!> <Prompt> [Regex] [Integer-Minimum{GTR}] [Integer-Maximum{GEQ}]
  321.  %clrButtons:& Cls=%
  322.  %Buffer:@=Alt%
  323.  Set "Tmp=%~2"
  324.  Set "TmpB=!Tmp:*:=!"
  325.  Set "Tmp=!Tmp:%TmpB%=!"
  326.  Set "Tmp=!Tmp::=!"
  327.  Set "Tmp.Prompt=%~1"
  328.  Set "Tmp.Prompt=!Tmp.Prompt:%~2=%Tmp%!"
  329.  Echo( !Tmp.Prompt!
  330.  Call :createButton "                            " 4 2 "0;0;0" "255;255;255" "36" -t
  331.  %Show.all.Btns%
  332.  
  333.  Call :InputBar 1 "!Tmp.Prompt!" -f
  334.  
  335.  If not "%~3"=="" (
  336.   Echo(!Input!|findstr /RX "[%~3]*" > nul || Goto :InputCon
  337.  )
  338.  
  339.  If not "%~4"=="" (
  340.   Set "MinV=%~4"
  341.   If !Input! LEQ !MinV! Goto :InputCon
  342.  )
  343.  
  344.  If not "%~5"=="" (
  345.   Set "MaxV=%~5"
  346.   If !Input! GEQ !MaxV! Goto :InputCon
  347.  )
  348.  
  349.  Call :createButton "Reject" 7 3 "155;;" "255;255;200" "38;2;155;;m%\E%[48;2;;;60"
  350.  Call :createButton "Confirm: !Input!" 7 12 "0;155;0" "255;255;200" "38;2;;180;m%\E%[48;2;;;60"
  351.  
  352.  %Show.all.Btns%
  353.  
  354. :Confirm
  355.  %GetClick%
  356.  %qClicked:Exc=1% If defined ValidClick (
  357.   If "!Clicked!"=="Reject" Goto :InputCon
  358.   If "!Clicked:~0,7!"=="Confirm" (
  359.    Set "!Tmp!=!Input!"
  360.    (For /f "Delims=" %%G in ('Set !Tmp!')Do Echo(Set "%%G") >"%~f0:!Tmp!.dat"
  361.     %Buffer:@=Main%
  362.    Goto :Eof
  363.   )
  364.  )Else Goto :Confirm
  365.  
  366. :YesNo <Prompt1> <Prompt2>
  367.  %Buffer:@=Alt%
  368.  %clrButtons:& Cls=%
  369.  
  370.  Call :createButton "%~1" 2 2 "155;;" "255;255;200" "38;2;155;;m%\E%[48;2;;;60"
  371.  Call :createButton "%~2" 2 "!l[X]!+1" "0;155;0" "255;255;200" "38;2;;180;m%\E%[48;2;;;60"
  372.  
  373.  %Show.all.Btns%
  374. :YesNoWait
  375.  %GetClick%
  376.  %qClicked% If defined ValidClick (
  377.   %Buffer:@=Main%
  378.   If "!Clicked!"=="%~1" Exit /B 1
  379.   If "!Clicked!"=="%~2" Exit /B 2
  380.  )Else Goto :YesNoWait
  381.  
  382. =========
  383. :ColorMod <Prefix.Extension> [-l]
  384. :# Prefix var doubles as the name of the Alternate data stream color variables as saved to / loaded from
  385.  %Buffer:@=Alt%
  386.  If Not "%~1" == "" Set "Type=%~1"
  387.  
  388. :# load any existing saved values.
  389.  (For /F "UsebackQ Delims=" %%G in ("%~f0:%Type%")Do %%G) 2> nul
  390.  If /I "%~2"=="-l" Goto :Eof
  391.  
  392.  If "!%Type%_FG_Red!"=="" If "!%Type%_BG_Red!"=="" (
  393.  For %%Z in ("FG" "BG")Do For /F "Tokens=1,2,3 Delims=;" %%1 in ("!%Type%.%%~Z.Color!")Do (
  394.    Set "%Type%_%%~Z_Red=%%1"
  395.    Set "%Type%_%%~Z_Green=%%2"
  396.    Set "%Type%_%%~Z_Blue=%%3"
  397.   )
  398.  )
  399.  If "!%Type%_Zone!"=="" Set "%Type%_Zone=FG"
  400.  If "!%Type%_Spectrum!"=="" Set "%Type%_Spectrum=%Type%_!%Type%_Zone!_Red"
  401.  
  402.  %clrButtons:& CLS=%
  403.  
  404. %=  1 =% Call :CreateButton "FG" 2 2 ";;" "255;255;255" -t
  405. %=  2 =% Call :CreateButton "BG" 2 !l[X]! ";;" "255;255;255" -t
  406. %=  3 =% Call :CreateButton "Red" 2 !l[X]! ";;" "255;255;255" -t
  407. %=  4 =% Call :CreateButton "Green" 2 !l[X]! ";;" "255;255;255" -t
  408. %=  5 =% Call :CreateButton "Blue" 2 !l[X]! ";;" "255;255;255" -t
  409. %=  6 =% Call :CreateButton "Accept" 5 2
  410. %=  7 =% Call :CreateButton "  ▲  " 5 !l[X]!
  411. %=  8 =% Call :CreateButton "  ▼  " 5 !l[X]!
  412.  
  413.  %Show.All.Btns%
  414.  If "!%Type%_Zone!" == "FG" (Call :Toggle 1)Else Call :Toggle 2
  415.  If not "!%Type%_Spectrum:Red=!" == "!%Type%_Spectrum!" Call :Toggle 3
  416.  If not "!%Type%_Spectrum:Green=!" == "!%Type%_Spectrum!" Call :Toggle 4
  417.  If not "!%Type%_Spectrum:Blue=!" == "!%Type%_Spectrum!" Call :Toggle 5
  418.  
  419. :ColorModLoop
  420.  Set "%Type%.FG.Color=!%Type%_FG_Red!;!%Type%_FG_Green!;!%Type%_FG_Blue!"
  421.  Set "%Type%.BG.Color=!%Type%_BG_Red!;!%Type%_BG_Green!;!%Type%_BG_Blue!"
  422.  <nul Set /P "=%\E%[10d%\E%[G%\E%[38;2;255;255;255m%\E%[48;2;!%Type%.BG.Color!m%Type% FG: %\E%[38;2;!%Type%.FG.Color!m!%Type%_FG_Red!;!%Type%_FG_Green!;!%Type%_FG_Blue! %\E%[38;2;255;255;255mBG:%\E%[38;2;!%Type%.FG.Color!m!%Type%_BG_Red!;!%Type%_BG_Green!;!%Type%_BG_Blue!%\E%[0m%\E%[K"
  423.  %GetClick%
  424.  %qClicked% If not defined ValidClick Goto :ColorModLoop
  425.  If "!Clicked!"=="Accept" (
  426.   %Buffer:@=Main%
  427.   Goto :Eof
  428.  )
  429.  
  430.  If "!ValidClick!"=="1" (
  431.   Set "%Type%_Zone=FG"
  432.   Call :Toggle 2 0
  433.   Set "%Type%_Spectrum=!%Type%_Spectrum:BG=FG!"
  434.  )
  435.  If "!ValidClick!"=="2" (
  436.   Set "%Type%_Zone=BG"
  437.   Call :Toggle 1 0
  438.   Set "%Type%_Spectrum=!%Type%_Spectrum:FG=BG!"
  439.  )
  440.  If "!Clicked!"=="Red" (
  441.   Set "%Type%_Spectrum=%Type%_!%Type%_Zone!_Red"
  442.   Call :Toggle 4 0
  443.   Call :Toggle 5 0
  444.  )
  445.  If "!Clicked!"=="Green" (
  446.   Set "%Type%_Spectrum=%Type%_!%Type%_Zone!_Green"
  447.   Call :Toggle 3 0
  448.   Call :Toggle 5 0
  449.  )
  450.  If "!Clicked!"=="Blue" (
  451.   Set "%Type%_Spectrum=%Type%_!%Type%_Zone!_Blue"
  452.   Call :Toggle 3 0
  453.   Call :Toggle 4 0
  454.  )
  455.  
  456.  For /f "Delims=" %%G in ("!%Type%_Spectrum!") Do (
  457.   If "!ValidClick!"=="7" (
  458.    If not !%%G! EQU 250 Set /A "%%G+=10"
  459.   )
  460.   If "!ValidClick!"=="8" (
  461.    If not !%%G! EQU 0 Set /A "%%G-=10"
  462.   )
  463.  )
  464.  
  465. :# Update stored Color values
  466.  (For /f "Delims=" %%G in ('Set %Type%')Do Echo(Set "%%G") >"%~f0:%Type%"
  467.  
  468. Goto :ColorModLoop
  469.  
  470. ========
  471. :DefKeys
  472.  Set "k[8]=Backspace"
  473.  
  474.  (Set LF=^
  475.  
  476.  
  477. %= empty lines above are required. =%)
  478.  
  479. rem For /l %%i in (9)Do For /F eol^=^%LF%%LF%^ delims^= %%A in ('forfiles /p "%~dp0." /m "%~nx0" /c "cmd /c echo(0x09"') do Set "k[9]=%%A"
  480.  
  481.  Set "k[13]=Enter"& Set "k[27]=Escape"& Set "k[32]=Space"& Set "k[33]=^!"& Set ^"k[34]=""
  482.  
  483.  set "i=35"
  484.  
  485.  For %%k in (
  486.  "#" "$" "%%" "&" "'" "(" ")" "ASsub" "+" "," "-" "." "/"^
  487.  "0" "1" "2" "3" "4" "5" "6" "7" "8" "9"^
  488.  ":" ";" "<" "=" ">" "QMsub" "@"^
  489.  A B C D E F G H I J K L M N O P Q R S T U V W X Y Z^
  490.  "[" "\" "]" "^^" "_" "`"^
  491.  a b c d e f g h i j k l m n o p q r s t u v w x y z^
  492.  )Do (
  493.   Set "k[!i!]=%%~k"
  494.   Set /A "i+=1"
  495.  )
  496.  Set "k[42]=*"& Set "k[63]=?"& Set "k[123]={"& Set "k[124]=|"& Set "k[125]=}"
  497.  Set "k[126]=~"& Set "k[339]=Delete"& Set "k[327]=Home"& Set "k[328]=Up"
  498.  Set "k[329]=PageUp"& Set "k[331]=Left"& Set "k[333]=Right"& Set "k[335]=End"
  499.  Set "k[336]=Down"& Set "k[337]=PageDown"
  500. Exit /b 0
  501.  
  502. :# REQUIRED UTILITY
  503.  
  504. ===============
  505. /* BG.exe V 3.9
  506.   https://github.com/carlos-montiers/consolesoft-mirror/blob/master/bg/README.md
  507.   Copyright (C) 2010-2018 Carlos Montiers Aguilera
  508.  
  509.   This software is provided 'as-is', without any express or implied
  510.   warranty.  In no event will the authors be held liable for any damages
  511.   arising from the use of this software.
  512.  
  513.   Permission is granted to anyone to use this software for any purpose,
  514.   including commercial applications, and to alter it and redistribute it
  515.   freely, subject to the following restrictions:
  516.  
  517.   1. The origin of this software must not be misrepresented; you must not
  518.      claim that you wrote the original software. If you use this software
  519.      in a product, an acknowledgment in the product documentation would be
  520.      appreciated but is not required.
  521.   2. Altered source versions must be plainly marked as such, and must not be
  522.      misrepresented as being the original software.
  523.   3. This notice may not be removed or altered from any source distribution.
  524.  
  525.   Carlos Montiers Aguilera
  526.   cmontiers@gmail.com
  527.  */
  528.  
  529. -----BEGIN CERTIFICATE-----
  530. TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  531. AAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5v
  532. dCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAEEAG3tp1sAAAAA
  533. AAAAAOAADwMLAQIZABoAAAAIAAAAAgAAcCcAAAAQAAAAAMD/AABAAAAQAAAAAgAA
  534. BAAAAAEAAAAEAAAAAAAAAABgAAAABAAAu00AAAMAAAAAACAAABAAAAAAEAAAEAAA
  535. AAAAABAAAAAAAAAAAAAAAABQAABMBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  536. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  537. AAAAAAAAAAD4UAAAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50ZXh0AAAA
  538. IBkAAAAQAAAAGgAAAAQAAAAAAAAAAAAAAAAAACAAUGAucmRhdGEAALgBAAAAMAAA
  539. AAIAAAAeAAAAAAAAAAAAAAAAAABAAGBALmJzcwAAAACMAAAAAEAAAAAAAAAAAAAA
  540. AAAAAAAAAAAAAAAAgABgwC5pZGF0YQAATAQAAABQAAAABgAAACAAAAAAAAAAAAAA
  541. AAAAAEAAMMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  542. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  543. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  544. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  545. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  546. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  547. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  548. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  549. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  550. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  551. AAAAAAAAAAAAAAAAAAAAAFWJ5YPsGKFQUUAAg8AgiUQkBA+3RQiJBCToIhgAAMnD
  552. hcAPhBoBAABVieVXVlOJx4PsPA+3GGaF2w+E/AAAADH2x0XQAAAAADHJ6ziNdCYA
  553. Mclmg/tcD5TBdBqhUFFAAIkcJIlN1IPAIIlEJATozhcAAItN1IPHAg+3H2aF2w+E
  554. jAAAAIXJdMgPt8PHRCQEgAAAAIkEJIlF1OiaFwAAhcAPhKoAAACDfdABD45wAQAA
  555. g/5/iXXkD7fGD4+RAQAAixVQUUAAiQQkg8cCMfaNSiCJTCQE6GcXAAChUFFAAIPA
  556. IIlEJASLRdSJBCToUBcAAA+3HzHJx0XQAAAAAGaF23WD6w2QkJCQkJCQkJCQkJCQ
  557. i0XQhcB0JIP+f4l13A+3xg+PygEAAIsVUFFAAIkEJIPCIIlUJAToBRcAAI1l9Fte
  558. X13zw422AAAAAI2/AAAAAItV0IXSdGmD/n+JdeAPt8YPj0oBAACLFVBRQACJBCSN
  559. SiCJTCQE6MUWAAAxyWaD+1wPlMEPhIYAAAChUFFAAIlNzDH2g8AgiUQkBItF1IkE
  560. JOiaFgAAx0XQAAAAAItNzOnA/v//jXQmAI28JwAAAABmg/tuD4R2AQAAD4awAAAA
  561. ZoP7cg+ERgEAAGaD+3QPhXwBAAChUFFAAMcEJAkAAACDwCCJRCQE6EQWAAAxyely
  562. /v//jbYAAAAAjbwnAAAAADH2x0XQAAAAAOlX/v//ZpCDRdABweYEZoP7OQ+GrwAA
  563. AIPLIA+3w4PoVwHGuQEAAADpL/7//412AI28JwAAAACNRdzHRCQIAQAAAIlEJASN
  564. ReSJBCT/FXxRQAAPt0Xcg+wM6Uj+//+J9o28JwAAAABmg/tiD4XWAAAAoVBRQADH
  565. BCQIAAAAg8AgiUQkBOieFQAAMcnpzP3//420JgAAAACNRdzHRCQIAQAAAIlEJASN
  566. ReCJBCT/FXxRQAAPt0Xcg+wM6Y/+//+J9o28JwAAAACLRdSD6DDpT////5CNdCYA
  567. jUXax0QkCAEAAACJRCQEjUXciQQk/xV8UUAAD7dF2oPsDOkP/v//ifaNvCcAAAAA
  568. oVBRQADHBCQNAAAAg8AgiUQkBOgIFQAAMcnpNv3//5ChUFFAAMcEJAoAAACDwCCJ
  569. RCQE6OgUAAAxyekW/f//kKFQUUAAg8AgiUQkBItF1IkEJOjJFAAAMcnp9/z//2aQ
  570. oUhAQACD+AJ+OlWJ5VdWU4PsHIsVREBAAIP4A4tyCHUvx0QkCBIAAgDHRCQEAAAA
  571. AIk0JP8VhFFAAIPsDI1l9FteX13zw412AI28JwAAAADHRCQICgAAAMdEJAQAAAAA
  572. i0IMiQQk6DUUAACFwH7Oiz2EUUAAjVj/kI20JgAAAACD6wHHRCQIEgACAMdEJAQA
  573. AAAAiTQk/9eD7AyD+/914OubjbQmAAAAAI28JwAAAABVuAQAAAC6BgAAALkGAAAA
  574. ieVXVlO+CAAAALsIAAAAvwgAAACB7LwAAABmiYVs////uBAAAABmiYV4////uAgA
  575. AACDPUhAQAADZomFev///7gFAAAAZomVbv///2aJhXz///+4DAAAAGaJjXD///9m
  576. iYV+////uAcAAABmiZ1y////ZolFgLgMAAAAZom1dP///2aJRYK4EAAAAGaJvXb/
  577. //9miUWOuAoAAAC6CAAAALkMAAAAuxAAAAC+DAAAAL8MAAAAZolFkLgSAAAAZolV
  578. hGaJTYZmiV2IZol1imaJfYxmiUWSdAmNZfRbXl9dw5ChREBAAMdEJAgKAAAAx0Qk
  579. BAAAAACLQAiJBCTo4BIAAIP4CYnDd9DHRCQYAAAAAMdEJBQAAAAAx0QkEAMAAADH
  580. RCQMAAAAAMdEJAgDAAAAx0QkBAAAAMDHBCQAMEAA/xX8UEAAg+wcicbHBCQQMEAA
  581. /xUcUUAAg+wEhcCJxw+ElgAAAMdEJAQqMEAAiQQk/xUYUUAAg+wIhcCJhWT///90
  582. bA+3hJ1s////jU2Ux0QkBEIwQADHRZRUAAAAiV2YiY1g////x0WgMAAAAMdFpJAB
  583. AABmiUWcD7eEnW7///9miUWejUWoiQQk6BsSAACLjWD////HRCQEAAAAAIk0JIuV
  584. ZP///4lMJAj/0oPsDIk8JP8VBFFAAIPsBIlcJASJNCToWxIAAIPsCIk0JP8V+FBA
  585. AIPsBOm+/v//jbQmAAAAAFWJ5VZTjXXwg+wwx0QkGAAAAADHRCQUAAAAAMdEJBAD
  586. AAAAx0QkDAAAAADHRCQIAwAAAMdEJAQAAADAxwQkADBAAP8V/FBAAIPsHInDiXQk
  587. BIkEJP8VCFFAAIPsCIM9SEBAAAN0OsdF9AEAAADHRfAZAAAAiXQkBIkcJP8VJFFA
  588. AIPsCIkcJP8V+FBAAIPsBI1l+FteXcOJ9o28JwAAAAChREBAAMdEJAgKAAAAx0Qk
  589. BAAAAACLQAiJBCToABEAAIP4GXQlfxmFwHQlg/gBdaTHRfQBAAAA65uNtCYAAAAA
  590. g/gydAWD+GR1iolF8OvhkMdF9AAAAADpeP///410JgCDPUhAQAADdAfDjbYAAAAA
  591. VYnlg+wYoURAQADHRCQICgAAAMdEJAQAAAAAi0AIiQQk6IoQAACFwH4MiQQk/xU4
  592. UUAAg+wEycOQjbQmAAAAAFWJ5YPsSI1F6IkEJP8VFFFAAA+3RfaD7ATHBCRUMEAA
  593. iUQkIA+3RfSJRCQcD7dF8olEJBgPt0XwiUQkFA+3Re6JRCQQD7dF6olEJAwPt0Xo
  594. iUQkCA+3ReyJRCQE6AcQAADJw422AAAAAI28JwAAAABVieVXVlONfcyNddSD7FzH
  595. RCQYAAAAAMdEJBQAAAAAx0QkEAMAAADHRCQMAAAAAMdEJAgDAAAAx0QkBAAAAMDH
  596. BCSGMEAA/xX8UEAAicONRdCD7ByJHCSJRCQE/xUMUUAAi0XQg+wIiRwkJC4MkIlE
  597. JAShMFFAAIlFxP/Qg+wIkIl8JAzHRCQIAQAAAIl0JASJHCT/FSBRQACD7BBmg33U
  598. AnXdg33cAXXXD7912g+/fdjHBCSUMEAAiXQkBIl8JAjB5hDoMA8AAItF0IkcJAH+
  599. iUQkBP9VxIPsCIkcJP8V+FBAAIPsBIk0JP8VAFFAAJBVieVTg+wEix1MUUAA/9OF
  600. wHQdPeAAAAB0FqNAQEAAg8QEW13DjXQmAI28JwAAAAD/0wUAAQAAo0BAQACDxARb
  601. XcONtCYAAAAAjbwnAAAAAFWJ5VOD7AT/FVRRQACFwHUfxwVAQEAAAAAAAIPEBFtd
  602. w+sNkJCQkJCQkJCQkJCQkIsdTFFAAP/ThcB0FD3gAAAAdA2jQEBAAIPEBFtdw2aQ
  603. /9MFAAEAAOvqjbQmAAAAAIM9SEBAAAR0B8ONtgAAAABVieVXVlOD7FzHRCQYAAAA
  604. AMdEJBQAAAAAx0QkEAMAAADHRCQMAAAAAMdEJAgDAAAAx0QkBAAAAMDHBCQAMEAA
  605. /xX8UEAAicaNRdKD7ByJNCSJRCQE/xUQUUAAoURAQACD7AgPt33gx0QkCAoAAADH
  606. RCQEAAAAAA+3XeJmK33ci0AIZitd3okEJOjCDQAAiUXEoURAQADHRCQICgAAAMdE
  607. JAQAAAAAi0AMiQQk6J8NAACLVcQxyWaFwA9IwYk0JGaF0g9I0WY5xw9P+GY50w9P
  608. 2g+3/8HjEAn7iVwkBP8VKFFAAIPsCIk0JP8V+FBAAIPsBI1l9FteX13DjbYAAAAA
  609. VYnlU4PsJMdEJBgAAAAAx0QkFAAAAADHRCQQAwAAAMdEJAwAAAAAx0QkCAMAAADH
  610. RCQEAAAAwMcEJAAwQAD/FfxQQACD7ByDPUhAQAADicO4BwAAAHQpiRwkiUQkBP8V
  611. NFFAAIPsCIkcJP8V+FBAAItd/IPsBMnDkI20JgAAAAChREBAAMdEJAgQAAAAx0Qk
  612. BAAAAACLQAiJBCTosAwAAA+3wOuyjXQmAI28JwAAAAChSEBAAIP4BX8G88ONdCYA
  613. VYPoAYnlV1ZTg+x8iUWkx0QkGAAAAADHRCQUAAAAAMdEJBADAAAAx0QkDAAAAADH
  614. RCQIAwAAAMdEJAQAAADAxwQkADBAAP8V/FBAAInDjUXSg+wciRwkiUQkBP8VEFFA
  615. AKFEQEAAg+wIx0QkCAoAAADHRCQEAAAAAItACIkEJOgMDAAAicahREBAAMdEJAgK
  616. AAAAx0QkBAAAAACLQAyJBCTo6gsAAGajIEBAAGajPEBAAA+3ReCJHSxAQABmK0Xc
  617. Zok1IkBAAMdFqBQAAADHRawEAAAAZqMwQEAAD7dF4mYrRd5mozJAQAC4AQAAAGaj
  618. NEBAALgBAAAAZqM2QEAAMcBmozhAQAAxwGajOkBAAKE8UUAAiUWgifaNvCcAAAAA
  619. i32soURAQADHRCQIEAAAAMdEJAQAAAAAiwS4iQQk6E0LAACJ+WajKkBAAKFEQEAA
  620. g8ECiU2si02oizQIhfYPhEkBAAAPtx5mhdsPhD0BAAAx/8dFtAAAAAAx0utSjXYA
  621. MdJmg/tcD5TCdDVmhdsPhAwCAABmg/sKD4XCAQAAD7cFPEBAAGaDBSJAQAABZqMg
  622. QEAAjbYAAAAAjbwnAAAAAIPGAg+3HmaF2w+EoQAAAIXSdK0Pt9PHRCQEgAAAAIkU
  623. JIlVsOi/CgAAhcAPhN8AAACDfbQBi1WwD44iAgAAg/9/iX3MifoPj0QDAABmhdIP
  624. hLsCAABmg/oKD4UxAgAAD7cFPEBAAGaDBSJAQAABZoP7CmajIEBAAA+FrAIAAA+3
  625. BTxAQABmgwUiQEAAAYPGAjH/MdLHRbQAAAAAZqMgQEAAD7ceZoXbD4Vi////jXYA
  626. i0W0hcB0NoP/f4l9xIn4D4+rBQAAZoXAD4RiBQAAZoP4Cg+FuAQAAA+3BTxAQABm
  627. gwUiQEAAAWajIEBAAINFqAiLTaw5TaQPj2P+//+NZfRbXl9dw410JgCNvCcAAAAA
  628. i0W0hcAPhNUAAACD/3+JfciJ+g+PNwQAAGaF0g+EDgMAAGaD+goPhYQCAAAPtwU8
  629. QEAAZoMFIkBAAAFmoyBAQAAx0maD+1wPlMIPhCACAABmhdsPhHcDAABmg/sKD4Xt
  630. AgAAD7cFPEBAAGaDBSJAQAABMf/HRbQAAAAAZqMgQEAA6Wr+//+NdgCNvCcAAAAA
  631. D7cFIEBAAGaFwHgkZjsFMEBAAH8bD7cNIkBAAGaFyXgPZjsNMkBAAA+OwgUAAGaQ
  632. g8ABZqMgQEAA6SL+//9mkGaDBSBAQAAB6RP+//+NdgBmg/tuD4RWBAAAD4YAAwAA
  633. ZoP7cg+ElgQAAGaD+3QPhSwFAAAPtwUgQEAAZoXAeDBmOwUwQEAAfycPtxUiQEAA
  634. ZoXSeBtmOxUyQEAAD44GBgAAjbQmAAAAAI28JwAAAACDwAEx0majIEBAAOmg/f//
  635. g0W0AcHnBIPqMGaD+zl2CYPLIA+304PqVwHXugEAAADpe/3//410JgCNvCcAAAAA
  636. D7cFIEBAAGaFwHh7ZjsFMEBAAH9yD7cNIkBAAGaFyXhmZjsNMkBAAH9dg8ABg8EB
  637. ZokVKEBAAGajJEBAAKE4QEAAZokNJkBAAMdEJBAgQEAAx0QkBChAQACJRCQMoTRA
  638. QACJRCQIoSxAQACJBCT/FTxRQACD7BSJ9o28JwAAAAAPtwUgQEAAg8ABZoP7Cmaj
  639. IEBAAA+EVP3//2aFwHgxZjkFMEBAAHwoD7cVIkBAAGaF0ngcZjsVMkBAAA+OngQA
  640. AOsNkJCQkJCQkJCQkJCQkIPAATH/MdJmoyBAQADHRbQAAAAA6Yf8//+NtCYAAAAA
  641. Mf/HRbQAAAAA6XL8//9mkI1FwsdEJAgBAAAAiUQkBI1FzIkEJP8VfFFAAA+3VcKD
  642. 7Azplfz//4n2jbwnAAAAAA+3BSBAQABmhcB4e2Y7BTBAQAB/cg+3DSJAQABmhcl4
  643. ZmY7DTJAQAB/XYPAAYPBAWaJFShAQABmoyRAQAChOEBAAGaJDSZAQADHRCQQIEBA
  644. AMdEJAQoQEAAiUQkDKE0QEAAiUQkCKEsQEAAiQQk/xU8UUAAg+wUifaNvCcAAAAA
  645. D7cFIEBAAIPAAWajIEBAAOn8/P//jXQmAI28JwAAAABmhcB4e2Y5BTBAQAB8cg+3
  646. DSJAQABmhcl4ZmY7DTJAQAB/XYPAAYPBAYlVtGajJEBAAKE4QEAAZokdKEBAAGaJ
  647. DSZAQADHRCQQIEBAAMdEJAQoQEAAiUQkDKE0QEAAiUQkCKEsQEAAiQQk/xU8UUAA
  648. D7cFIEBAAItVtIPsFI12AIPAATH/x0W0AAAAAGajIEBAAOkJ+///ifaNvCcAAAAA
  649. ZoP7Yg+FNgIAAA+3BSBAQABmhcAPiDb9//9mOwUwQEAAD48p/f//D7cVIkBAAGaF
  650. 0g+IGf3//2Y7FTJAQAAPjwz9//+5CAAAAGaJDShAQADp/wIAAI10JgCNvCcAAAAA
  651. jUXCx0QkCAEAAACJRCQEjUXIiQQk/xV8UUAAD7dVwoPsDOmi+///ifaNvCcAAAAA
  652. D7cVIEBAAGaF0nh0ZjsVMEBAAH9rD7cNIkBAAGaFyXhfZjsNMkBAAH9WZqMoQEAA
  653. oThAQACDwgGDwQFmiRUkQEAAx0QkECBAQABmiQ0mQEAAx0QkBChAQACJRCQMoTRA
  654. QACJRCQIoSxAQACJBCT/FTxRQAAPtxUgQEAAg+wUZpCDwgGDRagIi02sOU2kZokV
  655. IEBAAA+PNvn//+nO+v//kGaDBSBAQAABg0WoCItNrDlNpA+PGPn//+mw+v//jXYA
  656. D7cFPEBAAGaDBSJAQAABMdJmoyBAQADplPn//410JgCNRcLHRCQIAQAAAIlEJASN
  657. RcSJBCT/FXxRQAAPt0XCg+wM6S76//+J9o28JwAAAAAPtwUgQEAAZoXAD4ig+///
  658. ZjsFMEBAAA+Pk/v//w+3FSJAQABmhdIPiIP7//9mOxUyQEAAD492+///g8ABg8IB
  659. uw0AAABmoyRAQAChOEBAAGaJHShAQABmiRUmQEAAx0QkECBAQADHRCQEKEBAAIlE
  660. JAyhNEBAAIlEJAihLEBAAIkEJP9VoA+3BSBAQACD7BTpG/v//410JgCNvCcAAAAA
  661. ZoP7Cg+EBv///w+3BSBAQABmhcAPiPb6//9mOwUwQEAAD4/p+v//D7cVIkBAAGaF
  662. 0g+I2fr//2Y7FTJAQAAPj8z6//9miR0oQEAA6cQAAACDwAGDwQGJVbBmoyRAQACh
  663. OEBAAGaJHShAQABmiQ0mQEAAx0QkECBAQADHRCQEKEBAAIlEJAyhNEBAAIlEJAih
  664. LEBAAIkEJP8VPFFAAA+3BSBAQACD7BSLVbDp4fn//4PAAYPCAWaJHShAQABmoyRA
  665. QAChOEBAAGaJFSZAQADHRCQQIEBAAMdEJAQoQEAAiUQkDKE0QEAAiUQkCKEsQEAA
  666. iQQk/xU8UUAAD7cFIEBAAIPsFOkY+///uQkAAABmiQ0oQEAAg8ABg8IBx0QkECBA
  667. QABmoyRAQAChOEBAAGaJFSZAQADHRCQEKEBAAIlEJAyhNEBAAIlEJAihLEBAAIkE
  668. JP8VPFFAAA+3BSBAQACD7BTpqvn//412AI28JwAAAABVieVXVlOD7FzHRCQEojBA
  669. AMcEJAAAAADoEwIAAKFQUUAAg8AgiQQk/xVIUUAAx0QkBAAAAgCJBCT/FVhRQACh
  670. SEBAAIP4Aw+EAwEAAH8RjWX0W15fXcOJ9o28JwAAAACD6AHHRCQYAAAAAMdEJBQA
  671. AAAAiUXAx0QkEAMAAAC7DAAAAMdEJAwAAAAAx0QkCAMAAAC/AgAAAMdEJAQAAADA
  672. xwQkADBAAP8V/FBAAInCiUXEjUXSg+wciUQkBIkUJP8VEFFAAIPsCJCNtCYAAAAA
  673. oURAQADHRCQIEAAAAMdEJAQAAAAAiwS4g8cCiQQk6C0BAACLDURAQAAPt8CLNBmJ
  674. RCQEg8MIi0XEiQQk/xU0UUAAifCD7AjoBOn//zl9wH+vD7dF2ot1xIk0JIlEJAT/
  675. FTRRQACD7AiJNCT/FfhQQACD7ASNZfRbXl9dw410JgChREBAAItACOjD6P//6e3+
  676. //+NtCYAAAAAjbwnAAAAAFWJ5VdWU41F5IPsPMdF5AAAAACJRCQQx0QkDAAAAADH
  677. RCQIAEBAAMdEJAREQEAAxwQkSEBAAOjFAAAAhcB4S4M9SEBAAAF+NKFEQEAAizVc
  678. UUAAMduLeASQjbQmAAAAAIsE3UAxQACJPCSJRCQE/9aFwHQjg8MBg/sMdeShQEBA
  679. AIkEJP8VAFFAAMcEJP//////FQBRQAD/FN1EMUAA69z/JYRRQACQkP8ldFFAAJCQ
  680. /yVwUUAAkJD/JWxRQACQkP8laFFAAJCQ/yVkUUAAkJD/JWBRQACQkP8lXFFAAJCQ
  681. /yVYUUAAkJD/JVRRQACQkP8lTFFAAJCQ/yVIUUAAkJD/JURRQACQkP8lfFFAAJCQ
  682. /yU8UUAAkJD/JThRQACQkP8lNFFAAJCQ/yUwUUAAkJD/JSxRQACQkP8lKFFAAJCQ
  683. /yUkUUAAkJD/JSBRQACQkP8lHFFAAJCQ/yUYUUAAkJD/JRRRQACQkP8lEFFAAJCQ
  684. /yUMUUAAkJD/JQhRQACQkP8lBFFAAJCQ/yUAUUAAkJD/JfxQQACQkP8l+FBAAJCQ
  685. /////wAAAAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  686. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  687. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  688. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  689. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  690. QwBPAE4ATwBVAFQAJAAAAEsARQBSAE4ARQBMADMAMgAuAEQATABMAAAAU2V0Q3Vy
  691. cmVudENvbnNvbGVGb250RXgAVABlAHIAbQBpAG4AYQBsAAAAJQBkACAAJQBkACAA
  692. JQBkACAAJQBkACAAJQBkACAAJQBkACAAJQBkACAAJQBkAAoAAABDAE8ATgBJAE4A
  693. JAAAACUAZAAgACUAZAAKAAAAAABQAFIASQBOAFQAAABGAEMAUABSAEkATgBUAAAA
  694. QwBPAEwATwBSAAAATABPAEMAQQBUAEUAAABMAEEAUwBUAEsAQgBEAAAASwBCAEQA
  695. AABNAE8AVQBTAEUAAABEAEEAVABFAFQASQBNAEUAAABTAEwARQBFAFAAAABDAFUA
  696. UgBTAE8AUgAAAEYATwBOAFQAAABQAEwAQQBZAAAAAACkMEAAACZAALAwQACAG0AA
  697. wDBAANAaQADMMEAAwBlAANowQABgGUAA6jBAABAZQADyMEAAIBhAAP4wQACwF0AA
  698. EDFAAGAXQAAcMUAAYBZAACoxQAAwFEAANDFAAIATQABHQ0M6ICh0ZG02NC0xKSA1
  699. LjEuMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  700. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkUAAAAAAAAAAAAADcUwAA
  701. +FAAALBQAAAAAAAAAAAAACBUAABEUQAA6FAAAAAAAAAAAAAAMFQAAHxRAADwUAAA
  702. AAAAAAAAAABAVAAAhFEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjFEAAJpRAACoUQAA
  703. tlEAAMRRAADcUQAA7lEAAAxSAAAcUgAALlIAAD5SAABSUgAAalIAAIZSAACYUgAA
  704. qlIAAMRSAADMUgAAAAAAAOJSAAD0UgAA/lIAAAhTAAAQUwAAGlMAACZTAAAyUwAA
  705. PFMAAEhTAABUUwAAXlMAAGhTAAAAAAAAclMAAAAAAACEUwAAAAAAAIxRAACaUQAA
  706. qFEAALZRAADEUQAA3FEAAO5RAAAMUgAAHFIAAC5SAAA+UgAAUlIAAGpSAACGUgAA
  707. mFIAAKpSAADEUgAAzFIAAAAAAADiUgAA9FIAAP5SAAAIUwAAEFMAABpTAAAmUwAA
  708. MlMAADxTAABIUwAAVFMAAF5TAABoUwAAAAAAAHJTAAAAAAAAhFMAAAAAAABTAENs
  709. b3NlSGFuZGxlAJIAQ3JlYXRlRmlsZVcAGgFFeGl0UHJvY2VzcwBkAUZyZWVMaWJy
  710. YXJ5AKQBR2V0Q29uc29sZUN1cnNvckluZm8AALABR2V0Q29uc29sZU1vZGUAALYB
  711. R2V0Q29uc29sZVNjcmVlbkJ1ZmZlckluZm8AAAQCR2V0TG9jYWxUaW1lAABFAkdl
  712. dFByb2NBZGRyZXNzAAAsA0xvYWRMaWJyYXJ5VwAApQNSZWFkQ29uc29sZUlucHV0
  713. VwDzA1NldENvbnNvbGVDdXJzb3JJbmZvAAD1A1NldENvbnNvbGVDdXJzb3JQb3Np
  714. dGlvbgAA9wNTZXRDb25zb2xlRm9udAAAAQRTZXRDb25zb2xlTW9kZQAACgRTZXRD
  715. b25zb2xlVGV4dEF0dHJpYnV0ZQB0BFNsZWVwAOwEV3JpdGVDb25zb2xlT3V0cHV0
  716. VwB3AF9fd2dldG1haW5hcmdzAAAFAV9maWxlbm8AOwFfZ2V0Y2gAAGEBX2lvYgAA
  717. xAFfa2JoaXQAALUCX3NldG1vZGUAAI0DX3djc2ljbXAAAEsEZnB1dHdjAAB1BGlz
  718. d2N0eXBlAACqBHNldGxvY2FsZQD0BHdjc2NweQAABwV3Y3N0b2wAAA4Fd3ByaW50
  719. ZgDIAU9lbVRvQ2hhckJ1ZmZXAAAJAFBsYXlTb3VuZFcAAAAAAFAAAABQAAAAUAAA
  720. AFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAAAFAAAABQAAAAUAAA
  721. AFAAAABQAAAAUAAAS0VSTkVMMzIuZGxsAAAAABRQAAAUUAAAFFAAABRQAAAUUAAA
  722. FFAAABRQAAAUUAAAFFAAABRQAAAUUAAAFFAAABRQAABtc3ZjcnQuZGxsAAAoUAAA
  723. VVNFUjMyLmRsbAAAPFAAAFdJTk1NLkRMTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  724. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  725. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  726. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  727. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  728. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  729. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  730. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  731. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  732. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  733. -----END CERTIFICATE-----
  734.    
  735. ===================================================================================================
  736. ===================================================================================================
  737. :Main script body
  738.  mode 51,31
  739.  Setlocal EnableDelayedExpansion
  740.  
  741.  Call :DefKeys
  742.  
  743. :# USAGE EXAMPLES // Your script below
  744.  
  745.  %BG.exe% Font 9
  746.  
  747.  <nul set /p "=%\E%[?25l"
  748.  
  749. :Default
  750.  If "%~1" == "Reset" (
  751.   For %%E in ("Live" "Dead")Do For /f "Tokens=1 Delims==" %%G in (' Set %%~E 2^>nul ')Do Set "%%G="
  752.  )
  753.  
  754. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  755. :: Game Rules                                                              ::
  756. :: Modifying the rules here after the first run wont take effect until     ::
  757. :: the Defaults are restored in game. Live.Cell.Survive may contain a list ::
  758. :: of neighbour values that survive. IE - Set "Live.Cell.Survive=2 4 5"    ::
  759.  Set "Live.Cell.Survive=2"                                                 ::
  760.  Set "Live.Cell.Reproduce=3"                                               ::
  761. :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  762.  
  763.  Set /A "Density=4", "minX=5", "maxX=45", "minY=5", "maxY=20"
  764.  Set "Live.Cell.Char=╬"
  765.  Set "Live.Cell.Char[i]=20"
  766.  
  767.  If "!Live.Cell.FG.Color!"=="" Set "Live.Cell.FG.Color=250;70;0"
  768.  If "!Live.Cell.BG.Color!"=="" Set "Live.Cell.BG.Color=0;80;160"
  769.  If "!Dead.Cell.FG.Color!"=="" Set "Dead.Cell.FG.Color=20;30;40"
  770.  If "!Dead.Cell.BG.Color!"=="" Set "Dead.Cell.BG.Color=0;0;0"
  771.  
  772. :# Restore defaults by Alternate data streams with saved settings
  773.  If "%~1" == "Reset" (
  774.   Powershell -c "remove-item -path '%~nx0' -Stream '*'"
  775.   Goto :Eof
  776.  )
  777.  
  778. :# Load existing save values
  779.  For %%V in ("Density" "minX" "maxX" "minY" "maxY" "Wrap")Do (For /F "UsebackQ Delims=" %%G in ("%~f0:%%~V.dat")Do %%G) 2> nul
  780.  Call :ColorMod Live.Cell -l
  781.  Call :ColorMod Dead.Cell -l
  782.  
  783. :menu
  784.  
  785.  %clrButtons%
  786.  
  787. %=  1 =% Call :CreateButton "MinX:!MinX!" 2 2 "20;120;190" "80;20;20" "90"
  788. %=  2 =% Call :CreateButton "MaxX:!MaxX!" 2 !l[X]! "20;120;190" "80;20;20" "90"
  789. %=  3 =% Call :CreateButton "MinY:!MinY!" 2 !l[X]! "20;120;190" "80;20;20" "90"
  790. %=  4 =% Call :CreateButton "MaxY:!MaxY!" 2 !l[X]! "20;120;190" "80;20;20" "90"
  791. %=  5 =% Call :CreateButton "Live.Cell.Color" 5 2 "!Live.Cell.FG.Color!" "!Live.Cell.BG.Color!" "90"
  792. %=  6 =% Call :CreateButton "Dead.Cell.Color" 5 !l[X]! "!Dead.Cell.FG.Color!" "!Dead.Cell.BG.Color!" "90"
  793. %=  7 =% Call :CreateButton "ScreenWrap" 8 2
  794. %=  8 =% Call :CreateButton "Density:!Density!" 8 !l[X]! "20;120;190" "80;20;20" "90"
  795. %=  9 =% Call :CreateButton "Start" 8 !l[X]! ";200;" "80;20;20" "32"
  796. %= 10 =% Call :CreateButton "Exit" 8 !l[X]! "250;150;" "80;20;20" "31"
  797. %= 11 =% Call :CreateButton "    Restore default settings.   " 11 2 "80;20;20" "250;150;" "0m%\E%[38;2;200;150;0m%\E%[48;2;150;;150"
  798. %= 12 =% Call :CreateButton "☺" 14      2 "!Live.Cell.FG.Color!" "!Live.Cell.BG.Color!" "0m%\E%[38;2;!Dead.Cell.FG.Color!m%\E%[48;2;!Dead.Cell.BG.Color!"
  799. %= 13 =% Call :CreateButton "☻" 14 !l[X]! "!Live.Cell.FG.Color!" "!Live.Cell.BG.Color!" "0m%\E%[38;2;!Dead.Cell.FG.Color!m%\E%[48;2;!Dead.Cell.BG.Color!"
  800. %= 14 =% Call :CreateButton "♥" 14 !l[X]! "!Live.Cell.FG.Color!" "!Live.Cell.BG.Color!" "0m%\E%[38;2;!Dead.Cell.FG.Color!m%\E%[48;2;!Dead.Cell.BG.Color!"
  801. %= 15 =% Call :CreateButton "♦" 14 !l[X]! "!Live.Cell.FG.Color!" "!Live.Cell.BG.Color!" "0m%\E%[38;2;!Dead.Cell.FG.Color!m%\E%[48;2;!Dead.Cell.BG.Color!"
  802. %= 16 =% Call :CreateButton "♣" 14 !l[X]! "!Live.Cell.FG.Color!" "!Live.Cell.BG.Color!" "0m%\E%[38;2;!Dead.Cell.FG.Color!m%\E%[48;2;!Dead.Cell.BG.Color!"
  803. %= 17 =% Call :CreateButton "♠" 14 !l[X]! "!Live.Cell.FG.Color!" "!Live.Cell.BG.Color!" "0m%\E%[38;2;!Dead.Cell.FG.Color!m%\E%[48;2;!Dead.Cell.BG.Color!"
  804. %= 18 =% Call :CreateButton "♫" 14 !l[X]! "!Live.Cell.FG.Color!" "!Live.Cell.BG.Color!" "0m%\E%[38;2;!Dead.Cell.FG.Color!m%\E%[48;2;!Dead.Cell.BG.Color!"
  805. %= 19 =% Call :CreateButton "☼" 14 !l[X]! "!Live.Cell.FG.Color!" "!Live.Cell.BG.Color!" "0m%\E%[38;2;!Dead.Cell.FG.Color!m%\E%[48;2;!Dead.Cell.BG.Color!"
  806. %= 20 =% Call :CreateButton "╬" 14 !l[X]! "!Live.Cell.FG.Color!" "!Live.Cell.BG.Color!" "0m%\E%[38;2;!Dead.Cell.FG.Color!m%\E%[48;2;!Dead.Cell.BG.Color!"
  807. %= 21 =% Call :CreateButton "§" 14 !l[X]! "!Live.Cell.FG.Color!" "!Live.Cell.BG.Color!" "0m%\E%[38;2;!Dead.Cell.FG.Color!m%\E%[48;2;!Dead.Cell.BG.Color!"
  808.  
  809. :Menuwait
  810.  Title Game of Life
  811.  %Show.All.Btns%
  812.  If "!Wrap!" == "true" (
  813.   <nul set /P "=!btn[7]:48=7;48!"
  814.  )Else <nul set /P "=!btn[7]!"
  815.   <nul Set /p "=!btn[%Live.Cell.Char[i]%]:48=7;48!"
  816.  
  817.  %GetClick%
  818.  %qClicked% If not defined ValidClick Goto :Menuwait
  819.  
  820.  If "!Clicked!" == "Exit" Exit /B
  821.  If "!Clicked!" == "Start" Goto :Play
  822.  If !ValidClick! LSS 5 (
  823.    If not "!Clicked:MaxY=!" == "!Clicked!" (
  824.     Call :InputCon "Enter an Integer GTR !MinY! LEQ 30 for !Clicked! value." "!Clicked!" 0123456789 !MinY! 31
  825.    )Else If not "!Clicked:MaxX=!" == "!Clicked!" (
  826.     Call :InputCon "Enter an Integer GTR !MinX! LEQ 50 for !Clicked! value." "!Clicked!" 0123456789 !MinX! 51
  827.    )Else If not "!Clicked:MinX=!" == "!Clicked!" (
  828.     Call :InputCon "Enter an Integer GTR 0 LSS !MaxX! for !Clicked! value." "!Clicked!" 0123456789 0 !MaxX!
  829.    )Else If not "!Clicked:MinY=!" == "!Clicked!" (
  830.     Call :InputCon "Enter an Integer GTR 0 LSS !MaxY! for !Clicked! value." "!Clicked!" 0123456789 0 !MaxY!
  831.    )
  832.   Goto :Menu
  833.  )
  834.  If not "!Clicked:Live.Cell=!" == "!Clicked!" (
  835.   Call :ColorMod Live.Cell
  836.   Goto :Menu
  837.  )
  838.  If not "!Clicked:Dead.Cell=!" == "!Clicked!" (
  839.   Call :ColorMod Dead.Cell
  840.   Goto :Menu
  841.  )
  842.  If not "!Clicked:Density=!" == "!Clicked!" (
  843.   Call :InputCon "Enter an Integer between 2 and 8 for !Clicked! value." "!Clicked!" 0123456789 1 8
  844.   Goto :Menu
  845.  )
  846.  If "!Clicked!" == "ScreenWrap" (
  847.   If "!Wrap!" == "true" (
  848.    Set "Wrap=false"
  849.   )Else Set "Wrap=true"
  850.   (For /f "Delims=" %%G in ('Set Wrap')Do Echo(Set "%%G") >"%~f0:Wrap.dat"
  851.   Goto :Menu
  852.  )
  853.  If !ValidClick! EQU 11 (
  854.   Cls
  855.   Call :YesNo Abort Confirm
  856.   If !Errorlevel!==2 (
  857.    Call :Default Reset
  858.    Endlocal
  859.    Goto :main
  860.   )
  861.   Goto :menu
  862.  )
  863.  If !ValidClick! GEQ 12 (
  864.   <nul Set /p "=!btn[%Live.Cell.Char[i]%]!"
  865.   Set "Live.Cell.Char[i]=!ValidClick!"
  866.   Set "Live.Cell.Char=!Clicked!"
  867.   (For /f "Delims=" %%G in ('Set Live.Cell')Do Echo(Set "%%G") >"%~f0:Live.Cell")
  868.   Goto :MenuWait
  869.  )
  870.  
  871. :Play
  872.  
  873.     %Buffer:@=Alt%
  874.  
  875.     <nul set /P "=%\E%[?25l"
  876.  
  877.     Set "live=%\E%[38;2;!Live.Cell.FG.Color!m%\E%[48;2;!Live.Cell.BG.Color!m!Live.Cell.Char!"
  878.     Set "dead=%\E%[38;2;!Dead.Cell.FG.Color!m%\E%[48;2;!Dead.Cell.BG.Color!m▒"
  879.  
  880. :# Initial setup
  881.     (
  882.         For /l %%x in (%minX% 1 %maxX%)Do For /L %%y in (%minY% 1 %maxY%)Do (
  883. %= Screen Wrapping =%
  884.             If "!Wrap!"=="true" (
  885.                 If %%x==%minX% (Set /A "Xw=maxX")Else Set /A "Xw=%%x-1"
  886.                 If %%x==%maxX% (Set /A "Xe=minX")Else Set /A "Xe=%%x+1"
  887.                 If %%y==%minY% (Set /A "nY=maxY")Else Set /A "nY=%%y-1"
  888.                 If %%y==%maxY% (Set /A "sY=minY")Else Set /A "sY=%%y+1"
  889.             ) Else (
  890.                 Set /A "Xw=%%x-1"
  891.                 Set /A "Xe=%%x+1"
  892.                 Set /A "nY=%%y-1"
  893.                 Set /A "sY=%%y+1"
  894.             )
  895. %= Build neighbour cells array. Allows cell neighbors to be tested without having to calculate positions during game loop =%
  896.             Set "%%y;%%x[n]=!nY!;%%x"
  897.             Set "%%y;%%x[e]=%%y;!Xe!"
  898.             Set "%%y;%%x[s]=!sY!;%%x"
  899.             Set "%%y;%%x[w]=%%y;!Xw!"
  900.             Set "%%y;%%x[ne]=!nY!;!Xe!"
  901.             Set "%%y;%%x[nw]=!nY!;!Xw!"
  902.             Set "%%y;%%x[se]=!sY!;!Xe!"
  903.             Set "%%y;%%x[sw]=!sY!;!Xw!"
  904. %!!%
  905.             Set /A IO=!random! %%Density +1
  906.             IF !IO!==2 (
  907.                 <nul set /P "=%\E%[32m%\E%[%%y;%%xH%live%%\E%[0m"
  908.                 Set "}%%y;%%x=1"
  909.             )Else (
  910.                 Set "}%%y;%%x=0"
  911.                 <nul set /p "=%\E%[31m%\E%[%%y;%%xH%dead%%\E%[0m"
  912.             )
  913.         )
  914.         <nul set /p "=%\E%[%maxY%d%\E%[E"
  915.     ) > "%~dp0_%~n0_screen.dat"
  916.  
  917. :# Game Logic
  918. Title Game of Life. {Escape}
  919. %= Infinate loop =% For /l %%. in ()Do (
  920. %= Output state to con =%       Type "%~dp0_%~n0_screen.dat" > con
  921. %= Iterate State array cells =% For /f "delims=" %%C in ('Set }')Do For /f "tokens=1,2 delims=}=" %%1 in ("%%C")Do (
  922. %= 0 nieghbour + temp cells =%      Set /A "n{}=0,n}%%1=0"
  923. %= Iterate over neighbours =%       For %%G in (n s e w ne nw se sw)Do For /f "delims=" %%v in ("!%%1[%%G]!")Do if "!}%%v!"=="1" (
  924. %= Increment for each live =%           Set /A "n{}+=1"
  925. %= nieghbour =%             )
  926. %= Implement rules =%           For %%i in (!Live.Cell.Survive!)Do if !n{}!==%%i If %%2==1 Set "n}%%1=1"
  927.                     If !n{}!==!Live.Cell.Reproduce! Set "n}%%1=1"
  928.                 )
  929. %= Iterate over temp Array =%   (For /f "tokens=1,2 delims=n}=" %%1 in ('Set n}')Do (
  930. %= Update State Array =%        Set "}%%1=%%2"
  931. %= Redirect Display State to file =%    If %%2==1 (
  932.                         <nul set /p "=%\E%[32m%\E%[%%1H%live%%\E%[0m"
  933.                     )else <nul set /p "=%\E%[32m%\E%[%%1H%dead%%\E%[0m"
  934.                 )) > "%~dp0_%~n0_screen.dat"
  935.                 "%TEMP%\Games_By_T3RRY\BG.exe" lastkbd
  936.                 If !Errorlevel!==27 (
  937.                     %Buffer:@=Main%
  938.                     Endlocal
  939.                     cmd /k "%~f0"
  940.                     Exit
  941.                 )
  942.             )
  943.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement