From ce2797a2ef470df312343c27301bcbe03afdbac7 Mon Sep 17 00:00:00 2001 From: Jarr3 Date: Wed, 19 Jun 2024 07:44:51 +0200 Subject: [PATCH] Add new B2SBackglassServerEXE based on the B2SBackglassServerWrapper by jonesyUK --- .github/workflows/b2s-backglass.yml | 13 +- .../My Project/AssemblyInfo.vb | 6 +- .../b2sbackglassserver/Classes/B2SScreen.vb | 3 +- .../b2sbackglassserver/Classes/B2SSettings.vb | 4 +- .../b2sbackglassserver/Forms/formBackglass.vb | 1198 ++++++++++++++++- .../b2sbackglassserver/Forms/formSettings.vb | 16 +- .../My Project/AssemblyInfo.vb | 6 +- .../B2SBackglassServerEXE.ico | Bin 0 -> 96510 bytes .../B2SBackglassServerEXE.sln | 44 + .../B2SBackglassServerEXE.vbproj | 79 ++ .../My Project/Application.Designer.vb | 13 + .../My Project/Application.myapp | 10 + .../My Project/Settings.Designer.vb | 73 + .../My Project/Settings.settings | 6 + b2sbackglassserverexe/My Project/app.manifest | 79 ++ .../My Project/launchSettings.json | 8 + b2sbackglassserverexe/Program.vb | 27 + .../Classes/B2SSettings.vb | 2 +- .../My Project/AssemblyInfo.vb | 6 +- .../My Project/AssemblyInfo.vb | 6 +- 20 files changed, 1564 insertions(+), 35 deletions(-) create mode 100644 b2sbackglassserverexe/B2SBackglassServerEXE.ico create mode 100644 b2sbackglassserverexe/B2SBackglassServerEXE.sln create mode 100644 b2sbackglassserverexe/B2SBackglassServerEXE.vbproj create mode 100644 b2sbackglassserverexe/My Project/Application.Designer.vb create mode 100644 b2sbackglassserverexe/My Project/Application.myapp create mode 100644 b2sbackglassserverexe/My Project/Settings.Designer.vb create mode 100644 b2sbackglassserverexe/My Project/Settings.settings create mode 100644 b2sbackglassserverexe/My Project/app.manifest create mode 100644 b2sbackglassserverexe/My Project/launchSettings.json create mode 100644 b2sbackglassserverexe/Program.vb diff --git a/.github/workflows/b2s-backglass.yml b/.github/workflows/b2s-backglass.yml index 77218eb..93fd951 100644 --- a/.github/workflows/b2s-backglass.yml +++ b/.github/workflows/b2s-backglass.yml @@ -36,10 +36,6 @@ jobs: VERSION=$(grep -Eo "AssemblyVersion\(.*\)" "${ASSEMBLY_INFO}" | grep -Eo "[0-9\.]+" | tail -1) TAG="${VERSION}-${SHA7}" perl -i -pe"s/AssemblyInformationalVersion\(\".*\"\)/AssemblyInformationalVersion\(\"${TAG}\"\)/g" "${ASSEMBLY_INFO}" - ASSEMBLY_INFO="b2sbackglassserverexe/b2sbackglassserverexe/My Project/AssemblyInfo.vb" - VERSION=$(grep -Eo "AssemblyVersion\(.*\)" "${ASSEMBLY_INFO}" | grep -Eo "[0-9\.]+" | tail -1) - TAG="${VERSION}-${SHA7}" - perl -i -pe"s/AssemblyInformationalVersion\(\".*\"\)/AssemblyInformationalVersion\(\"${TAG}\"\)/g" "${ASSEMBLY_INFO}" ASSEMBLY_INFO="b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/My Project/AssemblyInfo.vb" VERSION=$(grep -Eo "AssemblyVersion\(.*\)" "${ASSEMBLY_INFO}" | grep -Eo "[0-9\.]+" | tail -1) TAG="${VERSION}-${SHA7}" @@ -66,7 +62,7 @@ jobs: - name: Build Server run: | msbuild b2s_screenresidentifier/B2S_ScreenResIdentifier.sln /t:Rebuild /p:Configuration=${{ matrix.config }} /p:Platform=${{ matrix.platform }} - msbuild b2sbackglassserverexe/B2SBackglassServerEXE.sln /t:Rebuild /p:Configuration=${{ matrix.config }} /p:Platform=${{ matrix.platform }} + msbuild b2sbackglassserverexe/B2SBackglassServerEXE.sln /t:Restore,Rebuild /p:Configuration=${{ matrix.config }} /p:Platform="Any CPU" msbuild b2sbackglassserverregisterapp/B2SBackglassServerRegisterApp.sln /t:Rebuild /p:Configuration=${{ matrix.config }} /p:Platform=${{ matrix.platform }} msbuild b2sbackglassserver/B2SBackglassServer.sln /t:Rebuild /p:Configuration=${{ matrix.config }} msbuild B2SWindowPunch/B2SWindowPunch.sln /t:Rebuild /p:Configuration=${{ matrix.config }} @@ -76,8 +72,9 @@ jobs: mkdir tmp cp b2s_screenresidentifier/b2s_screenresidentifier/bin/${{ matrix.platform }}/${{ matrix.config }}/B2S_ScreenResIdentifier.exe tmp cp b2s_screenresidentifier/b2s_screenresidentifier/bin/${{ matrix.platform }}/${{ matrix.config }}/B2S_ScreenResIdentifier.exe.config tmp - cp b2sbackglassserverexe/b2sbackglassserverexe/bin/${{ matrix.platform }}/${{ matrix.config }}/B2SBackglassServerEXE.exe tmp - cp b2sbackglassserverexe/b2sbackglassserverexe/bin/${{ matrix.platform }}/${{ matrix.config }}/B2SBackglassServerEXE.exe.config tmp + : # ls -R b2sbackglassserverexe + cp b2sbackglassserverexe/bin/${{ matrix.config }}/B2SBackglassServerEXE.exe tmp + : # cp b2sbackglassserverexe/bin/${{ matrix.config }}/B2SBackglassServerEXE.exe.config tmp cp b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/bin/${{ matrix.platform }}/${{ matrix.config }}/B2SBackglassServerRegisterApp.exe tmp cp b2sbackglassserver/b2sbackglassserver/bin/${{ matrix.config }}/B2SServerPluginInterface.dll tmp cp b2sbackglassserver/b2sbackglassserver/bin/${{ matrix.config }}/B2SBackglassServer.dll tmp @@ -85,7 +82,7 @@ jobs: cp B2SWindowPunch/B2SWindowPunch/bin/${{ matrix.config }}/B2SWindowPunch.exe tmp if [[ "${{ matrix.config }}" == "Debug" ]]; then cp b2s_screenresidentifier/b2s_screenresidentifier/bin/${{ matrix.platform }}/${{ matrix.config }}/B2S_ScreenResIdentifier.pdb tmp - cp b2sbackglassserverexe/b2sbackglassserverexe/bin/${{ matrix.platform }}/${{ matrix.config }}/B2SBackglassServerEXE.pdb tmp + : # cp b2sbackglassserverexe/bin/${{ matrix.config }}/*/B2SBackglassServerEXE.pdb tmp cp b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/bin/${{ matrix.platform }}/${{ matrix.config }}/B2SBackglassServerRegisterApp.pdb tmp cp b2sbackglassserver/b2sbackglassserver/bin/${{ matrix.config }}/B2SServerPluginInterface.pdb tmp cp b2sbackglassserver/b2sbackglassserver/bin/${{ matrix.config }}/B2SBackglassServer.pdb tmp diff --git a/b2s_screenresidentifier/b2s_screenresidentifier/My Project/AssemblyInfo.vb b/b2s_screenresidentifier/b2s_screenresidentifier/My Project/AssemblyInfo.vb index 561336b..7064b2e 100644 --- a/b2s_screenresidentifier/b2s_screenresidentifier/My Project/AssemblyInfo.vb +++ b/b2s_screenresidentifier/b2s_screenresidentifier/My Project/AssemblyInfo.vb @@ -31,6 +31,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - - + + + diff --git a/b2sbackglassserver/b2sbackglassserver/Classes/B2SScreen.vb b/b2sbackglassserver/b2sbackglassserver/Classes/B2SScreen.vb index 79e7077..ca7706c 100644 --- a/b2sbackglassserver/b2sbackglassserver/Classes/B2SScreen.vb +++ b/b2sbackglassserver/b2sbackglassserver/Classes/B2SScreen.vb @@ -53,6 +53,7 @@ Public Class B2SScreen debugLog.IsLogOn = B2SSettings.B2SDebugLog debugLog.WriteLogEntry("B2SScreen.New") + 'searchPathLog.WriteLogEntry("Start Search ScreenRes") ' read settings file @@ -114,7 +115,7 @@ Public Class B2SScreen B2SSettings.B2SScreenResFileName, ' .\ScreenRes.txt IO.Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), B2SSettings.B2SScreenResFileName)' B2SFolder\ScreenRes.txt } - + ' TODO IO.Path.Combine(Application.StartupPath(), B2SSettings.B2SScreenResFileName)' B2SFolder\ScreenRes.txt For Each testFileName As String In loadFileNames Server.errorlog.WriteLogEntry("B2SScreen.ReadB2SSettingsFromFile Test " & testFileName) 'searchPathLog.WriteLogEntry(" Test " & testFileName) diff --git a/b2sbackglassserver/b2sbackglassserver/Classes/B2SSettings.vb b/b2sbackglassserver/b2sbackglassserver/Classes/B2SSettings.vb index d338f7b..7415a61 100644 --- a/b2sbackglassserver/b2sbackglassserver/Classes/B2SSettings.vb +++ b/b2sbackglassserver/b2sbackglassserver/Classes/B2SSettings.vb @@ -7,7 +7,7 @@ Imports Microsoft.Win32 Public Class B2SSettings - Public Const DirectB2SVersion As String = "2.1.2" + Public Const DirectB2SVersion As String = "3.0.0" Public Const MinimumDirectB2SVersion As String = "1.0" Public Shared Property BackglassFileVersion() As String = String.Empty @@ -233,6 +233,8 @@ Public Class B2SSettings Public Shared Function GetSettingFilename() As String If IO.File.Exists(filename) Then Return filename + ElseIf StartAsEXE And B2STableSettingsExtendedPath And IO.File.Exists(IO.Path.Combine(Application.StartupPath(), filename)) Then + Return IO.Path.Combine(Application.StartupPath(), filename) ElseIf B2STableSettingsExtendedPath And IO.File.Exists(IO.Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), filename)) Then Return IO.Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), filename) End If diff --git a/b2sbackglassserver/b2sbackglassserver/Forms/formBackglass.vb b/b2sbackglassserver/b2sbackglassserver/Forms/formBackglass.vb index 9e20a7c..d65f5a3 100644 --- a/b2sbackglassserver/b2sbackglassserver/Forms/formBackglass.vb +++ b/b2sbackglassserver/b2sbackglassserver/Forms/formBackglass.vb @@ -1,8 +1,12 @@ -Imports System -Imports System.Drawing +Imports System.Drawing +Imports System.IO Imports System.Windows.Forms +Imports Microsoft.Win32 Public Class formBackglass + Inherits System.Windows.Forms.Form + Private Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As IntPtr) As Integer + Private Declare Function IsWindow Lib "user32.dll" (ByVal hwnd As IntPtr) As Boolean Private Const minSize4Image As Integer = 300000 @@ -15,6 +19,10 @@ Public Class formBackglass Private formMode As formMode = Nothing Private startupTimer As Timer = Nothing + Private timer As Timer = Nothing + Private tabletimer As Timer = Nothing + Private B2STimer As Timer = Nothing + Private tableHandle As Integer = 0 Private rotateTimer As Timer = Nothing Private rotateSlowDownSteps As Integer = 0 @@ -23,6 +31,8 @@ Public Class formBackglass Private rotateSteps As Integer = 0 Private rotateAngle As Single = 0 Private rotateTimerInterval As Integer = 0 + Private Const MA_NOACTIVATE As System.Int32 = 3 + Private Const WM_MOUSEACTIVATE As Integer = &H21 Private snifferLamps As B2SSnifferPanel = Nothing Private snifferSolenoids As B2SSnifferPanel = Nothing @@ -31,7 +41,16 @@ Public Class formBackglass Private snifferTimer As Timer = Nothing Private Const snifferTimerInterval As Integer = 311 - +#Region " Properties " + Protected Overrides Sub WndProc(ByRef m As Message) + 'Don't allow the window to be activated by swallowing the mouse event. + If B2SSettings.FormNoFocus And m.Msg = WM_MOUSEACTIVATE Then + m.Result = New IntPtr(MA_NOACTIVATE) + Return + End If + MyBase.WndProc(m) + End Sub +#End Region 'Properties #Region "constructor and closing" Public Sub New() @@ -49,8 +68,14 @@ Public Class formBackglass B2SSettings.Load() ' get B2S xml and start - LoadB2SData() - + Try + LoadB2SData() + Catch ex As Exception + If B2SSettings.ShowStartupError Then + MessageBox.Show(ex.Message, My.Resources.AppTitle, Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error) + End If + Stop + End Try ' initialize screen settings InitB2SScreen() @@ -73,6 +98,111 @@ Public Class formBackglass End If AddHandler rotateTimer.Tick, AddressOf RotateTimer_Tick + End Sub + + Public Sub New(tableName As String, topMost As Boolean) + ' This is the constructor for the server when run from the wrapper + InitializeComponent() + + B2SSettings.StartAsEXE = True + + If tableName.EndsWith(".directb2s") Then + tableName = System.IO.Path.GetFileNameWithoutExtension(B2SData.TableFileName) + B2SSettings.PureEXE = True + End If + B2SData.TableFileName = tableName + + Me.TopMost = topMost + ' set some styles + Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.OptimizedDoubleBuffer, True) + Me.DoubleBuffered = True + + ' set key preview to allow some key action + Me.KeyPreview = True + + ' mabye create the base registry key + If Registry.CurrentUser.OpenSubKey("Software\B2S") Is Nothing Then Registry.CurrentUser.CreateSubKey("Software\B2S") + If Registry.CurrentUser.OpenSubKey("Software\B2S\VPinMAME") Is Nothing Then Registry.CurrentUser.CreateSubKey("Software\B2S\VPinMAME") + ' get the table + 'IO.Directory.SetCurrentDirectory("C:\Visual Pinball\Tables") + 'B2SData.TableFileName = "Big Guns (Williams 1987)_1.0" + 'B2SData.TableFileName = "ScaredStiff_FS_B2S_GI8" + 'B2SData.TableFileName = "ACDC_B2S" '"Baseball 1.0 FS" '"Elvira_and_the_Party_Monsters_VP91x_v1.2FS" '"Close_Encounters_FS" + 'B2SData.TableFileName = "Close_Encounters_FS" + 'B2SData.TableFileName = "Pinbot.uw.V1.02.1_JF_91x_BMPR_MOD_FS" + 'B2SData.TableFileName = "ScaredStiff_FS_B2S" + + ' get the game name + 'B2SSettings.GameName = "bguns_l8" + 'B2SSettings.GameName = "closeenc" + 'B2SSettings.B2SName = "Baseball" + 'B2SSettings.B2SName = "Spider-Man(Stern 2007) alt full dmdON127" + 'B2SSettings.GameName = "smanve_101" + 'B2SData.TableFileName = "Spider-Man(Stern 2007) alt full dmdON127" + + + Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S") + B2SSettings.GameName = regkey.GetValue("B2SGameName", String.Empty) + B2SSettings.B2SName = regkey.GetValue("B2SB2SName", String.Empty) + End Using + + ' Westworld 2016-18-11 - TableFileName is empty in some cases when launched via PinballX, we use GameName as alternativ + If String.IsNullOrEmpty(B2SData.TableFileName) Then + B2SData.TableFileName = B2SSettings.GameName + End If + B2SScreen = New B2SScreen() ' was started before Tablename was identified, so alternativ ScreenRes was failing + + + ' load settings + B2SSettings.Load() + + If B2SSettings.CPUAffinityMask > 0 Then + Dim Proc = Process.GetCurrentProcess + Proc.ProcessorAffinity = B2SSettings.CPUAffinityMask + End If + + ' get B2S xml and start + Try + LoadB2SData() + Catch ex As Exception + If B2SSettings.ShowStartupError Then + MessageBox.Show(ex.Message, My.Resources.AppTitle, Windows.Forms.MessageBoxButtons.OK, Windows.Forms.MessageBoxIcon.Error) + End If + Stop + End Try + + ' initialize screen settings + InitB2SScreen() + + ' resize images + ResizeSomeImages() + + ' show snippits + ShowStartupSnippits() + + ' create 'image on' timer and start it + Timer = New Timer() + Timer.Interval = 2000 + AddHandler Timer.Tick, AddressOf Timer_Tick + Timer.Start() + + ' create 'table is still running' timer + tabletimer = New Timer + tabletimer.Interval = 207 + AddHandler tabletimer.Tick, AddressOf TableTimer_Tick + + ' create B2S data timer + B2STimer = New Timer + B2STimer.Interval = 13 + AddHandler B2STimer.Tick, AddressOf B2STimer_Tick + + ' create rotation timer + rotateTimer = New Timer + If rotateTimerInterval > 0 Then + rotateTimer.Interval = rotateTimerInterval + End If + AddHandler rotateTimer.Tick, AddressOf RotateTimer_Tick + End Sub Public Sub New(ByVal doNotLoadBackglassData As Boolean) @@ -370,6 +500,47 @@ Public Class formBackglass #Region "some timer events" + Private Sub Timer_Tick() + + timer.Stop() + + ' set focus to the VP player + SetFocusToVPPlayer() + + ' start autostarted animations + B2SAnimation.AutoStart() + + ' start B2S data timer + B2STimer.Start() + + ' set focus to the VP player + SetFocusToVPPlayer() + + ' start table check timer + tabletimer.Start() + + End Sub + + Private Sub TableTimer_Tick() + + If tableHandle <> 0 AndAlso Not IsWindow(tableHandle) Then + ' get out here + tabletimer.Stop() + Me.Close() + Me.Dispose() + End If + + End Sub + + Private Sub B2STimer_Tick() + + ' poll registry data + PollingData() + + ' show some 'startup on' images (one time) + ShowStartupImages() + + End Sub Private Sub StartupTimer_Tick(ByVal sender As Object, ByVal e As EventArgs) @@ -445,6 +616,995 @@ Public Class formBackglass #End Region +#Region "polling action" + + Private isVisibleStateSet As Boolean = False + Private lastTopVisible As Boolean = False + Private lastSecondVisible As Boolean = False + + Private pollingInit As Boolean = False + Private lamps(400) As Integer + Private solenoids(400) As Integer + Private gistrings(400) As Integer + Private b2sSets(400) As Integer + Private mechs(5) As Integer + Private leds(100) As Integer + + Private animations As Generic.Dictionary(Of String, Integer) = Nothing + Private lastRandomStartedAnimation As String = String.Empty + + Private rotation As Integer = 0 + + Private sounds As Generic.Dictionary(Of String, Integer) = Nothing + + Private Sub PollingData() + + ' initialize the value storage - this storage is to avoid too much update traffic + InitializePollArrays() + + ' open registry sub key + Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) + + ' get current data + Dim lampsData As String = GetLampsPollingData(regkey) + Dim solenoidsData As String = GetSolenoidsPollingData(regkey) + Dim gistringsData As String = GetGIStringsPollingData(regkey) + Dim b2sSetsData As String = GetB2SSetsPollingData(regkey) + Dim mechsData As Integer() = GetMechPollingData(regkey) + Dim animationsdata As String = GetAnimationsPollingData(regkey) + Dim rotationsdata As String = GetRotationsPollingData(regkey) + Dim soundsdata As String = GetSoundsPollingData(regkey) + + ' first of all have a look at the both top images + Dim topVisible As Boolean = lastTopVisible + topVisible = GetLampsTopVisible(lampsData, topVisible) + topVisible = GetSolenoidsTopVisible(solenoidsData, topVisible) + topVisible = GetGIStringsTopVisible(gistringsData, topVisible) + topVisible = GetB2SSetsTopVisible(b2sSetsData, topVisible) + Dim secondVisible As Boolean = lastSecondVisible + secondVisible = GetLampsSecondVisible(lampsData, secondVisible) + secondVisible = GetSolenoidsSecondVisible(solenoidsData, secondVisible) + secondVisible = GetGIStringsSecondVisible(gistringsData, secondVisible) + secondVisible = GetB2SSetsSecondVisible(b2sSetsData, secondVisible) + ' maybe show or hide top images + If lastTopVisible <> topVisible OrElse lastSecondVisible <> secondVisible OrElse Not isVisibleStateSet Then + B2SData.IsOffImageVisible = False + isVisibleStateSet = True + lastTopVisible = topVisible + lastSecondVisible = secondVisible + If topVisible AndAlso secondVisible Then + BackgroundImage = TopAndSecondLightImage + ElseIf topVisible Then + BackgroundImage = TopLightImage + ElseIf secondVisible Then + BackgroundImage = SecondLightImage + Else + BackgroundImage = DarkImage + B2SData.IsOffImageVisible = True + End If + End If + + ' get thru all lamps + GetThruAllLamps(lampsData) + + ' get thru all solenoids + GetThruAllSolenoids(solenoidsData) + + ' get thru all gistrings + GetThruAllGIStrings(gistringsData) + + ' get thru all B2SSetData + GetThruAllB2SData(b2sSetsData) + + ' get thru all mechs + GetThruAllMechs(mechsData) + + ' get thru all LEDs + GetThruAllLEDs(regkey) + + ' get thru all animations + GetThruAllAnimations(regkey, animationsdata) + + ' get thru all rotations + GetThruAllRotations(regkey, rotationsdata) + + ' get thru all sounds + GetThruAllSounds(regkey, soundsdata) + + ' maybe hide score display + GetThruAllScoreDisplays(regkey) + + ' maybe show or hide some illus by groupname + GetThruAllIlluGroups(regkey) + + End Using + + End Sub + + Private Sub InitializePollArrays() + + If Not pollingInit Then + + pollingInit = True + + For I As Integer = 0 To 250 + lamps(I) = 0 + Next + For I As Integer = 0 To 250 + solenoids(I) = 0 + Next + For I As Integer = 0 To 250 + gistrings(I) = 0 + Next + For I As Integer = 0 To 250 + b2sSets(I) = 0 + Next + For I As Integer = 0 To 5 + mechs(I) = -1 + Next + For I As Integer = 0 To 100 + leds(I) = 0 + Next + animations = New Generic.Dictionary(Of String, Integer) + sounds = New Generic.Dictionary(Of String, Integer) + + End If + + End Sub + + Private Function GetLampsPollingData(ByVal regkey As RegistryKey) As String + + Dim lampsData As String = String.Empty + + If B2SData.UseRomLamps OrElse B2SData.UseAnimationLamps Then + lampsData = regkey.GetValue("B2SLamps", New String("0", 401)) + 'If B2SSettings.IsROMControlled AndAlso lampsData.Contains("2") Then + ' regkey.SetValue("B2SLamps", lampsData.Replace("2", "0")) + 'End If + End If + + Return lampsData + + End Function + Private Function GetSolenoidsPollingData(ByVal regkey As RegistryKey) As String + + Dim solenoidsData As String = String.Empty + + If B2SData.UseRomSolenoids OrElse B2SData.UseAnimationSolenoids Then + solenoidsData = regkey.GetValue("B2SSolenoids", New String("0", 251)) + If B2SSettings.IsROMControlled AndAlso solenoidsData.Contains("2") Then + regkey.SetValue("B2SSolenoids", solenoidsData.Replace("2", "0")) + End If + End If + + Return solenoidsData + + End Function + Private Function GetGIStringsPollingData(ByVal regkey As RegistryKey) As String + + Dim gistringsData As String = String.Empty + + If B2SData.UseRomGIStrings OrElse B2SData.UseAnimationGIStrings Then + gistringsData = regkey.GetValue("B2SGIStrings", New String("0", 251)) + End If + + Return gistringsData + + End Function + Private Function GetB2SSetsPollingData(ByVal regkey As RegistryKey) As String + + Dim b2sSetsData As String = String.Empty + + If B2SData.UseRomLamps OrElse B2SData.UseAnimationLamps Then + b2sSetsData = regkey.GetValue("B2SSetData", New String(Chr(0), 251)) + 'If B2SSettings.IsROMControlled AndAlso b2sSetsData.Contains("2") Then + ' regkey.SetValue("B2SSetData", b2sSetsData.Replace("2", "0")) + 'End If + End If + + Return b2sSetsData + + End Function + Private Function GetMechPollingData(ByVal regkey As RegistryKey) As Integer() + + Dim mechsData As Integer() = New Integer() {-1, -1, -1, -1, -1, -1} + + If B2SData.UseRomMechs Then + For i As Integer = 1 To Math.Min(B2SData.UsedRomMechIDs.Count, 5) + mechsData(i) = regkey.GetValue("B2SMechs" & i.ToString(), -1) + Next + End If + + Return mechsData + + End Function + Private Function GetAnimationsPollingData(ByVal regkey As RegistryKey) As String + + Dim animationsdata As String = String.Empty + + If B2SAnimation.AreThereAnimations Then + animationsdata = regkey.GetValue("B2SAnimations", String.Empty) + End If + + Return animationsdata + + End Function + Private Function GetRotationsPollingData(ByVal regkey As RegistryKey) As String + + Dim rotationsdata As String = String.Empty + + rotationsdata = regkey.GetValue("B2SRotations", String.Empty) + + Return rotationsdata + + End Function + Private Function GetSoundsPollingData(ByVal regkey As RegistryKey) As String + + Dim soundsdata As String = String.Empty + + soundsdata = regkey.GetValue("B2SSounds", String.Empty) + + Return soundsdata + + End Function + + Private Function GetLampsTopVisible(ByVal lampsData As String, ByVal currentTopVisible As Boolean) As Boolean + + Dim topVisible As Boolean = currentTopVisible + + If B2SData.UseRomLamps AndAlso TopRomIDType = B2SBaseBox.eRomIDType.Lamp Then + Dim lampid As Integer = TopRomID + Dim currentvalue As Integer = CInt(lampsData.Substring(lampid, 1)) + If lamps(lampid) <> currentvalue Then + If Not B2SData.UsedRomLampIDs.ContainsKey(lampid) AndAlso Not B2SData.UsedAnimationLampIDs.ContainsKey(lampid) AndAlso Not B2SData.UsedRandomAnimationLampIDs.ContainsKey(lampid) Then lamps(lampid) = currentvalue + topVisible = (currentvalue <> 0) + If TopRomInverted Then topVisible = Not topVisible + End If + End If + + Return topVisible + + End Function + Private Function GetSolenoidsTopVisible(ByVal solenoidsData As String, ByVal currentTopVisible As Boolean) As Boolean + + Dim topVisible As Boolean = currentTopVisible + + If B2SData.UseRomSolenoids AndAlso TopRomIDType = B2SBaseBox.eRomIDType.Solenoid Then + Dim solenoidid As Integer = TopRomID + Dim currentvalue As Integer = CInt(solenoidsData.Substring(solenoidid, 1)) + If solenoids(solenoidid) <> currentvalue Then + If Not B2SData.UsedRomSolenoidIDs.ContainsKey(solenoidid) AndAlso Not B2SData.UsedAnimationSolenoidIDs.ContainsKey(solenoidid) AndAlso Not B2SData.UsedRandomAnimationSolenoidIDs.ContainsKey(solenoidid) Then solenoids(solenoidid) = currentvalue + topVisible = (currentvalue <> 0) + If TopRomInverted Then topVisible = Not topVisible + End If + End If + + Return topVisible + + End Function + Private Function GetGIStringsTopVisible(ByVal gistringsData As String, ByVal currentTopVisible As Boolean) As Boolean + + Dim topVisible As Boolean = currentTopVisible + + If B2SData.UseRomGIStrings AndAlso TopRomIDType = B2SBaseBox.eRomIDType.GIString Then + Dim gistringid As Integer = TopRomID + Dim currentvalue As Integer = CInt(gistringsData.Substring(gistringid, 1)) + If gistrings(gistringid) <> currentvalue Then + If Not B2SData.UsedRomGIStringIDs.ContainsKey(gistringid) AndAlso Not B2SData.UsedAnimationGIStringIDs.ContainsKey(gistringid) AndAlso Not B2SData.UsedRandomAnimationGIStringIDs.ContainsKey(gistringid) Then gistrings(gistringid) = currentvalue + topVisible = (currentvalue > 4) + If TopRomInverted Then topVisible = Not topVisible + End If + End If + + Return topVisible + + End Function + Private Function GetB2SSetsTopVisible(ByVal b2sSetsData As String, ByVal currentTopVisible As Boolean) As Boolean + + Dim topVisible As Boolean = currentTopVisible + + If B2SData.UseRomLamps AndAlso TopRomIDType = B2SBaseBox.eRomIDType.Lamp Then + Dim b2ssetid As Integer = TopRomID + Dim currentvalue As Integer = Asc(b2sSetsData.Substring(b2ssetid, 1)) + If b2sSets(b2ssetid) <> currentvalue Then + If Not B2SData.UsedRomLampIDs.ContainsKey(b2ssetid) AndAlso Not B2SData.UsedAnimationLampIDs.ContainsKey(b2ssetid) AndAlso Not B2SData.UsedRandomAnimationLampIDs.ContainsKey(b2ssetid) Then b2sSets(b2ssetid) = currentvalue + topVisible = (currentvalue <> 0) + If TopRomInverted Then topVisible = Not topVisible + End If + End If + + Return topVisible + + End Function + Private Function GetLampsSecondVisible(ByVal lampsData As String, ByVal currentSecondVisible As Boolean) As Boolean + + Dim secondVisible As Boolean = currentSecondVisible + + If B2SData.UseRomLamps AndAlso SecondRomIDType = B2SBaseBox.eRomIDType.Lamp Then + Dim lampid As Integer = SecondRomID + Dim currentvalue As Integer = CInt(lampsData.Substring(lampid, 1)) + If lamps(lampid) <> currentvalue Then + If Not B2SData.UsedRomLampIDs.ContainsKey(lampid) AndAlso Not B2SData.UsedAnimationLampIDs.ContainsKey(lampid) AndAlso Not B2SData.UsedRandomAnimationLampIDs.ContainsKey(lampid) Then lamps(lampid) = currentvalue + secondVisible = (currentvalue <> 0) + If SecondRomInverted Then secondVisible = Not secondVisible + End If + End If + + Return secondVisible + + End Function + Private Function GetSolenoidsSecondVisible(ByVal solenoidsData As String, ByVal currentSecondVisible As Boolean) As Boolean + + Dim secondVisible As Boolean = currentSecondVisible + + If B2SData.UseRomSolenoids AndAlso SecondRomIDType = B2SBaseBox.eRomIDType.Solenoid Then + Dim solenoidid As Integer = SecondRomID + Dim currentvalue As Integer = CInt(solenoidsData.Substring(solenoidid, 1)) + If solenoids(solenoidid) <> currentvalue Then + If Not B2SData.UsedRomSolenoidIDs.ContainsKey(solenoidid) AndAlso Not B2SData.UsedAnimationSolenoidIDs.ContainsKey(solenoidid) AndAlso Not B2SData.UsedRandomAnimationSolenoidIDs.ContainsKey(solenoidid) Then solenoids(solenoidid) = currentvalue + secondVisible = (currentvalue <> 0) + If SecondRomInverted Then secondVisible = Not secondVisible + End If + End If + + Return secondVisible + + End Function + Private Function GetGIStringsSecondVisible(ByVal gistringsData As String, ByVal currentSecondVisible As Boolean) As Boolean + + Dim secondVisible As Boolean = currentSecondVisible + + If B2SData.UseRomGIStrings AndAlso SecondRomIDType = B2SBaseBox.eRomIDType.GIString Then + Dim gistringid As Integer = SecondRomID + Dim currentvalue As Integer = CInt(gistringsData.Substring(gistringid, 1)) + If gistrings(gistringid) <> currentvalue Then + If Not B2SData.UsedRomGIStringIDs.ContainsKey(gistringid) AndAlso Not B2SData.UsedAnimationGIStringIDs.ContainsKey(gistringid) AndAlso Not B2SData.UsedRandomAnimationGIStringIDs.ContainsKey(gistringid) Then gistrings(gistringid) = currentvalue + secondVisible = (currentvalue > 4) + If SecondRomInverted Then secondVisible = Not secondVisible + End If + End If + + Return secondVisible + + End Function + Private Function GetB2SSetsSecondVisible(ByVal b2sSetsData As String, ByVal currentSecondVisible As Boolean) As Boolean + + Dim secondVisible As Boolean = currentSecondVisible + + If B2SData.UseRomLamps AndAlso SecondRomIDType = B2SBaseBox.eRomIDType.Lamp Then + Dim b2ssetid As Integer = SecondRomID + Dim currentvalue As Integer = Asc(b2sSetsData.Substring(b2ssetid, 1)) + If b2sSets(b2ssetid) <> currentvalue Then + If Not B2SData.UsedRomLampIDs.ContainsKey(b2ssetid) AndAlso Not B2SData.UsedAnimationLampIDs.ContainsKey(b2ssetid) AndAlso Not B2SData.UsedRandomAnimationLampIDs.ContainsKey(b2ssetid) Then b2sSets(b2ssetid) = currentvalue + secondVisible = (currentvalue <> 0) + If SecondRomInverted Then secondVisible = Not secondVisible + End If + End If + + Return secondVisible + + End Function + + Private Sub GetThruAllLamps(ByVal lampsData As String) + + If B2SData.UseRomLamps Then + For Each lampid As Integer In B2SData.UsedRomLampIDs.Keys + If lampid < lampsData.Length And lampid < lamps.Length Then + Dim currentvalue As Integer = CInt(lampsData.Substring(lampid, 1)) + If lamps(lampid) <> currentvalue Then + If Not B2SData.UsedRomReelLampIDs.ContainsKey(lampid) AndAlso Not B2SData.UsedAnimationLampIDs.ContainsKey(lampid) AndAlso Not B2SData.UsedRandomAnimationLampIDs.ContainsKey(lampid) Then lamps(lampid) = currentvalue + If B2SData.UsedRomLampIDs.ContainsKey(lampid) Then + For Each picbox As B2SPictureBox In B2SData.UsedRomLampIDs(lampid) + If picbox IsNot Nothing AndAlso (Not B2SData.UseIlluminationLocks OrElse String.IsNullOrEmpty(picbox.GroupName) OrElse Not B2SData.IlluminationLocks.ContainsKey(picbox.GroupName)) Then + If picbox.RomIDValue > 0 Then + picbox.Visible = (picbox.RomIDValue = currentvalue) + Else + Dim visible As Boolean = (currentvalue <> 0) + If picbox.RomInverted Then visible = Not visible + If B2SData.UseRotatingImage AndAlso B2SData.RotatingPictureBox(0) IsNot Nothing AndAlso picbox.Equals(B2SData.RotatingPictureBox(0)) Then + If visible Then + StartRotation() + Else + StopRotation() + End If + Else + picbox.Visible = visible + End If + End If + End If + Next + End If + End If + End If + Next + End If + If B2SData.UseRomReelLamps Then + For Each lampid As Integer In B2SData.UsedRomReelLampIDs.Keys + If lampid < lampsData.Length And lampid < lamps.Length Then + Dim currentvalue As Integer = CInt(lampsData.Substring(lampid, 1)) + If lamps(lampid) <> currentvalue Then + If Not B2SData.UsedAnimationLampIDs.ContainsKey(lampid) AndAlso Not B2SData.UsedRandomAnimationLampIDs.ContainsKey(lampid) Then lamps(lampid) = currentvalue + If B2SData.UsedRomReelLampIDs.ContainsKey(lampid) Then + For Each reelbox As B2SReelBox In B2SData.UsedRomReelLampIDs(lampid) + If reelbox IsNot Nothing AndAlso (Not B2SData.UseIlluminationLocks OrElse String.IsNullOrEmpty(reelbox.GroupName) OrElse Not B2SData.IlluminationLocks.ContainsKey(reelbox.GroupName)) Then + If reelbox.RomIDValue > 0 Then + reelbox.Illuminated = (reelbox.RomIDValue = currentvalue) + Else + Dim illuminated As Boolean = (currentvalue <> 0) + If reelbox.RomInverted Then illuminated = Not illuminated + reelbox.Illuminated = illuminated + End If + End If + Next + End If + End If + End If + Next + End If + If B2SData.UseAnimationLamps Then + For Each lampid As Integer In B2SData.UsedAnimationLampIDs.Keys + If lampid < lampsData.Length And lampid < lamps.Length Then + Dim currentvalue As Integer = CInt(lampsData.Substring(lampid, 1)) + If lamps(lampid) <> currentvalue Then + If Not B2SData.UsedRandomAnimationLampIDs.ContainsKey(lampid) Then lamps(lampid) = currentvalue + If B2SData.UsedAnimationLampIDs.ContainsKey(lampid) Then + For Each animation As B2SData.AnimationInfo In B2SData.UsedAnimationLampIDs(lampid) + Dim start As Boolean = (currentvalue <> 0) + If animation.Inverted Then start = Not start + If start Then + StartAnimation(animation.AnimationName) + Else + StopAnimation(animation.AnimationName) + End If + Next + End If + End If + End If + Next + ' random animation start + For Each lampid As Integer In B2SData.UsedRandomAnimationLampIDs.Keys + If lampid < lampsData.Length And lampid < lamps.Length Then + Dim currentvalue As Integer = CInt(lampsData.Substring(lampid, 1)) + If lamps(lampid) <> currentvalue Then + lamps(lampid) = currentvalue + If B2SData.UsedRandomAnimationLampIDs.ContainsKey(lampid) Then + Dim start As Boolean = (currentvalue <> 0) + Dim isrunning As Boolean = False + If start Then + For Each matchinganimation As B2SData.AnimationInfo In B2SData.UsedRandomAnimationLampIDs(lampid) + If IsAnimationRunning(matchinganimation.AnimationName) Then + isrunning = True + Exit For + End If + Next + End If + If start Then + If Not isrunning Then + Dim random As Integer = RandomStarter(B2SData.UsedRandomAnimationLampIDs(lampid).Length) + Dim animation As B2SData.AnimationInfo = B2SData.UsedRandomAnimationLampIDs(lampid)(random) + lastRandomStartedAnimation = animation.AnimationName + StartAnimation(lastRandomStartedAnimation) + End If + Else + If Not String.IsNullOrEmpty(lastRandomStartedAnimation) Then + StopAnimation(lastRandomStartedAnimation) + lastRandomStartedAnimation = String.Empty + End If + End If + End If + End If + End If + Next + End If + + End Sub + + Private Sub GetThruAllSolenoids(ByVal solenoidsData As String) + + If B2SData.UseRomSolenoids Then + For Each solenoidid As Integer In B2SData.UsedRomSolenoidIDs.Keys + If solenoidid < solenoidsData.Length Then + Dim currentvalue As Integer = CInt(solenoidsData.Substring(solenoidid, 1)) + If solenoids(solenoidid) <> currentvalue Then + If Not B2SData.UsedAnimationSolenoidIDs.ContainsKey(solenoidid) AndAlso Not B2SData.UsedRandomAnimationSolenoidIDs.ContainsKey(solenoidid) Then solenoids(solenoidid) = currentvalue + If B2SData.UsedRomSolenoidIDs.ContainsKey(solenoidid) Then + For Each picbox As B2SPictureBox In B2SData.UsedRomSolenoidIDs(solenoidid) + 'If picbox IsNot Nothing Then + If picbox IsNot Nothing AndAlso (Not B2SData.UseIlluminationLocks OrElse String.IsNullOrEmpty(picbox.GroupName) OrElse Not B2SData.IlluminationLocks.ContainsKey(picbox.GroupName)) Then + Dim visible As Boolean = (currentvalue <> 0) + If picbox.RomInverted Then visible = Not visible + If B2SData.UseRotatingImage AndAlso B2SData.RotatingPictureBox(0) IsNot Nothing AndAlso picbox.Equals(B2SData.RotatingPictureBox(0)) Then + If visible Then + StartRotation() + Else + StopRotation() + End If + Else + picbox.Visible = visible + End If + End If + Next + End If + End If + End If + Next + End If + If B2SData.UseAnimationSolenoids Then + For Each solenoidid As Integer In B2SData.UsedAnimationSolenoidIDs.Keys + If solenoidid < solenoidsData.Length Then + Dim currentvalue As Integer = CInt(solenoidsData.Substring(solenoidid, 1)) + If solenoids(solenoidid) <> currentvalue Then + If Not B2SData.UsedRandomAnimationSolenoidIDs.ContainsKey(solenoidid) Then solenoids(solenoidid) = currentvalue + If B2SData.UsedAnimationSolenoidIDs.ContainsKey(solenoidid) Then + For Each animation As B2SData.AnimationInfo In B2SData.UsedAnimationSolenoidIDs(solenoidid) + Dim start As Boolean = (currentvalue <> 0) + If animation.Inverted Then start = Not start + If start Then + StartAnimation(animation.AnimationName) + Else + StopAnimation(animation.AnimationName) + End If + Next + End If + End If + End If + Next + ' random animation start + For Each solenoidid As Integer In B2SData.UsedRandomAnimationSolenoidIDs.Keys + If solenoidid < solenoidsData.Length Then + Dim currentvalue As Integer = CInt(solenoidsData.Substring(solenoidid, 1)) + If solenoids(solenoidid) <> currentvalue Then + solenoids(solenoidid) = currentvalue + If B2SData.UsedRandomAnimationSolenoidIDs.ContainsKey(solenoidid) Then + Dim start As Boolean = (currentvalue <> 0) + Dim isrunning As Boolean = False + If start Then + For Each matchinganimation As B2SData.AnimationInfo In B2SData.UsedRandomAnimationSolenoidIDs(solenoidid) + If IsAnimationRunning(matchinganimation.AnimationName) Then + isrunning = True + Exit For + End If + Next + End If + If start Then + If Not isrunning Then + Dim random As Integer = RandomStarter(B2SData.UsedRandomAnimationSolenoidIDs(solenoidid).Length) + Dim animation As B2SData.AnimationInfo = B2SData.UsedRandomAnimationSolenoidIDs(solenoidid)(random) + lastRandomStartedAnimation = animation.AnimationName + StartAnimation(lastRandomStartedAnimation) + End If + Else + If Not String.IsNullOrEmpty(lastRandomStartedAnimation) Then + StopAnimation(lastRandomStartedAnimation) + lastRandomStartedAnimation = String.Empty + End If + End If + End If + End If + End If + Next + End If + + End Sub + + Private Sub GetThruAllGIStrings(ByVal gistringsData As String) + + If B2SData.UseRomGIStrings Then + For Each gistringid As Integer In B2SData.UsedRomGIStringIDs.Keys + If gistringid < gistringsData.Length Then + Dim currentvalue As Integer = CInt(gistringsData.Substring(gistringid, 1)) + If gistrings(gistringid) <> currentvalue Then + If Not B2SData.UsedAnimationGIStringIDs.ContainsKey(gistringid) AndAlso Not B2SData.UsedRandomAnimationGIStringIDs.ContainsKey(gistringid) Then gistrings(gistringid) = currentvalue + If B2SData.UsedRomGIStringIDs.ContainsKey(gistringid) Then + For Each picbox As B2SPictureBox In B2SData.UsedRomGIStringIDs(gistringid) + 'If picbox IsNot Nothing Then + If picbox IsNot Nothing AndAlso (Not B2SData.UseIlluminationLocks OrElse String.IsNullOrEmpty(picbox.GroupName) OrElse Not B2SData.IlluminationLocks.ContainsKey(picbox.GroupName)) Then + Dim visible As Boolean = (currentvalue > 4) + If picbox.RomInverted Then visible = Not visible + If B2SData.UseRotatingImage AndAlso B2SData.RotatingPictureBox(0) IsNot Nothing AndAlso picbox.Equals(B2SData.RotatingPictureBox(0)) Then + If visible Then + StartRotation() + Else + StopRotation() + End If + Else + picbox.Visible = visible + End If + End If + Next + End If + End If + End If + Next + End If + If B2SData.UseAnimationGIStrings Then + For Each gistringid As Integer In B2SData.UsedAnimationGIStringIDs.Keys + If gistringid < gistringsData.Length Then + Dim currentvalue As Integer = CInt(gistringsData.Substring(gistringid, 1)) + If gistrings(gistringid) <> currentvalue Then + If Not B2SData.UsedRandomAnimationGIStringIDs.ContainsKey(gistringid) Then gistrings(gistringid) = currentvalue + If B2SData.UsedAnimationGIStringIDs.ContainsKey(gistringid) Then + For Each animation As B2SData.AnimationInfo In B2SData.UsedAnimationGIStringIDs(gistringid) + Dim start As Boolean = (currentvalue > 4) + If animation.Inverted Then start = Not start + If start Then + StartAnimation(animation.AnimationName) + Else + StopAnimation(animation.AnimationName) + End If + Next + End If + End If + End If + Next + ' random animation start + For Each gistringid As Integer In B2SData.UsedRandomAnimationGIStringIDs.Keys + If gistringid < gistringsData.Length Then + Dim currentvalue As Integer = CInt(gistringsData.Substring(gistringid, 1)) + If gistrings(gistringid) <> currentvalue Then + gistrings(gistringid) = currentvalue + If B2SData.UsedRandomAnimationGIStringIDs.ContainsKey(gistringid) Then + Dim start As Boolean = (currentvalue > 4) + Dim isrunning As Boolean = False + If start Then + For Each matchinganimation As B2SData.AnimationInfo In B2SData.UsedRandomAnimationGIStringIDs(gistringid) + If IsAnimationRunning(matchinganimation.AnimationName) Then + isrunning = True + Exit For + End If + Next + End If + If start Then + If Not isrunning Then + Dim random As Integer = RandomStarter(B2SData.UsedRandomAnimationGIStringIDs(gistringid).Length) + Dim animation As B2SData.AnimationInfo = B2SData.UsedRandomAnimationGIStringIDs(gistringid)(random) + lastRandomStartedAnimation = animation.AnimationName + StartAnimation(lastRandomStartedAnimation) + End If + Else + If Not String.IsNullOrEmpty(lastRandomStartedAnimation) Then + StopAnimation(lastRandomStartedAnimation) + lastRandomStartedAnimation = String.Empty + End If + End If + End If + End If + End If + Next + End If + + End Sub + + Private Sub GetThruAllB2SData(ByVal b2sSetData As String) + + If B2SData.UseRomLamps Then + For Each b2ssetid As Integer In B2SData.UsedRomLampIDs.Keys + If b2ssetid < b2sSetData.Length Then + Dim currentvalue As Integer = Asc(b2sSetData.Substring(b2ssetid, 1)) + If b2sSets(b2ssetid) <> currentvalue Then + If Not B2SData.UsedRomReelLampIDs.ContainsKey(b2ssetid) AndAlso Not B2SData.UsedAnimationLampIDs.ContainsKey(b2ssetid) AndAlso Not B2SData.UsedRandomAnimationLampIDs.ContainsKey(b2ssetid) Then b2sSets(b2ssetid) = currentvalue + If B2SData.UsedRomLampIDs.ContainsKey(b2ssetid) Then + For Each picbox As B2SPictureBox In B2SData.UsedRomLampIDs(b2ssetid) + If picbox IsNot Nothing AndAlso (Not B2SData.UseIlluminationLocks OrElse String.IsNullOrEmpty(picbox.GroupName) OrElse Not B2SData.IlluminationLocks.ContainsKey(picbox.GroupName)) Then + If picbox.RomIDValue > 0 Then + picbox.Visible = (picbox.RomIDValue = currentvalue) + Else + Dim visible As Boolean = (currentvalue <> 0) + If picbox.RomInverted Then visible = Not visible + If B2SData.UseRotatingImage AndAlso B2SData.RotatingPictureBox(0) IsNot Nothing AndAlso picbox.Equals(B2SData.RotatingPictureBox(0)) Then + If visible Then + StartRotation() + Else + StopRotation() + End If + Else + picbox.Visible = visible + End If + End If + End If + Next + End If + End If + End If + Next + End If + If B2SData.UseRomReelLamps Then + For Each b2ssetid As Integer In B2SData.UsedRomReelLampIDs.Keys + If b2ssetid < b2sSetData.Length Then + Dim currentvalue As Integer = Asc(b2sSetData.Substring(b2ssetid, 1)) + If b2sSets(b2ssetid) <> currentvalue Then + If Not B2SData.UsedAnimationLampIDs.ContainsKey(b2ssetid) AndAlso Not B2SData.UsedRandomAnimationLampIDs.ContainsKey(b2ssetid) Then b2sSets(b2ssetid) = currentvalue + If B2SData.UsedRomReelLampIDs.ContainsKey(b2ssetid) Then + For Each reelbox As B2SReelBox In B2SData.UsedRomReelLampIDs(b2ssetid) + If reelbox IsNot Nothing AndAlso (Not B2SData.UseIlluminationLocks OrElse String.IsNullOrEmpty(reelbox.GroupName) OrElse Not B2SData.IlluminationLocks.ContainsKey(reelbox.GroupName)) Then + If reelbox.RomIDValue > 0 Then + reelbox.Illuminated = (reelbox.RomIDValue = currentvalue) + Else + Dim illuminated As Boolean = (currentvalue <> 0) + If reelbox.RomInverted Then illuminated = Not illuminated + reelbox.Illuminated = illuminated + End If + End If + Next + End If + End If + End If + Next + End If + If B2SData.UseAnimationLamps Then + For Each b2ssetid As Integer In B2SData.UsedAnimationLampIDs.Keys + If b2ssetid < b2sSetData.Length Then + Dim currentvalue As Integer = Asc(b2sSetData.Substring(b2ssetid, 1)) + If b2sSets(b2ssetid) <> currentvalue Then + If Not B2SData.UsedRandomAnimationLampIDs.ContainsKey(b2ssetid) Then b2sSets(b2ssetid) = currentvalue + If B2SData.UsedAnimationLampIDs.ContainsKey(b2ssetid) Then + For Each animation As B2SData.AnimationInfo In B2SData.UsedAnimationLampIDs(b2ssetid) + Dim start As Boolean = (currentvalue <> 0) + If animation.Inverted Then start = Not start + If start Then + StartAnimation(animation.AnimationName) + Else + StopAnimation(animation.AnimationName) + End If + Next + End If + End If + End If + Next + ' random animation start + For Each b2ssetid As Integer In B2SData.UsedRandomAnimationLampIDs.Keys + If b2ssetid < b2sSetData.Length Then + Dim currentvalue As Integer = Asc(b2sSetData.Substring(b2ssetid, 1)) + If b2sSets(b2ssetid) <> currentvalue Then + b2sSets(b2ssetid) = currentvalue + If B2SData.UsedRandomAnimationLampIDs.ContainsKey(b2ssetid) Then + Dim start As Boolean = (currentvalue <> 0) + Dim isrunning As Boolean = False + If start Then + For Each matchinganimation As B2SData.AnimationInfo In B2SData.UsedRandomAnimationLampIDs(b2ssetid) + If IsAnimationRunning(matchinganimation.AnimationName) Then + isrunning = True + Exit For + End If + Next + End If + If start Then + If Not isrunning Then + Dim random As Integer = RandomStarter(B2SData.UsedRandomAnimationLampIDs(b2ssetid).Length) + Dim animation As B2SData.AnimationInfo = B2SData.UsedRandomAnimationLampIDs(b2ssetid)(random) + lastRandomStartedAnimation = animation.AnimationName + StartAnimation(lastRandomStartedAnimation) + End If + Else + If Not String.IsNullOrEmpty(lastRandomStartedAnimation) Then + StopAnimation(lastRandomStartedAnimation) + lastRandomStartedAnimation = String.Empty + End If + End If + End If + End If + End If + Next + End If + + End Sub + + Private Sub GetThruAllMechs(ByVal mechsData As Integer()) + + If B2SData.UseRomMechs Then + For Each mechid As Integer In B2SData.UsedRomMechIDs.Keys + If mechid >= 1 AndAlso mechid <= 5 Then + Dim currentvalue As Integer = mechsData(mechid) + If mechs(mechid) <> currentvalue Then + mechs(mechid) = currentvalue + If B2SData.UsedRomMechIDs.ContainsKey(mechid) Then + If B2SData.RotatingPictureBox(mechid) IsNot Nothing AndAlso B2SData.RotatingImages(mechid) IsNot Nothing AndAlso B2SData.RotatingImages(mechid).Count > 0 AndAlso B2SData.RotatingImages(mechid).ContainsKey(currentvalue) Then + B2SData.RotatingPictureBox(mechid).BackgroundImage = B2SData.RotatingImages(mechid)(currentvalue) + B2SData.RotatingPictureBox(mechid).Visible = True + End If + End If + End If + End If + Next + End If + + End Sub + + Private Sub GetThruAllLEDs(ByVal regkey As RegistryKey) + + If B2SData.UseLEDs OrElse B2SData.UseLEDDisplays OrElse B2SData.UseReels Then + For digit As Integer = 1 To B2SData.ScoreMaxDigit + Dim currentvalue As Integer = regkey.GetValue("B2SLED" & digit.ToString(), 0) + If leds(digit) <> currentvalue Then + leds(digit) = currentvalue + If B2SData.LEDs.ContainsKey("LEDBox" & digit.ToString()) AndAlso B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Rendered Then + ' rendered LEDs are used + Dim ledname As String = "LEDBox" & digit.ToString() + B2SData.LEDs(ledname).Value = currentvalue + ElseIf B2SData.LEDDisplayDigits.ContainsKey(digit - 1) AndAlso B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Dream7 Then + ' Dream 7 displays are used + With B2SData.LEDDisplayDigits(digit - 1) + .LEDDisplay.SetValue(.Digit, currentvalue) + End With + ElseIf B2SData.Reels.ContainsKey("ReelBox" & digit.ToString()) Then + ' reels are used + Dim reelname As String = "ReelBox" & digit.ToString() + Dim reelbox As B2SReelBox = B2SData.Reels(reelname) + If B2SSettings.IsROMControlled Then + reelbox.Value = currentvalue 'ConvertLEDValue4Reels(currentvalue) + Else + If reelbox.ScoreType = B2SReelBox.eScoreType.Scores Then + reelbox.Text(True) = ConvertLEDValue4Reels(currentvalue) + Else + reelbox.Text(False) = currentvalue + End If + End If + End If + End If + Next + End If + + End Sub + + Private Sub GetThruAllAnimations(ByVal regkey As RegistryKey, ByVal animationsdata As String) + + If B2SAnimation.AreThereAnimations Then + If Not String.IsNullOrEmpty(animationsdata) Then + Dim writeAnimationsData As Boolean = False + For Each animationinfo As String In animationsdata.Split(Chr(1)) + If Not String.IsNullOrEmpty(animationinfo) Then + Dim animationname As String = animationinfo.Substring(0, animationinfo.Length - 2) + Dim animationstate As Integer = CInt(animationinfo.Substring(animationinfo.Length - 1)) + If animations.ContainsKey(animationname) Then + If animations(animationname) <> animationstate Then + animations(animationname) = animationstate + If animationstate = 1 OrElse animationstate = 2 Then + B2SAnimation.StartAnimation(animationname, (animationstate = 2)) + ElseIf animationstate = 0 Then + B2SAnimation.StopAnimation(animationname) + End If + writeAnimationsData = True + animationsdata = animationsdata.Replace(animationinfo, animationname & "=9") + End If + Else + animations.Add(animationname, animationstate) + If animationstate = 1 OrElse animationstate = 2 Then + B2SAnimation.StartAnimation(animationname, (animationstate = 2)) + ElseIf animationstate = 0 Then + B2SAnimation.StopAnimation(animationname) + End If + writeAnimationsData = True + animationsdata = animationsdata.Replace(animationinfo, animationname & "=9") + End If + End If + Next + If writeAnimationsData Then + regkey.SetValue("B2SAnimations", animationsdata) + End If + End If + End If + + End Sub + + Private Sub GetThruAllRotations(ByVal regkey As RegistryKey, ByVal rotationsdata As String) + + If Not String.IsNullOrEmpty(rotationsdata) Then + Dim rotationstate As Integer = CInt(rotationsdata) + If rotation <> rotationstate Then + rotation = rotationstate + If rotationstate = 1 Then + StartRotation() + ElseIf rotationstate = 0 Then + StopRotation() + End If + End If + End If + + End Sub + + Private Sub GetThruAllSounds(ByVal regkey As RegistryKey, ByVal soundsdata As String) + + If Not String.IsNullOrEmpty(soundsdata) Then + Dim writeSoundsData As Boolean = False + For Each soundinfo As String In soundsdata.Split(Chr(1)) + If Not String.IsNullOrEmpty(soundinfo) Then + Dim soundname As String = soundinfo.Substring(0, soundinfo.Length - 2) + Dim soundstate As Integer = CInt(soundinfo.Substring(soundinfo.Length - 1)) + If sounds.ContainsKey(soundname) Then + If sounds(soundname) <> soundstate Then + sounds(soundname) = soundstate + If soundstate = 1 Then + PlaySound(soundname) + ElseIf soundstate = 0 Then + StopSound(soundname) + End If + writeSoundsData = True + soundsdata = soundsdata.Replace(soundinfo, soundname & "=9") + End If + Else + sounds.Add(soundname, soundstate) + If soundstate = 1 Then + PlaySound(soundname) + ElseIf soundstate = 0 Then + StopSound(soundname) + End If + writeSoundsData = True + soundsdata = soundsdata.Replace(soundinfo, soundname & "=9") + End If + End If + Next + If writeSoundsData Then + regkey.SetValue("B2SSounds", soundsdata) + End If + End If + + End Sub + + Private Sub GetThruAllScoreDisplays(ByVal regkey As RegistryKey) + + Dim hide As Integer = regkey.GetValue("B2SHideScoreDisplays", -1) + If hide <> -1 Then + regkey.DeleteValue("B2SHideScoreDisplays", False) + If hide = 0 Then + ' show all score displays + ShowScoreDisplays() + ElseIf hide = 1 Then + ' hide all score display + HideScoreDisplays() + End If + End If + + End Sub + + Private Sub GetThruAllIlluGroups(ByVal regkey As RegistryKey) + + Dim illugroups As String = regkey.GetValue("B2SIlluGroupsByName", String.Empty) + If Not String.IsNullOrEmpty(illugroups) Then + regkey.DeleteValue("B2SIlluGroupsByName", False) + ' get thru all illu groups + For Each illugroupinfo As String In illugroups.Split(Chr(1)) + ' only do the lightning stuff if the group has a name + If Not String.IsNullOrEmpty(illugroupinfo) And illugroupinfo.Contains("=") Then + Dim pos As Integer = illugroupinfo.IndexOf("=") + Dim groupname As String = illugroupinfo.Substring(0, pos) + Dim value As Integer = CInt(illugroupinfo.Substring(pos + 1)) + If B2SData.IlluminationGroups.ContainsKey(groupname) Then + ' get all matching picture boxes + For Each picbox As B2SPictureBox In B2SData.IlluminationGroups(groupname) + If picbox.RomIDValue > 0 Then + picbox.Visible = (picbox.RomIDValue = value) + Else + picbox.Visible = (value <> 0) + End If + Next + End If + End If + Next + End If + + End Sub + + Private Function ConvertLEDValue4Reels(ByVal ledvalue As Integer) As Integer + + Dim ret As Integer = 0 + Select Case ledvalue + Case 0, 63 : ret = 0 + Case 6 : ret = 1 + Case 91 : ret = 2 + Case 79 : ret = 3 + Case 102 : ret = 4 + Case 109 : ret = 5 + Case 125 : ret = 6 + Case 7 : ret = 7 + Case 127 : ret = 8 + Case 111 : ret = 9 + End Select + Return ret + + End Function + +#End Region + #Region "settings action" @@ -1691,11 +2851,10 @@ Public Class formBackglass End If Next End If + End If - End If - - ' set info flags to dirty to load them - B2SData.IsInfoDirty = True + ' set info flags to dirty to load them + B2SData.IsInfoDirty = True End If @@ -2157,6 +3316,27 @@ Public Class formBackglass Return Drawing.Color.FromArgb(CInt(colorvalues(0)), CInt(colorvalues(1)), CInt(colorvalues(2))) End Function + Private Sub SetFocusToVPPlayer() + + ' set focus to the VP player + Dim proc As Processes = New Processes() + SetForegroundWindow(proc.TableHandle) + tableHandle = proc.TableHandle + + End Sub + + Private Function RandomStarter(ByVal top As Integer) As Integer + + Static lastone As Integer = -1 + Dim ret As Integer = -1 + Do Until ret >= 0 AndAlso ret < top AndAlso ret <> lastone + Dim random As Random = New Random(Date.Now.Millisecond) + ret = CInt(Math.Truncate(random.NextDouble() * top)) + Loop + lastone = ret + Return ret + + End Function #End Region diff --git a/b2sbackglassserver/b2sbackglassserver/Forms/formSettings.vb b/b2sbackglassserver/b2sbackglassserver/Forms/formSettings.vb index 572027e..4bfe06b 100644 --- a/b2sbackglassserver/b2sbackglassserver/Forms/formSettings.vb +++ b/b2sbackglassserver/b2sbackglassserver/Forms/formSettings.vb @@ -1,9 +1,9 @@ -Imports System -Imports System.Drawing +Imports System.Drawing Imports System.Windows.Forms Imports System.IO Imports System.Reflection Imports System.Security.Principal +Imports Microsoft.Win32 Public Class formSettings @@ -45,15 +45,17 @@ Public Class formSettings ' load data Dim _isdirty As Boolean = isSettingsScreenDirty Me.Text = "Settings... [" & B2SData.TableFileName & "] " & " (" & If(Not String.IsNullOrEmpty(B2SSettings.GameName), B2SSettings.GameName, B2SSettings.B2SName) & ")" & If(IsAdmin(), " (Administrator)", "") + If B2SSettings.PureEXE Then btnSaveSettings.Enabled = False ' set version info - lblCopyright.Text = String.Format(lblCopyright.Text, My.Application.Info.ProductName.ToString, My.Application.Info.Copyright.ToString) + lblCopyright.Text = String.Format(lblCopyright.Text, If(B2SSettings.StartAsEXE, "B2S.Server.EXE", "B2S.Server.DLL"), My.Application.Info.Copyright.ToString) Dim Assembly As Assembly = Assembly.GetExecutingAssembly() Dim FileVersionInfo As FileVersionInfo = FileVersionInfo.GetVersionInfo(Assembly.Location) lblVersion.Text = String.Format("Server version {0} {1}, backglass file version {2}", FileVersionInfo.ProductVersion, If(Environment.Is64BitProcess, "x64", "x86"), B2SSettings.BackglassFileVersion) ' get more data + formSettingsMore.btnLogPath.Text = "Log path: " & B2SSettings.LogPath formSettingsMore.chkLogLamps.Checked = B2SSettings.IsLampsStateLogOn formSettingsMore.chkLogSolenoids.Checked = B2SSettings.IsSolenoidsStateLogOn @@ -415,6 +417,14 @@ Public Class formSettings End Sub Private Sub btnPluginSettings_Click(sender As Object, e As EventArgs) Handles btnPluginSettings.Click B2SSettings.PluginHost.ShowPluginWindow(Me) + If B2SSettings.StartAsEXE Then + Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) + With Me 'B2SScreen.BackglassScreen.Bounds + regkey.SetValue("PluginsScreen", .Location.X & "," & .Location.Y & "," & .Size.Width & "," & .Size.Height) + End With + regkey.SetValue("PluginsOpenDialog", 1) + End Using + End If End Sub Private Function IsDirty() As Boolean diff --git a/b2sbackglassserver/b2sbackglassserver/My Project/AssemblyInfo.vb b/b2sbackglassserver/b2sbackglassserver/My Project/AssemblyInfo.vb index 874d9ad..8493b9b 100644 --- a/b2sbackglassserver/b2sbackglassserver/My Project/AssemblyInfo.vb +++ b/b2sbackglassserver/b2sbackglassserver/My Project/AssemblyInfo.vb @@ -31,6 +31,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - - + + + diff --git a/b2sbackglassserverexe/B2SBackglassServerEXE.ico b/b2sbackglassserverexe/B2SBackglassServerEXE.ico new file mode 100644 index 0000000000000000000000000000000000000000..6cbc31cfc64c09edda93e1b63bb6a2d7b4f6c98e GIT binary patch literal 96510 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𝔷L-(?}v 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 cGw2mJ(Mwy0`v%S5%h9UD0WX$|UdE{WU!dBl!T + + + WinExe + net6.0-windows10.0.17763.0 + B2SBackglassServerEXE.Main + True + WindowsFormsWithCustomSubMain + B2SBackglassServerEXE.ico + My Project\app.manifest + 10.0.17763.0 + + + + + + + + + + + + false + false + + + + + + + + + + + + + + + + + + + True + True + Application.myapp + + + True + True + Resources.resx + + + True + True + Settings.settings + + + + + + My.Resources + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + My + SettingsSingleFileGenerator + Settings.Designer.vb + + + + \ No newline at end of file diff --git a/b2sbackglassserverexe/My Project/Application.Designer.vb b/b2sbackglassserverexe/My Project/Application.Designer.vb new file mode 100644 index 0000000..88dd01c --- /dev/null +++ b/b2sbackglassserverexe/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/b2sbackglassserverexe/My Project/Application.myapp b/b2sbackglassserverexe/My Project/Application.myapp new file mode 100644 index 0000000..b56becd --- /dev/null +++ b/b2sbackglassserverexe/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + Form1 + false + 0 + false + 0 + true + \ No newline at end of file diff --git a/b2sbackglassserverexe/My Project/Settings.Designer.vb b/b2sbackglassserverexe/My Project/Settings.Designer.vb new file mode 100644 index 0000000..f016c55 --- /dev/null +++ b/b2sbackglassserverexe/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(sender As Global.System.Object, e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.B2SBackglassServerEXE.My.MySettings + Get + Return Global.B2SBackglassServerEXE.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/b2sbackglassserverexe/My Project/Settings.settings b/b2sbackglassserverexe/My Project/Settings.settings new file mode 100644 index 0000000..392df0a --- /dev/null +++ b/b2sbackglassserverexe/My Project/Settings.settings @@ -0,0 +1,6 @@ + + + + + + diff --git a/b2sbackglassserverexe/My Project/app.manifest b/b2sbackglassserverexe/My Project/app.manifest new file mode 100644 index 0000000..9ce67d2 --- /dev/null +++ b/b2sbackglassserverexe/My Project/app.manifest @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/b2sbackglassserverexe/My Project/launchSettings.json b/b2sbackglassserverexe/My Project/launchSettings.json new file mode 100644 index 0000000..f2cf1f2 --- /dev/null +++ b/b2sbackglassserverexe/My Project/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "B2SBackglassServerEXE": { + "commandName": "Project", + "commandLineArgs": "test007" + } + } +} \ No newline at end of file diff --git a/b2sbackglassserverexe/Program.vb b/b2sbackglassserverexe/Program.vb new file mode 100644 index 0000000..7e95f75 --- /dev/null +++ b/b2sbackglassserverexe/Program.vb @@ -0,0 +1,27 @@ +Imports B2S + +Public Module Main + Sub Main() + + Dim myServer As New B2S.Server + Dim topMost As Boolean = False + + If My.Application.CommandLineArgs.Count > 0 Then + B2SData.TableFileName = My.Application.CommandLineArgs(0).ToString + + If My.Application.CommandLineArgs.Count > 1 Then + If My.Application.CommandLineArgs(1).ToString = "1" Then + topMost = True + End If + End If + Else + MessageBox.Show("Please do not start the EXE this way.", "B2S.Server", MessageBoxButtons.OK, MessageBoxIcon.Error) + End + End If + + Application.EnableVisualStyles() + Application.SetCompatibleTextRenderingDefault(False) + Application.Run(New formBackglass(B2SData.TableFileName, topMost)) + End Sub + +End Module diff --git a/b2sbackglassserverexe_tmp/b2sbackglassserverexe/Classes/B2SSettings.vb b/b2sbackglassserverexe_tmp/b2sbackglassserverexe/Classes/B2SSettings.vb index 2ebe7ea..4a0067a 100644 --- a/b2sbackglassserverexe_tmp/b2sbackglassserverexe/Classes/B2SSettings.vb +++ b/b2sbackglassserverexe_tmp/b2sbackglassserverexe/Classes/B2SSettings.vb @@ -7,7 +7,7 @@ Imports Microsoft.Win32 Public Class B2SSettings - Public Const DirectB2SVersion As String = "2.1.2" + Public Const DirectB2SVersion As String = "3.0.0" Public Const MinimumDirectB2SVersion As String = "1.0" Public Shared Property BackglassFileVersion() As String = String.Empty diff --git a/b2sbackglassserverexe_tmp/b2sbackglassserverexe/My Project/AssemblyInfo.vb b/b2sbackglassserverexe_tmp/b2sbackglassserverexe/My Project/AssemblyInfo.vb index 6b461ea..5c728d1 100644 --- a/b2sbackglassserverexe_tmp/b2sbackglassserverexe/My Project/AssemblyInfo.vb +++ b/b2sbackglassserverexe_tmp/b2sbackglassserverexe/My Project/AssemblyInfo.vb @@ -31,6 +31,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - - + + + diff --git a/b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/My Project/AssemblyInfo.vb b/b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/My Project/AssemblyInfo.vb index 9e79be9..abcb5d5 100644 --- a/b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/My Project/AssemblyInfo.vb +++ b/b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/My Project/AssemblyInfo.vb @@ -31,6 +31,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - - + + +