diff --git a/.github/workflows/b2s-backglass.yml b/.github/workflows/b2s-backglass.yml index eacec8a..9edfb01 100644 --- a/.github/workflows/b2s-backglass.yml +++ b/.github/workflows/b2s-backglass.yml @@ -29,31 +29,47 @@ jobs: name: Update AssemblyInformationalVersion run: | SHA7="${GITHUB_SHA::7}" - ASSEMBLY_INFO="B2SServerPluginInterface/B2SServerPluginInterface/Properties/AssemblyInfo.cs" - VERSION=$(grep -Eo "AssemblyVersion\(.*\)" "${ASSEMBLY_INFO}" | grep -Eo "[0-9\.]+" | tail -1) - TAG="${VERSION}-${SHA7}" - echo -e "\n[assembly: AssemblyInformationalVersion(\"${TAG}\")]" >> "${ASSEMBLY_INFO}" + : # Fetch version + VERSION_INFO="b2sbackglassserver/b2sbackglassserver/Classes/B2SVersionInfo.vb" + VERSION_MAJOR=$(grep -Eo "B2S_VERSION_MAJOR\s+=\s\"[0-9]+\"" "${VERSION_INFO}" | grep -Eo "[0-9]+" | tail -1) + VERSION_MINOR=$(grep -Eo "B2S_VERSION_MINOR\s+=\s\"[0-9]+\"" "${VERSION_INFO}" | grep -Eo "[0-9]+" | tail -1) + VERSION_REV=$(grep -Eo "B2S_VERSION_REVISION\s+=\s\"[0-9]+\"" "${VERSION_INFO}" | grep -Eo "[0-9]+" | tail -1) + VERSION_SHORT="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REV}.${{ github.run_number }}" + VERSION_LONG="${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REV}.${{ github.run_number }}-${SHA7}" + echo VERSION_MINI ${VERSION_MINI} + echo VERSION_SHORT ${VERSION_SHORT} + echo VERSION_LONG ${VERSION_LONG} + : # b2sbackglassserver + perl -i -pe"s/B2S_VERSION_BUILD\s+=\s+\".*\"/B2S_VERSION_BUILD = \"${{ github.run_number }}\"/g" "${VERSION_INFO}" + perl -i -pe"s/B2S_VERSION_HASH\s+=\s+\".*\"/B2S_VERSION_HASH = \"${SHA7}\"/g" "${VERSION_INFO}" + ASSEMBLY_INFO="b2sbackglassserver/b2sbackglassserver/My Project/AssemblyInfo.vb" + perl -i -pe"s/AssemblyVersion\(\".*\"\)/AssemblyVersion\(\"${VERSION_SHORT}\"\)/g" "${ASSEMBLY_INFO}" + perl -i -pe"s/AssemblyFileVersion\(\".*\"\)/AssemblyFileVersion\(\"${VERSION_SHORT}\"\)/g" "${ASSEMBLY_INFO}" + perl -i -pe"s/AssemblyInformationalVersion\(\".*\"\)/AssemblyInformationalVersion\(\"${VERSION_LONG}\"\)/g" "${ASSEMBLY_INFO}" + : # b2s_screenresidentifier ASSEMBLY_INFO="b2s_screenresidentifier/b2s_screenresidentifier/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="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}" + perl -i -pe"s/AssemblyVersion\(\".*\"\)/AssemblyVersion\(\"${VERSION_SHORT}\"\)/g" "${ASSEMBLY_INFO}" + perl -i -pe"s/AssemblyFileVersion\(\".*\"\)/AssemblyFileVersion\(\"${VERSION_SHORT}\"\)/g" "${ASSEMBLY_INFO}" + perl -i -pe"s/AssemblyInformationalVersion\(\".*\"\)/AssemblyInformationalVersion\(\"${VERSION_LONG}\"\)/g" "${ASSEMBLY_INFO}" + : # b2sbackglassserverregisterapp ASSEMBLY_INFO="b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/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="b2sbackglassserver/b2sbackglassserver/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}" - echo "tag=${TAG}" >> $GITHUB_OUTPUT + perl -i -pe"s/AssemblyVersion\(\".*\"\)/AssemblyVersion\(\"${VERSION_SHORT}\"\)/g" "${ASSEMBLY_INFO}" + perl -i -pe"s/AssemblyFileVersion\(\".*\"\)/AssemblyFileVersion\(\"${VERSION_SHORT}\"\)/g" "${ASSEMBLY_INFO}" + perl -i -pe"s/AssemblyInformationalVersion\(\".*\"\)/AssemblyInformationalVersion\(\"${VERSION_LONG}\"\)/g" "${ASSEMBLY_INFO}" + : # B2SWindowPunch ASSEMBLY_INFO="B2SWindowPunch/B2SWindowPunch/Properties/AssemblyInfo.cs" + perl -i -pe"s/AssemblyVersion\(\".*\"\)/AssemblyVersion\(\"${VERSION_SHORT}\"\)/g" "${ASSEMBLY_INFO}" + perl -i -pe"s/AssemblyFileVersion\(\".*\"\)/AssemblyFileVersion\(\"${VERSION_SHORT}\"\)/g" "${ASSEMBLY_INFO}" + perl -i -pe"s/AssemblyInformationalVersion\(\".*\"\)/AssemblyInformationalVersion\(\"${VERSION_LONG}\"\)/g" "${ASSEMBLY_INFO}" + : # B2SServerPluginInterface + ASSEMBLY_INFO="B2SServerPluginInterface/B2SServerPluginInterface/Properties/AssemblyInfo.cs" 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}" + TAG="${VERSION::5}.${{ github.run_number }}" + perl -i -pe"s/AssemblyConfiguration\(\"\"\)/AssemblyConfiguration\(\"Compiled by B2S.Server\"\)/g" "${ASSEMBLY_INFO}" + echo -e "\n[assembly: AssemblyFileVersion(\"${TAG}\")]" >> "${ASSEMBLY_INFO}" + echo -e "\n[assembly: AssemblyInformationalVersion(\"${TAG}-${SHA7}\")]" >> "${ASSEMBLY_INFO}" + : # Keep the VERSION_LONG for later + echo "tag=${VERSION_LONG}" >> $GITHUB_OUTPUT - uses: microsoft/setup-msbuild@v2 - name: Build B2SServerPluginInterface run: | @@ -67,7 +83,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 b2sbackglassserver/B2SBackglassServerEXE.sln /t:Rebuild /p:Configuration=${{ matrix.config }} /p:Platform=${{ matrix.platform }} 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 }} @@ -77,19 +93,19 @@ 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 cp b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/bin/${{ matrix.platform }}/${{ matrix.config }}/B2SBackglassServerRegisterApp.exe tmp - cp b2sbackglassserver/b2sbackglassserver/bin/${{ matrix.config }}/B2SServerPluginInterface.dll tmp + cp B2SServerPluginInterface/B2SServerPluginInterface/bin/${{ matrix.config }}/B2SServerPluginInterface.dll tmp cp b2sbackglassserver/b2sbackglassserver/bin/${{ matrix.config }}/B2SBackglassServer.dll tmp + cp b2sbackglassserver/b2sbackglassserver/bin/${{ matrix.platform }}/${{ matrix.config }}/B2SBackglassServerEXE.exe tmp + cp b2sbackglassserver/b2sbackglassserver/bin/${{ matrix.platform }}/${{ matrix.config }}/B2SBackglassServerEXE.exe.config tmp cp b2sbackglassserver/b2sbackglassserver/B2SInit.cmd tmp 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 b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/bin/${{ matrix.platform }}/${{ matrix.config }}/B2SBackglassServerRegisterApp.pdb tmp - cp b2sbackglassserver/b2sbackglassserver/bin/${{ matrix.config }}/B2SServerPluginInterface.pdb tmp + cp B2SServerPluginInterface/B2SServerPluginInterface/bin/${{ matrix.config }}/B2SServerPluginInterface.pdb tmp cp b2sbackglassserver/b2sbackglassserver/bin/${{ matrix.config }}/B2SBackglassServer.pdb tmp + cp b2sbackglassserver/b2sbackglassserver/bin/${{ matrix.platform }}/${{ matrix.config }}/B2SBackglassServerEXE.pdb tmp cp B2SWindowPunch/B2SWindowPunch/bin/${{ matrix.config }}/B2SWindowPunch.pdb tmp fi mkdir tmp/Plugins tmp/Plugins64 diff --git a/Changelog.txt b/Changelog.txt index 8bb089e..ffa8fb5 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,8 @@ +2.5.0 +- Finally a merge of the source code of B2SBackglassServer & B2SBackglassServerEXE into one. Should not be noticed while running, but huge for development. +- Added new method B2SSetPos(ImageId, xpos, ypos) to move the images on the backglass. +- Added new method B2SServerBuild() returning float version number: 20500.0295 + 2.1.2 - Request to turn off backglass in b2s settings #80 Thanks @stevejones72! It is a setting per table, so the table you save with hidden backglass will have it's backglass not shown. diff --git a/b2s_screenresidentifier/b2s_screenresidentifier/My Project/AssemblyInfo.vb b/b2s_screenresidentifier/b2s_screenresidentifier/My Project/AssemblyInfo.vb index 756d0cb..cc8db81 100644 --- a/b2s_screenresidentifier/b2s_screenresidentifier/My Project/AssemblyInfo.vb +++ b/b2s_screenresidentifier/b2s_screenresidentifier/My Project/AssemblyInfo.vb @@ -2,35 +2,35 @@ Imports System.Reflection Imports System.Runtime.InteropServices -' Allgemeine Informationen über eine Assembly werden über die folgenden -' Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -' die mit einer Assembly verknüpft sind. +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. -' Die Werte der Assemblyattribute überprüfen +' Review the values of the assembly attributes - - + + -'Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +'The following GUID is for the ID of the typelib if this project is exposed to COM -' Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +' Version information for an assembly consists of the following four values: ' -' Hauptversion -' Nebenversion -' Buildnummer +' Major Version +' Minor Version +' Build Number ' Revision ' -' Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern -' übernehmen, indem Sie "*" eingeben: +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: ' - - - + + + diff --git a/b2sbackglassserverexe/B2SBackglassServerEXE.sln b/b2sbackglassserver/B2SBackglassServerEXE.sln similarity index 90% rename from b2sbackglassserverexe/B2SBackglassServerEXE.sln rename to b2sbackglassserver/B2SBackglassServerEXE.sln index f9ed247..2524e85 100644 --- a/b2sbackglassserverexe/B2SBackglassServerEXE.sln +++ b/b2sbackglassserver/B2SBackglassServerEXE.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.4.33205.214 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "B2SBackglassServerEXE", "B2SBackglassServerEXE\B2SBackglassServerEXE.vbproj", "{AC2E94BE-21CD-434A-9039-6551DF43698B}" +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "B2SBackglassServerEXE", "B2SBackglassServer\B2SBackglassServerEXE.vbproj", "{AC2E94BE-21CD-434A-9039-6551DF43698B}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/b2sbackglassserver/b2sbackglassserver/B2SBackglassServer.vbproj b/b2sbackglassserver/b2sbackglassserver/B2SBackglassServer.vbproj index ca0ed5d..ac6d1b0 100644 --- a/b2sbackglassserver/b2sbackglassserver/B2SBackglassServer.vbproj +++ b/b2sbackglassserver/b2sbackglassserver/B2SBackglassServer.vbproj @@ -10,11 +10,16 @@ 512 Windows v4.8 - SAK - SAK - SAK - SAK + + + + + + + + + B2S="DLL" AnyCPU @@ -25,8 +30,9 @@ bin\Debug\ B2SBackglassServer.xml 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - true + false false + B2S="DLL" AnyCPU @@ -37,9 +43,10 @@ bin\Release\ B2SBackglassServer.xml 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 - true + false true false + B2S="DLL" On @@ -96,6 +103,7 @@ + Component @@ -116,6 +124,12 @@ + + Background.vb + + + Form + formBackglass.vb @@ -158,7 +172,6 @@ Form - True @@ -175,17 +188,24 @@ Settings.settings True + + + Background.vb + Designer + formBackglass.vb Designer formDMD.vb + Designer formMode.vb + Designer formSettings.vb @@ -193,6 +213,7 @@ formSettingsMore.vb + Designer VbMyResourcesResXFileCodeGenerator diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/B2SBackglassServerEXE.ico b/b2sbackglassserver/b2sbackglassserver/B2SBackglassServerEXE.ico similarity index 100% rename from b2sbackglassserverexe/b2sbackglassserverexe/B2SBackglassServerEXE.ico rename to b2sbackglassserver/b2sbackglassserver/B2SBackglassServerEXE.ico diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/B2SBackglassServerEXE.vbproj b/b2sbackglassserver/b2sbackglassserver/B2SBackglassServerEXE.vbproj similarity index 92% rename from b2sbackglassserverexe/b2sbackglassserverexe/B2SBackglassServerEXE.vbproj rename to b2sbackglassserver/b2sbackglassserver/B2SBackglassServerEXE.vbproj index c68f8b0..cb9cbe9 100644 --- a/b2sbackglassserverexe/b2sbackglassserverexe/B2SBackglassServerEXE.vbproj +++ b/b2sbackglassserver/b2sbackglassserver/B2SBackglassServerEXE.vbproj @@ -10,10 +10,14 @@ 512 WindowsFormsWithCustomSubMain v4.8 - SAK - SAK - SAK - SAK + + + + + + + + publish\ true @@ -30,6 +34,7 @@ false false true + B2S="EXE" AnyCPU @@ -42,6 +47,7 @@ 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 false false + B2S="EXE" AnyCPU @@ -55,6 +61,7 @@ false true false + B2S="EXE" x64 @@ -67,6 +74,7 @@ 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 false false + B2S="EXE" x64 @@ -80,6 +88,7 @@ false true false + B2S="EXE" On @@ -153,6 +162,9 @@ + + + Component @@ -166,6 +178,9 @@ Component + + Component + Component @@ -207,9 +222,9 @@ Form - + True @@ -286,6 +301,9 @@ false + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/b2sbackglassserver/b2sbackglassserver/Server.vb b/b2sbackglassserver/b2sbackglassserver/Server.vb index dae2b03..8555ad3 100644 --- a/b2sbackglassserver/b2sbackglassserver/Server.vb +++ b/b2sbackglassserver/b2sbackglassserver/Server.vb @@ -4,6 +4,8 @@ Imports System.Runtime.InteropServices Imports Microsoft.Win32 Imports System.Linq.Expressions Imports System.Drawing +Imports System.Reflection +Imports System.Runtime.InteropServices.WindowsRuntime Public Class Server @@ -128,119 +130,125 @@ Public Class Server End Sub Private Sub Timer_Tick() + Try - ' check whether the table is still running - If tableHandle <> 0 AndAlso Not IsWindow(tableHandle) Then + ' check whether the table is still running + If tableHandle <> 0 AndAlso Not IsWindow(tableHandle) Then - Try - Me.Stop() - Finally - Me.Dispose() - End Try + Try + Me.Stop() + Finally + Me.Dispose() + End Try - Else + Else - ' maybe reload settings - If B2SData.IsBackglassStartedAsEXE Then - Static settingscounter As Integer = 0 - settingscounter += 1 + ' maybe reload settings + If B2SData.IsBackglassStartedAsEXE Then + Static settingscounter As Integer = 0 + settingscounter += 1 - ' check for set switches - Static whatsupwithswitches As Boolean = True - Static look4switches As Boolean = False - If whatsupwithswitches Then - Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) - Dim switch As Integer = 0 - If Not look4switches Then - switch = CInt(regkey.GetValue("B2SSetSwitch", "-1")) - If switch > -1 Then - whatsupwithswitches = (switch = 1) - look4switches = (switch = 1) - regkey.DeleteValue("B2SSetSwitch", False) + ' check for set switches + Static whatsupwithswitches As Boolean = True + Static look4switches As Boolean = False + If whatsupwithswitches Then + Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) + Dim switch As Integer = 0 + If Not look4switches Then + switch = CInt(regkey.GetValue("B2SSetSwitch", "-1")) + If switch > -1 Then + whatsupwithswitches = (switch = 1) + look4switches = (switch = 1) + regkey.DeleteValue("B2SSetSwitch", False) + End If End If + If look4switches Then + For i As Integer = 1 To 2 + switch = CInt(regkey.GetValue("B2SSetSwitch" & i.ToString(), "0")) + If switch > 0 Then + B2SAnimation.SetSwitch(switch) + regkey.DeleteValue("B2SSetSwitch" & i.ToString(), False) + End If + Next + End If + End Using + End If + + ' maybe reload settings + If settingscounter >= 200 Then + settingscounter = 0 + Dim reloadSettings As Boolean = (Registry.CurrentUser.OpenSubKey("Software\B2S").GetValue("B2SReloadSettings", 0) = 1) + If reloadSettings Then + Registry.CurrentUser.OpenSubKey("Software\B2S", True).SetValue("B2SReloadSettings", 0) + B2SSettings.Load(False) End If - If look4switches Then - For i As Integer = 1 To 2 - switch = CInt(regkey.GetValue("B2SSetSwitch" & i.ToString(), "0")) - If switch > 0 Then - B2SAnimation.SetSwitch(switch) - regkey.DeleteValue("B2SSetSwitch" & i.ToString(), False) + End If + + ' maybe open plugins window + If (settingscounter Mod 10) = 0 AndAlso B2SSettings.ArePluginsOn AndAlso B2SSettings.PluginHost IsNot Nothing AndAlso B2SSettings.PluginHost.Plugins.Count > 0 Then + Dim openPluginWindow As Boolean = (Registry.CurrentUser.OpenSubKey("Software\B2S").GetValue("PluginsOpenDialog", 0) = 1) + If openPluginWindow Then + Dim pluginScreenBounds As System.Drawing.Rectangle = Nothing + Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) + Dim screensettings As String = regkey.GetValue("PluginsScreen").ToString + If Not String.IsNullOrEmpty(screensettings) Then + Dim tmp As String() = regkey.GetValue("PluginsScreen").ToString.Split(",") + If tmp.Length >= 4 Then + pluginScreenBounds = New System.Drawing.Rectangle(CInt(tmp(0)), CInt(tmp(1)), CInt(tmp(2)), CInt(tmp(3))) + End If End If - Next + regkey.DeleteValue("PluginsScreen", False) + regkey.DeleteValue("PluginsOpenDialog", False) + End Using + B2SSettings.PluginHost.ShowPluginWindow(, pluginScreenBounds) End If - End Using - End If - - ' maybe reload settings - If settingscounter >= 200 Then - settingscounter = 0 - Dim reloadSettings As Boolean = (Registry.CurrentUser.OpenSubKey("Software\B2S").GetValue("B2SReloadSettings", 0) = 1) - If reloadSettings Then - Registry.CurrentUser.OpenSubKey("Software\B2S", True).SetValue("B2SReloadSettings", 0) - B2SSettings.Load(False) End If End If - ' maybe open plugins window - If (settingscounter Mod 10) = 0 AndAlso B2SSettings.ArePluginsOn AndAlso B2SSettings.PluginHost IsNot Nothing AndAlso B2SSettings.PluginHost.Plugins.Count > 0 Then - Dim openPluginWindow As Boolean = (Registry.CurrentUser.OpenSubKey("Software\B2S").GetValue("PluginsOpenDialog", 0) = 1) - If openPluginWindow Then - Dim pluginScreenBounds As System.Drawing.Rectangle = Nothing - Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) - Dim screensettings As String = regkey.GetValue("PluginsScreen").ToString - If Not String.IsNullOrEmpty(screensettings) Then - Dim tmp As String() = regkey.GetValue("PluginsScreen").ToString.Split(",") - If tmp.Length >= 4 Then - pluginScreenBounds = New System.Drawing.Rectangle(CInt(tmp(0)), CInt(tmp(1)), CInt(tmp(2)), CInt(tmp(3))) - End If - End If - regkey.DeleteValue("PluginsScreen", False) - regkey.DeleteValue("PluginsOpenDialog", False) - End Using - B2SSettings.PluginHost.ShowPluginWindow(, pluginScreenBounds) + ' have a look for important pollings + Static counter As Integer = 0 + Static callLamps As Boolean = False + Static callSolenoids As Boolean = False + Static callGIStrings As Boolean = False + Static callLEDs As Boolean = False + If counter <= 25 Then + counter += 1 + callLamps = Not isChangedLampsCalled AndAlso (B2SData.IsBackglassStartedAsEXE OrElse B2SData.UseRomLamps OrElse B2SData.UseAnimationLamps) + callSolenoids = Not isChangedSolenoidsCalled AndAlso (B2SData.IsBackglassStartedAsEXE OrElse B2SData.UseRomSolenoids OrElse B2SData.UseAnimationSolenoids) + callGIStrings = Not isChangedGIStringsCalled AndAlso (B2SData.IsBackglassStartedAsEXE OrElse B2SData.UseRomGIStrings OrElse B2SData.UseAnimationGIStrings) + callLEDs = Not isChangedLEDsCalled AndAlso (B2SData.IsBackglassStartedAsEXE OrElse B2SData.UseLEDs OrElse B2SData.UseLEDDisplays OrElse B2SData.UseReels) + CheckTableHandle() + Else + If B2SSettings.IsROMControlled Then + If callLamps Then Dim chg As Object = ChangedLamps() + If callSolenoids Then Dim chg As Object = ChangedSolenoids() + If callGIStrings Then Dim chg As Object = ChangedGIStrings() + If callLEDs Then Dim chg As Object = ChangedLEDs(&HFFFFFFFF, &HFFFFFFFF) End If End If - End If - ' have a look for important pollings - Static counter As Integer = 0 - Static callLamps As Boolean = False - Static callSolenoids As Boolean = False - Static callGIStrings As Boolean = False - Static callLEDs As Boolean = False - If counter <= 25 Then - counter += 1 - callLamps = Not isChangedLampsCalled AndAlso (B2SData.IsBackglassStartedAsEXE OrElse B2SData.UseRomLamps OrElse B2SData.UseAnimationLamps) - callSolenoids = Not isChangedSolenoidsCalled AndAlso (B2SData.IsBackglassStartedAsEXE OrElse B2SData.UseRomSolenoids OrElse B2SData.UseAnimationSolenoids) - callGIStrings = Not isChangedGIStringsCalled AndAlso (B2SData.IsBackglassStartedAsEXE OrElse B2SData.UseRomGIStrings OrElse B2SData.UseAnimationGIStrings) - callLEDs = Not isChangedLEDsCalled AndAlso (B2SData.IsBackglassStartedAsEXE OrElse B2SData.UseLEDs OrElse B2SData.UseLEDDisplays OrElse B2SData.UseReels) - CheckTableHandle() - Else - If B2SSettings.IsROMControlled Then - If callLamps Then Dim chg As Object = ChangedLamps() - If callSolenoids Then Dim chg As Object = ChangedSolenoids() - If callGIStrings Then Dim chg As Object = ChangedGIStrings() - If callLEDs Then Dim chg As Object = ChangedLEDs(&HFFFFFFFF, &HFFFFFFFF) + ' maybe the table is reseted so reset some stuff + If tableReset Then + tableCount = 0 + counter = 0 + callLamps = False + callSolenoids = False + callGIStrings = False + callLEDs = False + isChangedLampsCalled = False + isChangedSolenoidsCalled = False + isChangedGIStringsCalled = False + isChangedLEDsCalled = False + 'B2SData.IsBackglassStartedAsEXE = False + tableReset = False End If - End If - ' maybe the table is reseted so reset some stuff - If tableReset Then - tableCount = 0 - counter = 0 - callLamps = False - callSolenoids = False - callGIStrings = False - callLEDs = False - isChangedLampsCalled = False - isChangedSolenoidsCalled = False - isChangedGIStringsCalled = False - isChangedLEDsCalled = False - 'B2SData.IsBackglassStartedAsEXE = False - tableReset = False End If - - End If + Catch ex As Exception + Dim st As New StackTrace(ex, True) + errorlog.WriteLogEntry(DateTime.Now & "Line: " & st.GetFrame(0).GetMethod().Name & " : " & st.GetFrame(0).GetFileLineNumber().ToString & " : " & ex.Message) + Throw ex + End Try End Sub @@ -262,10 +270,20 @@ Public Class Server Public ReadOnly Property B2SServerVersion() As String Get - Return B2SSettings.DirectB2SVersion + Return B2SVersionInfo.B2S_VERSION_STRING + End Get + End Property + + Public ReadOnly Property B2SServerBuild() As Double + Get + Return CInt(B2SVersionInfo.B2S_VERSION_MAJOR) * 10000 + + CInt(B2SVersionInfo.B2S_VERSION_MINOR) * 100 + + CInt(B2SVersionInfo.B2S_VERSION_REVISION) + + CInt(B2SVersionInfo.B2S_VERSION_BUILD) / 10000 End Get End Property + Public ReadOnly Property B2SServerDirectory() As String Get Return System.Reflection.Assembly.GetExecutingAssembly().Location @@ -1709,14 +1727,6 @@ Public Class Server End If End Sub - - Public Sub B2SSetPosAbsolute(ByVal idORname As Object, ByVal xpos As Object, ByVal ypos As Object) - - If IsNumeric(idORname) And IsNumeric(xpos) And IsNumeric(ypos) Then - MyB2SSetPosAbsolute(CInt(idORname), CInt(xpos), CInt(ypos)) - End If - End Sub - ' method to set illumination Public Sub B2SSetIllumination(ByVal name As Object, ByVal value As Object) @@ -2150,42 +2160,15 @@ Public Class Server For Each picbox As B2SPictureBox In B2SData.UsedRomLampIDs(id) If picbox IsNot Nothing AndAlso (Not B2SData.UseIlluminationLocks OrElse String.IsNullOrEmpty(picbox.GroupName) OrElse Not B2SData.IlluminationLocks.ContainsKey(picbox.GroupName)) Then - picbox.Left += xpos - picbox.Top += ypos - ' Using RectangleF as this is used in the DrawImage within OnPaint for picturBoxes. - picbox.RectangleF = New RectangleF(CInt(picbox.Left / rescaleBackglass.Width), CInt(picbox.Top / rescaleBackglass.Height), picbox.RectangleF.Width, picbox.RectangleF.Height) - 'Invalidating this object does not work, need to Invalidate the parent. - If picbox.Parent IsNot Nothing Then - picbox.Parent.Invalidate() - End If - End If - Next - End If - End If - End If - - End Sub - - Private Sub MyB2SSetPosAbsolute(ByVal id As Integer, ByVal xpos As Integer, ByVal ypos As Integer) - - If B2SData.IsBackglassRunning Then - - If B2SData.IsBackglassStartedAsEXE Then - - Else - If B2SData.UsedRomLampIDs.ContainsKey(id) Then - Dim rescaleBackglass As SizeF - Me.formBackglass.GetScaleFactor(rescaleBackglass) - - For Each picbox As B2SPictureBox In B2SData.UsedRomLampIDs(id) - If picbox IsNot Nothing AndAlso (Not B2SData.UseIlluminationLocks OrElse String.IsNullOrEmpty(picbox.GroupName) OrElse Not B2SData.IlluminationLocks.ContainsKey(picbox.GroupName)) Then - picbox.Left = xpos - picbox.Top = ypos - ' Using RectangleF as this is used in the DrawImage within OnPaint for picturBoxes. - picbox.RectangleF = New RectangleF(CInt(picbox.Left / rescaleBackglass.Width), CInt(picbox.Top / rescaleBackglass.Height), picbox.RectangleF.Width, picbox.RectangleF.Height) - 'Invalidating this object does not work, need to Invalidate the parent. - If picbox.Parent IsNot Nothing Then - picbox.Parent.Invalidate() + If picbox.Left <> xpos OrElse picbox.Top <> ypos Then + picbox.Left = xpos + picbox.Top = ypos + ' Using RectangleF as this is used in the DrawImage within OnPaint for picturBoxes. + picbox.RectangleF = New RectangleF(CInt(picbox.Left / rescaleBackglass.Width), CInt(picbox.Top / rescaleBackglass.Height), picbox.RectangleF.Width, picbox.RectangleF.Height) + 'Invalidating this object does not work, need to Invalidate the parent. + If picbox.Parent IsNot Nothing Then + picbox.Parent.Invalidate() + End If End If End If Next @@ -2199,8 +2182,8 @@ Public Class Server If Not B2SData.IsBackglassRunning Then Return - Dim useLEDs As Boolean = (B2SData.LEDs.ContainsKey("LEDBox" & digit.ToString()) AndAlso B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Rendered) - Dim useLEDDisplays As Boolean = (B2SData.LEDDisplayDigits.ContainsKey(digit - 1) AndAlso B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Dream7) + 'Dim useLEDs As Boolean = (B2SData.LEDs.ContainsKey("LEDBox" & digit.ToString()) AndAlso B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Rendered) + 'Dim useLEDDisplays As Boolean = (B2SData.LEDDisplayDigits.ContainsKey(digit - 1) AndAlso B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Dream7) If B2SData.IsBackglassStartedAsEXE Then @@ -2208,16 +2191,16 @@ Public Class Server regkey.SetValue("B2SLED" & digit.ToString(), value) End Using - ElseIf useLEDs Then - + 'ElseIf useLEDs Then + ElseIf (B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Rendered AndAlso B2SData.LEDs.ContainsKey("LEDBox" & digit.ToString())) Then ' rendered LEDs are used Dim ledname As String = "LEDBox" & digit.ToString() If B2SData.LEDs.ContainsKey(ledname) Then B2SData.LEDs(ledname).Value = value End If - ElseIf useLEDDisplays Then - + 'ElseIf useLEDDisplays Then + ElseIf (B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Dream7 AndAlso B2SData.LEDDisplayDigits.ContainsKey(digit - 1)) Then ' Dream 7 displays are used If B2SData.LEDDisplayDigits.ContainsKey(digit - 1) Then With B2SData.LEDDisplayDigits(digit - 1) diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/app.config b/b2sbackglassserver/b2sbackglassserver/app.config similarity index 100% rename from b2sbackglassserverexe/b2sbackglassserverexe/app.config rename to b2sbackglassserver/b2sbackglassserver/app.config diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SAnimation.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SAnimation.vb deleted file mode 100644 index 16fc6ae..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SAnimation.vb +++ /dev/null @@ -1,999 +0,0 @@ -Imports System -Imports System.Windows.Forms -Imports System.Drawing -Imports Microsoft.Win32 - -Public Class B2SAnimation - - Private Shared runningAnimations As RunningAnimationsCollection = New RunningAnimationsCollection() - Private Class RunningAnimationsCollection - - Inherits Generic.List(Of String) - - Public Shadows Sub Add(item As String) - If Not Me.Contains(item) Then - MyBase.Add(item) - End If - End Sub - Public Shadows Function Remove(item As String) As Boolean - If Me.Contains(item) Then - Return MyBase.Remove(item) - End If - Return True - End Function - - End Class - - Public Enum eType - Undefined = 0 - ImageCollectionAtForm = 1 - ImageCollectionAtPictureBox = 2 - PictureBoxCollection = 3 - End Enum - Public Enum eLightsStateAtAnimationStart - Undefined = 0 - InvolvedLightsOff = 1 - InvolvedLightsOn = 2 - LightsOff = 3 - NoChange = 4 - End Enum - Public Enum eLightsStateAtAnimationEnd - Undefined = 0 - InvolvedLightsOff = 1 - InvolvedLightsOn = 2 - LightsReseted = 3 - NoChange = 4 - End Enum - Public Enum eAnimationStopBehaviour - Undefined = 0 - StopImmediatelly = 1 - RunAnimationTillEnd = 2 - RunAnimationToFirstStep = 3 - End Enum - - Public MustInherit Class B2SAnimationBase - - Inherits Timers.Timer - - Friend Name As String = String.Empty - Friend Type As eType = eType.Undefined - Friend DualMode As B2SData.eDualMode = B2SData.eDualMode.Both - Friend Loops As Integer = -1 - Friend PlayReverse As Boolean = False - Friend StartMeAtVPActivate As Boolean = True - Friend LightsStateAtAnimationStart As eLightsStateAtAnimationStart = eLightsStateAtAnimationStart.NoChange - Friend LightsStateAtAnimationEnd As eLightsStateAtAnimationEnd = eLightsStateAtAnimationEnd.InvolvedLightsOff - Friend AnimationStopBehaviour As eAnimationStopBehaviour = eAnimationStopBehaviour.StopImmediatelly - Friend LockInvolvedLamps As Boolean = False - Friend HideScoreDisplays As Boolean = False - Friend BringToFront As Boolean = False - Friend RandomStart As Boolean = False - Friend RandomQuality As Integer = 1 - Friend BaseInterval As Integer = 0 - Friend SlowDown As Integer = 1 - - Friend WouldBeStarted As Boolean = False - Friend StopMeLater As Boolean = False - - Friend Sub New(ByVal _DualMode As B2SData.eDualMode, - ByVal _Interval As Integer, - ByVal _Type As eType, - ByVal _Loops As Integer, - ByVal _PlayReverse As Boolean, - ByVal _StartMeAtVPActivate As Boolean, - ByVal _LightsStateAtAnimationStart As eLightsStateAtAnimationStart, - ByVal _LightsStateAtAnimationEnd As eLightsStateAtAnimationEnd, - ByVal _AnimationStopBehaviour As eAnimationStopBehaviour, - ByVal _LockInvolvedLamps As Boolean, - ByVal _HideScoreDisplays As Boolean, - ByVal _BringToFront As Boolean, - ByVal _RandomStart As Boolean, - ByVal _RandomQuality As Integer) - Me.DualMode = _DualMode - Me.Interval = _Interval - Me.Loops = _Loops - Me.PlayReverse = _PlayReverse - Me.BaseInterval = _Interval - Me.Type = _Type - Me.StartMeAtVPActivate = _StartMeAtVPActivate - Me.LightsStateAtAnimationStart = _LightsStateAtAnimationStart - If Me.LightsStateAtAnimationStart = eLightsStateAtAnimationStart.Undefined Then Me.LightsStateAtAnimationStart = eLightsStateAtAnimationStart.NoChange - Me.LightsStateAtAnimationEnd = _LightsStateAtAnimationEnd - If Me.LightsStateAtAnimationEnd = eLightsStateAtAnimationEnd.Undefined Then Me.LightsStateAtAnimationEnd = eLightsStateAtAnimationEnd.InvolvedLightsOff - Me.AnimationStopBehaviour = _AnimationStopBehaviour - If Me.AnimationStopBehaviour = eAnimationStopBehaviour.Undefined Then Me.AnimationStopBehaviour = eAnimationStopBehaviour.StopImmediatelly - Me.LockInvolvedLamps = _LockInvolvedLamps - Me.HideScoreDisplays = _HideScoreDisplays - Me.BringToFront = _BringToFront - Me.RandomStart = _RandomStart - Me.RandomQuality = _RandomQuality - Me.Enabled = False - End Sub - - End Class - - Public Class TimerAnimation - - Inherits B2SAnimationBase - - Public Event Finished() - - Private Form As Form = Nothing - Private FormDMD As Form = Nothing - Private PictureBox As PictureBox = Nothing - Private ImageCollection As ImageList.ImageCollection = Nothing - - Public Sub New(ByVal _Form As Form, - ByVal _FormDMD As Form, - ByVal _Name As String, - ByVal _DualMode As B2SData.eDualMode, - ByVal _Interval As Integer, - ByVal _Loops As Integer, - ByVal _StartTimerAtVPActivate As Boolean, - ByVal _LightsStateAtAnimationStart As eLightsStateAtAnimationStart, - ByVal _LightsStateAtAnimationEnd As eLightsStateAtAnimationEnd, - ByVal _AnimationStopBehaviour As eAnimationStopBehaviour, - ByVal _LockInvolvedLamps As Boolean, - ByVal _HideScoreDisplays As Boolean, - ByVal _BringToFront As Boolean, - ByVal _RandomStart As Boolean, - ByVal _RandomQuality As Integer, - ByVal _ImageCollection As ImageList.ImageCollection) - MyBase.New(_DualMode, _Interval, eType.ImageCollectionAtForm, _Loops, False, _StartTimerAtVPActivate, _LightsStateAtAnimationStart, _LightsStateAtAnimationEnd, _AnimationStopBehaviour, _LockInvolvedLamps, _HideScoreDisplays, _BringToFront, _RandomStart, _RandomQuality) - Me.SynchronizingObject = _Form - Me.Form = _Form - Me.FormDMD = _FormDMD - Me.Name = _Name - Me.ImageCollection = _ImageCollection - End Sub - Public Sub New(ByVal _Form As Form, - ByVal _Picturebox As PictureBox, - ByVal _Name As String, - ByVal _DualMode As B2SData.eDualMode, - ByVal _Interval As Integer, - ByVal _Loops As Integer, - ByVal _StartTimerAtVPActivate As Boolean, - ByVal _LightsStateAtAnimationStart As eLightsStateAtAnimationStart, - ByVal _LightsStateAtAnimationEnd As eLightsStateAtAnimationEnd, - ByVal _AnimationStopBehaviour As eAnimationStopBehaviour, - ByVal _LockInvolvedLamps As Boolean, - ByVal _HideScoreDisplays As Boolean, - ByVal _BringToFront As Boolean, - ByVal _RandomStart As Boolean, - ByVal _RandomQuality As Integer, - ByVal _ImageCollection As ImageList.ImageCollection) - MyBase.New(_DualMode, _Interval, eType.ImageCollectionAtPictureBox, _Loops, False, _StartTimerAtVPActivate, _LightsStateAtAnimationStart, _LightsStateAtAnimationEnd, _AnimationStopBehaviour, _LockInvolvedLamps, _HideScoreDisplays, _BringToFront, _RandomStart, _RandomQuality) - Me.SynchronizingObject = _Form - Me.PictureBox = _Picturebox - Me.Name = _Name - Me.ImageCollection = _ImageCollection - End Sub - - Private loopticker As Integer = 0 - Private ticker As Integer = 0 - Private reachedThe0Point As Boolean = False - - Public Shadows Sub Start() - - ' set the start flag - Me.WouldBeStarted = True - Me.StopMeLater = False - - ' maybe get out here because animation is not allowed to start - If B2SSettings.AllAnimationSlowDown = 0 OrElse Me.SlowDown = 0 Then - Return - End If - - ' maybe get out here because of not matching dual mode - If B2SData.DualBackglass Then - If Not (Me.DualMode = B2SData.eDualMode.Both OrElse Me.DualMode = B2SSettings.CurrentDualMode) Then - Return - End If - End If - - ' start the base timer - MyBase.Start() - runningAnimations.Add(Me.Name) - - End Sub - Public Shadows Sub [Stop]() - - ' remove the start flag - Me.WouldBeStarted = False - - ' maybe stop the animation a bit later to do the last animation steps - If (Me.AnimationStopBehaviour = eAnimationStopBehaviour.RunAnimationTillEnd OrElse Me.AnimationStopBehaviour = eAnimationStopBehaviour.RunAnimationToFirstStep) Then - If Not Me.StopMeLater Then - reachedThe0Point = False - End If - Me.StopMeLater = True - Return - End If - - ' stop the base timer - runningAnimations.Remove(Me.Name) - MyBase.Stop() - Me.Enabled = False - MyBase.Enabled = False - - End Sub - - Private Sub TimerAnimation_Tick(sender As Object, e As System.EventArgs) Handles Me.Elapsed - - ' first of all stop the timer - MyBase.Stop() - - ' maybe get out since the timer is already stopped - If Not runningAnimations.Contains(Me.Name) Then - Me.Enabled = False - MyBase.Enabled = False - Return - End If - - ' show image - If Me.Type = eType.ImageCollectionAtForm Then - Me.Form.BackgroundImage = Me.ImageCollection(ticker) - ElseIf eType.ImageCollectionAtPictureBox Then - Me.PictureBox.Image = Me.ImageCollection(ticker) - End If - - ' count on and maybe restart the timer - Dim restart As Boolean = True - ticker += 1 - If ticker >= Me.ImageCollection.Count Then - reachedThe0Point = True - loopticker += 1 - ticker = 0 - If Me.Loops > 0 AndAlso loopticker >= Me.Loops Then - loopticker = 0 - restart = False - RaiseEvent Finished() - End If - End If - If restart Then - If B2SSettings.AllAnimationSlowDown = 0 OrElse Me.SlowDown = 0 Then - Me.Stop() - ElseIf Me.StopMeLater AndAlso Me.AnimationStopBehaviour = eAnimationStopBehaviour.RunAnimationTillEnd AndAlso ticker = 0 Then - Me.Stop() - ElseIf Me.StopMeLater AndAlso Me.AnimationStopBehaviour = eAnimationStopBehaviour.RunAnimationToFirstStep AndAlso (ticker = 1 OrElse ticker = 2) AndAlso reachedThe0Point Then - Me.Stop() - Else - MyBase.Start() - End If - Else - Me.Stop() - End If - - End Sub - - End Class - - Public Class PictureBoxAnimation - - Inherits B2SAnimationBase - - Public Event Finished() - - Private Class EntryAction - Public Bulbs As String() = Nothing - Public IntervalMultiplier As Integer = 0 - Public Visible As Boolean = True - Public Corrector As Integer = 0 - Public PulseSwitch As Integer = 0 - - Public Sub New(ByVal _Bulbs As String(), ByVal _IntervalMultiplier As Integer, ByVal _Visible As Boolean, ByVal _Corrector As Integer, ByVal _PulseSwitch As Integer) - Bulbs = _Bulbs - IntervalMultiplier = _IntervalMultiplier - Visible = _Visible - Corrector = _Corrector - PulseSwitch = _PulseSwitch - End Sub - End Class - - Private Form As Form = Nothing - Private FormDMD As Form = Nothing - Private Entries As Generic.SortedList(Of Integer, EntryAction) = New Generic.SortedList(Of Integer, EntryAction) - - Private LightsInvolved As Generic.List(Of String) = New Generic.List(Of String) - Private LightsStateAtStartup As Generic.Dictionary(Of String, Boolean) = New Generic.Dictionary(Of String, Boolean) - Private MainFormBackgroundImage As Image = Nothing - - Private SelectedLEDType As B2SSettings.eLEDTypes = B2SSettings.eLEDTypes.Undefined - - Public Sub New(ByVal _Form As Form, - ByVal _FormDMD As Form, - ByVal _Name As String, - ByVal _DualMode As B2SData.eDualMode, - ByVal _Interval As Integer, - ByVal _Loops As Integer, - ByVal _StartTimerAtVPActivate As Boolean, - ByVal _LightsStateAtAnimationStart As eLightsStateAtAnimationStart, - ByVal _LightsStateAtAnimationEnd As eLightsStateAtAnimationEnd, - ByVal _AnimationStopBehaviour As eAnimationStopBehaviour, - ByVal _LockInvolvedLamps As Boolean, - ByVal _HideScoreDisplays As Boolean, - ByVal _BringToFront As Boolean, - ByVal _RandomStart As Boolean, - ByVal _RandomQuality As Integer, - ByVal ParamArray _Entries As PictureBoxAnimationEntry()) - - MyBase.New(_DualMode, _Interval, eType.PictureBoxCollection, _Loops, False, _StartTimerAtVPActivate, _LightsStateAtAnimationStart, _LightsStateAtAnimationEnd, _AnimationStopBehaviour, _LockInvolvedLamps, _HideScoreDisplays, _BringToFront, _RandomStart, _RandomQuality) - Me.SynchronizingObject = _Form - Me.Form = _Form - Me.FormDMD = _FormDMD - Me.Name = _Name - - ' collect all the entries in a nice collection - For Each entry As PictureBoxAnimationEntry In _Entries - Dim isOn1Valid As Boolean = (Not String.IsNullOrEmpty(entry.On1(0)) OrElse entry.WaitAfterOn1 > 0) - Dim isOff1Valid As Boolean = (Not String.IsNullOrEmpty(entry.Off1(0)) OrElse entry.WaitAfterOff1 > 0) - Dim isOn2Valid As Boolean = (Not String.IsNullOrEmpty(entry.On2(0)) OrElse entry.WaitAfterOn2 > 0) - Dim isOff2Valid As Boolean = (Not String.IsNullOrEmpty(entry.Off2(0)) OrElse entry.WaitAfterOff2 > 0) - Dim pulseswitch As Integer = entry.PulseSwitch - If isOn1Valid Then - Entries.Add(Entries.Count + 1, New EntryAction(entry.On1, entry.WaitAfterOn1, True, If(isOff1Valid, 1, 0), pulseswitch)) - pulseswitch = 0 - End If - If isOff1Valid Then - Entries.Add(Entries.Count + 1, New EntryAction(entry.Off1, entry.WaitAfterOff1, False, If(isOn1Valid, -1, 0), pulseswitch)) - pulseswitch = 0 - End If - If isOn2Valid Then - Entries.Add(Entries.Count + 1, New EntryAction(entry.On2, entry.WaitAfterOn2, True, If(isOff2Valid, 1, 0), pulseswitch)) - pulseswitch = 0 - End If - If isOff2Valid Then - Entries.Add(Entries.Count + 1, New EntryAction(entry.Off2, entry.WaitAfterOff2, False, If(isOn2Valid, -1, 0), pulseswitch)) - pulseswitch = 0 - End If - If pulseswitch > 0 Then - Entries.Add(Entries.Count + 1, New EntryAction(New String() {""}, 0, True, 0, pulseswitch)) - pulseswitch = 0 - End If - Next - - ' pick up all involved lights - LightsInvolved.Clear() - For Each entry As KeyValuePair(Of Integer, EntryAction) In Entries - For Each bulb As String In entry.Value.Bulbs - If Not String.IsNullOrEmpty(bulb) AndAlso Not LightsInvolved.Contains(bulb) Then - LightsInvolved.Add(bulb) - End If - Next - Next - - End Sub - - Private loopticker As Integer = 0 - Private ticker As Integer = 0 - Private reachedThe0Point As Boolean = False - - Public Shadows Sub Start() - - ' set the start flag - Me.WouldBeStarted = True - Me.StopMeLater = False - - ' maybe get out here because animation is not allowed to start - If B2SSettings.AllAnimationSlowDown = 0 OrElse Me.SlowDown = 0 Then - Return - End If - - ' maybe get out here because of not matching dual mode - If B2SData.DualBackglass Then - If Not (Me.DualMode = B2SData.eDualMode.Both OrElse Me.DualMode = B2SSettings.CurrentDualMode) Then - Return - End If - End If - - ' maybe switch off all lights but pick them up - LightsStateAtStartup.Clear() - For i As Integer = 1 To 2 - Dim currentForm As Form = If(i = 2, Me.FormDMD, Me.Form) - If currentForm IsNot Nothing Then - For Each picbox As B2SPictureBox In currentForm.Controls.OfType(Of B2SPictureBox)() - If Me.LightsStateAtAnimationEnd = eLightsStateAtAnimationEnd.LightsReseted AndAlso Not LightsStateAtStartup.ContainsKey(picbox.Name) Then - LightsStateAtStartup.Add(picbox.Name, picbox.Visible) - End If - If Me.LightsStateAtAnimationStart = eLightsStateAtAnimationStart.LightsOff Then - picbox.Visible = False - End If - Next - If Me.LightsStateAtAnimationStart = eLightsStateAtAnimationStart.LightsOff Then - If TypeOf currentForm Is formBackglass Then - With DirectCast(currentForm, formBackglass) - MainFormBackgroundImage = .BackgroundImage - .BackgroundImage = .DarkImage - .Refresh() - End With - Else - currentForm.Refresh() - End If - End If - End If - Next - - ' maybe switch on or off all involved lights - If Me.LightsStateAtAnimationStart = eLightsStateAtAnimationStart.InvolvedLightsOff OrElse Me.LightsStateAtAnimationStart = eLightsStateAtAnimationStart.InvolvedLightsOn Then - For Each groupname As String In LightsInvolved - LightGroup(groupname, (Me.LightsStateAtAnimationStart = eLightsStateAtAnimationStart.InvolvedLightsOn)) - Next - End If - - ' maybe lock some illu - If Me.LockInvolvedLamps Then - For Each groupname As String In LightsInvolved - If B2SData.IlluminationLocks.ContainsKey(groupname) Then - B2SData.IlluminationLocks.Item(groupname) += 1 - Else - B2SData.IlluminationLocks.Add(groupname, 1) - End If - B2SData.UseIlluminationLocks = True - Next - End If - - ' maybe hide score displays - If Me.HideScoreDisplays Then - SelectedLEDType = GetLEDType() - If SelectedLEDType = B2SSettings.eLEDTypes.Dream7 Then - For Each leddisplay As KeyValuePair(Of String, Dream7Display) In B2SData.LEDDisplays - leddisplay.Value.Visible = False - Next - ElseIf SelectedLEDType = B2SSettings.eLEDTypes.Rendered Then - For Each led As KeyValuePair(Of String, B2SLEDBox) In B2SData.LEDs - led.Value.Visible = False - Next - End If - End If - - ' maybe set a new timer interval - Me.Interval = Me.BaseInterval * If(B2SSettings.AllAnimationSlowDown > 1, B2SSettings.AllAnimationSlowDown, If(Me.SlowDown > 1, Me.SlowDown, 1)) - - ' start the base timer - loopticker = 0 - ticker = 0 - MyBase.Start() - runningAnimations.Add(Me.Name) - - End Sub - Public Shadows Sub [Stop]() - - ' remove the start flag - Me.WouldBeStarted = False - - ' maybe stop the animation a bit later to do the last animation steps - If (Me.AnimationStopBehaviour = eAnimationStopBehaviour.RunAnimationTillEnd OrElse Me.AnimationStopBehaviour = eAnimationStopBehaviour.RunAnimationToFirstStep) Then - If Not Me.StopMeLater Then - reachedThe0Point = False - End If - Me.StopMeLater = True - Return - End If - - ' stop the base timer - runningAnimations.Remove(Me.Name) - MyBase.Stop() - Me.Enabled = False - MyBase.Enabled = False - - ' maybe show score displays - If HideScoreDisplays Then - If SelectedLEDType = B2SSettings.eLEDTypes.Dream7 Then - For Each leddisplay As KeyValuePair(Of String, Dream7Display) In B2SData.LEDDisplays - leddisplay.Value.Visible = True - Next - ElseIf SelectedLEDType = B2SSettings.eLEDTypes.Rendered Then - For Each led As KeyValuePair(Of String, B2SLEDBox) In B2SData.LEDs - led.Value.Visible = True - Next - End If - End If - - ' maybe unlock all illu - If LockInvolvedLamps Then - For Each groupname As String In LightsInvolved - If B2SData.IlluminationLocks.ContainsKey(groupname) Then - If B2SData.IlluminationLocks.Item(groupname) > 1 Then - B2SData.IlluminationLocks.Item(groupname) -= 1 - Else - B2SData.IlluminationLocks.Remove(groupname) - End If - End If - Next - End If - B2SData.UseIlluminationLocks = (B2SData.IlluminationLocks.Count > 0) - - ' maybe switch all involved lights on/off or set some lights to initial state - If LightsStateAtAnimationEnd = eLightsStateAtAnimationEnd.InvolvedLightsOff OrElse LightsStateAtAnimationEnd = eLightsStateAtAnimationEnd.InvolvedLightsOn Then - For Each groupname As String In LightsInvolved - LightGroup(groupname, (LightsStateAtAnimationEnd = eLightsStateAtAnimationEnd.InvolvedLightsOn)) - Next - ElseIf LightsStateAtAnimationEnd = eLightsStateAtAnimationEnd.LightsReseted Then - For Each picbox As KeyValuePair(Of String, Boolean) In LightsStateAtStartup - LightBulb(picbox.Key, picbox.Value) - Next - If MainFormBackgroundImage IsNot Nothing Then - If TypeOf Form Is formBackglass Then - DirectCast(Form, formBackglass).BackgroundImage = MainFormBackgroundImage - End If - End If - End If - - End Sub - - Private Sub PictureBoxAnimation_Tick(sender As Object, e As System.EventArgs) Handles Me.Elapsed - - ' first of all stop the timer - MyBase.Stop() - - ' maybe get out since the timer is already stopped - If Not runningAnimations.Contains(Me.Name) Then - Me.Enabled = False - MyBase.Enabled = False - Return - End If - - ' show animation stuff - If Me.Entries IsNot Nothing AndAlso Me.Entries.Count > 0 Then - Do While True - Dim index As Integer = If(Not PlayReverse, ticker + 1, Me.Entries.Count - ticker) - If Me.Entries.ContainsKey(index) Then - Dim currentEntryAction As EntryAction = Me.Entries(index) - If currentEntryAction.Corrector <> 0 AndAlso PlayReverse Then currentEntryAction = Me.Entries(index + currentEntryAction.Corrector) - ' light or unlight bulbs - For Each groupname As String In currentEntryAction.Bulbs - If Not String.IsNullOrEmpty(groupname) Then - LightGroup(groupname, currentEntryAction.Visible) - End If - Next - ' maybe set switch - If currentEntryAction.PulseSwitch > 0 Then - SetSwitch(currentEntryAction.PulseSwitch) - End If - ' set next interval - If currentEntryAction.IntervalMultiplier > 0 Then - Me.Interval = currentEntryAction.IntervalMultiplier * Me.BaseInterval * If(B2SSettings.AllAnimationSlowDown > 1, B2SSettings.AllAnimationSlowDown, If(Me.SlowDown > 1, Me.SlowDown, 1)) - Exit Do - Else - ticker += 1 - If ticker >= Me.Entries.Count Then - Exit Do - End If - End If - Else - Exit Do - End If - Loop - End If - - ' count on and maybe restart the timer - Dim restart As Boolean = True - ticker += 1 - If ticker >= Me.Entries.Count Then - reachedThe0Point = True - loopticker += 1 - ticker = 0 - If Me.Loops > 0 AndAlso loopticker >= Me.Loops Then - loopticker = 0 - restart = False - RaiseEvent Finished() - End If - End If - If restart Then - If B2SSettings.AllAnimationSlowDown = 0 OrElse Me.SlowDown = 0 Then - Me.Stop() - ElseIf Me.StopMeLater AndAlso Me.AnimationStopBehaviour = eAnimationStopBehaviour.RunAnimationTillEnd AndAlso ticker = 0 Then - Me.Stop() - ElseIf Me.StopMeLater AndAlso Me.AnimationStopBehaviour = eAnimationStopBehaviour.RunAnimationToFirstStep AndAlso (ticker = 1 OrElse ticker = 2) AndAlso reachedThe0Point Then - Me.Stop() - Else - MyBase.Start() - End If - Else - Me.Stop() - End If - - End Sub - - Private Sub LightGroup(ByVal _GroupName As String, ByVal _Visible As Boolean) - - ' only do the lightning stuff if the group has a name - If Not String.IsNullOrEmpty(_GroupName) AndAlso B2SData.IlluminationGroups.ContainsKey(_GroupName) Then - - ' get all matching picture boxes - For Each picbox As B2SPictureBox In B2SData.IlluminationGroups(_GroupName) - Try - picbox.Visible(True) = _Visible - If _Visible AndAlso BringToFront Then - picbox.BringToFront() - End If - Catch - End Try - Next - - End If - - End Sub - Private Sub LightBulb(ByVal _Bulb As String, ByVal _Visible As Boolean) - - ' only do the lightning stuff if the bulb has a name - If Not String.IsNullOrEmpty(_Bulb) Then - Dim currentForm As Form = Nothing - If Form.Controls.ContainsKey(_Bulb) Then - currentForm = Form - ElseIf FormDMD.Controls.ContainsKey(_Bulb) Then - currentForm = FormDMD - End If - If currentForm IsNot Nothing Then - DirectCast(currentForm.Controls(_Bulb), B2SPictureBox).Visible(True) = _Visible - If _Visible AndAlso BringToFront Then - DirectCast(currentForm.Controls(_Bulb), B2SPictureBox).BringToFront() - End If - End If - End If - - End Sub - - Private Function GetLEDType() As B2SSettings.eLEDTypes - Dim ret As B2SSettings.eLEDTypes = B2SSettings.eLEDTypes.Undefined - If B2SData.LEDDisplays.Count > 0 Then - For Each leddisplay As KeyValuePair(Of String, Dream7Display) In B2SData.LEDDisplays - If leddisplay.Value.Visible Then ret = B2SSettings.eLEDTypes.Dream7 - Exit For - Next - ElseIf B2SData.LEDs.Count > 0 Then - For Each led As KeyValuePair(Of String, B2SLEDBox) In B2SData.LEDs - If led.Value.Visible Then ret = B2SSettings.eLEDTypes.Rendered - Exit For - Next - End If - Return ret - End Function - - End Class - Public Class PictureBoxAnimationEntry - - Public On1 As String() = New String() {""} - Public Off1 As String() = New String() {""} - Public On2 As String() = New String() {""} - Public Off2 As String() = New String() {""} - - Public WaitAfterOn1 As Integer = 0 - Public WaitAfterOff1 As Integer = 0 - Public WaitAfterOn2 As Integer = 0 - Public WaitAfterOff2 As Integer = 0 - - Public PulseSwitch As Integer = 0 - - Public Sub New(ByVal _On1 As Object, ByVal _WaitAfterOn1 As Integer, Optional ByVal _Off1 As Object = 0, Optional ByVal _WaitAfterOff1 As Integer = 0, - Optional ByVal _On2 As Object = Nothing, Optional ByVal _WaitAfterOn2 As Integer = 0, Optional ByVal _Off2 As Object = Nothing, Optional ByVal _WaitAfterOff2 As Integer = 0, - Optional ByVal _PulseSwitch As Integer = 0) - On1 = Check4StringOrArray(_On1) - WaitAfterOn1 = _WaitAfterOn1 - Off1 = Check4StringOrArray(_Off1) - WaitAfterOff1 = _WaitAfterOff1 - On2 = Check4StringOrArray(_On2) - WaitAfterOn2 = _WaitAfterOn2 - Off2 = Check4StringOrArray(_Off2) - WaitAfterOff2 = _WaitAfterOff2 - PulseSwitch = _PulseSwitch - End Sub - - Private Function Check4StringOrArray(ByVal _Str As Object) As Object - Dim ret As String() = New String() {""} - If _Str IsNot Nothing Then - If IsArray(_Str) Then - ret = _Str - ElseIf _Str.ToString.Contains(",") Then - ret = _Str.ToString.Split(",") - Else - ret(0) = _Str - End If - End If - Return ret - End Function - - End Class - - Public Class PictureBoxAnimationCollection - - Public Entries As PictureBoxAnimationCollectionEntry() = Nothing - - Public StartMeAtVPActivate As Boolean = True - - Public Sub New(ByVal _StartTimerAtVPActivate As Boolean, ByVal ParamArray _Entries As PictureBoxAnimationCollectionEntry()) - StartMeAtVPActivate = _StartTimerAtVPActivate - Entries = _Entries - End Sub - - End Class - Public Class PictureBoxAnimationCollectionEntry - - Public AnimationName As String = String.Empty - Public Loops As Integer = 1 - Public PlayReverse As Boolean = False - - Public Sub New(ByVal _AnimationName As String, ByVal _Loops As Integer, Optional ByVal _PlayReverse As Boolean = False) - AnimationName = _AnimationName - Loops = _Loops - PlayReverse = _PlayReverse - End Sub - - End Class - - Private TimerAnimations As Generic.Dictionary(Of String, TimerAnimation) = New Generic.Dictionary(Of String, TimerAnimation) - Private PictureBoxAnimations As Generic.Dictionary(Of String, PictureBoxAnimation) = New Generic.Dictionary(Of String, PictureBoxAnimation) - Private PictureBoxAnimationCollections As Generic.Dictionary(Of String, PictureBoxAnimationCollection) = New Generic.Dictionary(Of String, PictureBoxAnimationCollection) - -#Region "constructor and startup" - - Public Sub New() - - ' nothing to do right now - - End Sub - -#End Region - -#Region "add animations and collections of animations" - - Public Sub AddAnimation(ByVal _Name As String, - ByVal _Form As Form, - ByVal _FormDMD As Form, - ByVal _DualMode As B2SData.eDualMode, - ByVal _Interval As Integer, - ByVal _Loops As Integer, - ByVal _StartTimerAtVPActivate As Boolean, - ByVal _LightsStateAtAnimationStart As eLightsStateAtAnimationStart, - ByVal _LightsStateAtAnimationEnd As eLightsStateAtAnimationEnd, - ByVal _AnimationStopBehaviour As eAnimationStopBehaviour, - ByVal _LockInvolvedLamps As Boolean, - ByVal _HideScoreDisplays As Boolean, - ByVal _BringToFront As Boolean, - ByVal _RandomStart As Boolean, - ByVal _RandomQuality As Integer, - ByVal _ImageCollection As ImageList.ImageCollection) - If Not TimerAnimations.ContainsKey(_Name) Then - TimerAnimations.Add(_Name, New TimerAnimation(_Form, _FormDMD, _Name, _DualMode, _Interval, _Loops, _StartTimerAtVPActivate, _LightsStateAtAnimationStart, _LightsStateAtAnimationEnd, _AnimationStopBehaviour, _LockInvolvedLamps, _HideScoreDisplays, _BringToFront, _RandomStart, _RandomQuality, _ImageCollection)) - End If - End Sub - Public Sub AddAnimation(ByVal _Name As String, - ByVal _Form As Form, - ByVal _Picturebox As PictureBox, - ByVal _DualMode As B2SData.eDualMode, - ByVal _Interval As Integer, - ByVal _Loops As Integer, - ByVal _StartTimerAtVPActivate As Boolean, - ByVal _LightsStateAtAnimationStart As eLightsStateAtAnimationStart, - ByVal _LightsStateAtAnimationEnd As eLightsStateAtAnimationEnd, - ByVal _AnimationStopBehaviour As eAnimationStopBehaviour, - ByVal _LockInvolvedLamps As Boolean, - ByVal _HideScoreDisplays As Boolean, - ByVal _BringToFront As Boolean, - ByVal _RandomStart As Boolean, - ByVal _RandomQuality As Integer, - ByVal _ImageCollection As ImageList.ImageCollection) - If Not TimerAnimations.ContainsKey(_Name) Then - TimerAnimations.Add(_Name, New TimerAnimation(_Form, _Picturebox, _Name, _DualMode, _Interval, _Loops, _StartTimerAtVPActivate, _LightsStateAtAnimationStart, _LightsStateAtAnimationEnd, _AnimationStopBehaviour, _LockInvolvedLamps, _HideScoreDisplays, _BringToFront, _RandomStart, _RandomQuality, _ImageCollection)) - End If - End Sub - Public Sub AddAnimation(ByVal _Name As String, - ByVal _Form As Form, - ByVal _FormDMD As Form, - ByVal _DualMode As B2SData.eDualMode, - ByVal _Interval As Integer, - ByVal _Loops As Integer, - ByVal _StartTimerAtVPActivate As Boolean, - ByVal _LightsStateAtAnimationStart As eLightsStateAtAnimationStart, - ByVal _LightsStateAtAnimationEnd As eLightsStateAtAnimationEnd, - ByVal _AnimationStopBehaviour As eAnimationStopBehaviour, - ByVal _LockInvolvedLamps As Boolean, - ByVal _HideScoreDisplays As Boolean, - ByVal _BringToFront As Boolean, - ByVal _RandomStart As Boolean, - ByVal _RandomQuality As Integer, - ByVal ParamArray _entries As PictureBoxAnimationEntry()) - If Not PictureBoxAnimations.ContainsKey(_Name) Then - PictureBoxAnimations.Add(_Name, New PictureBoxAnimation(_Form, _FormDMD, _Name, _DualMode, _Interval, _Loops, _StartTimerAtVPActivate, _LightsStateAtAnimationStart, _LightsStateAtAnimationEnd, _AnimationStopBehaviour, _LockInvolvedLamps, _HideScoreDisplays, _BringToFront, _RandomStart, _RandomQuality, _entries)) - End If - End Sub - - Public Sub AddCollection(ByVal _Name As String, - ByVal _StartTimerAtVPActivate As Boolean, - ByVal ParamArray _Entries As PictureBoxAnimationCollectionEntry()) - If Not PictureBoxAnimationCollections.ContainsKey(_Name) Then - PictureBoxAnimationCollections.Add(_Name, New PictureBoxAnimationCollection(_StartTimerAtVPActivate, _Entries)) - End If - End Sub - -#End Region - -#Region "start and stop animations and collections of animations" - - Public ReadOnly Property AreThereAnimations() As Boolean - Get - Return (TimerAnimations.Count > 0 OrElse PictureBoxAnimations.Count > 0) - End Get - End Property - Public ReadOnly Property AreThereTimerAnimations() As Boolean - Get - Return (TimerAnimations.Count > 0) - End Get - End Property - Public ReadOnly Property AreTherePictureBoxAnimations() As Boolean - Get - Return (PictureBoxAnimations.Count > 0) - End Get - End Property - - Public Sub AutoStart() - - ' start all autostart timer animations - For Each timer As KeyValuePair(Of String, TimerAnimation) In TimerAnimations - With timer.Value - If .StartMeAtVPActivate AndAlso Not .Enabled Then - .Start() - End If - End With - Next - - ' start all autostart picture box animations - For Each pictimer As KeyValuePair(Of String, PictureBoxAnimation) In PictureBoxAnimations - With pictimer.Value - If .StartMeAtVPActivate AndAlso Not .Enabled Then - .Start() - End If - End With - Next - - ' and now start all autostart picture box animations' collections - For Each pictimer As KeyValuePair(Of String, PictureBoxAnimationCollection) In PictureBoxAnimationCollections - If pictimer.Value.StartMeAtVPActivate Then - StartCollection(pictimer.Key) - End If - Next - - End Sub - - Public Sub StartAnimation(ByVal _Name As String, - Optional ByVal _PlayReverse As Boolean = False) - If TimerAnimations.ContainsKey(_Name) AndAlso Not TimerAnimations(_Name).Enabled Then - TimerAnimations(_Name).PlayReverse = _PlayReverse - TimerAnimations(_Name).Start() - End If - If PictureBoxAnimations.ContainsKey(_Name) AndAlso Not PictureBoxAnimations(_Name).Enabled Then - PictureBoxAnimations(_Name).PlayReverse = _PlayReverse - PictureBoxAnimations(_Name).Start() - End If - End Sub - Public Sub RestartAnimations() - For Each timer As KeyValuePair(Of String, TimerAnimation) In TimerAnimations - If timer.Value.WouldBeStarted Then - timer.Value.Stop() - timer.Value.Start() - Else - timer.Value.Stop() - End If - Next - For Each timer As KeyValuePair(Of String, PictureBoxAnimation) In PictureBoxAnimations - If timer.Value.WouldBeStarted Then - timer.Value.Stop() - timer.Value.Start() - Else - timer.Value.Stop() - End If - Next - End Sub - Public Sub StopAnimation(ByVal _Name As String) - If TimerAnimations.ContainsKey(_Name) Then - TimerAnimations(_Name).Stop() - End If - If PictureBoxAnimations.ContainsKey(_Name) Then - PictureBoxAnimations(_Name).Stop() - End If - End Sub - Public Sub StopAllAnimations() - For Each timer As KeyValuePair(Of String, TimerAnimation) In TimerAnimations - timer.Value.Stop() - Next - For Each timer As KeyValuePair(Of String, PictureBoxAnimation) In PictureBoxAnimations - timer.Value.Stop() - Next - End Sub - - Public Property AnimationSlowDown(ByVal _Name As String) As Integer - Get - If TimerAnimations.ContainsKey(_Name) Then Return TimerAnimations(_Name).SlowDown - If PictureBoxAnimations.ContainsKey(_Name) Then Return PictureBoxAnimations(_Name).SlowDown - Return 1 - End Get - Set(ByVal value As Integer) - If TimerAnimations.ContainsKey(_Name) Then - TimerAnimations(_Name).SlowDown = value - End If - If PictureBoxAnimations.ContainsKey(_Name) Then - PictureBoxAnimations(_Name).SlowDown = value - End If - End Set - End Property - - Public Function IsAnimationRunning(ByVal _Name As String) As Boolean - If TimerAnimations.ContainsKey(_Name) Then - Return TimerAnimations(_Name).Enabled - End If - If PictureBoxAnimations.ContainsKey(_Name) Then - Return PictureBoxAnimations(_Name).Enabled - End If - Return False - End Function - - Public ReadOnly Property Animations() As Generic.List(Of String) - Get - Dim ret As Generic.List(Of String) = New Generic.List(Of String) - For Each timer As KeyValuePair(Of String, TimerAnimation) In TimerAnimations - If Not ret.Contains(timer.Key) Then ret.Add(timer.Key) - Next - For Each timer As KeyValuePair(Of String, PictureBoxAnimation) In PictureBoxAnimations - If Not ret.Contains(timer.Key) Then ret.Add(timer.Key) ' & If(timer.Value.SlowDown = 1, "", " (" & If(timer.Value.SlowDown = 0, "Off", timer.Value.SlowDown.ToString & "x") & ")")) - Next - Return ret - End Get - End Property - - Private WithEvents CurrentCollectionAnimation As PictureBoxAnimation = Nothing - Private CurrentCollectionEntries As PictureBoxAnimationCollectionEntry() = Nothing - Private CurrentCollectionIndex As Integer = 0 - Public Sub StartCollection(ByVal _Name As String) - If PictureBoxAnimationCollections.ContainsKey(_Name) Then - CurrentCollectionEntries = PictureBoxAnimationCollections(_Name).Entries - CurrentCollectionIndex = 0 - If IsArray(CurrentCollectionEntries) AndAlso CurrentCollectionEntries.Length > 0 Then - Dim firstEntry As PictureBoxAnimationCollectionEntry = CurrentCollectionEntries(0) - If Not String.IsNullOrEmpty(firstEntry.AnimationName) AndAlso PictureBoxAnimations.ContainsKey(firstEntry.AnimationName) AndAlso firstEntry.Loops > 0 Then - CurrentCollectionAnimation = PictureBoxAnimations(firstEntry.AnimationName) - CurrentCollectionAnimation.Loops = firstEntry.Loops - CurrentCollectionAnimation.PlayReverse = firstEntry.PlayReverse - CurrentCollectionAnimation.Start() - End If - End If - End If - End Sub - Public Sub StopCollection(ByVal _Name As String) - If CurrentCollectionAnimation IsNot Nothing Then - CurrentCollectionAnimation.Stop() - End If - End Sub - - Private Sub CurrentCollectionAnimation_Finished() Handles CurrentCollectionAnimation.Finished - CurrentCollectionIndex += 1 - If CurrentCollectionEntries.Length > CurrentCollectionIndex Then - Dim nextEntry As PictureBoxAnimationCollectionEntry = CurrentCollectionEntries(CurrentCollectionIndex) - If Not String.IsNullOrEmpty(nextEntry.AnimationName) AndAlso PictureBoxAnimations.ContainsKey(nextEntry.AnimationName) AndAlso nextEntry.Loops > 0 Then - CurrentCollectionAnimation = PictureBoxAnimations(nextEntry.AnimationName) - CurrentCollectionAnimation.Loops = nextEntry.Loops - CurrentCollectionAnimation.PlayReverse = nextEntry.PlayReverse - CurrentCollectionAnimation.Start() - End If - End If - End Sub - -#End Region - -#Region "switch timer stuff" - - Private Shared Sub SetSwitch(ByVal switchid As Integer) - - For i As Integer = 1 To 2 - Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) - If regkey.GetValue("B2SSetSwitch" & i.ToString(), "").ToString.Length = 0 Then - regkey.SetValue("B2SSetSwitch" & i.ToString(), switchid, RegistryValueKind.DWord) - Exit For - End If - End Using - Next - - End Sub - -#End Region - -End Class \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SBackglassServerEXE.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SBackglassServerEXE.vb deleted file mode 100644 index 15e7afe..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SBackglassServerEXE.vb +++ /dev/null @@ -1,23 +0,0 @@ -Imports System -Imports System.Drawing -Imports System.IO -Imports System.Security.Principal -Imports System.Windows.Forms -Imports Microsoft.Win32 - -Module B2SBackglassServerEXE - Sub Main() - 'If IsAdmin() Then - ' MessageBox.Show("You should not start this as Administrator!", My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Stop) - ' Exit Sub - 'End If - Application.EnableVisualStyles() - Application.SetCompatibleTextRenderingDefault(False) - Application.Run(New formBackglass()) - End Sub - Private Function IsAdmin() As Boolean - Dim identity As WindowsIdentity = WindowsIdentity.GetCurrent() - Dim principal As New WindowsPrincipal(identity) - Return principal.IsInRole(WindowsBuiltInRole.Administrator) - End Function -End Module \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SCollectData.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SCollectData.vb deleted file mode 100644 index 745adf8..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SCollectData.vb +++ /dev/null @@ -1,55 +0,0 @@ -Public Class B2SCollectData - - Inherits Generic.Dictionary(Of Integer, CollectData) - - Private skipframes As Integer = 0 - - Public Enum eCollectedDataType - TopImage = 1 - SecondImage = 2 - Standard = 4 - Animation = 8 - End Enum - - Public Class CollectData - Public State As Integer = 0 - Public Types As Integer = 0 - - Public Sub New(_state As Integer, _type As eCollectedDataType) - State = _state - Types = _type - End Sub - End Class - - Public Sub New(_skipframes As Integer) - skipframes = _skipframes - End Sub - - Public Shadows Function Add(key As Integer, value As CollectData) As Boolean - Dim ret As Boolean = False - If Me.ContainsKey(key) Then - Me(key).State = value.State - Me(key).Types = Me(key).Types Or value.Types - ret = True - Else - MyBase.Add(key, value) - End If - Return ret - End Function - - Public Sub DataAdded() - skipframes -= 1 - End Sub - - Public ReadOnly Property ShowData() As Boolean - Get - Return (skipframes < 0) - End Get - End Property - - Public Sub ClearData(_skipframes As Integer) - MyBase.Clear() - If skipframes <= 0 Then skipframes = _skipframes - End Sub - -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SData.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SData.vb deleted file mode 100644 index 5e6befb..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SData.vb +++ /dev/null @@ -1,510 +0,0 @@ -Imports System -Imports System.Drawing - -Public Class B2SData - - Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal LongName As String, ShortName As String, ByVal bufsize As Integer) As Long - - Public Enum eDMDType - NotDefined = 0 - NoB2SDMD = 1 - B2SAlwaysOnSecondMonitor = 2 - B2SAlwaysOnThirdMonitor = 3 - B2SOnSecondOrThirdMonitor = 4 - End Enum - Public Enum eDualMode - Both = 0 - Authentic = 1 - Fantasy = 2 - End Enum - - Public Shared Property OnAndOffImage() As Boolean = False - Public Shared Property IsOffImageVisible() As Boolean = False - - Public Shared ReadOnly Property UsedRomLampIDs() As Generic.SortedList(Of Integer, B2SBaseBox()) - Get - Return If(B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy, UsedRomLampIDs4Fantasy, UsedRomLampIDs4Authentic) - End Get - End Property - Public Shared ReadOnly Property UsedRomSolenoidIDs() As Generic.SortedList(Of Integer, B2SBaseBox()) - Get - Return If(B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy, UsedRomSolenoidIDs4Fantasy, UsedRomSolenoidIDs4Authentic) - End Get - End Property - Public Shared ReadOnly Property UsedRomGIStringIDs() As Generic.SortedList(Of Integer, B2SBaseBox()) - Get - Return If(B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy, UsedRomGIStringIDs4Fantasy, UsedRomGIStringIDs4Authentic) - End Get - End Property - Public Shared ReadOnly Property UsedRomMechIDs() As Generic.SortedList(Of Integer, B2SBaseBox()) - Get - Return If(B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy, UsedRomMechIDs4Fantasy, UsedRomMechIDs4Authentic) - End Get - End Property - Public Shared Property UsedRomLampIDs4Authentic() As Generic.SortedList(Of Integer, B2SBaseBox()) = New Generic.SortedList(Of Integer, B2SBaseBox()) - Public Shared Property UsedRomSolenoidIDs4Authentic() As Generic.SortedList(Of Integer, B2SBaseBox()) = New Generic.SortedList(Of Integer, B2SBaseBox()) - Public Shared Property UsedRomGIStringIDs4Authentic() As Generic.SortedList(Of Integer, B2SBaseBox()) = New Generic.SortedList(Of Integer, B2SBaseBox()) - Public Shared Property UsedRomMechIDs4Authentic() As Generic.SortedList(Of Integer, B2SBaseBox()) = New Generic.SortedList(Of Integer, B2SBaseBox()) - Public Shared Property UsedRomLampIDs4Fantasy() As Generic.SortedList(Of Integer, B2SBaseBox()) = New Generic.SortedList(Of Integer, B2SBaseBox()) - Public Shared Property UsedRomSolenoidIDs4Fantasy() As Generic.SortedList(Of Integer, B2SBaseBox()) = New Generic.SortedList(Of Integer, B2SBaseBox()) - Public Shared Property UsedRomGIStringIDs4Fantasy() As Generic.SortedList(Of Integer, B2SBaseBox()) = New Generic.SortedList(Of Integer, B2SBaseBox()) - Public Shared Property UsedRomMechIDs4Fantasy() As Generic.SortedList(Of Integer, B2SBaseBox()) = New Generic.SortedList(Of Integer, B2SBaseBox()) - - Public Shared ReadOnly Property UsedTopRomIDType() As B2SBaseBox.eRomIDType - Get - Return If(B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy, UsedTopRomIDType4Fantasy, UsedTopRomIDType4Authentic) - End Get - End Property - Public Shared ReadOnly Property UsedSecondRomIDType() As B2SBaseBox.eRomIDType - Get - Return If(B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy, UsedSecondRomIDType4Fantasy, UsedSecondRomIDType4Authentic) - End Get - End Property - Public Shared Property UsedTopRomIDType4Authentic() As B2SBaseBox.eRomIDType = B2SBaseBox.eRomIDType.NotDefined - Public Shared Property UsedSecondRomIDType4Authentic() As B2SBaseBox.eRomIDType = B2SBaseBox.eRomIDType.NotDefined - Public Shared Property UsedTopRomIDType4Fantasy() As B2SBaseBox.eRomIDType = B2SBaseBox.eRomIDType.NotDefined - Public Shared Property UsedSecondRomIDType4Fantasy() As B2SBaseBox.eRomIDType = B2SBaseBox.eRomIDType.NotDefined - - Public Shared Property UsedRomReelLampIDs() As Generic.SortedList(Of Integer, B2SReelBox()) = New Generic.SortedList(Of Integer, B2SReelBox()) - - Public Shared Property UsedAnimationLampIDs() As AnimationCollection = New AnimationCollection() - Public Shared Property UsedRandomAnimationLampIDs() As AnimationCollection = New AnimationCollection() - Public Shared Property UsedAnimationSolenoidIDs() As AnimationCollection = New AnimationCollection() - Public Shared Property UsedRandomAnimationSolenoidIDs() As AnimationCollection = New AnimationCollection() - Public Shared Property UsedAnimationGIStringIDs() As AnimationCollection = New AnimationCollection() - Public Shared Property UsedRandomAnimationGIStringIDs() As AnimationCollection = New AnimationCollection() - - Public Shared Property TableName() As String = String.Empty - Public Shared Property TableFileName() As String = String.Empty - Public Shared Property BackglassFileName() As String = String.Empty - Public Shared Property TableType() As Integer = 0 - Public Shared Property DMDType() As Integer = 0 - Public Shared Property GrillHeight() As Integer = 0 - Public Shared Property SmallGrillHeight() As Integer = 0 - Public Shared Property DMDDefaultLocation() As Point = New Point(0, 0) - Public Shared Property DualBackglass() As Boolean = False - - Public Class PictureBoxCollection - Inherits Generic.SortedList(Of String, B2SPictureBox) - - Public Sub New() - MyBase.New(StringComparer.OrdinalIgnoreCase) - End Sub - - Public Shadows Sub Add(ByVal value As B2SPictureBox, Optional ByVal dualmode As B2SData.eDualMode = eDualMode.Both) - If Not MyBase.ContainsKey(value.Name) Then MyBase.Add(value.Name, value) - If value.RomID > 0 Then - Dim UsedRomIDs4Authentic As Generic.SortedList(Of Integer, B2SBaseBox()) = Nothing - Dim UsedRomIDs4Fantasy As Generic.SortedList(Of Integer, B2SBaseBox()) = Nothing - If value.RomIDType = B2SBaseBox.eRomIDType.Lamp Then - UsedRomIDs4Authentic = UsedRomLampIDs4Authentic - UsedRomIDs4Fantasy = UsedRomLampIDs4Fantasy - ElseIf value.RomIDType = B2SBaseBox.eRomIDType.Solenoid Then - UsedRomIDs4Authentic = UsedRomSolenoidIDs4Authentic - UsedRomIDs4Fantasy = UsedRomSolenoidIDs4Fantasy - ElseIf value.RomIDType = B2SBaseBox.eRomIDType.GIString Then - UsedRomIDs4Authentic = UsedRomGIStringIDs4Authentic - UsedRomIDs4Fantasy = UsedRomGIStringIDs4Fantasy - ElseIf value.RomIDType = B2SBaseBox.eRomIDType.Mech Then - UsedRomIDs4Authentic = UsedRomMechIDs4Authentic - UsedRomIDs4Fantasy = UsedRomMechIDs4Fantasy - End If - If UsedRomIDs4Authentic IsNot Nothing AndAlso (dualmode = eDualMode.Both OrElse dualmode = eDualMode.Authentic) Then - If UsedRomIDs4Authentic.ContainsKey(value.RomID) Then - Dim baseboxes As B2SBaseBox() = UsedRomIDs4Authentic(value.RomID) - ReDim Preserve baseboxes(baseboxes.Length) - baseboxes(baseboxes.Length - 1) = value - UsedRomIDs4Authentic(value.RomID) = baseboxes - Else - Dim baseboxes As B2SBaseBox() - ReDim baseboxes(0) - baseboxes(0) = value - UsedRomIDs4Authentic.Add(value.RomID, baseboxes) - End If - End If - If UsedRomIDs4Fantasy IsNot Nothing AndAlso (dualmode = eDualMode.Both OrElse dualmode = eDualMode.Fantasy) Then - If UsedRomIDs4Fantasy.ContainsKey(value.RomID) Then - Dim baseboxes As B2SBaseBox() = UsedRomIDs4Fantasy(value.RomID) - ReDim Preserve baseboxes(baseboxes.Length) - baseboxes(baseboxes.Length - 1) = value - UsedRomIDs4Fantasy(value.RomID) = baseboxes - Else - Dim baseboxes As B2SBaseBox() - ReDim baseboxes(0) - baseboxes(0) = value - UsedRomIDs4Fantasy.Add(value.RomID, baseboxes) - End If - End If - End If - End Sub - End Class - Public Class ReelBoxCollection - Inherits Generic.Dictionary(Of String, B2SReelBox) - - Public Sub New() - MyBase.New(StringComparer.OrdinalIgnoreCase) - End Sub - - Public Shadows Sub Add(value As B2SReelBox) - If Not MyBase.ContainsKey(value.Name) Then MyBase.Add(value.Name, value) - If value.RomID > 0 Then - If UsedRomReelLampIDs.ContainsKey(value.RomID) Then - Dim reelboxes As B2SReelBox() = UsedRomReelLampIDs(value.RomID) - ReDim Preserve reelboxes(reelboxes.Length) - reelboxes(reelboxes.Length - 1) = value - UsedRomReelLampIDs(value.RomID) = reelboxes - Else - Dim reelboxes As B2SReelBox() - ReDim reelboxes(0) - reelboxes(0) = value - UsedRomReelLampIDs.Add(value.RomID, reelboxes) - End If - End If - End Sub - End Class - Public Class ZOrderCollection - Inherits Generic.SortedList(Of Integer, B2SPictureBox()) - - Public Shadows Sub Add(value As B2SPictureBox) - If value.ZOrder > 0 Then - If MyBase.ContainsKey(value.ZOrder) Then - Dim pictureboxes As B2SPictureBox() = MyBase.Item(value.ZOrder) - ReDim Preserve pictureboxes(pictureboxes.Length) - pictureboxes(pictureboxes.Length - 1) = value - MyBase.Item(value.ZOrder) = pictureboxes - Else - Dim pictureboxes As B2SPictureBox() - ReDim pictureboxes(0) - pictureboxes(0) = value - MyBase.Add(value.ZOrder, pictureboxes) - End If - End If - End Sub - End Class - - Public Class AnimationInfo - Public AnimationName As String = String.Empty - Public Inverted As Boolean = False - - Public Sub New(ByVal _name As String, ByVal _inverted As Boolean) - AnimationName = _name - Inverted = _inverted - End Sub - End Class - Public Class AnimationCollection - Inherits Generic.Dictionary(Of Integer, AnimationInfo()) - - Public Shadows Sub Add(key As Integer, value As AnimationInfo) - If Not Me.ContainsKey(key) Then - MyBase.Add(key, New AnimationInfo() {value}) - Else - Dim infos As AnimationInfo() = Me(key) - ReDim Preserve infos(infos.Length) - infos(infos.Length - 1) = value - Me(key) = infos - End If - End Sub - End Class - - Public Class IlluminationGroupCollection - Inherits Generic.Dictionary(Of String, B2SPictureBox()) - - Public Sub New() - MyBase.New(StringComparer.OrdinalIgnoreCase) - End Sub - - Public Shadows Sub Add(ByVal value As B2SPictureBox) - If Not String.IsNullOrEmpty(value.GroupName) Then - If Not Me.ContainsKey(value.GroupName) Then - MyBase.Add(value.GroupName, New B2SPictureBox() {value}) - Else - Dim picboxes As B2SPictureBox() = Me(value.GroupName) - ReDim Preserve picboxes(picboxes.Length) - picboxes(picboxes.Length - 1) = value - Me(value.GroupName) = picboxes - End If - End If - End Sub - End Class - - Public Shared ReadOnly Property UseRomLamps() As Boolean - Get - If B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy Then - Return (UsedRomLampIDs4Fantasy.Count > 0 OrElse UsedTopRomIDType4Fantasy = B2SBaseBox.eRomIDType.Lamp OrElse UsedSecondRomIDType4Fantasy = B2SBaseBox.eRomIDType.Lamp) - Else - Return (UsedRomLampIDs4Authentic.Count > 0 OrElse UsedTopRomIDType4Authentic = B2SBaseBox.eRomIDType.Lamp OrElse UsedSecondRomIDType4Authentic = B2SBaseBox.eRomIDType.Lamp) - End If - End Get - End Property - Public Shared ReadOnly Property UseRomSolenoids() As Boolean - Get - If B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy Then - Return (UsedRomSolenoidIDs4Fantasy.Count > 0 OrElse UsedTopRomIDType4Fantasy = B2SBaseBox.eRomIDType.Solenoid OrElse UsedSecondRomIDType4Fantasy = B2SBaseBox.eRomIDType.Solenoid) - Else - Return (UsedRomSolenoidIDs4Authentic.Count > 0 OrElse UsedTopRomIDType4Authentic = B2SBaseBox.eRomIDType.Solenoid OrElse UsedSecondRomIDType4Authentic = B2SBaseBox.eRomIDType.Solenoid) - End If - End Get - End Property - Public Shared ReadOnly Property UseRomGIStrings() As Boolean - Get - If B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy Then - Return (UsedRomGIStringIDs4Fantasy.Count > 0 OrElse UsedTopRomIDType4Fantasy = B2SBaseBox.eRomIDType.GIString OrElse UsedSecondRomIDType4Fantasy = B2SBaseBox.eRomIDType.GIString) - Else - Return (UsedRomGIStringIDs4Authentic.Count > 0 OrElse UsedTopRomIDType4Authentic = B2SBaseBox.eRomIDType.GIString OrElse UsedSecondRomIDType4Authentic = B2SBaseBox.eRomIDType.GIString) - End If - End Get - End Property - Public Shared ReadOnly Property UseRomMechs() As Boolean - Get - If B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy Then - Return (UsedRomMechIDs4Fantasy.Count > 0) - Else - Return (UsedRomMechIDs4Authentic.Count > 0) - End If - End Get - End Property - - Public Shared ReadOnly Property UseAnimationLamps() As Boolean - Get - Return (UsedAnimationLampIDs.Count > 0 OrElse UsedRandomAnimationLampIDs.Count > 0) - End Get - End Property - Public Shared ReadOnly Property UseAnimationSolenoids() As Boolean - Get - Return (UsedAnimationSolenoidIDs.Count > 0 OrElse UsedRandomAnimationSolenoidIDs.Count > 0) - End Get - End Property - Public Shared ReadOnly Property UseAnimationGIStrings() As Boolean - Get - Return (UsedAnimationGIStringIDs.Count > 0 OrElse UsedRandomAnimationGIStringIDs.Count > 0) - End Get - End Property - - Public Shared ReadOnly Property UseRomReelLamps() As Boolean - Get - Return (UsedRomReelLampIDs.Count > 0) - End Get - End Property - - Public Shared ReadOnly Property UseLEDs() As Boolean - Get - Return (LEDs.Count > 0) - End Get - End Property - Public Shared ReadOnly Property UseLEDDisplays() As Boolean - Get - Return (LEDDisplays.Count > 0) - End Get - End Property - - Public Shared ReadOnly Property UseReels() As Boolean - Get - Return (Reels.Count > 0) - End Get - End Property - - Private Shared _ScoreMaxDigit As Integer = 0 - Public Shared Property ScoreMaxDigit() As Integer - Get - Return _ScoreMaxDigit - End Get - Set(value As Integer) - If _ScoreMaxDigit < value Then - _ScoreMaxDigit = value - End If - End Set - End Property - - Public Shared Property Players() As B2SPlayer = New B2SPlayer() - Public Shared Property IsAPlayerAdded() As Boolean = False - - Public Shared Property Reels() As ReelBoxCollection = New ReelBoxCollection - Public Shared Property ReelDisplays() As Generic.Dictionary(Of Integer, B2SReelDisplay) = New Generic.Dictionary(Of Integer, B2SReelDisplay) - Public Shared Property ReelImages() As Generic.Dictionary(Of String, Image) = New Generic.Dictionary(Of String, Image)(StringComparer.OrdinalIgnoreCase) - Public Shared Property ReelIntermediateImages() As Generic.Dictionary(Of String, Image) = New Generic.Dictionary(Of String, Image)(StringComparer.OrdinalIgnoreCase) - Public Shared Property ReelIlluImages() As Generic.Dictionary(Of String, Image) = New Generic.Dictionary(Of String, Image)(StringComparer.OrdinalIgnoreCase) - Public Shared Property ReelIntermediateIlluImages() As Generic.Dictionary(Of String, Image) = New Generic.Dictionary(Of String, Image)(StringComparer.OrdinalIgnoreCase) - - Public Shared Property Sounds() As Generic.Dictionary(Of String, Byte()) = New Generic.Dictionary(Of String, Byte())(StringComparer.OrdinalIgnoreCase) - - Public Shared Property LEDs() As Generic.Dictionary(Of String, B2SLEDBox) = New Generic.Dictionary(Of String, B2SLEDBox)(StringComparer.OrdinalIgnoreCase) - Public Shared Property LEDAreas() As Generic.Dictionary(Of String, LEDAreaInfo) = New Generic.Dictionary(Of String, LEDAreaInfo)(StringComparer.OrdinalIgnoreCase) - Public Class LEDAreaInfo - Public Rect As Rectangle = Nothing - Public IsOnDMD As Boolean = False - - Public Sub New(ByVal _rect As Rectangle, ByVal _isOnDMD As Boolean) - Rect = _rect - IsOnDMD = _isOnDMD - End Sub - End Class - - Public Shared Property LEDDisplays() As Generic.Dictionary(Of String, Dream7Display) = New Generic.Dictionary(Of String, Dream7Display)(StringComparer.OrdinalIgnoreCase) - Public Shared Property LEDDisplayDigits() As Generic.Dictionary(Of Integer, LEDDisplayDigitLocation) = New Generic.Dictionary(Of Integer, LEDDisplayDigitLocation) - Public Class LEDDisplayDigitLocation - Public LEDDisplay As Dream7Display = Nothing - Public Digit As Integer = 0 - Public LEDDisplayID As Integer = 0 - - Public Sub New(ByRef _leddisplay As Dream7Display, ByVal _digit As Integer, ByVal _ledDisplayID As Integer) - LEDDisplay = _leddisplay - Digit = _digit - LEDDisplayID = _ledDisplayID - End Sub - End Class - - Public Shared Property Illuminations() As PictureBoxCollection = New PictureBoxCollection() - Public Shared Property DMDIlluminations() As PictureBoxCollection = New PictureBoxCollection() - - Public Shared Property UseIlluminationLocks() As Boolean = False - Public Shared Property IlluminationGroups() As IlluminationGroupCollection = New IlluminationGroupCollection() - Public Shared Property IlluminationLocks() As Generic.Dictionary(Of String, Integer) = New Generic.Dictionary(Of String, Integer)(StringComparer.OrdinalIgnoreCase) - - Public Shared Property UseZOrder() As Boolean = False - Public Shared Property UseDMDZOrder() As Boolean = False - Public Shared Property ZOrderImages() As ZOrderCollection = New ZOrderCollection() - Public Shared Property ZOrderDMDImages() As ZOrderCollection = New ZOrderCollection() - - Public Shared Property UseRotatingImage() As Boolean = False - Public Shared Property UseMechRotatingImage() As Boolean = False - Public Shared Property RotatingImages() As Generic.Dictionary(Of Integer, Generic.Dictionary(Of Integer, Image)) = New Generic.Dictionary(Of Integer, Generic.Dictionary(Of Integer, Image)) - Public Shared Property RotatingPictureBox() As Generic.Dictionary(Of Integer, B2SPictureBox) = New Generic.Dictionary(Of Integer, B2SPictureBox) - - Public Shared Property led8Seg() As Generic.List(Of PointF()) = New Generic.List(Of PointF()) - Public Shared Property led10Seg() As Generic.List(Of PointF()) = New Generic.List(Of PointF()) - Public Shared Property led14Seg() As Generic.List(Of PointF()) = New Generic.List(Of PointF()) - Public Shared Property led16Seg() As Generic.List(Of PointF()) = New Generic.List(Of PointF()) - Public Shared Property ledCoordMax() As Integer - - Public Shared Sub ClearAll(Optional ByVal donotclearnames As Boolean = False) - If Not donotclearnames Then - TableName = String.Empty - TableFileName = String.Empty - BackglassFileName = String.Empty - End If - TableType = 0 - DMDType = 0 - GrillHeight = 0 - SmallGrillHeight = 0 - DMDDefaultLocation = New Point(0, 0) - DualBackglass = False - UsedTopRomIDType4Authentic = B2SBaseBox.eRomIDType.NotDefined - UsedTopRomIDType4Fantasy = B2SBaseBox.eRomIDType.NotDefined - UsedSecondRomIDType4Authentic = B2SBaseBox.eRomIDType.NotDefined - UsedSecondRomIDType4Fantasy = B2SBaseBox.eRomIDType.NotDefined - UsedRomLampIDs4Authentic.Clear() - UsedRomSolenoidIDs4Authentic.Clear() - UsedRomGIStringIDs4Authentic.Clear() - UsedRomMechIDs4Authentic.Clear() - UsedRomLampIDs4Fantasy.Clear() - UsedRomSolenoidIDs4Fantasy.Clear() - UsedRomGIStringIDs4Fantasy.Clear() - UsedRomMechIDs4Fantasy.Clear() - UsedRomReelLampIDs.Clear() - UsedAnimationLampIDs.Clear() - UsedRandomAnimationLampIDs.Clear() - UsedAnimationSolenoidIDs.Clear() - UsedRandomAnimationSolenoidIDs.Clear() - UsedAnimationGIStringIDs.Clear() - UsedRandomAnimationGIStringIDs.Clear() - IsAPlayerAdded = False - Players.Clear() - For Each r In Reels : r.Value.Dispose() : Next - Reels.Clear() - For Each rd In ReelDisplays : rd.Value.Dispose() : Next - ReelDisplays.Clear() - ReelImages.Clear() - ReelIntermediateImages.Clear() - ReelIlluImages.Clear() - ReelIntermediateIlluImages.Clear() - 'For Each s In Sounds : s.Value.Dispose() : Next - Sounds.Clear() - LEDs.Clear() - LEDAreas.Clear() - LEDDisplays.Clear() - LEDDisplayDigits.Clear() - Illuminations.Clear() - DMDIlluminations.Clear() - UseIlluminationLocks = False - IlluminationGroups.Clear() - IlluminationLocks.Clear() - UseZOrder = False - UseDMDZOrder = False - ZOrderImages.Clear() - ZOrderDMDImages.Clear() - UseRotatingImage = False - UseMechRotatingImage = False - For Each r As KeyValuePair(Of Integer, Generic.Dictionary(Of Integer, Image)) In RotatingImages : r.Value.Clear() : Next - RotatingImages.Clear() - RotatingPictureBox.Clear() - End Sub - - Shared Sub New() - - ' set coordinates maximum - ledCoordMax = 103 - - ' add led segments - Const toleft As Integer = 8 - ' 8 segments - led8Seg.Add({New PointF(22, 5), New PointF(26, 2), New PointF(88, 2), New PointF(92, 5), New PointF(85, 11), New PointF(29, 11)}) - led8Seg.Add({New PointF(93, 7), New PointF(96, 10), New PointF(96 - toleft, 46), New PointF(93 - toleft, 49), New PointF(87 - toleft, 43), New PointF(87, 12)}) - led8Seg.Add({New PointF(92 - toleft, 51), New PointF(95 - toleft, 54), New PointF(96 - 2 * toleft, 90), New PointF(93 - 2 * toleft, 93), New PointF(87 - 2 * toleft, 88), New PointF(86 - toleft, 57)}) - led8Seg.Add({New PointF(22 - 2 * toleft, 95), New PointF(29 - 2 * toleft, 89), New PointF(85 - 2 * toleft, 89), New PointF(92 - 2 * toleft, 95), New PointF(88 - 2 * toleft, 98), New PointF(26 - 2 * toleft, 98)}) - led8Seg.Add({New PointF(20 - toleft, 51), New PointF(26 - toleft, 57), New PointF(27 - 2 * toleft, 88), New PointF(21 - 2 * toleft, 93), New PointF(17 - 2 * toleft, 90), New PointF(17 - toleft, 54)}) - led8Seg.Add({New PointF(21, 7), New PointF(27, 12), New PointF(27 - toleft, 43), New PointF(21 - toleft, 49), New PointF(18 - toleft, 46), New PointF(18, 10)}) - led8Seg.Add({New PointF(23 - toleft, 50), New PointF(27 - toleft, 46), New PointF(86 - toleft, 46), New PointF(90 - toleft, 50), New PointF(86 - toleft, 54), New PointF(27 - toleft, 54)}) - ' 10 segments - led10Seg.Add({New PointF(22, 5), New PointF(26, 2), New PointF(88, 2), New PointF(92, 5), New PointF(85, 11), New PointF(72, 11), New PointF(67, 6), New PointF(62, 11), New PointF(29, 11)}) - led10Seg.Add({New PointF(93, 7), New PointF(96, 10), New PointF(96 - toleft, 46), New PointF(93 - toleft, 49), New PointF(87 - toleft, 43), New PointF(87, 12)}) - led10Seg.Add({New PointF(92 - toleft, 51), New PointF(95 - toleft, 54), New PointF(96 - 2 * toleft, 90), New PointF(93 - 2 * toleft, 93), New PointF(87 - 2 * toleft, 88), New PointF(86 - toleft, 57)}) - led10Seg.Add({New PointF(22 - 2 * toleft, 95), New PointF(29 - 2 * toleft, 89), New PointF(61 - 2 * toleft, 89), New PointF(66 - 2 * toleft, 94), New PointF(71 - 2 * toleft, 89), New PointF(85 - 2 * toleft, 89), New PointF(92 - 2 * toleft, 95), New PointF(88 - 2 * toleft, 98), New PointF(26 - 2 * toleft, 98)}) - led10Seg.Add({New PointF(20 - toleft, 51), New PointF(26 - toleft, 57), New PointF(27 - 2 * toleft, 88), New PointF(21 - 2 * toleft, 93), New PointF(17 - 2 * toleft, 90), New PointF(17 - toleft, 54)}) - led10Seg.Add({New PointF(21, 7), New PointF(27, 12), New PointF(27 - toleft, 43), New PointF(21 - toleft, 49), New PointF(18 - toleft, 46), New PointF(18, 10)}) - led10Seg.Add({New PointF(23 - toleft, 50), New PointF(27 - toleft, 46), New PointF(63 - toleft, 46), New PointF(68 - toleft, 51), New PointF(73 - toleft, 46), New PointF(86 - toleft, 46), New PointF(90 - toleft, 50), New PointF(86 - toleft, 54), New PointF(72 - toleft, 54), New PointF(67 - toleft, 49), New PointF(62 - toleft, 54), New PointF(27 - toleft, 54)}) - led10Seg.Add({New PointF(67, 9), New PointF(71, 13), New PointF(71 - toleft, 45), New PointF(67 - toleft, 49), New PointF(63 - toleft, 45), New PointF(63, 13)}) - led10Seg.Add({New PointF(68, 7), New PointF(72, 11), New PointF(72 - toleft, 43), New PointF(68 - toleft, 47), New PointF(64 - toleft, 43), New PointF(64, 7)}) - led10Seg.Add({New PointF(66 - toleft, 51), New PointF(70 - toleft, 55), New PointF(70 - 2 * toleft, 88), New PointF(66 - 2 * toleft, 92), New PointF(62 - 2 * toleft, 88), New PointF(62 - toleft, 51)}) - ' 14 segments - led14Seg.Add({New PointF(22, 5), New PointF(26, 2), New PointF(88, 2), New PointF(92, 5), New PointF(85, 11), New PointF(29, 11)}) - led14Seg.Add({New PointF(93, 7), New PointF(96, 10), New PointF(96 - toleft, 46), New PointF(93 - toleft, 49), New PointF(87 - toleft, 43), New PointF(87, 12)}) - led14Seg.Add({New PointF(92 - toleft, 51), New PointF(95 - toleft, 54), New PointF(96 - 2 * toleft, 90), New PointF(93 - 2 * toleft, 93), New PointF(87 - 2 * toleft, 88), New PointF(86 - toleft, 57)}) - led14Seg.Add({New PointF(22 - 2 * toleft, 95), New PointF(29 - 2 * toleft, 89), New PointF(85 - 2 * toleft, 89), New PointF(92 - 2 * toleft, 95), New PointF(88 - 2 * toleft, 98), New PointF(26 - 2 * toleft, 98)}) - led14Seg.Add({New PointF(20 - toleft, 51), New PointF(26 - toleft, 57), New PointF(27 - 2 * toleft, 88), New PointF(21 - 2 * toleft, 93), New PointF(17 - 2 * toleft, 90), New PointF(17 - toleft, 54)}) - led14Seg.Add({New PointF(21, 7), New PointF(27, 12), New PointF(27 - toleft, 43), New PointF(21 - toleft, 49), New PointF(18 - toleft, 46), New PointF(18, 10)}) - led14Seg.Add({New PointF(23 - toleft, 50), New PointF(27 - toleft, 46), New PointF(52 - toleft, 46), New PointF(55 - toleft, 50), New PointF(52 - toleft, 54), New PointF(27 - toleft, 54)}) - led14Seg.Add({New PointF(104 - 2 * toleft, 87), New PointF(109 - 2 * toleft, 90), New PointF(109 - 2 * toleft, 95), New PointF(104 - 2 * toleft, 99), New PointF(100 - 2 * toleft, 95), New PointF(100 - 2 * toleft, 90)}) - led14Seg.Add({New PointF(30, 13), New PointF(34, 17), New PointF(54 - toleft, 38), New PointF(51 - toleft, 43), New PointF(48 - toleft, 40), New PointF(27, 16)}) - led14Seg.Add({New PointF(57, 13), New PointF(61, 13), New PointF(61 - toleft, 46), New PointF(57 - toleft, 48), New PointF(53 - toleft, 46), New PointF(53, 13)}) - led14Seg.Add({New PointF(82, 13), New PointF(85, 16), New PointF(68 - toleft, 42), New PointF(65 - toleft, 44), New PointF(63 - toleft, 39), New PointF(77, 17)}) - led14Seg.Add({New PointF(58 - toleft, 50), New PointF(62 - toleft, 46), New PointF(86 - toleft, 46), New PointF(90 - toleft, 50), New PointF(86 - toleft, 54), New PointF(62 - toleft, 54)}) - led14Seg.Add({New PointF(82 - 2 * toleft, 85), New PointF(87 - 2 * toleft, 86), New PointF(67 - toleft, 57), New PointF(62 - toleft, 57), New PointF(62 - toleft, 60), New PointF(79 - 2 * toleft, 86)}) - led14Seg.Add({New PointF(57 - toleft, 52), New PointF(61 - toleft, 54), New PointF(61 - 2 * toleft, 88), New PointF(57 - 2 * toleft, 88), New PointF(53 - 2 * toleft, 88), New PointF(53 - toleft, 54)}) - led14Seg.Add({New PointF(30 - 2 * toleft, 83), New PointF(33 - 2 * toleft, 86), New PointF(50 - toleft, 60), New PointF(47 - toleft, 57), New PointF(42 - toleft, 61), New PointF(27 - 2 * toleft, 86)}) - led14Seg.Add({New PointF(102 - 2 * toleft, 97), New PointF(107 - 2 * toleft, 100), New PointF(107 - 2 * toleft, 105), New PointF(102 - 2 * toleft, 109), New PointF(98 - 2 * toleft, 105), New PointF(98 - 2 * toleft, 100)}) - ' 16 segments - led16Seg.Add({New PointF(22, 5), New PointF(26, 2), New PointF(88, 2), New PointF(92, 5), New PointF(85, 11), New PointF(29, 11)}) - 'led16Seg.Add({New PointF(93, 7), New PointF(96, 10), New PointF(96 - toleft, 46), New PointF(93 - toleft, 49), New PointF(87 - toleft, 43), New PointF(87, 12)}) - 'led16Seg.Add({New PointF(92 - toleft, 51), New PointF(95 - toleft, 54), New PointF(96 - 2 * toleft, 90), New PointF(93 - 2 * toleft, 93), New PointF(87 - 2 * toleft, 88), New PointF(86 - toleft, 57)}) - 'led16Seg.Add({New PointF(22 - 2 * toleft, 95), New PointF(29 - 2 * toleft, 89), New PointF(85 - 2 * toleft, 89), New PointF(92 - 2 * toleft, 95), New PointF(88 - 2 * toleft, 98), New PointF(26 - 2 * toleft, 98)}) - 'led16Seg.Add({New PointF(20 - toleft, 51), New PointF(26 - toleft, 57), New PointF(27 - 2 * toleft, 88), New PointF(21 - 2 * toleft, 93), New PointF(17 - 2 * toleft, 90), New PointF(17 - toleft, 54)}) - 'led16Seg.Add({New PointF(21, 7), New PointF(27, 12), New PointF(27 - toleft, 43), New PointF(21 - toleft, 49), New PointF(18 - toleft, 46), New PointF(18, 10)}) - 'led16Seg.Add({New PointF(23 - toleft, 50), New PointF(27 - toleft, 46), New PointF(86 - toleft, 46), New PointF(90 - toleft, 50), New PointF(86 - toleft, 54), New PointF(27 - toleft, 54)}) - - End Sub - - Public Shared Function ShortFileName(ByVal longFileName As String) As String - - On Error Resume Next - Dim ret As String = Space(255) - GetShortPathName(longFileName, ret, Len(ret)) - If Not String.IsNullOrEmpty(ret) AndAlso InStr(ret, Chr(0)) > 0 Then - Return ret.Substring(0, InStr(ret, Chr(0)) - 1) - Else - ' Do not return an empty string as Short File Name - Return longFileName - End If - - End Function - -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SLED.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SLED.vb deleted file mode 100644 index 867a438..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SLED.vb +++ /dev/null @@ -1,36 +0,0 @@ -Imports System.Drawing - -Public Class B2SLED - - Public Enum eLEDType - Undefined = 0 - LED8 = 1 - LED10 = 2 - LED14 = 3 - LED16 = 4 - End Enum - -#Region "constructor and startup" - - Public Sub New() - ' nothing to do - End Sub - -#End Region - -#Region "standard colors" - - Private ReadOnly Property LitLEDSegmentStandardColor() As Color - Get - Return Color.OrangeRed - End Get - End Property - Private ReadOnly Property DarkLEDSegmentStandardColor() As Color - Get - Return Color.FromArgb(39, 34, 31) - End Get - End Property - -#End Region - -End Class \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SPlayer.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SPlayer.vb deleted file mode 100644 index 23a5032..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SPlayer.vb +++ /dev/null @@ -1,128 +0,0 @@ -Imports System - -Public Class B2SPlayer - - Inherits Generic.Dictionary(Of Integer, ControlCollection) - - Public Enum eControlType - NotDefined = 0 - LEDBox = 1 - Dream7LEDDisplay = 2 - ReelBox = 3 - ReelDisplay = 4 - End Enum - - Public Class ControlCollection - - Inherits Generic.List(Of ControlInfo) - - Public Shadows Sub Add(ByVal item As ControlInfo) - Dim add As Boolean = True - For Each control As ControlInfo In Me - If control.StartDigit = item.StartDigit Then - add = False - Exit For - End If - Next - If add Then - MyBase.Add(item) - Digits += item.Digits - End If - End Sub - - Public Property Digits() As Integer = 0 - - Private _Score As Integer = -1 - Public Property Score() As Integer - Get - Return _Score - End Get - Set(ByVal value As Integer) - 'If _Score <> value Then - _Score = value - SetScore(value) - 'End If - End Set - End Property - - Private Sub SetScore(ByVal score As Integer) - - Dim scoreAsString As String = New String(" ", Digits - score.ToString().Length) & score.ToString() - - For Each control As ControlInfo In Me - - ' get the part of the score - Dim partofscore As String = scoreasstring.Substring(0, control.Digits) - - ' pass matching score part to real control - Select Case control.Type - Case eControlType.LEDBox - ' nothing to do - Case eControlType.Dream7LEDDisplay - If Not control.LEDDisplay.Visible Then - For i As Integer = control.StartDigit To control.StartDigit + control.Digits - 1 - B2SData.LEDs("LEDBox" & i.ToString()).Text = partofscore.Substring(i - control.StartDigit, 1) - Next - Else - For i As Integer = 0 To control.Digits - 1 - control.LEDDisplay.SetValue(i, partofscore.Substring(i, 1)) - Next - End If - Case eControlType.ReelBox - ' nothing to do - Case eControlType.ReelDisplay - control.ReelDisplay.Score = CInt(partofscore) - End Select - - ' remove already passed score part - scoreasstring = scoreasstring.Substring(control.Digits) - - Next - - End Sub - - End Class - Public Class ControlInfo - - Public StartDigit As Integer = 0 - Public Digits As Integer = 0 - Public Type As eControlType = eControlType.NotDefined - Public LEDBox As B2SLEDBox = Nothing - Public LEDDisplay As Dream7Display = Nothing - Public ReelBox As B2SReelBox = Nothing - Public ReelDisplay As B2SReelDisplay = Nothing - - Public Sub New(ByVal _startdigit As Integer, ByVal _digits As Integer, ByVal _type As eControlType, ByVal _ledbox As B2SLEDBox) - MyNew(_startdigit, _digits, eControlType.LEDBox) - LEDBox = _ledbox - End Sub - Public Sub New(ByVal _startdigit As Integer, ByVal _digits As Integer, ByVal _type As eControlType, ByVal _leddisplay As Dream7Display) - MyNew(_startdigit, _digits, eControlType.Dream7LEDDisplay) - LEDDisplay = _leddisplay - End Sub - Public Sub New(ByVal _startdigit As Integer, ByVal _digits As Integer, ByVal _type As eControlType, ByVal _reelbox As B2SReelBox) - MyNew(_startdigit, _digits, eControlType.ReelBox) - ReelBox = _reelbox - End Sub - Public Sub New(ByVal _startdigit As Integer, ByVal _digits As Integer, ByVal _type As eControlType, ByVal _reeldisplay As B2SReelDisplay) - MyNew(_startdigit, _digits, eControlType.ReelDisplay) - ReelDisplay = _reeldisplay - End Sub - - Private Sub MyNew(ByVal _startdigit As Integer, ByVal _digits As Integer, ByVal _type As eControlType) - StartDigit = _startdigit - Digits = _digits - Type = _type - End Sub - - End Class - - Public Shadows Sub Add(ByVal playerno As Integer) - - Dim controls As ControlCollection = New ControlCollection() - MyBase.Add(playerno, controls) - - End Sub - -End Class - diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SReelDisplay.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SReelDisplay.vb deleted file mode 100644 index 07d8b8d..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SReelDisplay.vb +++ /dev/null @@ -1,189 +0,0 @@ -Imports System - -Public Class B2SReelDisplay - - Implements IDisposable - - Private timerRR As System.Windows.Forms.Timer = Nothing - Private timerIA As System.Windows.Forms.Timer = Nothing - - Public Sub New() - - ' create timers - timerRR = New System.Windows.Forms.Timer - timerRR.Interval = 17 - timerRR.Enabled = False - AddHandler timerRR.Tick, AddressOf TimerRR_Tick - timerIA = New System.Windows.Forms.Timer - timerIA.Interval = 17 - timerIA.Enabled = False - AddHandler timerIA.Tick, AddressOf TimerIA_Tick - - End Sub - - Public Reels As ReelBoxCollection = New ReelBoxCollection() - Public Class ReelBoxCollection - Inherits Generic.Dictionary(Of Integer, B2SReelBox) - - Public Property IsLED() As Boolean = False - - Public Shadows Sub Add(ByVal key As Integer, ByVal value As B2SReelBox) - If Not IsLED AndAlso (value.ReelType.StartsWith("LED", StringComparison.CurrentCultureIgnoreCase) OrElse value.ReelType.StartsWith("ImportedLED", StringComparison.CurrentCultureIgnoreCase)) Then - IsLED = True - End If - MyBase.Add(key, value) - End Sub - End Class - - Public Property StartDigit() As Integer = 0 - Public Property Digits() As Integer = 0 - - Public ReadOnly Property IsInAction() As Boolean - Get - Dim ret As Boolean = False - For Each reelbox As KeyValuePair(Of Integer, B2SReelBox) In Reels - If reelbox.Value.IsInAction Then ret = True : Exit For - Next - Return ret - End Get - End Property - - Private _Score As Integer = -1 - Private _NextScore As Integer = -1 - Public Property Score() As Integer - Get - Return _Score - End Get - Set(ByVal value As Integer) - If IsInAction Then - If _Score <> value Then - _NextScore = value - End If - Else - _Score = value - SetScore(_Score) - End If - End Set - End Property - - Private Sub SetScore(ByVal score As Integer, Optional ByVal startAtIndex As Integer = 0) - - If Reels.Count > 0 Then - - timerIA.Start() - - Dim scoreAsStringX As String = score.ToString("D" & Digits.ToString()) - - Dim j As Integer = 1 - For i As Integer = StartDigit + Digits - startAtIndex - 1 To StartDigit Step -1 - If Reels.ContainsKey(i) Then - Dim reelbox As B2SReelBox = Reels(i) - Dim value As Integer = reelbox.CurrentText - Dim newvalue As Integer = CInt(scoreAsStringX.Substring(i - StartDigit, 1)) - Dim nextReelShouldWait = (value > newvalue AndAlso score > 0) - Reels(i).Text(True) = CInt(scoreAsStringX.Substring(i - StartDigit, 1)) - ' maybe get out here since the current reel is rolling over '9' - If nextReelShouldWait Then - StartTimer(i, newvalue, score, j) - Exit For - End If - End If - j += 1 - Next - - End If - - End Sub - - - ' reel rolling timer stuff - - Dim currentindex As Integer = 0 - Dim currentnewvalue As Integer = 0 - Dim currentscore As Integer = 0 - Dim currentrestartat As Integer = 0 - - Private Sub StartTimer(ByVal index As Integer, ByVal newvalue As Integer, ByVal score As Integer, ByVal restartfromright As Integer) - currentindex = index - currentnewvalue = newvalue - currentscore = score - currentrestartat = restartfromright - timerRR.Start() - End Sub - - Private Sub TimerRR_Tick(ByVal sender As Object, ByVal e As EventArgs) - - If currentrestartat = 0 OrElse Reels(currentindex).CurrentText <= currentnewvalue OrElse (Reels(currentindex).CurrentText >= 9 AndAlso Not Reels(currentindex).IsInReelRolling) Then - - timerRR.Stop() - - Dim restartfromright As Integer = currentrestartat - Dim score As Integer = currentscore - currentindex = 0 - currentnewvalue = 0 - currentscore = 0 - currentrestartat = 0 - SetScore(score, restartfromright) - - End If - - End Sub - - Private Sub TimerIA_Tick(ByVal sender As Object, ByVal e As EventArgs) - - If Not IsInAction Then - - timerIA.Stop() - - If _NextScore > 0 Then - Dim nextscore As Integer = _NextScore - _NextScore = 0 - StartTimer(0, 0, nextscore, 0) - End If - - End If - - End Sub - - -#Region "IDisposable Support" - Private disposedValue As Boolean ' To detect redundant calls - - ' IDisposable - Protected Overridable Sub Dispose(disposing As Boolean) - If Not Me.disposedValue Then - If disposing Then - ' TODO: dispose managed state (managed objects). - On Error Resume Next - RemoveHandler timerIA.Tick, AddressOf TimerIA_Tick - RemoveHandler timerRR.Tick, AddressOf TimerRR_Tick - timerIA.Stop() - timerRR.Stop() - timerIA.Dispose() - timerRR.Stop() - timerIA = Nothing - timerRR = Nothing - End If - - ' TODO: free unmanaged resources (unmanaged objects) and override Finalize() below. - ' TODO: set large fields to null. - End If - Me.disposedValue = True - End Sub - - ' TODO: override Finalize() only if Dispose(ByVal disposing As Boolean) above has code to free unmanaged resources. - 'Protected Overrides Sub Finalize() - ' ' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above. - ' Dispose(False) - ' MyBase.Finalize() - 'End Sub - - ' This code added by Visual Basic to correctly implement the disposable pattern. - Public Sub Dispose() Implements IDisposable.Dispose - ' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above. - Dispose(True) - GC.SuppressFinalize(Me) - End Sub -#End Region - -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SScreen.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SScreen.vb deleted file mode 100644 index f5bc8a9..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SScreen.vb +++ /dev/null @@ -1,730 +0,0 @@ -Imports System -Imports System.Windows.Forms -Imports System.Drawing -Imports Microsoft.Win32 -Imports System.IO -Imports System.Reflection -Imports System.Text.RegularExpressions - -Public Class B2SScreen - - Public Property ScreensOrdered() = Screen.AllScreens.OrderBy(Function(sc) sc.Bounds.Location.X).ToArray() - Public Property VersionTwoFile() As Boolean = False - - Public Shared formBackglass As formBackglass = Nothing - Public formDMD As formDMD = Nothing - Public formbackground As Background = Nothing - Public debugLog As Log = New Log("B2SDebugLog") - - Public Enum eDMDViewMode - NotDefined = 0 - NoDMD = 1 - ShowDMD = 2 - ShowDMDOnlyAtDefaultLocation = 3 - DoNotShowDMDAtDefaultLocation = 4 - End Enum - - Public Property PlayfieldSize() As Size = New Size(0, 0) - Public Property BackglassMonitor() As String = String.Empty - Public Property BackglassScreen() As Screen = Nothing - Public Property BackglassSize() As Size = New Size(0, 0) - Public Property BackglassLocation() As Point = New Point(0, 0) - Public Property BackglassGrillHeight() As Integer = 0 - Public Property BackglassSmallGrillHeight() As Integer = 0 - Public Property DMDSize() As Size = New Size(0, 0) - Public Property DMDLocation() As Point = New Point(0, 0) - Public Property DMDFlipY() As Boolean = False - Public Property DMDAtDefaultLocation() As Boolean = True - Public Property DMDViewMode() As eDMDViewMode = eDMDViewMode.NotDefined - - Public Property BackgroundSize() As Size = New Size(0, 0) - Public Property BackgroundLocation() As Point = New Point(0, 0) - Public Property BackgroundPath() As String = String.Empty - - Public Property BackglassCutOff() As Rectangle = Nothing - - Public Property IsDMDToBeShown() As Boolean = False - Public Property StartBackground() As Boolean = False - - -#Region "constructor and startup" - - Public Sub New() - debugLog.IsLogOn = B2SSettings.B2SDebugLog - debugLog.WriteLogEntry("B2SScreen.New") - - 'searchPathLog.WriteLogEntry("Start Search ScreenRes") - - - ' read settings file - ReadB2SSettingsFromFile() - - End Sub - - Public Sub Start(ByVal _formBackglass As Form) - - ' here we go with one form for the backglass and no DMD and no grill - Me.Start(_formBackglass, Nothing, New Size(0, 0), eDMDViewMode.NoDMD, 0, 0) - - End Sub - Public Sub Start(ByVal _formBackglass As Form, ByVal _BackglassGrillHeight As Integer, ByVal _BackglassSmallGrillHeight As Integer) - - ' here we go with one form for the backglass and no DMD but with grill - Me.Start(_formBackglass, Nothing, New Size(0, 0), eDMDViewMode.NoDMD, _BackglassGrillHeight, _BackglassSmallGrillHeight) - - End Sub - Public Sub Start(ByVal _formBackglass As Form, ByVal _formDMD As Form, ByVal _DefaultDMDLocation As Point) - - ' here we go with two forms for the backglass and DMD and default values for the DMD view mode and the grill height - Me.Start(_formBackglass, _formDMD, _DefaultDMDLocation, eDMDViewMode.ShowDMD, 0, 0) - - End Sub - Public Sub Start(ByVal _formBackglass As Form, ByVal _formDMD As Form, ByVal _DefaultDMDLocation As Point, ByVal _DMDViewMode As eDMDViewMode, ByVal _BackglassGrillHeight As Integer, ByVal _BackglassSmallGrillHeight As Integer) - - ' here we go with one or two forms for the backglass and the DMD - formBackglass = _formBackglass - Me.formDMD = _formDMD - - Me.formbackground = New Background - - - ' get all backglass settings - GetB2SSettings(_DefaultDMDLocation, _DMDViewMode, _BackglassGrillHeight, _BackglassSmallGrillHeight) - - ' show all backglass stuff - Show() - - End Sub - -#End Region - - -#Region "get backglass settings and show backglass" - - Private Sub ReadB2SSettingsFromFile() - Dim loadFileName As String = String.Empty - 'Dim searchPathLog As Log = New Log("BackglassSearchPath") - 'searchPathLog.IsLogOn = B2SSettings.IsBackglassSearchLogOn - - 'searchPathLog.WriteLogEntry("Start Search ScreenRes") - debugLog.WriteLogEntry("B2SScreen.ReadB2SSettingsFromFile Start Search ScreenRes") - Try - Dim loadFileNames() As String = {IO.Path.Combine(B2SData.TableFileName & ".res"), ' .\TableName.res - IO.Path.Combine(B2SData.TableFileName, B2SSettings.B2SScreenResFileName), ' .\TableName\ScreenRes.txt - B2SSettings.B2SScreenResFileName, ' .\ScreenRes.txt - IO.Path.Combine(Application.StartupPath(), B2SSettings.B2SScreenResFileName)' B2SFolder\ScreenRes.txt - } - - For Each testFileName As String In loadFileNames - debugLog.WriteLogEntry("B2SScreen.ReadB2SSettingsFromFile Test " & testFileName) - 'searchPathLog.WriteLogEntry(" Test " & testFileName) - If IO.File.Exists(testFileName) Then - loadFileName = testFileName - B2SSettings.LoadedResFilePath = Path.GetFullPath(loadFileName) - debugLog.WriteLogEntry("B2SScreen.ReadB2SSettingsFromFile Found ScreenRes " & loadFileName) - 'searchPathLog.WriteLogEntry("Found ScreenRes " & loadFileName) - Exit For - End If - Next - Catch - End Try - debugLog.WriteLogEntry("B2SScreen.ReadB2SSettingsFromFile Stop Search ScreenRes") - 'searchPathLog.WriteLogEntry("Stop Search ScreenRes") - - If Not loadFileName = String.Empty Then - - ' open settings file - FileOpen(1, loadFileName, OpenMode.Input, OpenAccess.Read, OpenShare.Shared) - - ' get all settings - Dim line(50) As String - Dim i As Integer = 0 - Do Until EOF(1) Or i > 20 - line(i) = LineInput(1) - If (line(i).StartsWith("#")) Then - If (line(i).Replace(" ", "").StartsWith("#V2")) Then VersionTwoFile = True - Continue Do - End If - i += 1 - Loop - ' close file handle - FileClose(1) - debugLog.WriteLogEntry("B2SScreen.ReadB2SSettingsFromFile A version #2 file " & Me.BackgroundPath) - line(i) = 0 - line(i + 1) = 0 - Me.PlayfieldSize = New Size(CInt(line(0)), CInt(line(1))) - Me.BackglassSize = New Size(CInt(line(2)), CInt(line(3))) - Me.BackglassMonitor = line(4) - Me.BackglassLocation = New Point(CInt(line(5)), CInt(line(6))) - Me.DMDSize = New Size(CInt(line(7)), CInt(line(8))) - Me.DMDLocation = New Point(CInt(line(9)), CInt(line(10))) - Me.DMDFlipY = (Trim(line(11)) = "1") - - If (i > 15) Then - Me.BackgroundLocation = New Point(CInt(line(12)), CInt(line(13))) - Me.BackgroundSize = New Size(CInt(line(14)), CInt(line(15))) - Me.BackgroundPath = line(16) - If Me.BackgroundPath.Contains("{") Then - ' We will try to replace the placeholders with the real values - Me.BackgroundPath = GetBackgroundPath(Me.BackgroundPath, B2SData.TableFileName, B2SSettings.GameName) - debugLog.WriteLogEntry("B2SScreen.ReadB2SSettingsFromFile GetBackgroundPath called and returned " & Me.BackgroundPath) - End If - Else - Me.BackgroundLocation = New Point(0, 0) - Me.BackgroundSize = New Size(0, 0) - Me.BackgroundPath = "" - End If - - Else - debugLog.WriteLogEntry("B2SScreen.ReadB2SSettingsFromFile no B2S screen resolution file found") - - MessageBox.Show("There is no B2S screen resolution file '" & B2SSettings.B2SScreenResFileName & "' in the current folder '" & IO.Directory.GetCurrentDirectory() & "'." & vbCrLf & vbCrLf & - "Please create this file with the tool 'B2S_ScreenResIdentifier.exe'.", - "B2S backglass error", MessageBoxButtons.OK, MessageBoxIcon.Error) - End - - End If - End Sub - Private Function GetBackgroundPath(BackgroundPath As String, ByVal TableFileName As String, ByVal GameName As String) As String - Dim pattern As String = "^(?'name'[\w \-\!']+)(\((?'manufactor'[A-Za-z ]+)? (?'year'[\d{4}]+)\))?(?'extra'.*)?$" - Dim regex As New Regex(pattern) - Dim replacedSomething As Boolean = False - - Dim newPath As String = BackgroundPath - - Dim allGroupNames As List(Of String) = New List(Of String) From {"tablename", "gamename"} - - allGroupNames.AddRange(regex.GetGroupNames()) - allGroupNames.RemoveAll(Function(s) s.Length = 1) - - If regex.IsMatch(TableFileName) Then - For Each groupName As String In allGroupNames - For Each replaceName As String In allGroupNames - If groupName = replaceName And newPath.Contains("{" + replaceName + "}") Then - Select Case replaceName - Case "tablename" - newPath = newPath.Replace("{" + replaceName + "}", TableFileName) - replacedSomething = True - Case "gamename" - newPath = newPath.Replace("{" + replaceName + "}", GameName) - replacedSomething = True - Case Else - Dim replaceValue As String = regex.Match(TableFileName).Groups(replaceName).Value.Trim() - If Not String.IsNullOrEmpty(replaceValue) Then - replacedSomething = True - newPath = newPath.Replace("{" + replaceName + "}", replaceValue) - End If - End Select - Else - newPath = newPath.Replace("{" + replaceName + "}", "") - End If - Next - If File.Exists(newPath) And replacedSomething Then - Return newPath - Else - newPath = BackgroundPath - replacedSomething = False - End If - Next - End If - For Each replaceName As String In allGroupNames - newPath = newPath.Replace("{" + replaceName + "}", "") - Next - Return newPath - - End Function - - Private Sub GetB2SSettings(ByVal _DefaultDMDLocation As Point, ByVal _DMDViewMode As eDMDViewMode, ByVal _BackglassGrillHeight As Integer, ByVal _BackglassSmallGrillHeight As Integer) - - Me.DMDViewMode = _DMDViewMode - - ' show or do not show the grill and do some more DMD stuff - Dim showTheGrill As Boolean = (Me.DMDLocation.X = 0 AndAlso Me.DMDLocation.Y = 0) - If B2SSettings.HideGrill = CheckState.Unchecked Then - showTheGrill = True - ElseIf B2SSettings.HideGrill = CheckState.Checked Then - showTheGrill = False - End If - - If showTheGrill Then - - ' show the grill - Me.DMDAtDefaultLocation = True - - ' use default values for DMD location - If _DefaultDMDLocation <> Nothing AndAlso _DMDViewMode <> eDMDViewMode.DoNotShowDMDAtDefaultLocation Then - Me.DMDLocation = _DefaultDMDLocation - End If - - ' maybe do some corrections since there is a small grill - If _BackglassSmallGrillHeight > 0 AndAlso formBackglass.DarkImage IsNot Nothing Then - If Me.DMDLocation.Y > 0 Then - Me.DMDLocation = New Point(Me.DMDLocation.X, Me.DMDLocation.Y - _BackglassSmallGrillHeight) - End If - - Me.BackglassSmallGrillHeight = _BackglassSmallGrillHeight - - Me.BackglassCutOff = New Rectangle(0, formBackglass.DarkImage.Height - _BackglassGrillHeight - _BackglassSmallGrillHeight, formBackglass.DarkImage.Width, _BackglassSmallGrillHeight) - - ' shrink some images to remove the small grill - formBackglass.DarkImage4Authentic = CutOutImage(formBackglass.DarkImage4Authentic, _BackglassGrillHeight, _BackglassSmallGrillHeight) - If formBackglass.TopLightImage4Authentic IsNot Nothing Then - formBackglass.TopLightImage4Authentic = CutOutImage(formBackglass.TopLightImage4Authentic, _BackglassGrillHeight, _BackglassSmallGrillHeight) - End If - If formBackglass.SecondLightImage4Authentic IsNot Nothing Then - formBackglass.SecondLightImage4Authentic = CutOutImage(formBackglass.SecondLightImage4Authentic, _BackglassGrillHeight, _BackglassSmallGrillHeight) - End If - If formBackglass.TopAndSecondLightImage4Authentic IsNot Nothing Then - formBackglass.TopAndSecondLightImage4Authentic = CutOutImage(formBackglass.TopAndSecondLightImage4Authentic, _BackglassGrillHeight, _BackglassSmallGrillHeight) - End If - If formBackglass.DarkImage4Fantasy IsNot Nothing Then - formBackglass.DarkImage4Fantasy = CutOutImage(formBackglass.DarkImage4Fantasy, _BackglassGrillHeight, _BackglassSmallGrillHeight) - End If - If formBackglass.TopLightImage4Fantasy IsNot Nothing Then - formBackglass.TopLightImage4Fantasy = CutOutImage(formBackglass.TopLightImage4Fantasy, _BackglassGrillHeight, _BackglassSmallGrillHeight) - End If - If formBackglass.SecondLightImage4Fantasy IsNot Nothing Then - formBackglass.SecondLightImage4Fantasy = CutOutImage(formBackglass.SecondLightImage4Fantasy, _BackglassGrillHeight, _BackglassSmallGrillHeight) - End If - If formBackglass.TopAndSecondLightImage4Fantasy IsNot Nothing Then - formBackglass.TopAndSecondLightImage4Fantasy = CutOutImage(formBackglass.TopAndSecondLightImage4Fantasy, _BackglassGrillHeight, _BackglassSmallGrillHeight) - End If - - ' set background image and new backglass form height (without grill) - formBackglass.BackgroundImage = formBackglass.DarkImage - formBackglass.Size = formBackglass.DarkImage.Size - - End If - - Else - - ' do not show the grill (if possible) - Me.DMDAtDefaultLocation = False - - ' maybe hide grill - If _BackglassGrillHeight > 0 AndAlso formBackglass.DarkImage IsNot Nothing Then - - Me.BackglassGrillHeight = _BackglassGrillHeight - Me.BackglassSmallGrillHeight = _BackglassSmallGrillHeight - - Me.BackglassCutOff = New Rectangle(0, formBackglass.DarkImage.Height - _BackglassGrillHeight, formBackglass.DarkImage.Width, _BackglassGrillHeight) - - ' shrink some images to remove the grill - formBackglass.DarkImage4Authentic = ResizeImage(formBackglass.DarkImage4Authentic, _BackglassGrillHeight) - If formBackglass.TopLightImage4Authentic IsNot Nothing Then - formBackglass.TopLightImage4Authentic = ResizeImage(formBackglass.TopLightImage4Authentic, _BackglassGrillHeight) - End If - If formBackglass.SecondLightImage4Authentic IsNot Nothing Then - formBackglass.SecondLightImage4Authentic = ResizeImage(formBackglass.SecondLightImage4Authentic, _BackglassGrillHeight) - End If - If formBackglass.TopAndSecondLightImage4Authentic IsNot Nothing Then - formBackglass.TopAndSecondLightImage4Authentic = ResizeImage(formBackglass.TopAndSecondLightImage4Authentic, _BackglassGrillHeight) - End If - If formBackglass.DarkImage4Fantasy IsNot Nothing Then - formBackglass.DarkImage4Fantasy = ResizeImage(formBackglass.DarkImage4Fantasy, _BackglassGrillHeight) - End If - If formBackglass.TopLightImage4Fantasy IsNot Nothing Then - formBackglass.TopLightImage4Fantasy = ResizeImage(formBackglass.TopLightImage4Fantasy, _BackglassGrillHeight) - End If - If formBackglass.SecondLightImage4Fantasy IsNot Nothing Then - formBackglass.SecondLightImage4Fantasy = ResizeImage(formBackglass.SecondLightImage4Fantasy, _BackglassGrillHeight) - End If - If formBackglass.TopAndSecondLightImage4Fantasy IsNot Nothing Then - formBackglass.TopAndSecondLightImage4Fantasy = ResizeImage(formBackglass.TopAndSecondLightImage4Fantasy, _BackglassGrillHeight) - End If - - ' set background image and new backglass form height (without grill) - formBackglass.BackgroundImage = formBackglass.DarkImage - formBackglass.Size = formBackglass.DarkImage.Size - - End If - - ' maybe rotate DMD image - If Me.DMDFlipY AndAlso Me.formDMD IsNot Nothing AndAlso Me.formDMD.BackgroundImage IsNot Nothing Then - Me.formDMD.BackgroundImage.RotateFlip(RotateFlipType.RotateNoneFlipY) - End If - End If - - End Sub - - Private Sub Show() - 'Dim searchPathLog As Log = New Log("BackglassShow") - 'searchPathLog.IsLogOn = B2SSettings.IsBackglassSearchLogOn - - 'searchPathLog.WriteLogEntry("Start Show") - - 'On Error Resume Next - If (Not Me.BackgroundSize.IsEmpty) And ((B2SSettings.StartBackground.HasValue And B2SSettings.StartBackground) Or - (Not B2SSettings.StartBackground.HasValue And B2SSettings.GlobalStartBackground.HasValue And B2SSettings.GlobalStartBackground)) Then - StartBackground = True - End If - - ' first of all get the info whether the DMD is to be shown or not - IsDMDToBeShown = (Me.formDMD IsNot Nothing AndAlso Not Point.Empty.Equals(Me.DMDLocation) AndAlso - ((Me.DMDViewMode = eDMDViewMode.ShowDMD) OrElse - (Me.DMDViewMode = eDMDViewMode.ShowDMDOnlyAtDefaultLocation AndAlso Me.DMDAtDefaultLocation) OrElse - (Me.DMDViewMode = eDMDViewMode.DoNotShowDMDAtDefaultLocation AndAlso Not Me.DMDAtDefaultLocation))) - - ' get the correct screen - Me.BackglassScreen = ScreensOrdered(0) - Dim s As Screen - Dim currentScreen = 0 - - 'searchPathLog.WriteLogEntry("BackglassMonitor " & BackglassMonitor) - For Each s In ScreensOrdered - currentScreen += 1 - 'searchPathLog.WriteLogEntry("Screen: " & (s.DeviceName) & " Location " & s.Bounds.Location.X & " #" & currentScreen) - If Left(BackglassMonitor, 1) = "@" Then - If s.Bounds.Location.X = CInt(Mid(BackglassMonitor, 2)) Then - Me.BackglassScreen = s - 'searchPathLog.WriteLogEntry("Found: @" & (s.Bounds.Location.X)) - Exit For - End If - ElseIf Left(BackglassMonitor, 1) = "=" Then - If currentScreen = CInt(Mid(BackglassMonitor, 2)) Then - Me.BackglassScreen = s - 'searchPathLog.WriteLogEntry("Found: =" & currentScreen) - Exit For - End If - ElseIf s.DeviceName = "\\.\DISPLAY" + BackglassMonitor Then - 'searchPathLog.WriteLogEntry("Found: " & (s.DeviceName)) - Me.BackglassScreen = s - Exit For - End If - Next - On Error GoTo 0 - - - ' Westworld show background form, only if background is set and enabled in setting - Dim DMDKeepBackglassLocation = Me.BackglassLocation - If StartBackground Then - If Not VersionTwoFile Then - Dim swapSize = Me.BackgroundSize - Dim swapLocation = Me.BackgroundLocation - Me.BackgroundSize = Me.BackglassSize - Me.BackglassSize = swapSize - Me.BackgroundLocation = Me.BackglassLocation - Me.BackglassLocation = swapLocation - End If - - Me.formbackground.StartPosition = FormStartPosition.Manual - Me.formbackground.BackgroundImageLayout = ImageLayout.Stretch - Me.formbackground.FormBorderStyle = FormBorderStyle.None - Me.formbackground.ControlBox = False - Me.formbackground.MaximizeBox = False - Me.formbackground.MinimizeBox = False - Me.formbackground.Location = Me.BackglassScreen.Bounds.Location + Me.BackgroundLocation - Me.formbackground.Size = Me.BackgroundSize - Me.formbackground.Text = "B2S Backglass Server" - Me.formbackground.BackColor = Color.Black - If (IO.File.Exists(Me.BackgroundPath)) Then - Me.formbackground.BackgroundImage = Image.FromFile(Me.BackgroundPath) ' ("C:\backglass.png") - End If - Me.formbackground.Show() - If Not B2SSettings.PureEXE Then - If B2SSettings.FormToBack Then - Me.formbackground.SendToBack() - Me.formbackground.ShowInTaskbar = False - ElseIf B2SSettings.FormToFront Then - Me.formbackground.BringToFront() - Me.formbackground.TopMost = True - If B2SSettings.FormNoFocus Then Me.formbackground.ShowInTaskbar = False - Else - Me.formbackground.BringToFront() - End If - End If - End If - ' set forms to background image size - If formBackglass IsNot Nothing AndAlso formBackglass.BackgroundImage IsNot Nothing Then - formBackglass.Size = formBackglass.BackgroundImage.Size - End If - If Me.formDMD IsNot Nothing AndAlso Me.formDMD.BackgroundImage IsNot Nothing Then - Me.formDMD.Size = Me.formDMD.BackgroundImage.Size - End If - - ' calculate backglass rescale factors - Dim rescaleBackglassX As Single = formBackglass.Width / Me.BackglassSize.Width - Dim rescaleBackglassY As Single = formBackglass.Height / Me.BackglassSize.Height - If formBackglass.BackgroundImage IsNot Nothing Then - rescaleBackglassX = formBackglass.BackgroundImage.Width / Me.BackglassSize.Width - rescaleBackglassY = formBackglass.BackgroundImage.Height / Me.BackglassSize.Height - End If - - ' maybe rescale the location and the size because this is the default and therefore it has to be done - Dim rescaleDMDX As Single = 1 - Dim rescaleDMDY As Single = 1 - If IsDMDToBeShown Then - If Me.DMDAtDefaultLocation Then - Me.DMDSize = Me.formDMD.Size - If rescaleBackglassX <> 1 OrElse rescaleBackglassY <> 1 Then - Me.DMDLocation = New Point(Int(Me.DMDLocation.X / rescaleBackglassX), Int(Me.DMDLocation.Y / rescaleBackglassY)) - Me.DMDSize = New Size(Int(Me.DMDSize.Width / rescaleBackglassX), Int(Me.DMDSize.Height / rescaleBackglassY)) - End If - End If - - ' calculate DMD rescale factors - rescaleDMDX = Me.formDMD.Width / Me.DMDSize.Width - rescaleDMDY = Me.formDMD.Height / Me.DMDSize.Height - If Me.formDMD.BackgroundImage IsNot Nothing Then - rescaleDMDX = Me.formDMD.BackgroundImage.Width / Me.DMDSize.Width - rescaleDMDY = Me.formDMD.BackgroundImage.Height / Me.DMDSize.Height - End If - End If - - ' move and scale all picked objects - ScaleAllControls(rescaleBackglassX, rescaleBackglassY, rescaleDMDX, rescaleDMDY) - - - ' show the backglass form - formBackglass.StartPosition = FormStartPosition.Manual - formBackglass.BackgroundImageLayout = ImageLayout.Stretch - formBackglass.FormBorderStyle = FormBorderStyle.None - formBackglass.ControlBox = False - formBackglass.MaximizeBox = False - formBackglass.MinimizeBox = False - formBackglass.Location = Me.BackglassScreen.Bounds.Location + Me.BackglassLocation - formBackglass.Size = Me.BackglassSize - - If Not B2SSettings.PureEXE Then - If B2SSettings.FormToFront Then - ' bring backglass screen to the front and force it to stay - formBackglass.TopMost = True - formBackglass.BringToFront() - If B2SSettings.FormNoFocus Then formBackglass.ShowInTaskbar = False - ElseIf B2SSettings.FormToBack Then - ' bring backglass screen to the back and force it to stay - formBackglass.SendToBack() - formBackglass.ShowInTaskbar = False - Else - formBackglass.BringToFront() - End If - End If - - If StartBackground Then - formBackglass.Text = "B2S Backglass" - formBackglass.ShowInTaskbar = False - - formBackglass.Show(Me.formbackground) - Else - ' Without background picture the backglass is the main form - formBackglass.Text = "B2S Backglass Server" - formBackglass.Show() - End If - - 'If B2sSettings.HideBackglass Then hide this form - ' If B2SSettings.HideB2SBackglass Then - ' formBackglass.Hide() - ' End If - - ' maybe show DMD form - If IsDMDToBeShown Then - ' set DMD location relative to the backglass location - Me.formDMD.StartPosition = FormStartPosition.Manual - Me.formDMD.BackgroundImageLayout = ImageLayout.Stretch - Me.formDMD.FormBorderStyle = FormBorderStyle.None - Me.formDMD.ControlBox = False - Me.formDMD.MaximizeBox = False - Me.formDMD.MinimizeBox = False - Me.formDMD.Location = Me.BackglassScreen.Bounds.Location + DMDKeepBackglassLocation + Me.DMDLocation - Me.formDMD.Size = Me.DMDSize - Me.formDMD.Text = "B2S DMD" - - If B2SSettings.FormToFront Then - If B2SSettings.FormNoFocus Then Me.formDMD.ShowInTaskbar = False - - Me.formDMD.BringToFront() - Me.formDMD.TopMost = True - - If Me.DMDAtDefaultLocation Then - ' DMD and Back Glass one unit, make sure they stay together - Me.formDMD.Show(formBackglass) - Else - ' DMD and Back Glass separate and accessed separately - Me.formDMD.Show() - End If - ElseIf B2SSettings.FormToBack Then - ' DMD and Back Glass one unit, make sure they are together and also make sure it is impossible to activate - Me.formDMD.ShowInTaskbar = False - Me.formDMD.SendToBack() - Me.formDMD.Show(formBackglass) - Else - ' show the DMD form without grill - Me.formDMD.BringToFront() - Me.formDMD.Show() - End If - End If - - End Sub - - Private Sub ScaleAllControls(ByVal _rescaleX As Single, ByVal _rescaleY As Single, ByVal _rescaleDMDX As Single, ByVal _rescaleDMDY As Single) - - ' get scale info for all picked objects and scale some of them - For Each cntrlinfo As KeyValuePair(Of String, B2SReelBox) In B2SData.Reels - Dim isOnDMD As Boolean = (cntrlinfo.Value.Parent IsNot Nothing AndAlso cntrlinfo.Value.Parent.Name.Equals("formDMD")) - ScaleControl(cntrlinfo.Value, If(isOnDMD, _rescaleDMDX, _rescaleX), If(isOnDMD, _rescaleDMDY, _rescaleY), isOnDMD) - Next - For Each cntrlinfo As KeyValuePair(Of String, B2SLEDBox) In B2SData.LEDs - Dim isOnDMD As Boolean = (cntrlinfo.Value.Parent IsNot Nothing AndAlso cntrlinfo.Value.Parent.Name.Equals("formDMD")) - ScaleControl(cntrlinfo.Value, If(isOnDMD, _rescaleDMDX, _rescaleX), If(isOnDMD, _rescaleDMDY, _rescaleY), isOnDMD, isOnDMD AndAlso DMDFlipY AndAlso Not DMDAtDefaultLocation) - Next - For Each cntrlinfo As KeyValuePair(Of String, Dream7Display) In B2SData.LEDDisplays - Dim isOnDMD As Boolean = (cntrlinfo.Value.Parent IsNot Nothing AndAlso cntrlinfo.Value.Parent.Name.Equals("formDMD")) - ScaleControl(cntrlinfo.Value, If(isOnDMD, _rescaleDMDX, _rescaleX), If(isOnDMD, _rescaleDMDY, _rescaleY), isOnDMD, isOnDMD AndAlso DMDFlipY AndAlso Not DMDAtDefaultLocation) - Next - For Each cntrlinfo As KeyValuePair(Of String, B2SPictureBox) In B2SData.Illuminations - Dim isOnDMD As Boolean = (cntrlinfo.Value.Parent IsNot Nothing AndAlso cntrlinfo.Value.Parent.Name.Equals("formDMD")) - ScaleControl(cntrlinfo.Value, _rescaleX, _rescaleY, isOnDMD) - Next - For Each cntrlinfo As KeyValuePair(Of String, B2SPictureBox) In B2SData.DMDIlluminations - Dim isOnDMD As Boolean = (cntrlinfo.Value.Parent IsNot Nothing AndAlso cntrlinfo.Value.Parent.Name.Equals("formDMD")) - ScaleControl(cntrlinfo.Value, _rescaleDMDX, _rescaleDMDY, isOnDMD, DMDFlipY AndAlso Not DMDAtDefaultLocation) - Next - - ' get scale info for the LED areas - For Each ledarea As KeyValuePair(Of String, B2SData.LEDAreaInfo) In B2SData.LEDAreas - If ledarea.Value.IsOnDMD Then - If formDMD IsNot Nothing Then - Dim y As Single = ledarea.Value.Rect.Y / _rescaleDMDY - If DMDFlipY AndAlso Not DMDAtDefaultLocation Then - y = formDMD.Height / _rescaleDMDY - y - ledarea.Value.Rect.Height / _rescaleDMDY - End If - ledarea.Value.Rect = Rectangle.Round(New Rectangle(ledarea.Value.Rect.X / _rescaleDMDX, y, ledarea.Value.Rect.Width / _rescaleDMDX, ledarea.Value.Rect.Height / _rescaleDMDY)) - End If - Else - ledarea.Value.Rect = Rectangle.Round(New Rectangle(ledarea.Value.Rect.X / _rescaleX, ledarea.Value.Rect.Y / _rescaleY, ledarea.Value.Rect.Width / _rescaleX, ledarea.Value.Rect.Height / _rescaleY)) - End If - Next - - ' and now recalc the backglass cut off rectangle - If BackglassCutOff <> Nothing Then - BackglassCutOff = New Rectangle(BackglassCutOff.X / _rescaleX, BackglassCutOff.Y / _rescaleY, BackglassCutOff.Width / _rescaleX, BackglassCutOff.Height / _rescaleY) - End If - - End Sub - - Private Sub ScaleControl(ByVal _cntrl As B2SBaseBox, ByVal _rescaleX As Single, ByVal _rescaleY As Single, ByVal isOnDMD As Boolean, Optional ByVal flipY As Boolean = False) - - ' calculate the exact location and size of all controls - If Not isOnDMD AndAlso BackglassCutOff <> Nothing Then - If BackglassCutOff.IntersectsWith(New Rectangle(_cntrl.Left, _cntrl.Top, _cntrl.Width, _cntrl.Height)) Then - _cntrl.RectangleF = New RectangleF(0, 0, 0, 0) - ElseIf BackglassCutOff.Top < _cntrl.Top Then - _cntrl.RectangleF = New RectangleF(_cntrl.Left / _rescaleX, (_cntrl.Top - Me.BackglassSmallGrillHeight) / _rescaleY, _cntrl.Width / _rescaleX, _cntrl.Height / _rescaleY) - Else - _cntrl.RectangleF = New RectangleF(_cntrl.Left / _rescaleX, _cntrl.Top / _rescaleY, _cntrl.Width / _rescaleX, _cntrl.Height / _rescaleY) - End If - Else - _cntrl.RectangleF = New RectangleF(_cntrl.Left / _rescaleX, _cntrl.Top / _rescaleY, _cntrl.Width / _rescaleX, _cntrl.Height / _rescaleY) - End If - - ' scale not more than the LED and reel boxes - If TypeOf _cntrl Is B2SLEDBox OrElse TypeOf _cntrl Is B2SReelBox Then - _cntrl.Location = New Point(Point.Round(_cntrl.RectangleF.Location)) - _cntrl.Size = New Size(Size.Round(_cntrl.RectangleF.Size)) - End If - - ' maybe flip DMD images - If flipY AndAlso formDMD IsNot Nothing Then - If TypeOf _cntrl Is B2SLEDBox Then - Else - Dim picbox As B2SPictureBox = TryCast(_cntrl, B2SPictureBox) - If picbox IsNot Nothing Then - ' set new top location - Dim newY As Single = formDMD.Height / _rescaleY - picbox.RectangleF.Y - picbox.RectangleF.Height - picbox.RectangleF = New RectangleF(picbox.RectangleF.X, newY, picbox.RectangleF.Width, picbox.RectangleF.Height) - ' flip the images - If picbox.BackgroundImage IsNot Nothing Then - picbox.BackgroundImage.RotateFlip(RotateFlipType.RotateNoneFlipY) - End If - If picbox.OffImage IsNot Nothing Then - picbox.OffImage.RotateFlip(RotateFlipType.RotateNoneFlipY) - End If - End If - End If - End If - - End Sub - Private Sub ScaleControl(ByVal _cntrl As Dream7Display, ByVal _rescaleX As Single, ByVal _rescaleY As Single, ByVal isOnDMD As Boolean, Optional ByVal flipY As Boolean = False) - - ' store current LED location - Dim rectF As RectangleF = New RectangleF(New PointF(_cntrl.Left / _rescaleX, _cntrl.Top / _rescaleY), New Size(_cntrl.Width / _rescaleX, _cntrl.Height / _rescaleY)) - - ' scale LED display - _cntrl.Location = Point.Round(New PointF(_cntrl.Left / _rescaleX, _cntrl.Top / _rescaleY)) - _cntrl.Size = Size.Round(New Size(_cntrl.Width / _rescaleX, _cntrl.Height / _rescaleY)) - _cntrl.Spacing = _cntrl.Spacing / _rescaleX - _cntrl.OffsetWidth = _cntrl.OffsetWidth / _rescaleX - _cntrl.Thickness = _cntrl.Thickness / _rescaleX - - ' maybe flip LEDs - If flipY Then - _cntrl.Mirrored = True - ' set new top location - If formDMD IsNot Nothing Then - Dim newY As Single = formDMD.Height / _rescaleY - rectF.Y - rectF.Height - _cntrl.Location = Point.Round(New PointF(rectF.X, newY)) - End If - End If - - End Sub - - Private Function ResizeImage(ByVal sourceimage As Image, ByVal grillheight As Integer) As Image - Dim imageWithoutGrill As Bitmap = New Bitmap(sourceimage.Width, sourceimage.Height - grillheight) - Using gr As Graphics = Graphics.FromImage(imageWithoutGrill) - gr.DrawImage(sourceimage, New Rectangle(0, 0, imageWithoutGrill.Width, imageWithoutGrill.Height + grillheight)) - End Using - Return imageWithoutGrill - End Function - Private Function CutOutImage(ByVal sourceimage As Image, ByVal grillheight As Integer, ByVal smallgrillheight As Integer) As Image - Dim imageWithoutSmallGrill As Bitmap = New Bitmap(sourceimage.Width, sourceimage.Height - smallgrillheight) - Using imageBackglass As Bitmap = PartFromImage(sourceimage, New Rectangle(0, 0, sourceimage.Width, sourceimage.Height - grillheight - smallgrillheight)) - Using imageGrill As Bitmap = PartFromImage(sourceimage, New Rectangle(0, sourceimage.Height - grillheight, sourceimage.Width, grillheight)) - Using gr As Graphics = Graphics.FromImage(imageWithoutSmallGrill) - gr.DrawImage(imageBackglass, New Rectangle(0, 0, imageBackglass.Width, imageBackglass.Height)) - gr.DrawImage(imageGrill, New Rectangle(0, imageBackglass.Height, imageGrill.Width, imageGrill.Height)) - End Using - End Using - End Using - Return imageWithoutSmallGrill - End Function - Private Function PartFromImage(image As Image, area As Rectangle) As Image - If image Is Nothing Then Return Nothing - Dim imageBackground As Bitmap = CType(image, Bitmap) - Dim imagePart As Image = New Bitmap(area.Width, area.Height) - imagePart = imageBackground.Clone(area, Imaging.PixelFormat.Format32bppArgb) - Return imagePart - End Function - -#End Region - - -#Region "screenshot stuff" - - Public Function MakeScreenShot(ByVal filename As String, - ByVal fileformat As Imaging.ImageFormat) As Boolean - - ' get screenshot - Dim screenshot As Bitmap = New Bitmap(formBackglass.Width, formBackglass.Height) - Using gr As Graphics = Graphics.FromImage(screenshot) - gr.CopyFromScreen(formBackglass.Location, Point.Empty, formBackglass.Size) - End Using - - ' save it - Try - screenshot.Save(filename, fileformat) - Catch ex As Exception - MessageBox.Show(ex.Message, My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Error) - Return False - Finally - screenshot.Dispose() - screenshot = Nothing - End Try - - Return True - - End Function - -#End Region - - -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SSettings.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SSettings.vb deleted file mode 100644 index f66de74..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SSettings.vb +++ /dev/null @@ -1,550 +0,0 @@ -Imports System -Imports System.IO -Imports System.Reflection -Imports System.Windows.Forms -Imports System.Xml -Imports Microsoft.Win32 - -Public Class B2SSettings - - Public Const DirectB2SVersion As String = "2.1.3" - Public Const MinimumDirectB2SVersion As String = "1.0" - Public Shared Property BackglassFileVersion() As String = String.Empty - - Public Enum eDefaultStartMode - Standard = 1 - EXE = 2 - End Enum - - Public Enum eDMDTypes - Standard = 0 - TwoMonitorSetup = 1 - ThreeMonitorSetup = 2 - Hidden = 3 - End Enum - Public Enum eLEDTypes - Undefined = 0 - Rendered = 1 - Dream7 = 2 - End Enum - Public Enum eImageFileType - PNG = 0 - JPG = 1 - GIF = 2 - BMP = 3 - End Enum - Public Enum eDualMode - NotSet = 0 - Authentic = 1 - Fantasy = 2 - End Enum - - Private Const filename As String = "B2STableSettings.xml" - Public Shared Property B2SScreenResFileName As String = SafeReadRegistry("Software\B2S", "B2SScreenResFileNameOverride", "ScreenRes.txt") - Public Shared Property B2STableSettingsExtendedPath() As Boolean = SafeReadRegistry("Software\B2S", "B2STableSettingsExtendedPath", "0") = "1" - Public Shared Property B2SWindowPunchActive() As Boolean = SafeReadRegistry("Software\B2S", "B2SWindowPunchActive", "0") = "1" - Public Shared Property B2SDebugLog() As Boolean = SafeReadRegistry("Software\B2S", "B2SDebugLog", "0") = "1" - Public Shared Property SettingFilePath() As String = Path.GetFullPath(GetSettingFilename()) - - Public Shared Property MatchingFileName() As String = String.Empty - Public Shared Property MatchingFileNames() As String() = Nothing - - Public Shared Property LoadedResFilePath() As String = String.Empty - Public Shared Property LogPath() As String = String.Empty - Public Shared Property IsLampsStateLogOn() As Boolean = False - Public Shared Property IsSolenoidsStateLogOn() As Boolean = False - Public Shared Property IsGIStringsStateLogOn() As Boolean = False - Public Shared Property IsLEDsStateLogOn() As Boolean = False - Public Shared Property IsPaintingLogOn() As Boolean = True - Public Shared Property IsStatisticsBackglassOn() As Boolean = True - Public Shared Property IsBackglassSearchLogOn As Boolean = False - - Public Shared Property ShowStartupError() As Boolean = False ' set to True to display errors - - Public Shared Property ArePluginsOn() As Boolean = False - - Public Shared Property CPUAffinityMask() As Integer = 0 - - Public Shared Property ScreenshotPath() As String = String.Empty - Public Shared Property ScreenshotFileType() As eImageFileType = eImageFileType.PNG - - Public Shared Property DMDType() As eDMDTypes = eDMDTypes.Standard - - Public Shared Property AllOut() As Boolean = False - Public Shared Property AllOff() As Boolean = False - Public Shared Property LampsOff() As Boolean = False - Public Shared Property SolenoidsOff() As Boolean = False - Public Shared Property GIStringsOff() As Boolean = False - Public Shared Property LEDsOff() As Boolean = False - Public Shared Property StartAsEXE() As Boolean = True - Public Shared Property PureEXE() As Boolean = False - Public Shared Property DefaultStartMode() As eDefaultStartMode = eDefaultStartMode.EXE - Public Shared Property DisableFuzzyMatching() As Boolean = True - - Public Shared Property LampsSkipFrames() As Integer = 0 - Public Shared Property SolenoidsSkipFrames() As Integer = 0 - Public Shared Property GIStringsSkipFrames() As Integer = 0 - Public Shared Property LEDsSkipFrames() As Integer = 0 - - Public Shared Property UsedLEDType() As eLEDTypes = eLEDTypes.Undefined - - Public Shared Property IsGlowBulbOn() As Boolean = False - Public Shared Property GlowIndex() As Integer = -1 - Public Shared Property DefaultGlow() As Integer = -1 - Public Shared Property DisableBuiltInEMReelSound() As Nullable(Of Boolean) = Nothing - Public Shared Property FormToFront() As Boolean = True - Public Shared Property FormToBack() As Boolean = False - Public Shared Property FormNoFocus() As Boolean = False - Public Shared Property HideGrill() As System.Windows.Forms.CheckState = Windows.Forms.CheckState.Indeterminate - Public Shared Property HideB2SDMD() As Boolean = False - Public Shared Property HideB2SBackglass() As Boolean = False - Public Shared Property HideDMD() As System.Windows.Forms.CheckState = Windows.Forms.CheckState.Indeterminate - - Public Shared Property AnimationSlowDowns() As Generic.Dictionary(Of String, Integer) = New Generic.Dictionary(Of String, Integer) - Public Shared Property AllAnimationSlowDown() As Integer = 1 - - Public Shared Property HyperpinXMLFile() As String = String.Empty - - Public Shared Property CurrentDualMode() As B2SSettings.eDualMode = eDualMode.NotSet - - Public Shared Property StartBackground() As Nullable(Of Boolean) = Nothing - Public Shared Property GlobalStartBackground() As Nullable(Of Boolean) = Nothing - - - Public Shared ReadOnly Property IsROMControlled() As Boolean - Get - Return (GameName.Length > 0) - End Get - End Property - - Private Shared _GameName As String = String.Empty - Public Shared Property GameName() As String - Get - Return _GameName - End Get - Set(ByVal value As String) - _GameName = value - Load(False) - End Set - End Property - - Private Shared _IsGameNameFound As Boolean = False - Public Shared ReadOnly Property IsGameNameFound() As Boolean - Get - Return _IsGameNameFound - End Get - End Property - - Private Shared _B2SName As String = String.Empty - Public Shared Property B2SName() As String - Get - Return _B2SName - End Get - Set(ByVal value As String) - _B2SName = value - Load(False) - End Set - End Property - - Public Shared Function SafeReadRegistry(ByVal keyname As String, ByVal valuename As String, ByVal defaultvalue As String) As String - ' Public Property GlobalFileName As String = SafeReadRegistry("Software\B2S", "B2SScreenResFileNameOverride", "ScreenRes.txt") - - Try - Return CStr(Registry.CurrentUser.OpenSubKey(keyname).GetValue(valuename, defaultvalue)) - Catch ex As Exception - Return defaultvalue - End Try - End Function - - Public Shared Function GetSettingFilename() As String - If IO.File.Exists(filename) Then - Return filename - ElseIf B2STableSettingsExtendedPath And IO.File.Exists(IO.Path.Combine(Application.StartupPath(), filename)) Then - Return IO.Path.Combine(Application.StartupPath(), filename) - End If - Return filename - End Function - - Public Shared Sub LoadGlobalAndTableSettings(xmlNode As Xml.XmlNode) - If xmlNode.SelectSingleNode("DisableBuiltInEMReelSound") IsNot Nothing Then DisableBuiltInEMReelSound = (xmlNode.SelectSingleNode("DisableBuiltInEMReelSound").InnerText = "1") - If xmlNode.SelectSingleNode("HideGrill") IsNot Nothing Then HideGrill = CInt(xmlNode.SelectSingleNode("HideGrill").InnerText) - If xmlNode.SelectSingleNode("HideB2SDMD") IsNot Nothing Then HideB2SDMD = (xmlNode.SelectSingleNode("HideB2SDMD").InnerText = "1") - If xmlNode.SelectSingleNode("HideB2SBackglass") IsNot Nothing Then HideB2SBackglass = (xmlNode.SelectSingleNode("HideB2SBackglass").InnerText = "1") - If xmlNode.SelectSingleNode("HideDMD") IsNot Nothing Then HideDMD = CInt(xmlNode.SelectSingleNode("HideDMD").InnerText) - If xmlNode.SelectSingleNode("LampsBlackTurns") IsNot Nothing Then LampsSkipFrames = CInt(xmlNode.SelectSingleNode("LampsBlackTurns").InnerText) - If xmlNode.SelectSingleNode("SolenoidsBlackTurns") IsNot Nothing Then SolenoidsSkipFrames = CInt(xmlNode.SelectSingleNode("SolenoidsBlackTurns").InnerText) - If xmlNode.SelectSingleNode("GIStringsBlackTurns") IsNot Nothing Then GIStringsSkipFrames = CInt(xmlNode.SelectSingleNode("GIStringsBlackTurns").InnerText) - If xmlNode.SelectSingleNode("LEDsBlackTurns") IsNot Nothing Then LEDsSkipFrames = CInt(xmlNode.SelectSingleNode("LEDsBlackTurns").InnerText) - If xmlNode.SelectSingleNode("LampsSkipFrames") IsNot Nothing Then LampsSkipFrames = CInt(xmlNode.SelectSingleNode("LampsSkipFrames").InnerText) - If xmlNode.SelectSingleNode("SolenoidsSkipFrames") IsNot Nothing Then SolenoidsSkipFrames = CInt(xmlNode.SelectSingleNode("SolenoidsSkipFrames").InnerText) - If xmlNode.SelectSingleNode("GIStringsSkipFrames") IsNot Nothing Then GIStringsSkipFrames = CInt(xmlNode.SelectSingleNode("GIStringsSkipFrames").InnerText) - If xmlNode.SelectSingleNode("LEDsSkipFrames") IsNot Nothing Then LEDsSkipFrames = CInt(xmlNode.SelectSingleNode("LEDsSkipFrames").InnerText) - If xmlNode.SelectSingleNode("UsedLEDType") IsNot Nothing Then UsedLEDType = CInt(xmlNode.SelectSingleNode("UsedLEDType").InnerText) - If xmlNode.SelectSingleNode("IsGlowBulbOn") IsNot Nothing Then IsGlowBulbOn = (xmlNode.SelectSingleNode("IsGlowBulbOn").InnerText = "1") - If xmlNode.SelectSingleNode("GlowIndex") IsNot Nothing Then GlowIndex = CInt(xmlNode.SelectSingleNode("GlowIndex").InnerText) - If xmlNode.SelectSingleNode("StartAsEXE") IsNot Nothing Then StartAsEXE = (xmlNode.SelectSingleNode("StartAsEXE").InnerText = "1") - If xmlNode.SelectSingleNode("StartBackground") IsNot Nothing Then StartBackground = (xmlNode.SelectSingleNode("StartBackground").InnerText = "1") - - If Not PureEXE Then - If xmlNode.SelectSingleNode("FormToFront") IsNot Nothing Then FormToFront = (xmlNode.SelectSingleNode("FormToFront").InnerText = "1") - If xmlNode.SelectSingleNode("FormToBack") IsNot Nothing Then - FormToBack = (xmlNode.SelectSingleNode("FormToBack").InnerText = "1") - If FormToBack Then FormToFront = False - FormNoFocus = True - End If - If xmlNode.SelectSingleNode("FormNoFocus") IsNot Nothing Then - FormNoFocus = (xmlNode.SelectSingleNode("FormNoFocus").InnerText = "1") - End If - End If - End Sub - - Public Shared Sub Load(Optional ByVal resetLogs As Boolean = True) - ClearAll() - - ' load settings - If IO.File.Exists(SettingFilePath) Then - Dim XML As Xml.XmlDocument = New Xml.XmlDocument - Try - XML.Load(SettingFilePath) - Catch ex As Exception - MessageBox.Show("The following error occurred opening the file '" & Path.GetFileName(SettingFilePath) & "':" & vbCrLf & vbCrLf & ex.Message, My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation) - Throw - End Try - - If XML IsNot Nothing AndAlso XML.SelectSingleNode("B2STableSettings") IsNot Nothing Then - Dim nodeHeader As Xml.XmlNode = XML.SelectSingleNode("B2STableSettings") - ' get plugin status - If nodeHeader.SelectSingleNode("ArePluginsOn") IsNot Nothing Then ArePluginsOn = (nodeHeader.SelectSingleNode("ArePluginsOn").InnerText = "1") - ' get default start mode - If nodeHeader.SelectSingleNode("DefaultStartMode") IsNot Nothing Then DefaultStartMode = CInt(nodeHeader.SelectSingleNode("DefaultStartMode").InnerText) - If DefaultStartMode <> eDefaultStartMode.Standard Then DefaultStartMode = eDefaultStartMode.EXE - If DefaultStartMode = eDefaultStartMode.Standard Then StartAsEXE = False - If nodeHeader.SelectSingleNode("DisableFuzzyMatching") IsNot Nothing Then DisableFuzzyMatching = (nodeHeader.SelectSingleNode("DisableFuzzyMatching").InnerText = "1") - - ' get overall settings - If nodeHeader.SelectSingleNode("CPUAffinityMask") IsNot Nothing Then CPUAffinityMask = CInt(nodeHeader.SelectSingleNode("CPUAffinityMask").InnerText) - If nodeHeader.SelectSingleNode("LogPath") IsNot Nothing Then LogPath = nodeHeader.SelectSingleNode("LogPath").InnerText - If nodeHeader.SelectSingleNode("IsLampsStateLogOn") IsNot Nothing Then IsLampsStateLogOn = (nodeHeader.SelectSingleNode("IsLampsStateLogOn").InnerText = "1") - If nodeHeader.SelectSingleNode("IsSolenoidsStateLogOn") IsNot Nothing Then IsSolenoidsStateLogOn = (nodeHeader.SelectSingleNode("IsSolenoidsStateLogOn").InnerText = "1") - If nodeHeader.SelectSingleNode("IsGIStringsStateLogOn") IsNot Nothing Then IsGIStringsStateLogOn = (nodeHeader.SelectSingleNode("IsGIStringsStateLogOn").InnerText = "1") - If nodeHeader.SelectSingleNode("IsLEDsStateLogOn") IsNot Nothing Then IsLEDsStateLogOn = (nodeHeader.SelectSingleNode("IsLEDsStateLogOn").InnerText = "1") - If nodeHeader.SelectSingleNode("IsPaintingLogOn") IsNot Nothing Then IsPaintingLogOn = (nodeHeader.SelectSingleNode("IsPaintingLogOn").InnerText = "1") - If nodeHeader.SelectSingleNode("IsStatisticsBackglassOn") IsNot Nothing Then IsStatisticsBackglassOn = (nodeHeader.SelectSingleNode("IsStatisticsBackglassOn").InnerText = "1") - If nodeHeader.SelectSingleNode("IsBackglassSearchLogOn") IsNot Nothing Then IsBackglassSearchLogOn = (nodeHeader.SelectSingleNode("IsBackglassSearchLogOn").InnerText = "1") - If nodeHeader.SelectSingleNode("ShowStartupError") IsNot Nothing Then ShowStartupError = (nodeHeader.SelectSingleNode("ShowStartupError").InnerText = "1") - LoadGlobalAndTableSettings(nodeHeader) - If StartBackground.HasValue Then GlobalStartBackground = StartBackground - StartBackground = Nothing - - If nodeHeader.SelectSingleNode("ScreenshotPath") IsNot Nothing Then - ScreenshotPath = nodeHeader.SelectSingleNode("ScreenshotPath").InnerText - ScreenshotFileType = CInt(nodeHeader.SelectSingleNode("ScreenshotFileType").InnerText) - End If - If nodeHeader.SelectSingleNode("HyperpinXMLFile") IsNot Nothing Then - HyperpinXMLFile = nodeHeader.SelectSingleNode("HyperpinXMLFile").InnerText - End If - If resetLogs AndAlso (IsLampsStateLogOn OrElse IsSolenoidsStateLogOn OrElse IsGIStringsStateLogOn OrElse IsLEDsStateLogOn OrElse IsPaintingLogOn) Then - AddNode(XML, nodeHeader, "IsLampsStateLogOn", "0") - AddNode(XML, nodeHeader, "IsSolenoidsStateLogOn", "0") - AddNode(XML, nodeHeader, "IsGIStringsStateLogOn", "0") - AddNode(XML, nodeHeader, "IsLEDsStateLogOn", "0") - AddNode(XML, nodeHeader, "IsPaintingLogOn", "0") - XML.Save(SettingFilePath) - End If - ' set default dual mode - 'If B2SData.DualBackglass Then - CurrentDualMode = eDualMode.Authentic - 'End If - ' maybe get table specific settings - If Not String.IsNullOrEmpty(GameName) OrElse Not String.IsNullOrEmpty(B2SName) Then - Dim nodeTable As Xml.XmlElement = nodeHeader.SelectSingleNode(If(Not String.IsNullOrEmpty(GameName), GameName, B2SName)) - If nodeTable IsNot Nothing Then - _IsGameNameFound = True - LoadGlobalAndTableSettings(nodeTable) - If nodeTable.SelectSingleNode("DualMode") IsNot Nothing Then CurrentDualMode = CInt(nodeTable.SelectSingleNode("DualMode").InnerText) - If nodeTable.SelectSingleNode("MatchingFileName") IsNot Nothing Then MatchingFileName = nodeTable.SelectSingleNode("MatchingFileName").InnerText - - Dim nodeAnimations As Xml.XmlElement = nodeTable.SelectSingleNode("Animations") - If nodeAnimations IsNot Nothing Then - For Each nodeAnimation As Xml.XmlElement In nodeAnimations.ChildNodes - If nodeAnimation.Name.Equals("Animation") Then - AnimationSlowDowns.Add(nodeAnimation.Attributes("Name").InnerText, CInt(nodeAnimation.Attributes("SlowDown").InnerText)) - ElseIf nodeAnimation.Name.Equals("AllAnimations") Then - AllAnimationSlowDown = CInt(nodeAnimation.Attributes("SlowDown").InnerText) - End If - Next - End If - End If - End If - End If - End If - End Sub - Public Shared Sub Save(Optional ByVal b2sanimation As B2SAnimation = Nothing, - Optional ByVal justSaveDualMode As Boolean = False, - Optional ByVal justSaveHyperpinXMLFile As Boolean = False) - ' save settings - Dim XML As Xml.XmlDocument = New Xml.XmlDocument - If IO.File.Exists(SettingFilePath) Then XML.Load(SettingFilePath) - Dim nodeHeader As Xml.XmlElement = AddHeader(XML, XML, "B2STableSettings") - If justSaveDualMode Then - If B2SData.DualBackglass AndAlso (Not String.IsNullOrEmpty(GameName) OrElse Not String.IsNullOrEmpty(B2SName)) Then - Dim nodeTable As Xml.XmlElement = AddHeader(XML, nodeHeader, If(Not String.IsNullOrEmpty(GameName), GameName, B2SName)) - AddNode(XML, nodeTable, "DualMode", CInt(CurrentDualMode).ToString()) - End If - ElseIf justSaveHyperpinXMLFile Then - AddNode(XML, nodeHeader, "HyperpinXMLFile", HyperpinXMLFile) - Else - AddNode(XML, nodeHeader, "ArePluginsOn", If(ArePluginsOn, "1", "0")) - AddNode(XML, nodeHeader, "DefaultStartMode", CInt(DefaultStartMode).ToString()) - AddNode(XML, nodeHeader, "DisableFuzzyMatching", If(DisableFuzzyMatching, "1", "0")) - AddNode(XML, nodeHeader, "LogPath", LogPath) - AddNode(XML, nodeHeader, "IsLampsStateLogOn", If(IsLampsStateLogOn, "1", "0")) - AddNode(XML, nodeHeader, "IsSolenoidsStateLogOn", If(IsSolenoidsStateLogOn, "1", "0")) - AddNode(XML, nodeHeader, "IsGIStringsStateLogOn", If(IsGIStringsStateLogOn, "1", "0")) - AddNode(XML, nodeHeader, "IsLEDsStateLogOn", If(IsLEDsStateLogOn, "1", "0")) - AddNode(XML, nodeHeader, "IsPaintingLogOn", If(IsPaintingLogOn, "1", "0")) - AddNode(XML, nodeHeader, "IsStatisticsBackglassOn", If(IsStatisticsBackglassOn, "1", "0")) - AddNode(XML, nodeHeader, "ShowStartupError", If(ShowStartupError, "1", "0")) - AddNode(XML, nodeHeader, "ScreenshotPath", ScreenshotPath) - AddNode(XML, nodeHeader, "ScreenshotFileType", CInt(ScreenshotFileType).ToString()) - ' Only save the StartBackground setting on global level if it is definded - If GlobalStartBackground.HasValue Then - AddNode(XML, nodeHeader, "StartBackground", If(GlobalStartBackground, "1", "0")) - End If - If Not String.IsNullOrEmpty(GameName) OrElse Not String.IsNullOrEmpty(B2SName) Then - Dim nodeTable As Xml.XmlElement = AddHeader(XML, nodeHeader, If(Not String.IsNullOrEmpty(GameName), GameName, B2SName)) - nodeTable.RemoveAll() - AddNode(XML, nodeTable, "HideGrill", CInt(HideGrill).ToString()) - AddNode(XML, nodeTable, "HideB2SDMD", If(HideB2SDMD, "1", "0")) - AddNode(XML, nodeTable, "HideB2SBackglass", If(HideB2SBackglass, "1", "0")) - AddNode(XML, nodeTable, "HideDMD", CInt(HideDMD).ToString()) - If Not String.IsNullOrEmpty(MatchingFileName) Then - AddNode(XML, nodeTable, "MatchingFileName", MatchingFileName) - End If - AddNode(XML, nodeTable, "LampsSkipFrames", LampsSkipFrames.ToString()) - AddNode(XML, nodeTable, "SolenoidsSkipFrames", SolenoidsSkipFrames.ToString()) - AddNode(XML, nodeTable, "GIStringsSkipFrames", GIStringsSkipFrames.ToString()) - If Not B2SData.UseReels Then - AddNode(XML, nodeTable, "LEDsSkipFrames", LEDsSkipFrames.ToString()) - AddNode(XML, nodeTable, "UsedLEDType", CInt(UsedLEDType).ToString()) - AddNode(XML, nodeTable, "IsGlowBulbOn", If(IsGlowBulbOn, "1", "0")) - AddNode(XML, nodeTable, "GlowIndex", GlowIndex.ToString()) - End If - AddNode(XML, nodeTable, "StartAsEXE", If(StartAsEXE, "1", "0")) - - ' Only save the StartBackground setting on table level if not set to standard - If StartBackground.HasValue Then - AddNode(XML, nodeTable, "StartBackground", If(StartBackground, "1", "0")) - End If - If DisableBuiltInEMReelSound.HasValue Then - AddNode(XML, nodeTable, "DisableBuiltInEMReelSound", If(DisableBuiltInEMReelSound, "1", "0")) - End If - - AddNode(XML, nodeTable, "FormToFront", If(FormToFront, "1", "0")) - AddNode(XML, nodeTable, "FormToBack", If(FormToBack, "1", "0")) - AddNode(XML, nodeTable, "FormNoFocus", If(FormNoFocus, "1", "0")) - - If b2sanimation IsNot Nothing Then - Dim nodeAnimations As Xml.XmlElement = AddHeader(XML, nodeTable, "Animations") - nodeAnimations.RemoveAll() - For Each animationname As String In b2sanimation.Animations - Dim slowdown As Integer = b2sanimation.AnimationSlowDown(animationname) - If slowdown <> 1 Then - Dim nodeAnimation As Xml.XmlElement = XML.CreateElement("Animation") - nodeAnimations.AppendChild(nodeAnimation) - nodeAnimation.SetAttribute("Name", animationname) - nodeAnimation.SetAttribute("SlowDown", slowdown) - End If - Next - If AllAnimationSlowDown <> 1 Then - Dim nodeAnimation As Xml.XmlElement = XML.CreateElement("AllAnimations") - nodeAnimations.AppendChild(nodeAnimation) - nodeAnimation.SetAttribute("SlowDown", AllAnimationSlowDown) - End If - End If - End If - End If - XML.Save(SettingFilePath) - End Sub - - Public Shared Sub ClearAll() - ' do not add GameName or B2SName here - DefaultStartMode = eDefaultStartMode.EXE - DisableFuzzyMatching = True - LogPath = String.Empty - IsLampsStateLogOn = False - IsSolenoidsStateLogOn = False - IsGIStringsStateLogOn = False - IsLEDsStateLogOn = False - IsPaintingLogOn = False - IsBackglassSearchLogOn = False - IsStatisticsBackglassOn = False - ScreenshotPath = String.Empty - ScreenshotFileType = eImageFileType.PNG - DMDType = eDMDTypes.Standard - AllOut = False - AllOff = False - LampsOff = False - SolenoidsOff = False - GIStringsOff = False - LEDsOff = False - StartAsEXE = True - LampsSkipFrames = 0 - SolenoidsSkipFrames = 0 - GIStringsSkipFrames = 0 - LEDsSkipFrames = 0 - UsedLEDType = eLEDTypes.Undefined - IsGlowBulbOn = False - GlowIndex = -1 - DefaultGlow = -1 - HideGrill = System.Windows.Forms.CheckState.Indeterminate - HideB2SDMD = False - HideB2SBackglass = False - HideDMD = System.Windows.Forms.CheckState.Indeterminate - HyperpinXMLFile = String.Empty - AnimationSlowDowns.Clear() - AllAnimationSlowDown = 1 - CurrentDualMode = eDualMode.NotSet - FormToFront = True - FormToBack = False - FormNoFocus = False - End Sub - - Private Shared Function AddHeader(XML As Xml.XmlDocument, parentnode As Xml.XmlNode, nodename As String) As Xml.XmlNode - Dim node As Xml.XmlElement = parentnode.SelectSingleNode(nodename) - If node Is Nothing Then - node = XML.CreateElement(nodename) - parentnode.AppendChild(node) - End If - Return node - End Function - Private Shared Sub AddNode(XML As Xml.XmlDocument, parentnode As Xml.XmlNode, nodename As String, nodevalue As String) - Dim node As Xml.XmlElement = parentnode.SelectSingleNode(nodename) - If node Is Nothing Then - node = XML.CreateElement(nodename) - parentnode.AppendChild(node) - End If - node.InnerText = nodevalue - End Sub - - Public Shared Function LocateHyperpinXMLFile() As Boolean - If Not String.IsNullOrEmpty(HyperpinXMLFile) AndAlso HyperpinXMLFile <> "Unknown" AndAlso Not IO.File.Exists(HyperpinXMLFile) Then - HyperpinXMLFile = String.Empty - End If - If String.IsNullOrEmpty(HyperpinXMLFile) Then - Dim vp As DirectoryInfo = Directory.GetParent(IO.Directory.GetCurrentDirectory()) - Dim vpparent As DirectoryInfo = vp.Parent() - ' get thru all directories of the parent of visual pinball - HyperpinXMLFile = CheckDir(vpparent.FullName) - ' maybe check the next parent - If String.IsNullOrEmpty(HyperpinXMLFile) Then - Dim nextparent As DirectoryInfo = vpparent - Do While Not vp.Root.FullName.Equals(nextparent.Parent.FullName) - nextparent = nextparent.Parent - Loop - If Not vpparent.Equals(nextparent) Then - HyperpinXMLFile = CheckDir(nextparent.FullName) - End If - End If - If String.IsNullOrEmpty(HyperpinXMLFile) Then - If IO.Directory.Exists(IO.Path.Combine(vp.Root.FullName, "Hyperpin")) Then - HyperpinXMLFile = CheckDir(IO.Path.Combine(vp.Root.FullName, "Hyperpin")) - End If - End If - If String.IsNullOrEmpty(HyperpinXMLFile) Then - If IO.Directory.Exists(IO.Path.Combine(vp.Root.FullName, "PinballX")) Then - HyperpinXMLFile = CheckDir(IO.Path.Combine(vp.Root.FullName, "PinballX")) - End If - End If - If String.IsNullOrEmpty(HyperpinXMLFile) Then - ' not found - HyperpinXMLFile = "Unknown" - End If - Save(, , True) - End If - Return (HyperpinXMLFile <> "Unknown") - End Function - Public Shared ReadOnly Property HyperpinName() As String - Get - Dim ret As String = String.Empty - Dim searchPathLog As Log = New Log("BackglassSearchPath") - searchPathLog.IsLogOn = B2SSettings.IsBackglassSearchLogOn - - searchPathLog.WriteLogEntry("Start Search Hyperpinname") - If HyperpinXMLFile <> "Unknown" Then - If Not String.IsNullOrEmpty(HyperpinXMLFile) AndAlso IO.File.Exists(HyperpinXMLFile) Then - Dim Xml As Xml.XmlDocument = New Xml.XmlDocument - Xml.Load(HyperpinXMLFile) - searchPathLog.WriteLogEntry("Loop Hyperpinname") - If Xml.SelectNodes("menu") IsNot Nothing Then - For Each node As Xml.XmlNode In Xml.SelectNodes("menu") - For Each gamenode As Xml.XmlNode In node.SelectNodes("game") - If gamenode.Attributes("name") IsNot Nothing Then - Dim name As String = gamenode.Attributes("name").InnerText - searchPathLog.WriteLogEntry("Check name: " + name + " compare with: " + B2SData.TableFileName) - If name.Equals(B2SData.TableFileName, StringComparison.CurrentCultureIgnoreCase) Then - ret = gamenode.SelectSingleNode("description").InnerText - searchPathLog.WriteLogEntry("Found: " + ret + "end search") - Exit For - Else 'Westworld, allow optional syntax - If gamenode.SelectSingleNode("gamename") IsNot Nothing Then - Dim gamename As String = gamenode.SelectSingleNode("gamename").InnerText - If Not String.IsNullOrEmpty(gamename) Then - searchPathLog.WriteLogEntry("Check gamename: " + gamename + " compare with: " + B2SSettings.GameName) - If gamename.Equals(B2SSettings.GameName, StringComparison.CurrentCultureIgnoreCase) Then - ret = gamenode.SelectSingleNode("description").InnerText - searchPathLog.WriteLogEntry("Found: " + ret + "end search") - Exit For - End If - End If - End If - - 'last chance, try rom name - If gamenode.SelectSingleNode("rom") IsNot Nothing Then - Dim romname As String = gamenode.SelectSingleNode("rom").InnerText - If Not String.IsNullOrEmpty(romname) Then - searchPathLog.WriteLogEntry("Check rom: " + romname + " compare with: " + B2SSettings.GameName) - If romname.Equals(B2SSettings.GameName, StringComparison.CurrentCultureIgnoreCase) Then - ret = gamenode.SelectSingleNode("description").InnerText - searchPathLog.WriteLogEntry("Found: " + ret + "end search") - Exit For - End If - End If - End If - End If - End If - Next - If Not String.IsNullOrEmpty(ret) Then Exit For - Next - End If - End If - If String.IsNullOrEmpty(ret) Then - ret = B2SData.TableFileName - searchPathLog.WriteLogEntry("Nothing found, using: " + ret + "as replacement") - End If - End If - ' get out - Return ret - End Get - End Property - - Private Shared Function CheckDir(ByVal direc As String) As String - Dim ret As String = String.Empty - If File.Exists(Path.Combine(direc, "hyperpin.exe")) OrElse File.Exists(Path.Combine(direc, "pinballx.exe")) Then - If File.Exists(Path.Combine(direc, "Databases", "Visual Pinball", "Visual Pinball.xml")) Then - ret = Path.Combine(direc, "Databases", "Visual Pinball", "Visual Pinball.xml") - End If - End If - If String.IsNullOrEmpty(ret) AndAlso Directory.Exists(direc) Then - For Each d As String In Directory.GetDirectories(direc) - Try - ret = CheckDir(d) - Catch - End Try - If Not String.IsNullOrEmpty(ret) Then Exit For - Next - End If - Return ret - End Function - -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SSystem.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SSystem.vb deleted file mode 100644 index 13a88ac..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/B2SSystem.vb +++ /dev/null @@ -1,185 +0,0 @@ -Imports System -Imports System.Text -Imports System.Windows.Forms - -Public Class B2SSystem - - Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Int32) As Short - - Private Const writeLogFile As Boolean = False - - Private formBackglass As formBackglass = Nothing - - Public Class B2SSystemEventArgs - Inherits EventArgs - - Public Value As Integer() - Public IsValueChanged As Boolean() - - Public Sub New(ByVal _value As Integer(), ByVal _isValueChanged As Boolean()) - Value = _value - IsValueChanged = _isValueChanged - End Sub - End Class - - Public Event DataIsSent(ByVal sender As Object, ByVal e As B2SSystemEventArgs) - Public Event EscapeIsHit(ByVal sender As Object, ByVal e As EventArgs) - Public Event VPIsActivated(ByVal sender As Object, ByVal e As EventArgs) - - Private TimerData As Timer = Nothing - Private TimerEscape As Timer = Nothing - Private TimerActivateVP As Timer = Nothing - - Private B2SDataCount As Integer = 0 - -#Region "constructor and startup" - - Public Sub New() - - ' here is the place for a system checkup - CheckUp() - - ' timer to pass data to backglass - TimerData = New Timer - With TimerData - AddHandler .Tick, AddressOf TimerData_Tick - .Interval = 51 - .Enabled = False - End With - - ' timer to get escape key event - TimerEscape = New Timer - With TimerEscape - AddHandler .Tick, AddressOf TimerEscape_Tick - .Interval = 150 - .Enabled = False - End With - - ' timer to activate visual pinball - TimerActivateVP = New Timer - With TimerActivateVP - AddHandler .Tick, AddressOf TimerActivateVP_Tick - .Interval = 2000 - .Enabled = False - End With - - End Sub - - Public Sub Start(ByVal _formBackglass As Form, ByVal _B2SDataCount As Integer, Optional ByVal _StartDataTimerImmediatelly As Boolean = True) - - ' here we go with the backglass form - Me.formBackglass = _formBackglass - - ' this is the count of high priority data elements - ' max count is 50 - Me.B2SDataCount = _B2SDataCount - If Me.B2SDataCount > 50 Then Me.B2SDataCount = 50 - - ' maybe start the VP activation and the escape timer - If Not TimerActivateVP.Enabled Then TimerActivateVP.Start() - 'If Not TimerEscape.Enabled Then TimerEscape.Start() - - ' maybe start the remaining timers - 'If _StartDataTimerImmediatelly Then - ' If Not TimerData.Enabled Then TimerData.Start() - 'End If - - End Sub - - Private Sub CheckUp() - - ' have a look for the .NET framework - - - End Sub - -#End Region - -#Region "timers" - - Private Sub TimerData_Tick(ByVal sender As Object, ByVal e As EventArgs) - - '' initialize the value storage - this storage is to avoid too much update traffic - 'Static value(75) As Integer - 'Static isvaluechanged(75) As Boolean - 'Static valueInit As Boolean = False - 'If Not valueInit Then - ' valueInit = True - ' For I As Integer = 0 To Me.B2SDataCount - ' isvaluechanged(I) = True - ' value(I) = 0 - ' Next - 'End If - - '' get current data - 'Dim data As String = My.Computer.Registry.GetValue("HKEY_CURRENT_USER\B2S\", "B2SDATA", Nothing) - 'If data = Nothing OrElse data.Length = 0 Then - ' data = Space(75) ' " " - 'End If - - '' get thru all data receiving objects - 'For i As Integer = 1 To Me.B2SDataCount - ' isvaluechanged(i) = False - ' Dim currentvalue As Integer = Asc(data.Substring(i, 1)) - 1 - ' If currentvalue <> value(i) Then - ' isvaluechanged(i) = True - ' value(i) = currentvalue - ' End If - 'Next - 'If writeLogFile Then - ' Dim sb As StringBuilder = New StringBuilder() - ' Dim log As IO.StreamWriter = New IO.StreamWriter("c:\tmp\log.txt", True) - ' For i As Integer = 0 To 50 - ' sb.Append(value(i)) - ' sb.Append(" ") - ' Next - ' log.WriteLine(sb.ToString()) - ' log.Flush() - ' log.Close() - 'End If - 'RaiseEvent DataIsSent(Me, New B2SSystemEventArgs(value, isvaluechanged)) - - End Sub - - Private Sub TimerEscape_Tick(ByVal sender As Object, ByVal e As EventArgs) - - '' stop current timer - 'TimerEscape.Stop() - - '' check whether the escape is pressed - 'Dim keyState As Short = GetAsyncKeyState(Keys.Escape) - 'If keyState <> 0 Then - ' ' raise matching escape key event - ' RaiseEvent EscapeIsHit(Me, New EventArgs()) - ' ' close the backglass - ' formBackglass.Close() - 'Else - ' ' restart current timer - ' TimerEscape.Start() - 'End If - - End Sub - - Private Sub TimerActivateVP_Tick(ByVal sender As Object, ByVal e As EventArgs) - - '' stop current timer - 'TimerActivateVP.Stop() - - '' set focus to VP - 'Try - ' AppActivate("Visual Pinball Player") - 'Catch - 'End Try - - '' raise matching event - 'RaiseEvent VPIsActivated(Me, New EventArgs()) - - '' maybe start the remaining timers - 'If Not TimerData.Enabled Then TimerData.Start() - 'If Not TimerEscape.Enabled Then TimerEscape.Start() - - End Sub - -#End Region - -End Class \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/Processes.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Classes/Processes.vb deleted file mode 100644 index 0bd968a..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Classes/Processes.vb +++ /dev/null @@ -1,95 +0,0 @@ -Imports System - -Public Class Processes - - Private Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As EnumWindowsProc, ByVal lParam As Int32) As Int32 - Private Declare Function IsWindowVisible Lib "user32.dll" (ByVal hwnd As IntPtr) As Boolean - Private Delegate Function EnumWindowsProc(ByVal hwnd As IntPtr, ByVal lParam As Int32) As Boolean - Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As Int32) As Int32 - Private Declare Function GetWindowTextLength Lib "user32.dll" Alias "GetWindowTextLengthA" (ByVal hwnd As IntPtr) As Int32 - Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hwnd As IntPtr, ByVal nIndex As Int32) As Int32 - Private Declare Function GetParent Lib "user32.dll" (ByVal intptr As IntPtr) As IntPtr - - Private windowlist As List(Of ProcInfo) - Private _tablename As String = String.Empty - Private _tablecount As Integer = 0 - Private _tablehandle As IntPtr = 0 - - Private Const GWL_HWNDPARENT As Int32 = -8 - - Private Class ProcInfo - Public Name As String - Public Handle As IntPtr - - Public Sub New(ByVal _name As String, ByVal _handle As IntPtr) - Name = _name - Handle = _handle - End Sub - End Class - - Public Sub New() - RefreshWindowList() - For Each proc As ProcInfo In windowlist - If Not String.IsNullOrEmpty(proc.Name) Then - If proc.Name.StartsWith("Visual Pinball - ", StringComparison.CurrentCultureIgnoreCase) Then - If String.IsNullOrEmpty(_tablename) Then - _tablename = proc.Name.Substring(17) - If _tablename.StartsWith("[") AndAlso Not _tablename.EndsWith("]") Then - Dim i As Integer = _tablename.Length - 1 - Dim found As Boolean = False - Do While i > 0 - If _tablename.Substring(i, 1) = "]" Then - found = True - Exit Do - End If - i -= 1 - Loop - If found Then - _tablename = _tablename.Substring(0, i + 1) - End If - End If - If _tablename.StartsWith("[") Then _tablename = _tablename.Substring(1) - If _tablename.EndsWith("]") Then _tablename = _tablename.Substring(0, _tablename.Length - 1) - If _tablename.EndsWith("*") Then _tablename = _tablename.Substring(0, _tablename.Length - 1) - If _tablename.EndsWith(".vpt") Then _tablename = _tablename.Substring(0, _tablename.Length - 4) - If _tablename.EndsWith("*") Then _tablename = _tablename.Substring(0, _tablename.Length - 1) - End If - _tablecount += 1 - End If - If proc.Name.StartsWith("Visual Pinball Player", StringComparison.CurrentCultureIgnoreCase) Then - _tablehandle = proc.Handle - End If - End If - Next - End Sub - - Public ReadOnly Property TableName() As String - Get - Return _tablename - End Get - End Property - Public ReadOnly Property TableCount() As Integer - Get - Return _tablecount - End Get - End Property - Public ReadOnly Property TableHandle() As IntPtr - Get - Return _tablehandle - End Get - End Property - - Private Function EnumWinProc(ByVal hwnd As IntPtr, ByVal lParam As Int32) As Boolean - If IsWindowVisible(hwnd) AndAlso GetParent(hwnd) = IntPtr.Zero AndAlso GetWindowLong(hwnd, GWL_HWNDPARENT) = 0 Then - Dim str As String = String.Empty.PadLeft(GetWindowTextLength(hwnd) + 1) - GetWindowText(hwnd, str, str.Length) - If Not String.IsNullOrEmpty(str.Substring(0, str.Length - 1)) Then windowlist.Add(New ProcInfo(str.Substring(0, str.Length - 1), hwnd)) - End If - EnumWinProc = True - End Function - Private Sub RefreshWindowList() - windowlist = New List(Of ProcInfo) - EnumWindows(AddressOf EnumWinProc, CInt(True)) - End Sub - -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Controls/B2SBaseBox.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Controls/B2SBaseBox.vb deleted file mode 100644 index cd0358c..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Controls/B2SBaseBox.vb +++ /dev/null @@ -1,47 +0,0 @@ -Imports System -Imports System.Drawing -Imports System.Windows.Forms - -Public Class B2SBaseBox - - Inherits Control - Implements System.ComponentModel.ISupportInitialize - - Public Enum eType - NotDefined = 0 - OnBackglass = 1 - OnDMD = 2 - End Enum - Public Property Type() As eType = eType.NotDefined - - Public Property ID() As Integer - Public Property DisplayID() As Integer - - Public Property RomID() As Integer = 0 - Public Enum eRomIDType - NotDefined = 0 - Lamp = 1 - Solenoid = 2 - GIString = 3 - Mech = 4 - End Enum - Public Property RomIDType() As eRomIDType = eType.NotDefined - Public Property RomIDValue() As Integer = 0 - Public Property RomInverted() As Boolean = False - - Public Property RectangleF As RectangleF = Nothing - - Public Property StartDigit() As Integer = 0 - Public Property Digits() As Integer = 0 - - Public Property Hidden() As Boolean = False - - Public Sub BeginInit() Implements System.ComponentModel.ISupportInitialize.BeginInit - ' nothing to do right now - End Sub - - Public Sub EndInit() Implements System.ComponentModel.ISupportInitialize.EndInit - ' nothing to do right now - End Sub - -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Controls/B2SLEDBox.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Controls/B2SLEDBox.vb deleted file mode 100644 index 1d66edc..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Controls/B2SLEDBox.vb +++ /dev/null @@ -1,163 +0,0 @@ -Imports System -Imports System.Drawing.Drawing2D -Imports System.Drawing -Imports System.Windows.Forms - -Public Class B2SLEDBox - - Inherits B2SBaseBox - - Private currentSeg As Generic.List(Of PointF()) = New Generic.List(Of PointF()) - - Protected Overrides Sub OnResize(e As System.EventArgs) - - ' base call - MyBase.OnResize(e) - - ' resize the led segments and load it into the current segment array - Dim width As Single = Me.Width / B2SData.ledCoordMax - Dim height As Single = Me.Height / B2SData.ledCoordMax - currentSeg.Clear() - For Each entry As PointF() In If(LEDType = B2SLED.eLEDType.LED10, B2SData.led10Seg, If(LEDType = B2SLED.eLEDType.LED14, B2SData.led14Seg, If(LEDType = B2SLED.eLEDType.LED16, B2SData.led16Seg, B2SData.led8Seg))) - Dim scaled(entry.Length - 1) As PointF - For i As Integer = 0 To entry.Length - 1 - scaled(i) = New PointF(entry(i).X * width, entry(i).Y * height) - Next - currentSeg.Add(scaled) - Next - - End Sub - Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) - - ' create or recreate brushes - 'Static glowingbrush As SolidBrush = New SolidBrush(Color.FromArgb(Math.Min(LitLEDSegmentColor.R + 20, 255), Math.Min(LitLEDSegmentColor.G + 20, 255), Math.Min(LitLEDSegmentColor.B + 20, 255))) - Static litbrush As SolidBrush = New SolidBrush(LitLEDSegmentColor) - Static litpen As Pen = New Pen(LitLEDSegmentColor) - Static darkbrush As SolidBrush = New SolidBrush(DarkLEDSegmentColor) - If Not litbrush.Color.Equals(LitLEDSegmentColor) Then - 'glowingbrush.Dispose() - 'glowingbrush = New SolidBrush(Color.FromArgb(Math.Min(LitLEDSegmentColor.R + 30, 255), Math.Max(LitLEDSegmentColor.G + 30, 255), Math.Max(LitLEDSegmentColor.B + 30, 255))) - litbrush.Dispose() - litbrush = New SolidBrush(LitLEDSegmentColor) - litpen.Dispose() - litpen = New Pen(LitLEDSegmentColor) - End If - If Not darkbrush.Color.Equals(DarkLEDSegmentColor) Then - darkbrush.Dispose() - darkbrush = New SolidBrush(DarkLEDSegmentColor) - End If - - ' draw LED segments - Dim width As Single = Me.Width / B2SData.ledCoordMax - Dim height As Single = Me.Height / B2SData.ledCoordMax - - ' set graphics' options - e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias - - ' draw LED segments - For i As Integer = 0 To currentSeg.Count - 1 - If (_Value And 2 ^ i) <> 0 Then - 'e.Graphics.FillPolygon(glowingbrush, currentSeg(i)) - 'e.Graphics.DrawPolygon(litpen, currentSeg(i)) - e.Graphics.FillPolygon(litbrush, currentSeg(i)) - Else - e.Graphics.FillPolygon(darkbrush, currentSeg(i)) - End If - Next - - End Sub - - Public Sub New() - - ' set some styles - 'Me.SetStyle(ControlStyles.ResizeRedraw, True) ' Or ControlStyles.SupportsTransparentBackColor - 'Me.DoubleBuffered = True - Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.DoubleBuffer, True) - - ' back color - Me.BackColor = Color.Black - - ' show control - Me.Visible = True - Me.BringToFront() - - End Sub - - Public Property LitLEDSegmentColor() As Color = Nothing - Public Property DarkLEDSegmentColor() As Color = Nothing - - Private _LEDType As B2SLED.eLEDType = B2SLED.eLEDType.Undefined - Public Property LEDType() As B2SLED.eLEDType - Get - Return _LEDType - End Get - Set(ByVal value As B2SLED.eLEDType) - If _LEDType <> value Then - _LEDType = value - Me.Invalidate() - End If - End Set - End Property - - Private _Value As Integer = 0 - Public Property Value(Optional ByVal refresh As Boolean = False) As Integer - Get - Return _Value - End Get - Set(ByVal newvalue As Integer) - If _Value <> newvalue OrElse refresh Then - _Value = newvalue - Me.Refresh() - End If - End Set - End Property - - Private _Text As String = String.Empty - Public Shadows Property Text() As String - Get - Return _Text - End Get - Set(ByVal newvalue As String) - If Not String.IsNullOrEmpty(newvalue) Then - If _Text <> newvalue Then - _Text = newvalue - Select Case LEDType - Case B2SLED.eLEDType.LED8, B2SLED.eLEDType.Undefined - Select Case newvalue - Case " " : Value = 0 - Case "0" : Value = 63 - Case "1" : Value = 6 - Case "2" : Value = 91 - Case "3" : Value = 79 - Case "4" : Value = 102 - Case "5" : Value = 109 - Case "6" : Value = 125 - Case "7" : Value = 7 - Case "8" : Value = 127 - Case "9" : Value = 111 - End Select - Case B2SLED.eLEDType.LED10 - Select Case newvalue - Case " " : Value = 0 - Case "0" : Value = 63 - Case "1" : Value = 768 - Case "2" : Value = 91 - Case "3" : Value = 79 - Case "4" : Value = 102 - Case "5" : Value = 109 - Case "6" : Value = 124 - Case "7" : Value = 7 - Case "8" : Value = 127 - Case "9" : Value = 103 - End Select - Case B2SLED.eLEDType.LED14 - ' TODO - Case B2SLED.eLEDType.LED16 - ' not implemented right now - End Select - End If - End If - End Set - End Property - -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Controls/B2SPictureBox.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Controls/B2SPictureBox.vb deleted file mode 100644 index 814b0bc..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Controls/B2SPictureBox.vb +++ /dev/null @@ -1,108 +0,0 @@ -Imports System -Imports System.Drawing -Imports System.Windows.Forms - -Public Class B2SPictureBox - - Inherits B2SBaseBox - - Public Enum ePictureBoxType - StandardImage = 0 - SelfRotatingImage = 1 - MechRotatingImage = 2 - End Enum - Public Enum eSnippitRotationDirection - Clockwise = 0 - AntiClockwise = 1 - End Enum - Public Enum eSnippitRotationStopBehaviour - SpinOff = 0 - StopImmediatelly = 1 - RunAnimationTillEnd = 2 - RunAnimationToFirstStep = 3 - End Enum - - Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) - ' rectangle area for painting - Dim rect As Rectangle = New Rectangle(0, 0, Me.Width - 1, Me.Height - 1) - - ' draw dashed frame - Dim pen As Pen = New Pen(Brushes.LightGray) - pen.DashPattern = New Single() {3.0F, 3.0F} - e.Graphics.DrawRectangle(pen, rect) - pen.Dispose() - - ' draw text - 'If Not String.IsNullOrEmpty(Me.Text) Then - ' TextRenderer.DrawText(e.Graphics, Me.Text, Me.Font, rect, Color.White, TextFormatFlags.WordBreak Or TextFormatFlags.HorizontalCenter Or TextFormatFlags.VerticalCenter) - 'End If - End Sub - - Public Sub New() - ' set some drawing styles - Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True) - 'Me.SetStyle(ControlStyles.ResizeRedraw Or ControlStyles.SupportsTransparentBackColor, True) - 'Me.DoubleBuffered = True - Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.DoubleBuffer, True) - - ' backcolor needs to be transparent - Me.BackColor = Color.Transparent - - ' do not show the control - MyBase.Visible = False - Me.BringToFront() - End Sub - - Public Property PictureBoxType() As ePictureBoxType = ePictureBoxType.StandardImage - - Public Property GroupName() As String = String.Empty - - Public Property Intensity() As Integer = 1 - Public Property InitialState() As Integer = 0 - Public Property DualMode() As B2SData.eDualMode = B2SData.eDualMode.Both - Public Property ZOrder() As Integer = 0 - - Public Property IsImageSnippit() As Boolean = False - Public Property SnippitRotationStopBehaviour() As eSnippitRotationStopBehaviour = eSnippitRotationStopBehaviour.SpinOff - - Private _Visible As Boolean - Public Shadows Property Visible(Optional ByVal _SetThruAnimation As Boolean = False) As Boolean - Get - Return _Visible - End Get - Set(ByVal value As Boolean) - If _Visible <> value Then - SetThruAnimation = _SetThruAnimation - _Visible = value - ' do a invalidate at the parent form - If Me.Parent IsNot Nothing Then Me.Parent.Invalidate(Rectangle.Round(Me.RectangleF)) - End If - End Set - End Property - Public Property SetThruAnimation() As Boolean = False - - Private _BackgroundImage As Image - Public Shadows Property BackgroundImage() As Image - Get - Return _BackgroundImage - End Get - Set(ByVal value As Image) - If _BackgroundImage Is Nothing OrElse Not _BackgroundImage.Equals(value) Then - _BackgroundImage = value - ' do a invalidate at the parent form - If Me.Parent IsNot Nothing Then Me.Parent.Invalidate(Rectangle.Round(Me.RectangleF)) - End If - End Set - End Property - - Private _OffImage As Image - Public Property OffImage() As Image - Get - Return _OffImage - End Get - Set(ByVal value As Image) - _OffImage = value - End Set - End Property - -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Controls/B2SReelBox.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Controls/B2SReelBox.vb deleted file mode 100644 index 99d8825..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Controls/B2SReelBox.vb +++ /dev/null @@ -1,327 +0,0 @@ -Imports System -Imports System.Windows.Forms -Imports System.Drawing - -Public Class B2SReelBox - - Inherits B2SBaseBox - - Public Enum eScoreType - NotUsed = 0 - Scores = 1 - Credits = 2 - End Enum - - Public Class ReelRollOverEventArgs - Inherits EventArgs - - Public Digit As Integer = 0 - - Public Sub New(ByVal _digit As Integer) - Digit = _digit - End Sub - End Class - Public Event ReelRollOver(ByVal sender As Object, ByVal e As ReelRollOverEventArgs) - - Private timer As Timer = Nothing - Private cTimerInterval As Integer = 101 - - Private isLED As Boolean = False - - Private length As Integer = 1 - Private initValue As String = "0" - Private reelindex As String = String.Empty - - Private intermediates As Integer = -1 - Private intermediates2go As Integer = 0 - - Protected Overrides Sub Dispose(disposing As Boolean) - MyBase.Dispose(disposing) - On Error Resume Next - If disposing Then - timer.Stop() - RemoveHandler timer.Tick, AddressOf ReelAnimationTimer_Tick - timer.Dispose() - timer = Nothing - End If - End Sub - - Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) - - If Not String.IsNullOrEmpty(reelindex) Then - Dim images As Generic.Dictionary(Of String, Image) = If(_Illuminated, B2SData.ReelIlluImages, B2SData.ReelImages) - Dim intimages As Generic.Dictionary(Of String, Image) = If(_Illuminated, B2SData.ReelIntermediateIlluImages, B2SData.ReelIntermediateImages) - Dim name As String = String.Empty - If intermediates = -1 AndAlso timer.Enabled Then - Static firstintermediatecount As Integer = 1 - name = _ReelType & "_" & reelindex & If(SetID > 0 AndAlso _Illuminated, "_" & SetID.ToString(), "") & "_" & firstintermediatecount.ToString() - If intimages.ContainsKey(name) Then - e.Graphics.DrawImage(intimages(name), e.ClipRectangle) - firstintermediatecount += 1 - intermediates2go = 2 - Else - name = _ReelType & "_" & ConvertText(_CurrentText + 1) & If(SetID > 0 AndAlso _Illuminated, "_" & SetID.ToString(), "") - If images.ContainsKey(name) Then e.Graphics.DrawImage(images(name), e.ClipRectangle) - intermediates = firstintermediatecount - 1 - intermediates2go = 1 - End If - ElseIf intermediates2go > 0 Then - name = _ReelType & "_" & reelindex & If(SetID > 0 AndAlso _Illuminated, "_" & SetID.ToString(), "") & "_" & (intermediates - intermediates2go + 1).ToString() - If intimages.ContainsKey(name) Then e.Graphics.DrawImage(intimages(name), e.ClipRectangle) - Else - name = _ReelType & "_" & reelindex & If(SetID > 0 AndAlso _Illuminated, "_" & SetID.ToString(), "") - If images.ContainsKey(name) Then e.Graphics.DrawImage(images(name), e.ClipRectangle) - End If - End If - - End Sub - 'Protected Overrides Sub OnPaintBackground(pevent As System.Windows.Forms.PaintEventArgs) - - ' ' nothing to do but important - - 'End Sub - - Public Sub New() - - ' set some styles - Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.DoubleBuffer, True) - 'Me.SetStyle(ControlStyles.SupportsTransparentBackColor, True) - Me.DoubleBuffered = True - Me.BringToFront() - - ' back color - 'Me.BackColor = Color.Transparent - - ' show control - 'Me.Visible = True - - ' create timer - timer = New Timer() - timer.Interval = CInt(_RollingInterval / (If((intermediates = -1), 3, intermediates) + 2)) - AddHandler timer.Tick, AddressOf ReelAnimationTimer_Tick - - End Sub - - Private Sub B2SReelBox_Disposed(sender As Object, e As System.EventArgs) Handles Me.Disposed - On Error Resume Next - If timer IsNot Nothing Then - timer.Stop() - RemoveHandler timer.Tick, AddressOf ReelAnimationTimer_Tick - timer.Dispose() - timer = Nothing - End If - End Sub - - Private Sub ReelAnimationTimer_Tick(ByVal sender As Object, ByVal e As System.EventArgs) - - If intermediates2go > 0 OrElse intermediates = -1 Then - - Me.Refresh() - intermediates2go -= 1 - - Else - - If intermediates2go = 0 Then - ' add one reel step - _CurrentText += 1 - If _CurrentText > 9 Then - _CurrentText = 0 - RaiseEvent ReelRollOver(Me, New ReelRollOverEventArgs(ID)) - End If - - reelindex = ConvertText(_CurrentText) - - ' play sound and redraw reel - Try - If Sound() IsNot Nothing Then - My.Computer.Audio.Play(Sound(), AudioPlayMode.Background) - ElseIf SoundName() = "stille" Then - ' no sound - Else - My.Computer.Audio.Play(My.Resources.EMReel, AudioPlayMode.Background) - End If - Catch - End Try - Me.Refresh() - - intermediates2go -= 1 - ElseIf intermediates2go = -1 Then - intermediates2go -= 1 - Else - ' maybe stop timer - intermediates2go = intermediates - If _CurrentText = _Text OrElse _Text >= 10 Then - timer.Stop() - timer.Interval = CInt(_RollingInterval / (If((intermediates = -1), 3, intermediates) + 2)) - End If - End If - - End If - - End Sub - - Public Property SetID() As Integer - - Private _ReelType As String - Public Property ReelType() As String - Get - Return _ReelType - End Get - Set(ByVal value As String) - reelindex = "0" - If value.Substring(value.Length - 1, 1) = "_" Then - length = 2 - reelindex = "00" - value = value.Substring(0, value.Length - 1) - End If - If value.StartsWith("LED", StringComparison.CurrentCultureIgnoreCase) OrElse value.StartsWith("ImportedLED", StringComparison.CurrentCultureIgnoreCase) Then - isLED = True - reelindex = "Empty" - initValue = "Empty" - _Text = -1 - End If - _ReelType = value - End Set - End Property - - Public Property SoundName() As String = String.Empty - Public Property Sound() As Byte() = Nothing - - Public Property ScoreType() As eScoreType = eScoreType.NotUsed - - Public Property GroupName() As String = String.Empty - - Private _Illuminated As Boolean - Public Property Illuminated() As Boolean - Get - Return _Illuminated - End Get - Set(ByVal value As Boolean) - If _Illuminated <> value Then - _Illuminated = value - intermediates2go = 0 - Me.Refresh() - End If - End Set - End Property - - Private _Value As Integer = 0 - Public Property Value(Optional ByVal refresh As Boolean = False) As Integer - Get - Return _Value - End Get - Set(ByVal value As Integer) - If _Value <> value OrElse refresh Then - _Value = value - reelindex = ConvertValue(_Value) - Me.Refresh() - End If - End Set - End Property - - Private _CurrentText As Integer = 0 - Private _Text As Integer = 0 - Public Shadows Property Text(Optional ByVal AnimateReelChange As Boolean = True) As Integer - Get - Return _Text - End Get - Set(ByVal value As Integer) - If value >= 0 Then - If _Text <> value Then - _Text = value - If AnimateReelChange AndAlso Not isLED Then - timer.Stop() - intermediates2go = intermediates - timer.Start() - Else - reelindex = ConvertText(_Text) - Me.Refresh() - End If - End If - End If - End Set - End Property - Public ReadOnly Property CurrentText() As Integer - Get - Return _CurrentText - End Get - End Property - - Private _RollingInterval As Integer = cTimerInterval - Public Property RollingInterval() As Integer - Get - Return _RollingInterval - End Get - Set(ByVal value As Integer) - If _RollingInterval <> value Then - _RollingInterval = value - If _RollingInterval < 10 Then _RollingInterval = cTimerInterval - End If - End Set - End Property - - Public ReadOnly Property IsInReelRolling() As Boolean - Get - Return (intermediates2go <= 0) - End Get - End Property - Public ReadOnly Property IsInAction() As Boolean - Get - Return timer.Enabled - End Get - End Property - - Private Function ConvertValue(ByVal value As Integer) As String - Dim ret As String = initValue - ' remove the "," from the 7-segmenter - If value >= 128 AndAlso value <= 255 Then - value -= 128 - End If - ' map value - If value > 0 Then - Select Case value - ' 7-segment stuff - Case 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" - Case Else - 'additional 10-segment stuff - Select Case value - Case 768 - ret = "1" - Case 124 - ret = "6" - Case 103 - ret = "9" - 'Case Else - ' Debug.WriteLine(_Value) - End Select - End Select - End If - Return If(length = 2, "0", "") & ret - End Function - Private Function ConvertText(ByVal text As Integer) As String - Dim ret As String = String.Empty - ret = "00" & text.ToString() - ret = ret.Substring(ret.Length - length, length) - Return ret - End Function - -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Dream7/Dream7Display.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Dream7/Dream7Display.vb deleted file mode 100644 index 3707467..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Dream7/Dream7Display.vb +++ /dev/null @@ -1,482 +0,0 @@ -Imports System.Drawing.Drawing2D -Imports System.ComponentModel -Imports System.Drawing -Imports System.Windows.Forms - -Public Class Dream7Display - Inherits Control - Private SegmentNumbers As New Generic.List(Of SegmentNumber) - Private ExtraSpacings As New Generic.Dictionary(Of Integer, Single) - - Public Shared SegmentPaintCounter As Long - -#Region "constructor" - - Public Sub New() - Me.DoubleBuffered = True - Me.SetStyle(ControlStyles.Opaque, False) - Me.SetStyle(ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint, True) - End Sub - - Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams - Get - Dim cp As CreateParams = MyBase.CreateParams - If TransparentBackground Then cp.ExStyle = cp.ExStyle Or &H20 ' WS_EX_TRANSPARENT - Return cp - End Get - End Property - -#End Region - -#Region "public properties" - - Public Property Hidden() As Boolean = False - - Private bMirrored As Boolean - _ - Public Property Mirrored As Boolean - Get - Return bMirrored - End Get - Set(ByVal value As Boolean) - If bMirrored <> value Then - bMirrored = value - InitSegmentsStyle() - End If - End Set - End Property - - Private sText As String = Nothing - Public Overrides Property Text As String - Get - Return sText - End Get - Set(ByVal value As String) - sText = value - Dim nLen As Integer = 0 - If Not String.IsNullOrEmpty(value) Then nLen = value.Length - 1 - Dim nIndex As Integer = 0 - For nSegment As Integer = 0 To nLen - If nIndex >= SegmentNumbers.Count Then Exit For - Dim sChar As Char = " " - If Not String.IsNullOrEmpty(sText) AndAlso sText.Length > nSegment Then - sChar = sText.Substring(nSegment, 1) - End If - If sChar = "." AndAlso nIndex > 0 AndAlso Not SegmentNumbers(nIndex - 1).Character.EndsWith(".") Then - SegmentNumbers(nIndex - 1).Character &= "." - Else - SegmentNumbers(nIndex).Character = sChar - nIndex += 1 - End If - Next - End Set - End Property - - Private nDigits As Integer - _ - Public Property Digits As Integer - Get - Return nDigits - End Get - Set(ByVal value As Integer) - If value <> nDigits Then - nDigits = value - InitSegements() - End If - End Set - End Property - - Private nScaleMode As ScaleMode = ScaleMode.Stretch - Public Property ScaleMode As ScaleMode - Get - Return nScaleMode - End Get - Set(ByVal value As ScaleMode) - If nScaleMode <> value Then - nScaleMode = value - InitSegmentsStyle() - End If - End Set - End Property - - Private nSpacing As Single = 20.0 - _ - Public Property Spacing As Single - Get - Return nSpacing - End Get - Set(ByVal value As Single) - If nSpacing <> value Then - nSpacing = value - InitSegmentsStyle() - End If - End Set - End Property - - Private bTransparentBackground As Boolean = False - _ - Public Property TransparentBackground As Boolean - Get - Return bTransparentBackground - End Get - Set(ByVal value As Boolean) - bTransparentBackground = value - If Not value Then - Me.DoubleBuffered = True - Me.SetStyle(ControlStyles.Opaque, False) - Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True) - Else - Me.DoubleBuffered = False - Me.SetStyle(ControlStyles.Opaque, True) - Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, False) - End If - End Set - End Property - - Private nType As SegmentNumberType = SegmentNumberType.SevenSegment - _ - Public Property Type As SegmentNumberType - Get - Return nType - End Get - Set(ByVal value As SegmentNumberType) - If value <> nType Then - nType = value - InitSegmentsStyle() - End If - End Set - End Property - - _ - Public WriteOnly Property OffColor As Color - Set(ByVal value As Color) - For Each oSegment As SegmentNumber In SegmentNumbers - oSegment.Style.OffColor = value - oSegment.AssignStyle() - Next - End Set - End Property - - Public WriteOnly Property LightColor As Color - Set(ByVal value As Color) - For Each oSegment As SegmentNumber In SegmentNumbers - oSegment.Style.LightColor = value - oSegment.AssignStyle() - Next - End Set - End Property - - Public WriteOnly Property GlassColor As Color - Set(ByVal value As Color) - For Each oSegment As SegmentNumber In SegmentNumbers - oSegment.Style.GlassColor = value - oSegment.AssignStyle() - Next - End Set - End Property - - Public WriteOnly Property GlassColorCenter As Color - Set(ByVal value As Color) - For Each oSegment As SegmentNumber In SegmentNumbers - oSegment.Style.GlassColorCenter = value - oSegment.AssignStyle() - Next - End Set - End Property - - Public WriteOnly Property GlassAlpha As Integer - Set(ByVal value As Integer) - For Each oSegment As SegmentNumber In SegmentNumbers - oSegment.Style.GlassAlpha = value - oSegment.AssignStyle() - Next - End Set - End Property - - Public WriteOnly Property GlassAlphaCenter As Integer - Set(ByVal value As Integer) - For Each oSegment As SegmentNumber In SegmentNumbers - oSegment.Style.GlassAlphaCenter = value - oSegment.AssignStyle() - Next - End Set - End Property - - Public WriteOnly Property Glow As Single - Set(ByVal value As Single) - For Each oSegment As SegmentNumber In SegmentNumbers - oSegment.Style.Glow = value - oSegment.AssignStyle() - Next - End Set - End Property - - Public WriteOnly Property BulbSize As SizeF - Set(ByVal value As SizeF) - For Each oSegment As SegmentNumber In SegmentNumbers - oSegment.Style.BulbSize = value - oSegment.AssignStyle() - Next - End Set - End Property - - Public WriteOnly Property WireFrame As Boolean - Set(ByVal value As Boolean) - For Each oSegment As SegmentNumber In SegmentNumbers - oSegment.Style.WireFrame = value - oSegment.AssignStyle() - Next - End Set - End Property - - Private nShear As Single = 0.1 - _ - Public Property Shear As Single - Get - Return nShear - End Get - Set(ByVal value As Single) - If nShear <> value Then - nShear = value - InitSegmentsStyle() - End If - End Set - End Property - - Private nThickness As Single = 16.0 - _ - Public Property Thickness As Single - Get - Return nThickness - End Get - Set(ByVal value As Single) - If nThickness <> value Then - nThickness = value - InitSegmentsStyle() - End If - End Set - End Property - - Private nScaleFactor As Single = 0.5 - _ - Public Property ScaleFactor As Single - Get - Return nScaleFactor - End Get - Set(ByVal value As Single) - If nScaleFactor <> value Then - nScaleFactor = value - InitSegmentsStyle() - End If - End Set - End Property - - Private nOffsetWidth As Integer = 0 - _ - Public Property OffsetWidth As Integer - Get - Return nOffsetWidth - End Get - Set(ByVal value As Integer) - If value <> nOffsetWidth Then - nOffsetWidth = value - InitSegmentsStyle() - End If - End Set - End Property - - Private nAngle As Single = 0.0 - _ - Public Property Angle As Single - Get - Return nAngle - End Get - Set(ByVal value As Single) - If nAngle <> value Then - nAngle = value - InitSegmentsStyle() - End If - End Set - End Property - -#End Region - -#Region "public functions" - - Public Sub SetValue(ByVal nSegment As Integer, ByVal sValue As String) - If SegmentNumbers.Count <= nSegment Then Return - SegmentNumbers(nSegment).DisplayCharacter(sValue) - End Sub - - Public Sub SetValue(ByVal nSegment As Integer, ByVal nValue As Long) - If SegmentNumbers.Count <= nSegment Then Return - SegmentNumbers(nSegment).DisplayBitCode(nValue) - End Sub - - Public Sub SetExtraSpacing(ByVal nSegment As Integer, ByVal nValue As Long) - If ExtraSpacings.ContainsKey(nSegment) Then ExtraSpacings.Remove(nSegment) - If nValue > 0 Then - ExtraSpacings.Add(nSegment, nValue) - End If - InitSegmentsStyle() - End Sub - - _ - Public Sub Repaint() - End Sub - -#End Region - -#Region "transformation functions" - - Private oMatrix As Matrix - Private Sub InitMatrix(ByVal nShear As Single, ByVal nScaleFactor As Single, ByVal bMirrored As Boolean) - If oMatrix IsNot Nothing Then oMatrix.Dispose() - oMatrix = New Matrix - If nShear < 0 Then nShear = 0 - If nShear > 2 Then nShear = 2 - If nScaleFactor <= 0.01 Then nScaleFactor = 0.01 - If nScaleFactor > 10 Then nScaleFactor = 10 - ' try the simple matrix - Dim oStyleMatrix As New Matrix - If bMirrored Then oStyleMatrix.Multiply(New Matrix(1, 0, 0, -1, 0, 0)) - oStyleMatrix.Shear(-nShear, 0) - oStyleMatrix.Rotate(nAngle) - oStyleMatrix.Scale(nScaleFactor, nScaleFactor) - oStyleMatrix.Translate(10, 10) - If Me.IsHandleCreated Then - ' correct the location and scale the whole display with a new matrix - Dim nBounds As RectangleF = GetBounds(oStyleMatrix) - Dim oCorrectedMatrix As New Matrix - If nScaleMode <> ScaleMode.Manual Then - Dim nScaleX As Single = (Me.Width + 3 - nOffsetWidth) / nBounds.Width - Dim nScaleY As Single = (Me.Height - 1) / nBounds.Height - If nScaleMode = ScaleMode.Zoom Then - nScaleY = Math.Min(nScaleX, nScaleY) - nScaleX = nScaleY - End If - If nScaleX > 0 AndAlso nScaleY > 0 Then oMatrix.Scale(nScaleX, nScaleY) - End If - oMatrix.Translate(-nBounds.X, -nBounds.Y) - End If - oMatrix.Multiply(oStyleMatrix) - oStyleMatrix.Dispose() - End Sub - - Private nBounds As RectangleF - Private Function GetBounds(ByVal oMatrix As Matrix) As RectangleF - ' determine the bounds of the whole display - Dim nPoints(3) As PointF - Dim nExtraSpacings As Single = 0 - For Each nSpacing As Single In ExtraSpacings.Values - nExtraSpacings += nSpacing - Next - nBounds = New RectangleF(-10.0, -10.0, CSng(SegmentNumbers.Count) * (154.0 + Spacing) + 15.0 - Spacing + nExtraSpacings, 264.0) - nPoints(0) = New PointF(nBounds.Left, nBounds.Top) - nPoints(1) = New PointF(nBounds.Right, nBounds.Top) - nPoints(2) = New PointF(nBounds.Right, nBounds.Bottom) - nPoints(3) = New PointF(nBounds.Left, nBounds.Bottom) - oMatrix.TransformPoints(nPoints) - Dim nMinX As Single = Single.MaxValue, nMinY As Single = Single.MaxValue - Dim nMaxX As Single = Single.MinValue, nMaxY As Single = Single.MinValue - For Each nPoint As PointF In nPoints - If nPoint.X < nMinX Then nMinX = nPoint.X - If nPoint.X > nMaxX Then nMaxX = nPoint.X - If nPoint.Y < nMinY Then nMinY = nPoint.Y - If nPoint.Y > nMaxY Then nMaxY = nPoint.Y - Next - Return New RectangleF(nMinX, nMinY, nMaxX - nMinX, nMaxY - nMinY) - End Function - -#End Region - -#Region "init methods" - - Private Sub InitSegements() - InitSegements(nDigits, nType, nShear) - End Sub - - Private Sub InitSegements(ByVal nNumbers As Integer, ByVal nType As SegmentNumberType, ByVal nShear As Single) - If nNumbers >= 0 AndAlso nNumbers <= 80 Then - For nNumber = SegmentNumbers.Count To nNumbers - 1 - Dim oNumber As New SegmentNumber() - SegmentNumbers.Add(oNumber) - AddHandler oNumber.Invalidated, AddressOf SegmentNumberInvalidated - Next - For nNumber = nNumbers To SegmentNumbers.Count - 1 - SegmentNumbers.RemoveAt(SegmentNumbers.Count - 1) - Next - End If - nDigits = SegmentNumbers.Count - InitSegmentsStyle() - End Sub - - Private Sub SegmentNumberInvalidated(ByVal sender As Object, ByVal e As System.EventArgs) - Dim oNumber As SegmentNumber = sender - Me.Invalidate(New Region(oNumber.Bounds)) - End Sub - Private Sub InitSegmentsStyle() - InitMatrix(nShear, nScaleFactor, Mirrored) - Dim nNumber As Integer = 0 - Dim nDistance As Single = 154 + Spacing - Dim nXPos As Single = 0 - For Each oNumber As SegmentNumber In SegmentNumbers - oNumber.Init(New PointF(nXPos, 0), nType, oMatrix, nThickness) - nXPos += nDistance - If ExtraSpacings.ContainsKey(nNumber) Then - nXPos += ExtraSpacings(nNumber) - End If - nNumber += 1 - Next - Me.Invalidate() - End Sub - - Private Sub SegmentDisplay_HandleCreated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.HandleCreated - InitSegmentsStyle() - End Sub - - Private Sub SegmentDisplay_SizeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SizeChanged - InitSegmentsStyle() - End Sub - -#End Region - -#Region "painting" - - Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs) - e.Graphics.SmoothingMode = SmoothingMode.AntiAlias - e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality - e.Graphics.CompositingMode = CompositingMode.SourceCopy - e.Graphics.InterpolationMode = InterpolationMode.HighQualityBilinear - ' draw background - If Me.DoubleBuffered Then - e.Graphics.Clear(Color.Black) - Else - e.Graphics.Transform = oMatrix - e.Graphics.FillRectangle(Brushes.Black, nBounds) - e.Graphics.ResetTransform() - End If - For Each oNumber As SegmentNumber In SegmentNumbers - Dim oRegion As New Region(e.ClipRectangle) - oRegion.Intersect(oNumber.Bounds) - If Not oRegion.IsEmpty(e.Graphics) Then - oNumber.Draw(e.Graphics) - End If - 'e.Graphics.DrawPath(Pens.Blue, oNumber.Bounds) - Next - e.Graphics.ResetTransform() - End Sub - - Protected Overrides Sub OnPaintBackground(ByVal pevent As System.Windows.Forms.PaintEventArgs) - ' no background - End Sub - -#End Region - -End Class - -Public Enum ScaleMode - Manual = 0 - Stretch = 1 - Zoom = 2 -End Enum \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Dream7/Segment.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Dream7/Segment.vb deleted file mode 100644 index 0a55db1..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Dream7/Segment.vb +++ /dev/null @@ -1,284 +0,0 @@ -Imports System.Drawing.Drawing2D -Imports System.Drawing -Imports System.ComponentModel - -Friend Class Segment - Private FocusScales As PointF - Private Lights(5) As PointF - Private LightDot As RectangleF - Private Points(5) As PointF - - Public Property Style As SegmentStyle - Public Property IsOn As Boolean - Public Property Name As String - -#Region "constructors" - - Public Sub New(ByVal sName As String, ByVal x As Single, ByVal y As Single, ByVal width As Single, ByVal height As Single, _ - ByVal angle As Single) - InitSegment(sName, x, y, width, height, angle, SegmentCap.Standard, SegmentCap.Standard, 45) - End Sub - - Public Sub New(ByVal sName As String, ByVal x As Single, ByVal y As Single, ByVal width As Single, ByVal height As Single, _ - ByVal angle As Single, ByVal topcap As SegmentCap, ByVal bottomcap As SegmentCap) - InitSegment(sName, x, y, width, height, angle, topcap, bottomcap, 45) - End Sub - - Public Sub New(ByVal sName As String, ByVal x As Single, ByVal y As Single, ByVal width As Single, ByVal height As Single, _ - ByVal angle As Single, ByVal topcap As SegmentCap, ByVal bottomcap As SegmentCap, ByVal capangle As Single) - InitSegment(sName, x, y, width, height, angle, topcap, bottomcap, capangle) - End Sub - - Public Sub New(ByVal x As Single, ByVal y As Single, ByVal radius As Single) - InitSegmentDot(x, y, radius) - End Sub - -#End Region - -#Region "public properties" - - Private oGlassPath As GraphicsPath - Public ReadOnly Property GlassPath As GraphicsPath - Get - GetGlassData() - Return oGlassPath - End Get - End Property - Public ReadOnly Property GlassPathTransformed As GraphicsPath - Get - Dim oPath As GraphicsPath = GlassPath.Clone - oPath.Transform(oOwnMatrix) - Return oPath - End Get - End Property - -#End Region - -#Region "public functions" - - Public Sub AssignStyle() - ResetCacheData() - End Sub - - Public Sub Draw(ByVal oGraphics As Graphics) - SetTransform(oGraphics) - GetGlassData() - Dim oBrush As Brush - If IsOn Then - oBrush = New PathGradientBrush(oGlassPath) - With DirectCast(oBrush, PathGradientBrush) - .CenterColor = (Color.FromArgb(Style.GlassAlphaCenter, Style.GlassColorCenter)) - .SurroundColors = New Color() {Color.FromArgb(Style.GlassAlpha, Style.GlassColor)} - .FocusScales = FocusScales - End With - PaintSegment(oGraphics, oBrush, Pens.Red, oGlassPath) - Else - oBrush = New SolidBrush(Style.OffColor) - PaintSegment(oGraphics, oBrush, Pens.DarkGray, oGlassPath) - End If - oGraphics.ResetTransform() - oBrush.Dispose() - End Sub - - Public Sub DrawLight(ByVal oGraphics As Graphics) - If Not IsOn Then Return - SetTransform(oGraphics) - GetLightData() - PaintSegment(oGraphics, oLightBrush, Pens.Yellow, oLightPath) - oGraphics.ResetTransform() - End Sub - -#End Region - -#Region "private functions" - - Private Sub InitSegmentDot(ByVal x As Single, ByVal y As Single, ByVal radius As Single) - Name = "." - Points(0) = New PointF(radius, radius) - nRadius = radius - - CreateLightData() - - oOwnMatrix = New Matrix - oOwnMatrix.Translate(x, y) - End Sub - - Private Sub InitSegment(ByVal sName As String, ByVal x As Single, ByVal y As Single, ByVal width As Single, ByVal height As Single, _ - ByVal angle As Single, ByVal topcap As SegmentCap, ByVal bottomcap As SegmentCap, ByVal capangle As Single) - Name = sName - Dim nBounds As New RectangleF(0, 0, width, height) - Dim topleft As Single, topright As Single, topdelta As Single - Dim bottomleft As Single, bottomright As Single, bottomdelta As Single - LeftRightFromCap(topcap, width, capangle, topleft, topright, topdelta) - LeftRightFromCap(bottomcap, width, capangle, bottomleft, bottomright, bottomdelta) - - Points(0) = New PointF(nBounds.Left + topdelta, nBounds.Top) - Points(1) = New PointF(nBounds.Right, nBounds.Top + If(topcap = SegmentCap.Flat, 0, topright)) - Points(2) = New PointF(nBounds.Right, nBounds.Bottom - If(bottomcap = SegmentCap.Flat, 0, bottomright)) - Points(3) = New PointF(nBounds.Left + bottomdelta, nBounds.Bottom) - Points(4) = New PointF(nBounds.Left, nBounds.Bottom - If(bottomcap = SegmentCap.Flat, 0, bottomleft)) - Points(5) = New PointF(nBounds.Left, nBounds.Top + If(topcap = SegmentCap.Flat, 0, topleft)) - - nAngle = angle - CreateLightData() - - oOwnMatrix = New Matrix - oOwnMatrix.Translate(x, y) - oOwnMatrix.Rotate(angle) - End Sub - - Private nGlow As Single = -1 - Private Sub CreateLightData() - If Style Is Nothing OrElse Me.nGlow = Style.Glow Then Return - Me.nGlow = Style.Glow - If nRadius > 0 Then - ' extra light for the dot - LightDot = New RectangleF(Points(0).X - nGlow, Points(0).Y - nGlow, nRadius + nGlow * 2, nRadius + nGlow * 2) - Else - Lights(0) = PointF.Add(Points(0), New SizeF(0, -nGlow)) - Lights(1) = PointF.Add(Points(1), New SizeF(nGlow, 0)) - Lights(2) = PointF.Add(Points(2), New SizeF(nGlow, 0)) - Lights(3) = PointF.Add(Points(3), New SizeF(0, nGlow)) - Lights(4) = PointF.Add(Points(4), New SizeF(-nGlow, 0)) - Lights(5) = PointF.Add(Points(5), New SizeF(-nGlow, 0)) - ' bulb size - End If - End Sub - - Private Sub SetBulbSize() - If Style.BulbSize.IsEmpty Then - FocusScales = PointF.Empty - Else - With Style.BulbSize - If nAngle = -90 Then - FocusScales = New PointF(.Height, .Width) - ElseIf nAngle = 0 Then - FocusScales = New PointF(.Width, .Height) - Else - Dim nDiag As Single = (.Width + .Height) / 2 - FocusScales = New PointF(nDiag, nDiag) - End If - End With - End If - End Sub - - Private nAngle As Single - Private nRadius As Single - - Private Sub LeftRightFromCap(ByVal nCap As SegmentCap, ByVal nWidth As Single, ByVal nCapangle As Single, _ - ByRef nLeft As Single, ByRef nRight As Single, ByRef nDelta As Single) - Select Case nCap - Case SegmentCap.Standard, SegmentCap.Flat - nLeft = nWidth / 2.0 - nRight = nWidth / 2.0 - Case SegmentCap.Left - nLeft = 0 - nRight = nWidth - Case SegmentCap.Right - nLeft = nWidth - nRight = 0 - Case SegmentCap.MoreLeft - nLeft = nWidth / 4.0 - nRight = nWidth * 3.0 / 4.0 - Case SegmentCap.MoreRight - nLeft = nWidth * 3.0 / 4.0 - nRight = nWidth / 4.0 - End Select - nDelta = nLeft - nLeft = Math.Tan(nCapangle / 180 * Math.PI) * nLeft - nRight = Math.Tan(nCapangle / 180 * Math.PI) * nRight - End Sub - - Private Sub PaintSegment(ByVal oGraphics As Graphics, ByVal oBrush As Brush, ByVal oPen As Pen, ByVal oPath As GraphicsPath) - If Style.WireFrame Then - oGraphics.DrawPath(oPen, oPath) - Else - oGraphics.FillPath(oBrush, oPath) - End If - Dream7Display.SegmentPaintCounter += 1 - End Sub - - Private Sub GetGlassData() - If oGlassPath Is Nothing Then - oGlassPath = New GraphicsPath() - If nRadius > 0 Then - oGlassPath.AddEllipse(Points(0).X, Points(0).Y, nRadius, nRadius) - Else - oGlassPath.AddPolygon(Points) - End If - SetBulbSize() - End If - End Sub - - Private oLightPath As GraphicsPath - Private oLightBrush As PathGradientBrush - Private Sub GetLightData() - If oLightPath Is Nothing Then - CreateLightData() - oLightPath = New GraphicsPath() - If nRadius > 0 Then - oLightPath.AddEllipse(LightDot) - Else - oLightPath.AddClosedCurve(Lights, 0.5) - End If - SetBulbSize() - End If - If oLightBrush Is Nothing Then - ' create light brush - oLightBrush = New PathGradientBrush(oLightPath) - oLightBrush.SurroundColors = New Color() {Color.Transparent} - oLightBrush.CenterColor = Color.FromArgb(255, Style.LightColor) - ' huge performance impact - If Not FocusScales.IsEmpty Then oLightBrush.FocusScales = FocusScales - 'oLightBrush.SetSigmaBellShape(1, 0.6) - End If - End Sub - - Private Sub ResetCacheData() - If oGlassPath IsNot Nothing Then oGlassPath.Dispose() - oGlassPath = Nothing - If oLightPath IsNot Nothing Then oLightPath.Dispose() - oLightPath = Nothing - If oLightBrush IsNot Nothing Then oLightBrush.Dispose() - oLightBrush = Nothing - End Sub - - Private Sub SetTransform(ByVal oGraphics As Graphics) - Dim oMatrix As Matrix - If oExternMatrix Is Nothing Then oMatrix = New Matrix Else oMatrix = oExternMatrix.Clone - oMatrix.Multiply(oOwnMatrix) - oGraphics.Transform = oMatrix - End Sub - - Private oOwnMatrix As Matrix - Private oExternMatrix As Matrix - Public Sub Transform(ByVal oMatrix As Matrix) - Me.oExternMatrix = oMatrix - End Sub - -#End Region - -End Class - -#Region "helper classes" - -Friend Class SegmentList - Inherits Generic.List(Of Segment) - - Public Sub Transform(ByVal oMatrix As Matrix) - For Each oSegment As Segment In Me - oSegment.Transform(oMatrix) - Next - End Sub -End Class - -Friend Enum SegmentCap - Standard = 0 - Flat = 1 - MoreLeft = 2 - Left = 3 - MoreRight = 4 - Right = 5 -End Enum - -#End Region diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Dream7/SegmentNumber.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Dream7/SegmentNumber.vb deleted file mode 100644 index 723909c..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Dream7/SegmentNumber.vb +++ /dev/null @@ -1,327 +0,0 @@ -Imports System.Drawing.Drawing2D -Imports System.Drawing - -Friend Class SegmentNumber - Private oSegments As New SegmentList - Private oSegmentStyle As New SegmentStyle - - Private Property Type As SegmentNumberType - Private Property Thickness As Single = 16.0 - -#Region "invalidate handler for the parent control" - - Public Event Invalidated As EventHandler - - Public Sub OnInvalidated() - RaiseEvent Invalidated(Me, New System.EventArgs) - End Sub - -#End Region - -#Region "public methods" - - Public Sub Init(ByVal nLocation As PointF, ByVal nType As SegmentNumberType, ByVal oMatrix As Matrix, ByVal nThickness As Single) - If Me.Type <> nType OrElse Me.Thickness <> nThickness Then - InitSegments(nType, nThickness) - DisplayCharacter(sCharacter) - End If - InitMatrix(nLocation, oMatrix) - End Sub - - Public Sub AssignStyle() - For Each oSegment As Segment In oSegments - oSegment.AssignStyle() - Next - OnInvalidated() - End Sub - - Public Sub Draw(ByVal oGraphics As Graphics) - oGraphics.ResetTransform() - oGraphics.CompositingMode = CompositingMode.SourceCopy - oGraphics.ExcludeClip(GetSegmentRegions) - oGraphics.FillPath(Brushes.Black, Me.Bounds) - oGraphics.ResetClip() - For Each oSegment As Segment In oSegments - If oSegment.IsOn Then Continue For - oSegment.Draw(oGraphics) - Next - If Style.Glow > 0 Then - oGraphics.CompositingMode = CompositingMode.SourceOver - For Each oSegment As Segment In oSegments - If Not oSegment.IsOn Then Continue For - oSegment.DrawLight(oGraphics) - Next - Else - oGraphics.CompositingMode = CompositingMode.SourceCopy - End If - oGraphics.ResetClip() - For Each oSegment As Segment In oSegments - If Not oSegment.IsOn Then Continue For - oSegment.Draw(oGraphics) - Next - oGraphics.ResetClip() - oGraphics.ResetTransform() - End Sub - -#End Region - -#Region "public properties" - - Public ReadOnly Property Bounds As GraphicsPath - Get - Dim oBounds As New RectangleF(-14, -14, 173, 272) - Dim oRegion As New GraphicsPath() - oRegion.AddRectangle(oBounds) - oRegion.Transform(oNumberMatrix) - Return oRegion - End Get - End Property - - Public ReadOnly Property Style As SegmentStyle - Get - Return oSegmentStyle - End Get - End Property - - Private sCharacter As String - Public Property Character As String - Get - Return sCharacter - End Get - Set(ByVal value As String) - sCharacter = value - DisplayCharacter(sCharacter) - End Set - End Property - -#End Region - -#Region "segment coordinates" - - Private Sub InitSegments(ByVal nType As SegmentNumberType, ByVal nThickness As Single) - oSegments.Clear() - Dim TH As Single = nThickness - Dim T4 As Single = TH / 4.0 - Dim T2 As Single = TH / 2.0 - Me.Type = nType - Me.Thickness = TH - Select Case nType - Case SegmentNumberType.SevenSegment - oSegments.AddRange(New Segment() { _ - New Segment("a", T4 + 2, TH, TH, 120 - T2, -90, SegmentCap.MoreRight, SegmentCap.MoreRight), _ - New Segment("b", 124 - TH, T4 + 2, TH, 110 - T4, 0, SegmentCap.MoreRight, SegmentCap.Standard), _ - New Segment("c", 124 - TH, 116, TH, 110 - T4, 0, SegmentCap.Standard, SegmentCap.MoreRight), _ - New Segment("d", T4 + 2, 228, TH, 120 - T2, -90, SegmentCap.MoreLeft, SegmentCap.MoreLeft), _ - New Segment("e", 0, 116, TH, 110 - T4, 0, SegmentCap.Standard, SegmentCap.MoreLeft), _ - New Segment("f", 0, T4 + 2, TH, 110 - T4, 0, SegmentCap.MoreLeft, SegmentCap.Standard), _ - New Segment("g", T2 + 2, 114 + T2, TH, 120 - TH, -90), _ - New Segment(135 - T4 * 5, 228 - T4 * 5, TH) _ - }) - Case SegmentNumberType.FourteenSegment - Dim nAngleDiag As Single = 26.5 + T4 - Dim MT As Single = TH - T4 - Dim nSinA As Single = Math.Sin(nAngleDiag / 180.0 * Math.PI) - Dim nCosA As Single = Math.Cos(nAngleDiag / 180.0 * Math.PI) - Dim nTanA As Single = Math.Tan(nAngleDiag / 180.0 * Math.PI) - Dim nDiagX As Single = nCosA * MT - Dim nDiagY As Single = nSinA * MT - Dim nDiagHeight As Single = (58 - TH - MT / 2) / nSinA + MT / nTanA - oSegments.AddRange(New Segment() { _ - New Segment("a", T4 + 2, TH, TH, 120 - T2, -90, SegmentCap.MoreRight, SegmentCap.MoreRight), _ - New Segment("b", 124 - TH, T4 + 2, TH, 110 - T4, 0, SegmentCap.MoreRight, SegmentCap.Standard), _ - New Segment("c", 124 - TH, 116, TH, 110 - T4, 0, SegmentCap.Standard, SegmentCap.MoreRight), _ - New Segment("d", T4 + 2, 228, TH, 120 - T2, -90, SegmentCap.MoreLeft, SegmentCap.MoreLeft), _ - New Segment("e", 0, 116, TH, 110 - T4, 0, SegmentCap.Standard, SegmentCap.MoreLeft), _ - New Segment("f", 0, T4 + 2, TH, 110 - T4, 0, SegmentCap.MoreLeft, SegmentCap.Standard), _ - New Segment("g1", T2 + 2, 114 + T2, TH, 59 - T2, -90, SegmentCap.Standard, SegmentCap.Flat), _ - New Segment(135 - T4 * 5, 224 - T4 * 6, TH), _ - New Segment("h", TH - nDiagX + 2, TH + 2 + nDiagY, MT, nDiagHeight, -nAngleDiag, SegmentCap.Right, SegmentCap.Left, 90 - nAngleDiag), - New Segment("i", 62 - MT / 2, TH + 2, MT, 110 - TH - T2, 0, SegmentCap.Flat, SegmentCap.Flat), _ - New Segment("j", 122 - TH, TH + 2, MT, nDiagHeight, nAngleDiag, SegmentCap.Left, SegmentCap.Right, 90 - nAngleDiag), - New Segment("g2", 63, 114 + T2, TH, 59 - T2, -90, SegmentCap.Flat, SegmentCap.Standard), _ - New Segment("m", MT / 2.0 - nDiagX + 64, 116 + T2 + nDiagY, MT, nDiagHeight, -nAngleDiag, SegmentCap.Right, SegmentCap.Left, 90 - nAngleDiag), _ - New Segment("l", 62 - MT / 2, 116 + T2, MT, 110 - TH - T2, 0, SegmentCap.Flat, SegmentCap.Flat), _ - New Segment("k", 60 - MT / 2, 116 + TH / 2, MT, nDiagHeight, nAngleDiag, SegmentCap.Left, SegmentCap.Right, 90 - nAngleDiag), _ - New Segment(131 - T4 * 5, 230 - T4 * 4, TH) _ - }) - Case SegmentNumberType.TenSegment - oSegments.AddRange(New Segment() { _ - New Segment("a", T4 + 2, TH, TH, 120 - T2, -90, SegmentCap.MoreRight, SegmentCap.MoreRight), _ - New Segment("b", 124 - TH, T4 + 2, TH, 110 - T4, 0, SegmentCap.MoreRight, SegmentCap.Standard), _ - New Segment("c", 124 - TH, 116, TH, 110 - T4, 0, SegmentCap.Standard, SegmentCap.MoreRight), _ - New Segment("d", T4 + 2, 228, TH, 120 - T2, -90, SegmentCap.MoreLeft, SegmentCap.MoreLeft), _ - New Segment("e", 0, 116, TH, 110 - T4, 0, SegmentCap.Standard, SegmentCap.MoreLeft), _ - New Segment("f", 0, T4 + 2, TH, 110 - T4, 0, SegmentCap.MoreLeft, SegmentCap.Standard), _ - New Segment("g1", T2 + 2, 114 + T2, TH, 69 - T2, -90, SegmentCap.Standard, SegmentCap.Standard), _ - New Segment("g2", 73, 114 + T2, TH, 49 - T2, -90, SegmentCap.Standard, SegmentCap.Standard), _ - New Segment("i", 72 - T2, T2 + 2, TH, 110 - T2, 0, SegmentCap.Standard, SegmentCap.Standard), _ - New Segment("l", 72 - T2, 116, TH, 110 - T2, 0, SegmentCap.Standard, SegmentCap.Standard) - }) - End Select - For Each oSegment As Segment In oSegments - oSegment.Style = oSegmentStyle - Next - End Sub - -#End Region - -#Region "private methods" - - Private oNumberMatrix As Matrix - Private Sub InitMatrix(ByVal nLocation As PointF, ByVal oMatrix As Matrix) - oMatrix = oMatrix.Clone - oMatrix.Translate(nLocation.X, nLocation.Y) - oNumberMatrix = oMatrix - oSegments.Transform(oMatrix) - End Sub - - Private Function SetSegmentState(ByVal oSegment As Segment, ByVal bIsOn As Boolean) As Boolean - If oSegment.IsOn = bIsOn Then Return False - oSegment.IsOn = bIsOn - Return True - End Function - - Private Function GetSegmentRegions() As Region - Dim oRegion As New Region(RectangleF.Empty) - For Each oSegment As Segment In oSegments - Dim oPath As GraphicsPath = oSegment.GlassPathTransformed - oPath.Transform(oNumberMatrix) - oRegion.Union(oPath) - Next - Return oRegion - End Function - -#End Region - -#Region "character and bitflag display" - - Friend Sub DisplayCharacter(ByVal sCharacter As String) - Dim sSegments As String = String.Empty - If Not String.IsNullOrEmpty(sCharacter) Then - Select Case Type - Case SegmentNumberType.SevenSegment - Select Case sCharacter(0) - Case "0"c : sSegments = "abcdef" - Case "1"c : sSegments = "bc" - Case "2"c : sSegments = "abdeg" - Case "3"c : sSegments = "abcdg" - Case "4"c : sSegments = "bcfg" - Case "5"c : sSegments = "acdfg" - Case "6"c : sSegments = "acdefg" - Case "7"c : sSegments = "abc" - Case "8"c : sSegments = "abcdefg" - Case "9"c : sSegments = "abcdfg" - Case "A"c, "a"c : sSegments = "abcefg" - Case "B"c, "b"c : sSegments = "cdefg" - Case "C"c, "c"c : sSegments = "adef" - Case "D"c, "d"c : sSegments = "bcdeg" - Case "E"c, "e"c : sSegments = "adefg" - Case "F"c, "f"c : sSegments = "aefg" - End Select - Case SegmentNumberType.TenSegment - Select Case sCharacter(0) - Case "0"c : sSegments = "abcdefjk" - Case "1"c : sSegments = "il" - Case "2"c : sSegments = "abdeg1g2" - Case "3"c : sSegments = "abcdg2" - Case "4"c : sSegments = "bcfg1g2" - Case "5"c : sSegments = "acdfg1g2" - Case "6"c : sSegments = "acdefg1g2" - Case "7"c : sSegments = "abc" - Case "8"c : sSegments = "abcdefg1g2" - Case "9"c : sSegments = "abcdfg1g2" - Case "A"c, "a"c : sSegments = "abcefg" - Case "B"c, "b"c : sSegments = "cdefg" - Case "C"c, "c"c : sSegments = "adef" - Case "D"c, "d"c : sSegments = "bcdeg" - Case "E"c, "e"c : sSegments = "adefg" - Case "F"c, "f"c : sSegments = "aefg" - End Select - Case SegmentNumberType.FourteenSegment - Select Case sCharacter(0) - Case "0"c : sSegments = "abcdefjk" - Case "1"c : sSegments = "bcj" - Case "2"c : sSegments = "abdeg1g2" - Case "3"c : sSegments = "abcdg2" - Case "4"c : sSegments = "bcfg1g2" - Case "5"c : sSegments = "acdfg1g2" - Case "6"c : sSegments = "acdefg1g2" - Case "7"c : sSegments = "abc" - Case "8"c : sSegments = "abcdefg1g2" - Case "9"c : sSegments = "abcdfg1g2" - Case "A"c, "a"c : sSegments = "abcefg1g2" - Case "B"c, "b"c : sSegments = "abcdg2il" - Case "C"c, "c"c : sSegments = "adef" - Case "D"c, "d"c : sSegments = "abcdil" - Case "E"c, "e"c : sSegments = "adefg1" - Case "F"c, "f"c : sSegments = "aefg1" - Case "G"c, "g"c : sSegments = "acdefg2" - Case "H"c, "h"c : sSegments = "bcefg1g2" - Case "I"c, "i"c : sSegments = "adil" - Case "J"c, "j"c : sSegments = "bcde" - Case "K"c, "k"c : sSegments = "efg1jm" - Case "L"c, "l"c : sSegments = "def" - Case "M"c, "m"c : sSegments = "bcefhj" - Case "N"c, "n"c : sSegments = "bcefhm" - Case "O"c, "o"c : sSegments = "abcdef" - Case "P"c, "p"c : sSegments = "abefg1g2" - Case "Q"c, "q"c : sSegments = "abcdefm" - Case "R"c, "r"c : sSegments = "abefg1g2m" - Case "S"c, "s"c : sSegments = "acdfg1g2" - Case "T"c, "t"c : sSegments = "ail" - Case "U"c, "u"c : sSegments = "bcdef" - Case "V"c, "v"c : sSegments = "efjk" - Case "W"c, "w"c : sSegments = "bcefkm" - Case "X"c, "x"c : sSegments = "hjkm" - Case "Y"c, "y"c : sSegments = "hjl" '"bfg1g2l" - Case "Z"c, "z"c : sSegments = "adjk" - End Select - End Select - If sCharacter.EndsWith(".") Then sSegments &= "." - End If - Dim bAnyChange As Boolean = False - For Each oSegment As Segment In oSegments - bAnyChange = bAnyChange Or SetSegmentState(oSegment, sSegments.Contains(oSegment.Name)) - Next - If bAnyChange Then OnInvalidated() - End Sub - - Friend Sub DisplayBitCode(ByVal nValue As Long) - Dim nSegment As Long - Dim bAnyChange As Boolean = False - For Each oSegment As Segment In oSegments - If Type = SegmentNumberType.TenSegment AndAlso oSegment.Name = "g2" Then - bAnyChange = bAnyChange Or SetSegmentState(oSegment, (nValue And (2 ^ (nSegment - 1))) > 0) - Else - bAnyChange = bAnyChange Or SetSegmentState(oSegment, (nValue And (2 ^ nSegment)) > 0) - End If - nSegment += 1 - Next - If bAnyChange Then OnInvalidated() - End Sub - -#End Region - -End Class - -#Region "helper classes" - -Public Enum SegmentNumberType - SevenSegment = 7 - TenSegment = 10 - FourteenSegment = 14 -End Enum - -Friend Class SegmentStyle - Public Property OffColor As Color = Color.FromArgb(255, 20, 20, 20) - Public Property LightColor As Color = Color.FromArgb(254, 90, 50) - Public Property GlassColor As Color = Color.FromArgb(254, 50, 25) - Public Property GlassColorCenter As Color = Color.FromArgb(254, 50, 25) - Public Property GlassAlpha As Integer = 140 - Public Property GlassAlphaCenter As Integer = 255 - Public Property Glow As Single = 10 - Public Property BulbSize As SizeF = SizeF.Empty - Public Property WireFrame As Boolean = False -End Class - -#End Region diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formBackglass.Designer.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formBackglass.Designer.vb deleted file mode 100644 index bccf1f2..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formBackglass.Designer.vb +++ /dev/null @@ -1,47 +0,0 @@ - _ -Partial Class formBackglass - Inherits System.Windows.Forms.Form - - 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. - _ - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - Try - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - Finally - MyBase.Dispose(disposing) - End Try - End Sub - - 'Wird vom Windows Form-Designer benötigt. - Private components As System.ComponentModel.IContainer - - 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich. - 'Das Bearbeiten ist mit dem Windows Form-Designer möglich. - 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. - _ - Private Sub InitializeComponent() - Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(formBackglass)) - Me.SuspendLayout() - ' - 'formBackglass - ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.BackgroundImageLayout = System.Windows.Forms.ImageLayout.None - Me.ClientSize = New System.Drawing.Size(564, 594) - Me.ControlBox = False - Me.DoubleBuffered = True - Me.Font = New System.Drawing.Font("Tahoma", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None - Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) - Me.MaximizeBox = False - Me.MinimizeBox = False - Me.Name = "formBackglass" - Me.StartPosition = System.Windows.Forms.FormStartPosition.Manual - Me.Text = "Backglass" - Me.ResumeLayout(False) - - End Sub -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formBackglass.resx b/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formBackglass.resx deleted file mode 100644 index 6a23e00..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formBackglass.resx +++ /dev/null @@ -1,1734 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs5gG9ubgOinaELHVS - bz15XXQ8m5OWGLWzsQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAC0q645l2mRt4U1f/5+J3v/eyp4/4FLgfKfip5+u7S3GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAC9r7capHabrqE8mf+gPJn/nkCY/59Hm/+fTpz/oWWk+6ucqnDp6OMCAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAua+zP6NRnPinQ6H/pUKd/6RHnP+lUJ//qFmk/61s - rv+si67Ev7a/GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSZn2elVaP/oUef/55G - m/+cSZj/nk+Z/59VnP+maKb/p4Wr4rOpszIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAC6tLY5m2ef95teof+aX57/mV+c/5Vbmf+WXJv/m2ig/6OLp8G+t74aAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAuLG2G56Go7eac6T/m3ek/5h0oP+TbZz/j2mZ/5Z0n/6mnad36+rlAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsp6xTlX+g95N7n/+Pd5r/h3CU/4Zw - lf+WiJ3HvLq8JgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAure5FZWP - n6p5cZL/dG2O/2hihP9ubIv+paSnY+zs5gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAKmrrQ6gpqceztTRCuzs5gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - Jf8JKDH/CSw4/wouOv8LKzf/DCg0/wsvQv8FOlX/AVFy/wFWf/8Beq//AYCt/wF0of8BZ5n/CEBb/xI5 - Sv8fLTD/KzQ3/ys9Qv8jQEr/F0JV/wo+VP8ENUv/eX+DiszNyQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAC6urYYSkxL4ggQGP8IEh7/CBIe/wgVI/8KHS7/CyIv/wskMf8LIiz/CRIW/wkR - FP8HDA//BwwP/wkVGP8KHyX/CyYu/wsoMv8MKDP/DCYv/wwjK/8MKDf/Ci5E/wYxSv8BRWH/AlFs/wNX - gf8DY5D/BlB7/wkrOP8PIST/EiEj/xYjJv8aJyr/Gyov/yE1RP8jOVH/ECw+/2lubpiVmJURAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuLi0GzI0OPoIFyb/BC5A/wYXLf8IGC7/DCI2/wwi - M/8MITD/DB8s/woXH/8JERb/BgsO/wYLDv8IEhX/Chsh/wsdJP8LHSX/DB0l/wwcI/8LGyL/Cxsj/wwd - Kf8KIDD/CSIy/wVDZv8EOVf/CiUz/wwgKv8MHiT/DB0i/w0bHv8PHB7/EB0g/w8dIP8QHyP/ER8n/w4Z - IP9XWVi24uLdBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqamDMaISr+ByEs/wM1 - RP8GFiv/CRgt/w0gMP8MHi7/DB8x/wwgMf8MHCv/CRAW/wYKDv8HCw7/CBAT/woYH/8LGyP/Cxol/wwa - Jf8MGiP/DBkg/wwYIv8LGSX/Choo/wocLP8LHS7/DCEy/wsiMP8MICr/DR8n/wwdI/8MHCD/DRwe/w0c - Hv8KGhz/CBkc/wgbIP8IGiD/UlRTzuzs5gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB8fnxQCxki/wgjK/8FLjj/BhYq/woXLf8NGyv/DBws/w0eMP8NHS7/DBcj/wkNEv8HCw//BwoO/wgO - Ev8KFBr/CxYe/w0YIP8NGCD/DRcg/wwXHv8MFh7/DBYf/wwXIf8LGCT/DBop/wsbKv8LGyb/Chsj/wsb - Iv8LHCL/Cx0i/wwfJP8MHyL/Chse/wcaHf8GHCD/BCEr/0FHS+zl5d8FAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAbW9uZQkXIf8JIyn/CCkv/wgXKP8LFin/DRkp/w0YJv8NGir/DRgo/w0V - H/8LEBX/BwsP/wcLDv8KEBT/ChMX/wsVGv8NFhz/DRce/w0WHf8NFhz/DRQa/w0VGv8MFRz/DBYe/w0Y - If8NGSL/DBok/wsZIv8LGiH/Cxsh/wweJf8MISr/CyUu/wojLf8HGRz/Bhoe/wQgK/8yPkf6rK2qEQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBjYnIIGSH/CiIn/wkjKv8IFiX/CxUm/w0X - Jv8NFiT/Dhkl/w4ZJf8NFB7/CxEW/wgMD/8IDA//DBMW/wsTFv8LExf/CxMY/wwTGf8MExj/DBMX/wwT - Fv8NExf/DBQY/w0VG/8NFx3/DRgf/w0YH/8NGB7/DBkf/w0ZIP8NGyP/DR8o/wwiLv8LISv/CBYZ/wga - Hv8FHyv/MT5K/W9ydBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5e3pVER8l/wof - JP8KHyb/CRUj/yUpMf1RU1XSV1lasFdZWsAzNjv4DBQc/wsRFv8IDA//BwsO/wsRFf8LExb/CxIV/wsR - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ13vBWBW3RxbUtIqYVjfH3N2kHw/S1f/MkFG/yg1 - OP8jMDL/ICss/xwjKP8TFx3/DRAU/woOD/8KDA3/CQsM/wkLDP8ICgv/CAsM/wgLDv8JDA//CgwP/woM - Dv8KCw//CwsP/w0NEP8MDRH/DQ4R/w0PEv8NEBL/DxIT/w8UFf8PFRf/DxYZ/xAYGv8PGh3/DRgb/w0V - GP8NFRn/Dhkh/xAcLP8VIjf/OD9Q+qSizRhnXu8IZ17vBmdd7wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ13vA1NJvjYpGUqnIQ4szicX - RL1MR2zJTU5y/01ReP9AR3L/Nj1q/y4zW/8oLE3/ISQ//xYZLf8OEBv/CwwQ/wkMDf8JCw3/CQsM/wkL - DP8KDA3/CQwN/wsLDv8MCw7/DAsP/wsLEP8NDBD/DQ0Q/w0OEf8ODxP/DhAT/w4RFP8PExT/EBQW/w8V - GP8PFxr/Dhkd/w4XG/8QFyX/Gx9B/ycpX/8sLmn/LC1m/z48avdFPYSGOzCBfkI4lGVVSsE8ZVroF2dc - 7wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1zvAWdd - 7ws+M4htHAUL6xwFC/0cBQv9HwwQ/SMVF/8oHh3/KSEk/ysmNP8pJEf/LCVU/y4pX/8uKmX/LCll/yUk - WP8XFzb/DhAb/wwMD/8LCw3/CwwN/wwMEv8QDx7/EBAh/xEQIv8RECL/EhEk/xUULP8WFjD/FhYx/xgZ - N/8bHED/HB1B/x8gSP8fIkr/Fxwz/xEbJ/8eIUj/LCpm/yomXf8hGDn/GwsU/xwID/8fDBH+HAYM+BwF - C/YcBQvwHggY2TAiYaFRRrlIZlzvDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAZVrqDFRJwDBQRbZBVErAbCgZSdgcBQv8HAUL/xwFC/8cBQv/HAYM/x0GDP8cBwz/HAcM/xwG - DP8cBgz/HAcN/x0MHf8kGUL/LCZf/ysoY/8aGTv/Dw4X/w8PG/8hIE3/Kidh/ywpZv8sKGP/Kydf/yol - XP8sJ2D/LShj/yslXf8qI1f/KyNa/yghVP8mHUr/Jh5K/y0rZv8uL23/KyZd/x0OI/8cBg3/HAUL/xwF - C/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/4cBQv3IQ8vzko/qFxmW+4LAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAZlvvB0c8oVQiGjPHIzBF3yMcOtslFTvrHAUL/RwFC/8cBQv/HAUL/xwF - C/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwGDP8gEzH/Lill/yMhUv8gH0v/KCJV/xsH - E/8bBQv/GwUL/xsFC/8bBQv/GwUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8eDyT/KiFU/xsH - Dv8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/okEjrDWEzKOGZb - 7wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZb7gw5LHp7Llh371Cv6/5NquP+RZbJ/jt8 - p/8wX4D/KERd/yAkNP8dDxn/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xsH - D/8rJVz/NDJ5/yEVN/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwF - C/8cBQv/HAUL/xwGDP8gIjH/LVVz/zh0nf8+hLH/QIq5/z2Cr/81bZP/JTlQ/xwGDP8cBQv/HAUL/xwF - C/8cBQv+HAUL8TsugYBmW+8NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnXO8DU0i+Oikc - TbMrT2zxSqTb/1O59/9Tuff/U7j2/1K28/9Qse3/TKjh/0eb0P9Aibj/NWyR/yhEXf8dDxn/HAUL/xwF - C/8cBQv/HAUL/xwFC/8cBQv/HAgW/zIrav8oHEj/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwG - DP8cCBD/HAcP/xwFC/8cBQv/HAUL/yhDXf9Aibj/T67o/1K29P9QsOv/Tarj/1G18v9Tuff/U7n3/1Cy - 7v89ga7/Hhkm/xwFC/8cBQv/HAUL/xwFC/spGUq0YlfkIGZb7wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAGdc7wZeU9k0MSRmuDh2n/tTuff/U7n3/1O59/9Tuff/U7n3/1K29P9Qs+//U7j2/1O5 - 9/9RtfL/SZ/V/zVrkf8eFyP/HAUL/xwFC/8cBQv/HAUL/y1ScP82b5b/OHSc/zp6pf86e6b/O32o/z6D - sP9BjLz/Q5DC/0WWyf9IntP/SqLZ/0KOv/8dEx7/HAoT/zdymv9Qsez/U7n3/06s5v81a5H/Ii1A/yId - MP8uUm//Tani/1O59/9Tuff/U7j2/z+GtP8cCRH/HAUL/xwFC/8cBQv+IAwn0VlNzTZmW+8CAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnXO8BZlvtHC0eWK89ga77U7n3/1O59/9Tuff/U7n3/1Cy - 7f8uVXT/Hhso/zFggv9OrOb/U7n3/1O59/9Tufb/SJ3S/yU8U/8cBQv/HAUL/xwGDf9DkcP/U7n3/1O5 - 9/9Tuff/U7n3/1O59/9Tuff/U7n3/1O59/9Tuff/U7n3/1O59/9StvP/J0Jb/ypKZf9StfL/U7n3/0+v - 6v8qTGj/HAUL/yASIP9UUI//Xld0/zxlhv9TuPb/U7n3/1O59/9RtfH/Kkxo/xwFC/8cBQv/HAUL/h4J - HtdUSMA7ZlvvAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1zvAl5T2S4jFTXJR5rO/VO5 - 9/9Tuff/U7n3/1O59/9Ek8X/HAYN/xwFC/8cBQv/MF5//1K39f9Tuff/U7n3/1O59/9LpNz/Ii5B/xwF - C/8cBQv/ICQ0/0ORw/9TuPb/U7n3/1O59/9Tuff/U7n3/1O59/9Tuff/U7n3/1O59/9Tuff/U7n3/zt9 - qP8vWnr/U7j2/1O49v86eKH/HAUL/xwGDP83Lz7/h4Gb/5qQrP9GUGD/UbPv/1O59/9Tuff/U7n3/zyA - rP8cBQv/HAUL/xwFC/0hDzDLXFDVMWZb7wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdc - 7wNQRbZJISQ33k2r5P5Tuff/U7n3/1O59/9Tuff/O3ym/xwFC/8cBQv/HAUL/x8eLP9NqeL/U7n3/1O5 - 9/9Tuff/U7n3/zt7pv8cBQv/HAUL/xwFC/8fHCn9QIm5/lO49v9Pr+r/Q5HC/z+Htf88gKv/Onmj/zp4 - ov89ga7/RpjM/1K28/9MqOD/Llh3/1O49v9QsOv/JC9B/SMVGPwvJib/c2+F/7SuyP+Oh5j/QGaF/1O4 - 9f9Tuff/U7n3/1O59/9Gl8v/HAoS/xwFC/8cBQv3MCJjnWVa7RcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABmXO8IQzeVaCxPXu1cyPX/Vb33/1O59/9Tuff/U7n2/y9be/8cBQv/HAUL/xwF - C/8dERv/S6Xd/1O59/9Tuff/U7n3/1O59/9Gl8v/HAUL/xwFC/8cBQv5LB9S0ykhOt9AhrT8UbPv/zhz - nP8dERv/Kx1O/yYXPv8cBQv/HAUL/xwGDf8zZor/UbTw/zdxmf9Qs+//R5zQ/SgbNN1dWJ+KenemhpCO - u792c4fxQU5g/0ym3v9Tuff/U7n3/1O59/9Uu/f/TaXR/x0NFf8cBQv8Hwoh1E9DtExmW+8FAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZlvvDzcqdYw+e471Z9z7/2bZ+/9fzvn/V8H4/1G0 - 8P8lOlD/HAUL/xwFC/8cBQv/JDRI/1Cw7P9Tuff/U7n3/1O59/9Tuff/RpjM/xwFC/8cBQv8Hgoe1lFK - t1xSS65eOjZH2Tp7pv9RtfH/Qo6//yQsRP8vIVf/HAYO/xwFC/8cBQv/HAcO/zZwlv81ao//SqHX/z6C - r/oqHU+wZV3pKVhPyD8vI12nLExo8Uyn4P9Tuff/U7n3/1a/+P9dy/n/ZNf6/02huP8cBgz9HQcW4EE1 - knJlWuwUZlrvAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRZ6RssHVatSpqz+mXa - +/9l2fv/Zdr7/2XZ+/9awOP/Hxwm/xwFC/8cBQv/HAYM/zl2n/9Tuff/U7n3/1O59/9Tuff/U7n3/z2C - rv8cBQv2IA0o0EI6kW1nYewToZ/bF3BtnZchFzX/O3yn/1K39P9Kotn/KERe/xwFDP8cBQv/HAUL/xwF - C/8cBQv/HAUL/yIwRPwhIDXZRz6ecFRLvlcnGUO+M2iM9U+w6v5VvPf/W8b4/2HR+v9l2Pv/Zdr7/2LS - 8v8xXGv8HggY4EAzjH9eU9o9TECsSlVJxTNmWu0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZb - 7wFcUNUuIxE2ylSy0P1k1/r/ZNf6/2TX+v9k1/r/W8Pj/yU2Qf8cBQv/HhMa/zx4j/9Vu+7/VLr3/1O5 - 9/9Tuff/U7n3/1G08f8rT2v1NSpvp1VNv0JoYu8OgHzvAcXFwShPTlveMCts/yEVM/8/hbP/U7n3/0+u - 6f8vXH3/HAYN/xwFC/8cBQv/HAUL/xwFC/8cBQzySD+gjldPx10kFznHPoGi+VrF9f9g0Pn/Y9b6/2TX - +v9k1/r/ZNf6/2PV+P9EjKT7Hwwi2EI2knVaT9FKJxdGsRwFDOMhDSzDT0K1Q2ZZ7wQAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABmWu8EUES3SSAbKd5bxOf+YtX6/2LV+v9i1fr/YtX6/2LV+v9dyOz/Vrvc/1rC - 5P9h0/f/YtX6/2HT+v9fzvn/XMn5/1W67v83cZj+HQoX7UpBpXJoYe8NAAAAAMTEvxJ+fnuDGBMk/yMf - Tf8zLXH/ISM4/0mg1v9Tuff/UbPw/zNnjP8cBgz/HAUL/xwFC/8cBQv/HAUL+i8hW8ouIVrFQIOb92HS - 9/9i1fr/YtX6/2LV+v9i1fr/YtX6/2HT9/9ImLP7Ihkz0Eo+pmBlW+wfQjeVbxwFC+wcBQv9HAUL8jwv - hH9mWe8MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZlrvCEQ4mmkqSVntX871/2HT+v9h0/r/YdP6/2HT - +v9Us9X/SZq2/1a52/9g0vn/YdP6/17M8f9Vtdb/T6nI/0GGoP8qSVn/HAYN/xwFC/kqHU+xYVreImhh - 7wHJyMMcU1JY1ywnXv8rI1n/NC1z/zUscv8xXXr/WsX2/1vI+f9aw/D/MmB0/xwFC/8cBQv/HAUL/xwF - C/8cBQv7KENS+1zI7f9h0/r/YdP6/2HT+v9h0/r/YdP6/1/P9v9CiqT9IRcv3E5DsmxTSL9OQTWSbTQm - bbYcBQv4HAUL/xwFC/kwIWKiZFfqFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVZ7g44K3mJOnSN9V/Q - +f9g0fr/YNH6/2DR+v9dyvL/KUVU/xwFC/8eFx//RZGu/1/Q+f9dyvL/RpKw/yAlMP8cBQv/HAUL/xwF - C/8cBQv9Hgkc2VNLvT9oYe8Du7u6LkpGZvQvI0r/HAYM/xwGDP8mF0D/Hx8o/1a53v9g0fr/YNH6/1a6 - 3/8iKzb/HAUL/xwFC/8cBQv/HAUL/0CFof9g0fr/YNH6/2DR+v9g0fr/YNH6/13L8v86dIz/HAgP+zUo - cbdUSL9tIRwwzjNiePEeFh75HAUL/xwFC/8cBQv7KRhKsmBT4R1lWO8BAAAAAAAAAAAAAAAAAAAAAAAA - AABjVuYbLR5Yq0aTs/pez/n/Xs/5/17P+f9ez/n/Vrzi/x4XIP8cBQv/HAUL/yMvO/9aw+z/Xs/5/17O - +f9Pqs7/ICcy/xwFC/8cBQv/HAUL/h0GEt9RSbpJaGDvCquqyzNZU3zrMiRJ/xwGDP8cBQv/HAUL/xwF - C/9Jm7z/Xs/5/17P+f9ezvj/PX2Z/xwFC/8cBQv/HAUL/xwFC/9Jnb3/Xs/5/17P+f9ez/n/Xs/5/1zJ - 8v83bof/HAcN/xwFC/4jEjfiMyVqzDlyi/hcyvP/LlVp/xwFC/8cBQv/HAUL+ycVQrZfUt4gZljvAQAA - AAAAAAAAAAAAAAAAAABmWe8DXE/WLyMTNslPq9D9Xsz5/17M+f9ezPn/Xsz5/02lyf8cBgz/HAUL/xwF - C/8eEhr/V73m/17M+f9ezPn/Xsz5/0GJp/8cBQv/HAUL/xwFC/wjETPKXVXWPUY8mlpEPmWgUk171D00 - f/8dCBL/HAUL/xwFC/8cBQv/QIel/17M+f9ezPn/Xsz5/0+q0P8dDRX/HAUL/xwFC/8cBQv+RZGx/17M - +f9ezPn/Xsz5/17M+f9FkbL/HAcO/xwFC/8cBQv/HAUL/hwFC/xEjq7/Xcz4/zp3k/8cBQv/HAUL/RwF - DO40Jm+LY1bqEgAAAAAAAAAAAAAAAGVY7wFkVusQWkzQL0o9qHAhJTLlVrzn/lzK+f9cyvn/XMr5/1zK - +f9Ci6z/HAUL/xwFC/8cBQv/JTlJ/1nC7/9cyvn/XMr5/1zK+f9RsNn/HAkQ/xwFC/8cBQzwNyx1jWJa - 4jkkFzu6PoGg9zdmf/YwJ035KBlF/xwFC/8cBQv/HAUL/0GIqf9cyvn/XMr5/1zK+f9Ts9z/HhUe/xwF - C/4cBQ7vKhtN2zVpgvlbyff/XMr5/1zK+f9cyvn/OHCM/xwFC/8cBQv/HAUL/xwFC/8gIy//U7Te/1zK - +f9Dj7D/HAUL+B8KItg2KHONWk3TKmVY7wMAAAAAAAAAAAAAAABiVOUTNyl3eyMjO80oQFXpQIWo/FrG - 9/9ayPn/Wsj5/1rI+f9ax/j/NGiD/xwFC/8cBQv/HAUL/zp2lf9ax/j/Wsj5/1rI+f9ayPn/UK/a/xwJ - Ef0cBQvtKx1SqFpRzjJiWeIoJhhBuUeZwPtZxPT/RZO4/iU3R/8cBgz/HAUL/yMxQP9Sst7/Wsj5/1rI - +f9ayPn/TKbO/x0NFPwdBhLnNyt1lVNJvmohIjTYTqnS/VrI+f9ayPn/Wsj5/0uhyf8eFyD/HAUL/xwF - C/8hJzT/RpW7/1rH+P9ayPn/QYqt+isbUcFTRr9MZFfrE2ZY7wIAAAAAAAAAAAAAAABlV+8BWEnMJyEP - LL9HmMD6Vr7v/lnF+P9Zxvj/Wcb5/1rG+f9Zxvn/WcX4/z1/of8eGSP/HRAY/yxRaP9Tt+b/Wcb5/1rG - +f9Zxvn/Wcb5/0ONsvwjETbUQDWMelxT1ChnXu8FZ17vDEA1jXEmPlHlUK/d/VnG+P9Vu+z/SqDJ/0aW - vv9RsuD/Wcb4/1nG+f9Zxvn/WcX3/zh0k/kkEzrMQDWNcWFY4R9lW+oWPDGDeiY8T+RNp9L9WcX3/1nG - +f9Zxff/TKXQ/0GKr/9FlLr/UrPi/1nF+P9Xv/D/Rpa9+yU0Rt9CNJNrZVjuDAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAGBS4hc0JW6KIik52StNY+wzZ4TzOXSU9kCHq/lIm8X8UbLh/lfA8/9Ywvb/UrTk/1Cv - 3v9XwPP/WcT4/1nE+P9ZxPj/WMT4/1Ct3P0lNUfjRDqZbWdd7xFnXu8CAAAAAGde8AFjWeQcOS57hCQ0 - R+NJncf8WML1/1nE+P9ZxPj/WMT4/1nE+P9ZxPj/WMP3/0ibxPwhHjPUUEa3U2de7w1nXu8BZ13wAmNZ - 5Rk+Mol2IRkx0TdvjvVKoMv9U7fo/la87v5Wve/+U7bn/kyk0P09f6H5J0BT6ScXRrtEN5plYlXnFmZZ - 7wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlV+8CYVPkF1JEvTxHOaFWQDKPbDstgXo1KHORLB5YryMf - OtAnQVboNWyM9EGMtPlInMn8TajY/U+t3v1OrNz9SJ3J/Dx9ovckMETcOSx6gmNY5BtnXe8BAAAAAAAA - AAAAAAAAZ17vAmNa5RlDOZZrJRs/xTFgffBHmcT8UrTn/lS67v5Uue3+Tqra/Tp5nPciHzfTRDqZamVb - 7BAAAAAAAAAAAAAAAABnXe8BZlvtD1JGukA2KnWIKBpIuyIlO9UkL0LeJDBE3iMjOtYmGUS/MyVrlkc6 - oVxeUdsmZlnvCWZZ7wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlV+8CZVfvA2VY - 7wZlWO8IZlnvDGRX6xhZTM4wSTylUzwvhXkyJGeZKxxUsiUUO8QjEjTMJBM3yCkZSrM1KHGOTEGtT2RZ - 6BVnXO8CAAAAAAAAAAAAAAAAAAAAAAAAAABnXe8BZ13vC1lPzTM8MYR6KRlKtiIkOtYkMkbgJC9D3iIY - M80xJGWcT0SySmZc7A9nXe8BAAAAAAAAAAAAAAAAAAAAAAAAAABmXO8DZlvvDWFW4R5XS8gyUES3OlFF - ujtWSsgyYFPfIGZZ7xBmWe8FZlnvAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZlnvAWZZ7wNmWu8HZlrvDmVZ7hdjV+ghY1jnJmNY - 5yNlWusYZlvvDGZc7wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnXe8CZ13vCmRa - 6RxaT80xVUvEPVZLxTteVNgrZlztE2dd7wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAZlvvAWZa7wFmWu8BZlrvAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAZ1zvAWdc7wJnXO8CZ1zvAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////8B/////////wD/////// - /+AH////////4Af////////gB////////+AH////////4Af////////wD/////////AP//////h/8B/+ - P///+AHwD4Af///4AAAAAB////gAAAAAH///8AAAAAAf///wAAAAAB////AAAAAAD///8AAAAAAP///w - AAAAAA////AAAAAAD///8AAAAAAP///wAAAAAA////AAAAAAD///8AAAAAAP///wAAAAAA////AAAAAA - D///8DgAADwf///8/AAAfz/////+AAB///////4AAH/////8/AAAfz////A4AAA8H///8AAAAAAP///w - AAAAAA///9AAAAAAD///AAAAAAAB//4AAAAAAAB//AAAAAAAAD/4AAAAAAAAH/AAAAAAAAAP8AAAAAAA - AA/wAAAAAAAAB/gAAAAAAAAH+AAAAAAAAAf4AAAAAAAAB/gAAAAAAAAP+AAAAAAAAA/4AAAAAAAAD/gA - AAAAAAAH8AAAAAAAAAPwAAAgAAAAA/AAAAAAAAAD8AAAAAAAAAHwAAAAAAAAAeAAAAAAAAADgAAAAAAA - AAOAAAAAAAAABwAAAAAAAAAfgAAAgAAAAB+AAAHAAOAAP+AAA+AA+AD//4AP+AP/D///////D////ygA - AAAwAAAAYAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsnKY+j1eIvn41eux7PHnpkG6Qm7exsx0AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMC0uhijYZvPoz2c/6BAmf+hSpz/olqi/6iK - qp/Ryc8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKugpUOlT6D+o0Se/6FG - mv+jUJz/p2Cl/6uBruG2rLUfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALOs - rzGdYaH6m1qf/5lbm/+XWJn/mmCe/6OCp9a7s7wXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAALmxtw+dhKS+mnek/5d2oP+QbZr/kXCb/6OTpojr6uUBAAAAAAAAAAAAAAAAAAAAAAAA - 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 - QP8vep3/CkZf/wsPE/8KDA//Cw0Q/wwPEf8NERP/DhMV/w8VF/8iJif7ZWZkoo2OilGNjotUaGlnmjI1 - NvINGiT/NDk+7peYlSIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSWVmWJjU2/yEuL/8gLzD/GiIp/xkcIP8QExb/CQ0P/wkM - Df8ICwz/CAsN/y5GXv8kSWP/Cw8T/woMEP8KDA//CwwQ/wwOEf8NEBL/DhIT/w8VFv8PFhj/EBca/xce - If8WHiH/DRMX/w0XHP8NGiP/Dh4o/2VoaE8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdUtURRz2gQUtBqj1iZoalQEtd/y07Rf8kMDb/ICgt/xcb - I/8NEBX/Cg0O/wkLDP8JCwz/CAoM/wgLDv8JDA7/CgwO/woLD/8LCw//DA0Q/w0OEf8NDxL/DhET/w8T - FP8PFRf/DxcZ/w8aHP8NFxr/DRUa/xAaJ/8XIT3/ICpP/25um1ZiWeMVZVzrC2dd7wIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdd7wU5LXtxHAUO6RwGEOszKzrwPjxV/zw9 - Xv80Nl//Ly9f/y0sX/8mJVb/Gho+/w8QH/8LDRD/CgsN/wsMDf8LDA//DQwT/w0ME/8NDRT/Dg4W/w8P - Gv8QEBv/ERMg/xIVIv8TFyj/Ehgl/w8ZH/8VGzL/JSZY/yknW/8nI1H/JR5D/y8kRNYmFkLGLiFdpEA1 - j15gVd4WZ1zvAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnXO8BXFHUFlFGuDJFO5yDHgkc8hwF - C/8cBQv/HQcN/x0JDv8eCw//HQkP/x0KFP8gESz/Jh1J/ykkWv8kIlP/EhEj/w4NF/8fHkn/JyRa/ygl - W/8mI1b/JyNW/yklXP8nI1f/KSNY/ygjV/8nIVL/KCVY/yorY/8pJVn/HxIt/xwHDv8cBQz/HAUL/xwF - C/8cBQv/HAUL/RwGD/EuIF2mWU7OIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhVuESLSZboDJi - huUtSm3lIR4z+BwGDP8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFDP8hFDb/KiZf/yMh - Uv8kG0X/GwYM/xsFC/8bBQv/GwUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAcO/yYbRf8cBg3/HAYN/x0Q - G/8eGCX/HQwU/xwFC/8cBQv/HAUL/xwFC/8cBQz3NShxjGRZ6wsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABiVuISLSdcpT+GtPdRs+//T67o/0id0v9BjLz/O3um/zNnjP8pSWT/HyEv/xwGDP8cBQv/HAUL/xwF - C/8cBQv/HQsf/zUwdv8lGED/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAkR/ylI - Y/89g6//SJ3T/02p4v9Prej/TKff/0GNvf8nQVr/HAUL/xwFC/8cBQv+IQ0s1ldLyCoAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABmXO8BWE3KJTImaaxCj7/9U7n3/1O59/9Tuff/U7n2/1G18f9StvP/T67o/0OS - w/8sU3H/HAcP/xwFC/8cBQv/ISg6/zFgg/8zZ4v/NGuR/zVtk/84dJz/O32p/z2Cr/9Ai7v/QYy8/yMy - Rv8fHy7/QIm4/1G18f9NqeH/Nm+W/yxPbf89f6v/Urb0/1O59/9Oruj/KEZh/xwFC/8cBQv/HAUO70Y6 - nk9mW+8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZlzuCTQnbZVFlcj8U7n3/1O59/9Tuff/P4a0/x4b - KP8yZIj/ULLu/1O59/9St/T/P4a0/x4WIf8cBQv/K1Bu/1Cx7f9Tuff/U7n3/1O59/9Tuff/U7n3/1O5 - 9/9Tuff/U7n3/zdymv83cZn/U7n3/06s5v8lOVD/HQkP/1RPgf9kXHX/SJfK/1O59/9Tuff/RJXH/xwG - Df8cBQv/HAUL8kE1k1hmW+8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZFjnFCsjU7lNqeL+U7n3/1O5 - 9/9St/T/Kk1p/xwFC/8cBQz/P4e1/1O59/9Tuff/U7j2/zl2oP8cBQv/HAUL/yxUcv9Pruj/U7n3/1Cy - 7v9OrOb/TKjg/0um3v9OrOX/Urf0/0mf1f86eaT/U7n3/zh1nf8dBw3/Myow/5aQp/+Ohpv/R5DA/1O5 - 9/9Tuff/T6/q/yAiMv8cBQv/Hgga5E5Csj5mW+8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWU7NJytD - WNdZwfT/U7r3/1O59/9PsOv/ISc4/xwFC/8cBQv/N3KZ/1O59/9Tuff/U7n3/0ie1P8cBQv/HAUL/iUW - POMwUXDrTarj/zt7pv8fGif/KiBN/x0NFv8eFyL/Llh4/06s5/88f6r/UbXx/yxCXetTTYGjfnqgt4+M - p+9OY3v/ULHs/1O59/9Tuff/VLny/yQ3Sf8cBQv6LiBdoGFW4hEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABmW+8BSj6mRjt0hutn2/v/Y9b6/1zJ+f9Mpdj/HAsU/xwFC/8cBQz/QIq5/1O59/9Tuff/U7n3/0mf - 1f8cBQv+HQgY50Y+nGRWUZ1lNU1q7Eym3/9Cj8D/KzJY/x8KHf8cBQv/HAUL/y1VdP8xYoT/RZXI/Csn - VLliWt8wOC55hzJgg+xPr+r/VLv3/1nE+P9g0Pr/Xsfl/x8eJvsmFkS/VkvHNWVa7gcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABmW+8DPTGHbEeUrfZk2Pv/ZNj7/2TY+/9QqcX/HAUL/xwFC/8sUGn/ULHs/1O5 - 9/9Tuff/U7n3/z6Fs/wmF0LKQjmRYGVf5wysq7stQ0Bu7ClDYf9Nq+X/SqPa/ydDXf8cBQv/HAUL/xwF - C/8cBQv+JxhD2VBHtGYzKmmhO3yi9Fe+8v9dy/n/YtT7/2TY+/9k1vn/QYOZ+igYR75SRrtaNCZtizMm - bYVZTc4bAAAAAAAAAAAAAAAAAAAAAAAAAABmWu8IMydtlFCsyvxi1fr/YtX6/2LV+v9fzvL/T6nI/0+p - yP9ezPD/YND6/1zK+f9ZxPj/TKXa/yQ1S/JMRKtgaGLvBsPDwApubmuTHRk7/y8paP8uWHr/UbXy/06t - 5/8rT2z/HAUL/xwFC/8cBQv/IxE04DkveqxEjab1YdL3/2LW+v9i1fr/YtX6/2LU+f9ImbT4LSNZrFhN - zDQ5LXyCHAUL9hwFC/FBNZNeZlnvAgAAAAAAAAAAAAAAAAAAAABjV+cUKyVVuVi/4/5h0/r/YdP6/2DS - +f9Jm7j/RpOv/1vF6v9h0/r/VLTW/0eWsv83boT/ICQt/xwFC/swJGGeZ2DtDMPDvxhIRlzmKiJU/y4l - YP8wJmL/SZ3E/1zK+f9Yvuf/J0BO/xwFC/8cBQv/HAUL/ipKW/xezfP/YdP6/2HT+v9h0/r/X8/2/0OM - p/0tI1u/UUa7XTYqdYUpGk7RHAUL/hwFC/s2KHOHZlnvBgAAAAAAAAAAAAAAAAAAAABYTc0nLEVd1l3L - 9P9f0Pr/X9D6/1vH7/8hKDP/HAUL/y1TZf9dzPX/Xcrz/0CGo/8cChH/HAUL/xwFC/4lFj/FY1zkGbi4 - wSRMRW32IhAd/xwFC/8dBxL/NmyD/1/P+f9f0Pr/S6DB/xwHDv8cBQv/HAUL/z6Bnf9f0Pr/X9D6/1/Q - +v9dy/T/PHuV/xwHDv04LHq4LStbxEqdvvojMkD+HAUL/xwFC/wvIGCYZVjuCQAAAAAAAAAAAAAAAGZZ - 7wJLPqlGNm2F617M+P9ezfn/Xs35/1Oz2v8cBw7/HAUL/x0RGf9Zwev/Xs35/13L9/82bIX/HAUL/xwF - C/0rHVG0WlLPNE9Jen5RS4PgKx9M/xwFC/8cBQv/KUZX/1zJ9f9ezfn/WsXv/yMyQP8cBQv/HAUL/j6C - n/9ezfn/Xs35/17N+f9DjKv/HAgO/xwFC/8dBhH6KUZZ+1zJ9P8zZHz/HAUL/xwFC/Q3KXd6ZVjvBgAA - AAAAAAAAXlHbD0Y5oEU1J3GcQ42w+VzK+f9cyvn/XMr5/0iav/8cBQv/HAUL/yY7TP9axfP/XMr5/1zK - +f9JnMH/HAUL/hwGEO1COJNpPTKFczx9m/Q+eZf4LCRO/RwGD/8cBQv/LFBk/1vH9v9cyvn/W8j2/ylF - V/8cBQv5LR9Xzy9Vbe1ax/X/XMr5/1zK+f81aoT/HAUL/xwFC/8cBw7/QYqr/1zK+f88fpz9IQ4w2zcp - d4FbTtUaAAAAAAAAAABlV+8DOy2DXzRnhOZHmMD6V7/v/1rH+f9ax/n/Wsf5/0CGqf8cBQv/HAsS/0GK - rv9ax/n/Wsf5/1rH+f9DjrP9IQ8v2TovfnZiWeMTRTubUjVphelYwfL/S6PN/zVqh/8wXXf/TKbQ/1rH - +f9ax/n/VLjn/iElM/AtIFqkWVDNOjInaJdDkLT3WcX3/1rH+f9PrNj/LVVt/yxRaf9Biq//WMPz/1a9 - 7f4yYHvmSj2nVmVY7QgAAAAAAAAAAAAAAABlV+8CQDKQVC1Ra9k7fJ7xQYuw90aYwPpOqtf9Vr3v/lW8 - 7v9Jnsn/S6TQ/1jB9f9ZxPj/WcT4/1S46P4sSGLaUEa2R2Zd7ggAAAAAYljiEDcsdoM2bo3uVLnq/lnE - +P9Yw/f/WcT4/1nE+P9YwfT/O3ma8jsvgH9hWOEUZ17vAlpQzyAxKWWcN26N7U2m0v1VvO3+Vr3v/lW5 - 6v5Oqdb9P4So9StBXtE9MIduYVTkDQAAAAAAAAAAAAAAAAAAAAAAAAAAZFbsCFRGxClGOaBGPzOPWjot - gHAyJWqWKjFXwzFceuI8gKXxQ4+4+EaZxfpFlsH5PYCl8ixBYM1DN5RaZlzvBwAAAAAAAAAAAAAAAGNa - 5g9ANY5lKztdyT6Cp/NKo9D8TajY/UeaxvsyYn/nNSpwjF9V3BcAAAAAAAAAAGdd7wFiV+MRRDmaTzEl - aJQqK1a6KjJWwispVbowJGaaPzKMYFlMzyRmWe8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABlWO8BZljvAWZZ7wJmWe8HYFTgFVJFvC5EN5lMPTCGZTougHY7LoFwQjaUUFdMySRnXO4FAAAAAAAA - AAAAAAAAAAAAAAAAAABnXe8EWU/NIkE1j1s1KHCIMydtkzcrdoBJPqRFY1nlDmdd7wEAAAAAAAAAAAAA - AAAAAAAAZ1zvAWZb7wdkWeoPYVXiEWRY6g9mWu8IZlnvAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmWu8BZlrvAmZa7wNmW+8CZlvvAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdd7wFnXe8FZ13vBmdd7wRnXO8BAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAD///////8AAP///////wAA///4H///AAD///AP//8AAP//8A///wAA///wD/// - AAD///AP//8AAP//+B///wAA/8/4H+P/AAD/gAAAA/8AAP+AAAAD/wAA/4AAAAH/AAD/gAAAAf8AAP+A - AAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/4AAAAH/AAD/gAAAAf8AAP+AAAAB/wAA/4IAAMH/ - AAD/z4AB9/8AAP//gAH//wAA/8+AAff/AAD/ggAAwf8AAP+AAAAB/wAA/4AAAAH/AAD8AAAAAD8AAPgA - AAAADwAA4AAAAAAPAADgAAAAAAcAAOAAAAAABwAA4AAAAAADAADwAAAAAAMAAPAAAAAAAwAA8AAAAAAH - AADgAAAAAAcAAOAAAAAAAwAA4AAAAAABAADgAAAAAAEAAOAAAAAAAQAAwAAAAAABAACAAAAAAAMAAAAA - AAAABwAAAAAgAAAPAACAAHADAB8AAOAA+APAfwAA/4P+D///AAAoAAAAIAAAAEAAAAABACAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKGCmkCBPHyZf0d9kaaVoygAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC6r7QWpFKd6aJBmv+jUJ7/qXqqy8K6wQcAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKyjqCifWaH9m1Sb/5pXm/+jeKbot663EwAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAubG2B5yCo8CVd5//jG6X/5yJ - opkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAKiqrAOttLMKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlJagVV1t - iP9WZX79q62uKgAAAAAAAAAAAAAAAAAAAAAAAAAA6urlAaSqug4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuLu4F1R2kdFYd6y8Zn2HhnyQl16doqEqvr66Eayw - rhxlip2vPHWa/x9rjP9plbaTqLS3J6WsrCmMqLZJd4uUcGaDi5pXc4TAX3+tw6uvtQoAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACTmKI1FUV9/wFcof8JW37/BVx8/xcx - PP4sOT33MUBI9zJed/8yVHf/I1SD/xqJxv8tmcT9JY2u/hCFpf8LX3T/DD5J/wE7RP8wYor0srW3GAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHWAmGQHSY3/CEt9/wwp - O/8KGB3/CA8S/wgNEv8KDxT/DRMZ/xIYHP8RGyX/BlJ9/wF6rv8EisD/FoCx/xxQZ/8cRE7/BzhA/xdK - ZP+UmZ80AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYmVpewoW - I/8IEhv/Chok/wodJv8IERT/BwwP/wkbH/8KKTL/Cyo1/wwpN/8GPFj/AVyD/wJtmf8GTHH/FSsz/yMw - NP8eOUb/EzdM/3d8fU8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABKTE6SBSg3/wcXLf8MITL/DCAw/woWH/8GCw7/CRUb/wscJP8MGyT/DBoi/wscKv8JK0L/Cio+/wwf - KP8MHSH/Dhwf/wwcH/8MGyL/WlxbYwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAD5CRK0HJy//CRcq/w0aKf8NHCz/CxMb/wcLDv8KERb/DBYd/w0XH/8MFhz/DBYd/wwY - I/8MGib/Cxoi/wwdI/8MISj/CBwi/wUeJv9HTVJ/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAPEFCsQohJ/8UGyj+ODtA4DE1Ou0MExr/CAsP/wsTFv8LEhb/DBIX/wwS - Ff8MExf/DRYc/w0YHv8OGR//Njs85jU8QecMHCL/Bxwk/0JLUoUAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+gH1FUFVVtoOEgkzCwr4KtLWxF1NUU6kOEhf/ChAT/woQ - E/8KDhH/Cg4Q/wsRFP8OFhr/Dxke/2ZoZojBwbwPv7+7EHZ3dGNRVFSzjo+OKQAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADo6OICAAAAAAAAAAAAAAAApqeiJR8l - J/0JDQ//CQ0P/wkLDf8KDA3/DBIV/w4WGf82OjrmvLy3EgAAAAAAAAAAAAAAAOfn4QIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs5gEAAAAAAAAAAAAA - AACpqaUjHB4e/QgMDv8JDA//CQoN/wsLDv8MERP/DRUY/zg6OuTAwLsQAAAAAAAAAAAAAAAA7OzmAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACChIFCWF1bsoWI - hUfHx8ILvb24E1BQT6EHCw3/Dio7/zd7nv8LDxL/CwsP/wwQEv8NExX/ERcZ/2VmZH/Dw74Ow8O/Dnt7 - eVtWWFmtkpOQJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEVN - TbIhLzD/JjE0/jw+P9c0NTXmCQ0O/wgLDP8lNUX/IUdg/wsOEf8LDA//DA4R/w0REv8PFRb/Ehga/zo8 - PN86PT3fEhkd/w0bJP9FSkyDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ13vAT4z - iT8yJml1UFNv0TtFX/8rM07/HyM4/w8SHf8KDA7/CQsM/wkLDf8KDA7/CwsO/wwMEP8NDRH/DQ8S/w4S - FP8PFRf/Dxkc/w4WHf8ZHj7/IidS/0VEbqRBN5M8Wk/OFWdc7wEAAAAAAAAAAAAAAAAAAAAAAAAAAGVa - 6gNUScAfMydrpxwFC/4fDBD+IxYY/yQaLf8lG0H/Jh5K/yQfTv8aGT3/DQ0U/x0bQf8hH0z/IB1I/yMf - Tf8iH0r/Ix9N/yMfSv8jJVL/JSFQ/yIWN/8cBw//HQcN/RwFC/khDi3cPDCDYGZb7gMAAAAAAAAAAAAA - AAAAAAAAQziXODZtlOU7eaXxK1Bt/yAmN/8cCA//HAUL/xwFC/8cBQv/HAUL/yIWOv8pJl7/IRQ0/xwF - C/8cBQv/HAUL/xwFC/8cBQv/HAUL/yARL/8iLkH/Llp6/zFhhP8mP1f/HAUL/xwFC/8eCBzrSD2lMgAA - AAAAAAAAAAAAAAAAAABWS8YRMjtxpEum3v5Tuff/Urbz/06r5f9IntP/PIGt/yQ4Tv8cBQv/HAUL/y1K - bv8vV3r/Llp6/zFihf80a5H/OHWd/ylLZ/8lO1L/RZfK/0qj2f89ga3/SqHY/1K39f8/hrT/HAYN/xwF - C/40J253ZlvvAQAAAAAAAAAAAAAAAAAAAAA3K3VxS6Xd/lO59/9Pr+n/Ii1A/zZvlv9Tufb/ULLu/zBe - gP8cBQv/QY2+/1O59/9Tuff/U7n3/1O59/9Tuff/RZXI/0OQwf9NqeH/ICY2/1dRcf9na4X/Urf1/1O4 - 9v8qTGj/HAUL/jEkaIRmW+8BAAAAAAAAAAAAAAAAZlzvAzM+b59Vu/L/U7n3/0aZzf8cBQv/HRAa/1Cx - 7P9Tuff/SqTb/xwFC/8hEy3yQYq69kic0f8zYYb/L1h6/zNni/9Kotn/RJTH/z1+qvZKRGfDj4um7F5+ - oP9Tuff/U7n3/zh0mP8dBhLxQjaVQQAAAAAAAAAAAAAAAAAAAABlWusLPnKOymba+/9g0Pr/Qoyw/xwF - C/8nQlv/Urf0/1O59/9Lpd3/HQcV8Dsyf21aV4l5PYCu/0ORw/8kJkH/HAUL/yQ5UP8zZor+NFSBvUY9 - m187dqHjVLny/1zJ+f9i0/j/M2Fx9joufoRTSMAlZVntAgAAAAAAAAAAAAAAAFZKxh9Fj6rpY9b6/2PW - +v9UtNP/Qoyl/1e74f9axvj/Vr31/zh2n/hFPJlao6HXCFxbYKIqJFz/Qo6//0qj2/8jNUr/HAUL/xwF - C/s9MoOeRpOx7mDQ+f9j1vr/Y9X6/0qbtvE7L4BzMydtlR0HFuVHOqA0AAAAAAAAAAAAAAAAQjaVQk2m - xvhg0vr/YND4/z1+l/9Lob//X872/0aTr/8sT1//HAUL/TMobHu9vMEUQDta8iccSv8sOF3/W8by/1Oy - 2P8dFB3/HAUL/ytNXv1fz/f/YNL6/2DQ+P9Djaj+PDGDmzdIep8iFDTqHAUL/Dcpd2IAAAAAAAAAAGZZ - 7wE1KXNvVbng/V7O+f9YwOn/HQsS/x4YIf9bx/H/W8Xv/ypKXP8cBQv+MyhsjGFckk5HQHLvHAYO/xwF - C/9Ts9n/Xs75/zZuhv8cBQv/Nm6G/17O+f9ezvn/Qoup/xwFDP8kEzrqUKvR/SpLXf8cBQv5OCp5XQAA - AABiVOYFNy95YjRYfc9ZxfT/W8n5/02o0P8cBQv/KENW/1rH9v9byfn/PYGg/iAMJeFPRrNIOG+P2UOK - rvsiHjL/Hhch/1O24f9byfn/PH6e/iIRNNozRnLFWMLw/lvJ+f8zZoD/HAUL/yxSaf9ZxPL/NmqI7Tcp - d3FcT9cMAAAAAFtN1RAzXX7HSJvE902o0/tTuOf+UrXk/z2Cpv9Oq9n/WcX4/1fA8v81Wn/ITEKsLWde - 7wU3Onp9SZ/K91S56v9SteX/WcX4/1W77P4xS3O7TEKsJ0pAqSs4aY3KT6zZ/FS46P9MptL/TqrW/UGH - rOc5N39yZVjuBAAAAAAAAAAAAAAAAFdJyhVFN50zPC+GSDQrcXI1UYCqPXeh0D+ErOM+gKndNlaDrEg9 - oi0AAAAAAAAAAGRb5gc7MoNcOWqSx0KNtu1BibHqNVF+rE5EsiMAAAAAAAAAAFZMxxQ4LHlbMTJqiDIy - a4g2KnZiUEO4ImZZ7wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZZ7wNmWu4JY1fnEmRZ - 6Q9mW+8EAAAAAAAAAAAAAAAAAAAAAAAAAABlW+sJWE3JHFpPzhpmXO4GAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAZlrvAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////D////gf///4H///+D///Pw+f/wA - AD/8AAA//AAAP/wAAD/8AAA//AAAP/wAAD/8AAA//uAHf/7gB3/8AAA//AAAP+AAAAfAAAADwAAAA8AA - AAHgAAABwAAAA8AAAAHAAAABwAAAAYAAAAEAAAABAAAAA4AYDAf4Ph+/KAAAABAAAAAgAAAAAQAgAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACLWIY2iF+HLgAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACyqKwQoFGd+aJn - ouy6sboHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAq7GxAwAAAAAAAAAAubG3Aoh7 - mcWCdpOwAAAAAAAAAAAAAAAApKq6AwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRsjIc7aJbQQ2FxoUdQ - VIdCbInrNHek5EyXuJNGfpWuPVxn1lZ3nHcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA9T3G3CS5L/wkW - G/8JEhb/DSEp/wo5VP8CdaX/FFh6/xs6Q/9BVmagAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKjY8zwoa - Lf8MGSb/CA8U/wwZIf8MGCL/CyM0/wwdI/8MHSL/LTU5uAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEJI - SatFR0qNPkBCqwsQFP8LERT/CxEU/w4XHf9DRkafRElKlkNIS5gAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AADp6eMBAAAAAKeooxIVGRr+CQsO/wsPEf8nKyzyvb65CQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAASlBQqUpOToo9Pj2mEyIv/yFJYP8LDRD/DxQW/0NFRJtGSUiSRUlLlQAAAAAAAAAAAAAAAAAA - AABWS8UJLB9YljY2SfMlJD7/Gxg5/xAQIf8XFjT/GRc2/xoZN/8bHTv/HRw8/ygjQegoGUqKPjKJGQAA - AAAAAAAAOFiMdEORw/s9g7D/M2mO/x4bKP8mK0//J0Bc/ylKZf8oR2H/LVV0/zh1nv9Aibj/KEZg/ycX - R6UAAAAAAAAAADY4dEVStfD/OXqk/0GOv/9JoNf/Kkto/Eyo4P1ElMf/RprO/0SUxv1eW3XrW5vM/0SV - yP8mFkStAAAAAAAAAABEf6N3Y9X6/0GHo/9Oqdf/TKje/TUrZnBFXoTGP4W0/yAnN/8wSHLVTZ3FzF3M - +P9LmrrWMSNliUg8pA4AAAAATJvCql7M9f81an//V73k/yQ2RP5PSXtaNS1S+EOMrv9Glrb/KERV/l/P - +f9FkrD/PWyUyCInN/g3KngwOFGFT0uhy/BUuOb/OHOT/1rF9v81XYC1PVyRaUSPtfxMpM//TKLM7jI1 - bHxRsNzxQIit/0eZwfg3VIN0W07VA1dJywVAM5AfNkV8SEF8rHQ+b59nSD2iC2Na5gI8XJJLRIa2gzxQ - jDUAAAAAPjOMHDEya0Q+MoshAAAAAAAAAAD+fwAA/D8AAOx3AADgBwAA4AcAAOAHAADgBwAA6B8AAOAH - AACAAQAAgAEAAIABAACAAAAAgAAAAAAAAAAAIwAA - - - \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formBackglass.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formBackglass.vb deleted file mode 100644 index 1dde400..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formBackglass.vb +++ /dev/null @@ -1,3334 +0,0 @@ -Imports System -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 - - Private B2SScreen As B2SScreen = Nothing ' was New B2SScreen(), delayed to do later - Westworld, 2016-11-18 - Private B2SLED As B2SLED = New B2SLED() - Private B2SAnimation As B2SAnimation = New B2SAnimation() - - Private formDMD As formDMD = Nothing - Private formSettings As formSettings = Nothing - Private formMode As formMode = 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 - Private rotateRunTillEnd As Boolean = False - Private rotateRunToFirstStep As Boolean = False - 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 - -#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() - - - InitializeComponent() - - ' set some styles - Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.OptimizedDoubleBuffer, True) - Me.DoubleBuffered = True - - ' set key peview 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" - If My.Application.CommandLineArgs.Count > 0 Then - B2SData.TableFileName = My.Application.CommandLineArgs(0).ToString - - If B2SData.TableFileName.EndsWith(".directb2s") Then - B2SData.TableFileName = System.IO.Path.GetFileNameWithoutExtension(B2SData.TableFileName) - B2SSettings.PureEXE = True - End If - - If My.Application.CommandLineArgs.Count > 1 Then - If My.Application.CommandLineArgs(1).ToString = "1" Then - Me.TopMost = True - End If - End If - Else - MessageBox.Show("Please do not start the EXE this way.", My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Error) - End - End If - - - ' 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 - End - 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 - - Private Sub formBackglass_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown - - If Not B2SSettings.FormToFront Then - Me.SendToBack() - End If - - - 'Me.TopMost = False - - SetFocusToVPPlayer() - - End Sub - - Private Sub formBackglass_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing - - On Error Resume Next - - ' stop all timer - timer.Stop() - tabletimer.Stop() - B2STimer.Stop() - rotateTimer.Stop() - - ' unload DMD form stuff - If formDMD IsNot Nothing Then - formDMD.Close() - formDMD.Dispose() - End If - - If B2SScreen.formbackground IsNot Nothing Then - B2SScreen.formbackground.Close() - B2SScreen.formbackground.Dispose() - End If - - ' unload mode form - If formMode IsNot Nothing Then - formMode.Close() - formMode.Dispose() - End If - - ' unload backglass form stuff - For Each picbox As KeyValuePair(Of String, B2SPictureBox) In B2SData.Illuminations - If picbox.Value IsNot Nothing Then - If picbox.Value.BackgroundImage IsNot Nothing Then - picbox.Value.BackgroundImage.Dispose() - picbox.Value.BackgroundImage = Nothing - End If - If picbox.Value.OffImage IsNot Nothing Then - picbox.Value.OffImage.Dispose() - picbox.Value.OffImage = Nothing - End If - picbox.Value.Dispose() - End If - Next - For Each led As KeyValuePair(Of String, Dream7Display) In B2SData.LEDDisplays - led.Value.Dispose() - Next - For Each led As KeyValuePair(Of String, B2SLEDBox) In B2SData.LEDs - led.Value.Dispose() - Next - For Each reel As KeyValuePair(Of String, B2SReelBox) In B2SData.Reels - reel.Value.Dispose() - Next - If TopLightImage4Authentic IsNot Nothing Then - TopLightImage4Authentic.Dispose() - TopLightImage4Authentic = Nothing - End If - If TopLightImage4Fantasy IsNot Nothing Then - TopLightImage4Fantasy.Dispose() - TopLightImage4Fantasy = Nothing - End If - If SecondLightImage4Authentic IsNot Nothing Then - SecondLightImage4Authentic.Dispose() - SecondLightImage4Authentic = Nothing - End If - If SecondLightImage4Fantasy IsNot Nothing Then - SecondLightImage4Fantasy.Dispose() - SecondLightImage4Fantasy = Nothing - End If - If TopAndSecondLightImage4Authentic IsNot Nothing Then - TopAndSecondLightImage4Authentic.Dispose() - TopAndSecondLightImage4Authentic = Nothing - End If - If TopAndSecondLightImage4Fantasy IsNot Nothing Then - TopAndSecondLightImage4Fantasy.Dispose() - TopAndSecondLightImage4Fantasy = Nothing - End If - If DarkImage4Authentic IsNot Nothing Then - DarkImage4Authentic.Dispose() - DarkImage4Authentic = Nothing - End If - If DarkImage4Fantasy IsNot Nothing Then - DarkImage4Fantasy.Dispose() - DarkImage4Fantasy = Nothing - End If - If BackgroundImage IsNot Nothing Then - BackgroundImage.Dispose() - BackgroundImage = Nothing - End If - - ' stop all animations - StopAllAnimations() - - ' clean up some classes - B2SData.ClearAll() - B2SSettings.ClearAll() - - End Sub - -#End Region - - -#Region "painting" - - Protected Overrides Sub OnPaint(e As System.Windows.Forms.PaintEventArgs) - 'If B2sSettings.HideBackglass Then hide this form - If B2SSettings.HideB2SBackglass Then - Me.Hide() - Return - End If - - ' some rendering hints - e.Graphics.PageUnit = GraphicsUnit.Pixel - e.Graphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias - - ' draw background and illumination images - If Me.BackgroundImage IsNot Nothing Then - - On Error Resume Next - - ' generate new clipping region - Dim clip As Region = New Region(e.ClipRectangle) - For Each ledarea As KeyValuePair(Of String, B2SData.LEDAreaInfo) In B2SData.LEDAreas - If Not ledarea.Value.IsOnDMD Then - clip.Exclude(ledarea.Value.Rect) - End If - Next - e.Graphics.SetClip(clip, Drawing2D.CombineMode.Replace) - - ' draw background image - e.Graphics.DrawImage(Me.BackgroundImage, 0, 0) - - ' draw all visible and necessary images - If B2SData.Illuminations.Count > 0 Then - - If Not B2SData.UseZOrder Then - - ' draw all standard images - For Each illu As KeyValuePair(Of String, B2SPictureBox) In B2SData.Illuminations - DrawImage(e, illu.Value) - Next - - Else - - ' first of all draw all standard images - For Each illu As KeyValuePair(Of String, B2SPictureBox) In B2SData.Illuminations - If illu.Value.ZOrder = 0 Then DrawImage(e, illu.Value) - Next - ' now draw zorderd images - For Each illus As KeyValuePair(Of Integer, B2SPictureBox()) In B2SData.ZOrderImages - 'For Each illu As B2SPictureBox In illus.Value - ' DrawImage(e, illu) - 'Next - For i As Integer = 0 To illus.Value.Length - 1 - DrawImage(e, illus.Value(i)) - Next - Next - - End If - - End If - - End If - - End Sub - Protected Overrides Sub OnPaintBackground(e As System.Windows.Forms.PaintEventArgs) - - ' no background painting here - - End Sub - - Private Sub DrawImage(e As System.Windows.Forms.PaintEventArgs, picbox As B2SPictureBox) - - If picbox IsNot Nothing Then - - Dim drawme As Boolean = (Not B2SSettings.AllOut AndAlso picbox IsNot Nothing AndAlso Not picbox.IsDisposed AndAlso picbox.Visible AndAlso e.ClipRectangle.IntersectsWith(Rectangle.Round(picbox.RectangleF))) - If drawme AndAlso B2SScreen.BackglassCutOff <> Nothing Then - drawme = Not B2SScreen.BackglassCutOff.IntersectsWith(Rectangle.Round(picbox.RectangleF)) - End If - If drawme AndAlso picbox.RomID <> 0 AndAlso Not picbox.SetThruAnimation Then - drawme = (picbox.RomID <> TopRomID OrElse picbox.RomIDType <> TopRomIDType OrElse picbox.RomInverted <> TopRomInverted) AndAlso (picbox.RomID <> SecondRomID OrElse picbox.RomIDType <> SecondRomIDType OrElse picbox.RomInverted <> SecondRomInverted) - End If - If drawme AndAlso B2SData.DualBackglass Then - drawme = (picbox.DualMode = B2SData.eDualMode.Both OrElse picbox.DualMode = B2SSettings.CurrentDualMode) - End If - - ' maybe write a drawing log - If B2SSettings.IsPaintingLogOn AndAlso Not String.IsNullOrEmpty(B2SSettings.LogPath) Then - ' write to log file - On Error Resume Next - Dim log As IO.StreamWriter = New IO.StreamWriter(IO.Path.Combine(B2SSettings.LogPath, "Drawing.txt"), True) - log.WriteLine(DateTime.Now & ": " & picbox.Name & ", Visible=" & picbox.Visible.ToString() & ", DrawMe=" & drawme.ToString() & ", Rect=" & Rectangle.Round(picbox.RectangleF).ToString()) - log.Flush() - log.Close() - End If - - If drawme Then - If B2SData.OnAndOffImage Then - If B2SData.IsOffImageVisible AndAlso picbox.OffImage IsNot Nothing Then - 'e.Graphics.DrawImage(picbox.OffImage, picbox.RectangleF) - e.Graphics.DrawImage(picbox.OffImage, picbox.RectangleF.Location) - Else - 'e.Graphics.DrawImage(picbox.BackgroundImage, picbox.RectangleF) - e.Graphics.DrawImage(picbox.BackgroundImage, picbox.RectangleF.Location) - End If - Else - 'e.Graphics.DrawImage(picbox.BackgroundImage, picbox.RectangleF) - e.Graphics.DrawImage(picbox.BackgroundImage, picbox.RectangleF.Location) - End If - End If - - End If - - End Sub - -#End Region - - -#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 RotateTimer_Tick() - - Static currentAngleS As Single = 0 - Static currentAngle As Integer = 0 - - ' move on with rotation - If B2SData.RotatingImages(0).ContainsKey(currentAngle) Then - - B2SData.RotatingPictureBox(0).BackgroundImage = B2SData.RotatingImages(0)(currentAngle) - B2SData.RotatingPictureBox(0).Visible = True - - currentAngleS += rotateAngle - If currentAngleS >= 360 Then currentAngleS = 0 - currentAngle = CInt(currentAngleS) - - Else - - rotateTimer.Stop() - - End If - - ' mabye slow down the rotation or stop it at a certain step - If rotateSlowDownSteps > 0 Then - - Const lastStep As Integer = 25 - Const add2IntervalPerStep As Integer = 3 - - If rotateSlowDownSteps >= lastStep Then - rotateTimer.Stop() - rotateSlowDownSteps = 0 - rotateTimer.Interval = rotateTimerInterval - Else - rotateSlowDownSteps += 1 - rotateTimer.Interval += add2IntervalPerStep - End If - - ElseIf rotateRunTillEnd Then - - If currentAngleS + rotateAngle >= 360 Then - rotateTimer.Stop() - End If - - ElseIf rotateRunToFirstStep Then - - If currentAngleS = 0 Then - rotateTimer.Stop() - End If - - End If - - End Sub - -#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" - - Public Sub formBackglass_MouseClick(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseClick - - If e.Button = Windows.Forms.MouseButtons.Right Then - formBackglass_KeyUp(Me, New KeyEventArgs(Keys.S)) - End If - - End Sub - - Private Sub formBackglass_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp - - If e.KeyCode = Keys.S Then - - If formSettings IsNot Nothing Then - Try - formSettings.Dispose() - formSettings = Nothing - Catch - End Try - End If - formSettings = New formSettings() - formSettings.B2SScreen = B2SScreen - formSettings.B2SAnimation = B2SAnimation - formSettings.formBackglass = Me - formSettings.Show(Me) - - ElseIf e.KeyCode = Keys.M OrElse e.KeyCode = Keys.A OrElse e.KeyCode = Keys.F Then - - If B2SData.DualBackglass Then - If e.KeyCode = Keys.M Then - B2SSettings.CurrentDualMode = If(B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy, B2SSettings.eDualMode.Authentic, B2SSettings.eDualMode.Fantasy) - ElseIf e.KeyCode = Keys.A Then - B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Authentic - ElseIf e.KeyCode = Keys.F Then - B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy - End If - B2SSettings.Save(, True) - Me.BackgroundImage = DarkImage - Me.Refresh() - ShowStartupImages() - B2SAnimation.RestartAnimations() - If formMode IsNot Nothing Then - Try - formMode.Dispose() - formMode = Nothing - Catch - End Try - End If - formMode = New formMode() - formMode.Show(Me) - Me.Focus() - End If - - ElseIf e.KeyCode = Keys.I OrElse e.KeyCode = Keys.Print OrElse e.KeyCode = Keys.PrintScreen Then - - ' do a screenshot and save it - If String.IsNullOrEmpty(B2SSettings.ScreenshotPath) Then - MessageBox.Show("Please enter a valid screenshot path here at the settings.", My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation) - Else - Dim imageformat As Imaging.ImageFormat = Imaging.ImageFormat.Png - Dim extension As String = ".png" - Select Case B2SSettings.ScreenshotFileType - Case B2SSettings.eImageFileType.JPG : imageformat = Imaging.ImageFormat.Jpeg : extension = ".jpg" - Case B2SSettings.eImageFileType.GIF : imageformat = Imaging.ImageFormat.Gif : extension = ".gif" - Case B2SSettings.eImageFileType.BMP : imageformat = Imaging.ImageFormat.Bmp : extension = ".bmp" - End Select - Dim filename As String = IO.Path.Combine(B2SSettings.ScreenshotPath, IO.Path.GetFileNameWithoutExtension(B2SData.BackglassFileName) & extension) - B2SScreen.MakeScreenShot(filename, imageformat) - My.Computer.Audio.Play(My.Resources.camera1, AudioPlayMode.Background) - End If - - ElseIf e.KeyCode = Keys.Escape Then - - ' stop the app - End - - End If - - End Sub - -#End Region - - -#Region "public methods" - - Private _backgroundimage As Image - Public Overrides Property BackgroundImage() As Image - Get - Return _backgroundimage - End Get - Set(ByVal value As Image) - If value Is Nothing Then - _backgroundimage = Nothing - ElseIf Not value.Equals(_backgroundimage) Then - _backgroundimage = value - Me.Invalidate() - End If - End Set - End Property - - Public Sub StartAnimation(ByVal name As String, Optional ByVal playreverse As Boolean = False) - - B2SAnimation.StartAnimation(name, playreverse) - - End Sub - Public Sub StopAnimation(ByVal name As String) - - B2SAnimation.StopAnimation(name) - - End Sub - Public Sub StopAllAnimations() - - B2SAnimation.StopAllAnimations() - - End Sub - - Public Function IsAnimationRunning(ByVal name As String) As Boolean - - Return B2SAnimation.IsAnimationRunning(name) - - End Function - - Public Sub StartRotation() - - If B2SData.RotatingPictureBox IsNot Nothing AndAlso B2SData.RotatingPictureBox(0) IsNot Nothing AndAlso B2SData.RotatingImages(0) IsNot Nothing AndAlso B2SData.RotatingImages(0).Count > 0 Then - If rotateAngle > 0 AndAlso rotateTimerInterval > 0 Then - If rotateTimer.Enabled Then rotateTimer.Stop() - rotateSlowDownSteps = 0 - rotateTimer.Interval = rotateTimerInterval - rotateTimer.Start() - End If - End If - - End Sub - Public Sub StopRotation() - - If B2SData.RotatingPictureBox IsNot Nothing AndAlso B2SData.RotatingPictureBox(0) IsNot Nothing AndAlso B2SData.RotatingImages(0) IsNot Nothing AndAlso B2SData.RotatingImages(0).Count > 0 Then - If rotateTimer.Enabled Then - If B2SData.RotatingPictureBox(0).SnippitRotationStopBehaviour = B2SPictureBox.eSnippitRotationStopBehaviour.SpinOff Then - rotateSlowDownSteps = 1 - ElseIf B2SData.RotatingPictureBox(0).SnippitRotationStopBehaviour = B2SPictureBox.eSnippitRotationStopBehaviour.RunAnimationTillEnd Then - rotateRunTillEnd = True - ElseIf B2SData.RotatingPictureBox(0).SnippitRotationStopBehaviour = B2SPictureBox.eSnippitRotationStopBehaviour.RunAnimationToFirstStep Then - rotateRunToFirstStep = True - Else - rotateTimer.Stop() - End If - End If - End If - - End Sub - - Private SelectedLEDType As B2SSettings.eLEDTypes = B2SSettings.eLEDTypes.Undefined - Public Sub ShowScoreDisplays() - - If SelectedLEDType = B2SSettings.eLEDTypes.Undefined Then SelectedLEDType = GetLEDType() - If SelectedLEDType = B2SSettings.eLEDTypes.Dream7 Then - For Each leddisplay As KeyValuePair(Of String, Dream7Display) In B2SData.LEDDisplays - leddisplay.Value.Visible = True - Next - ElseIf SelectedLEDType = B2SSettings.eLEDTypes.Rendered Then - For Each led As KeyValuePair(Of String, B2SLEDBox) In B2SData.LEDs - led.Value.Visible = True - Next - End If - - End Sub - Public Sub HideScoreDisplays() - - If SelectedLEDType = B2SSettings.eLEDTypes.Undefined Then SelectedLEDType = GetLEDType() - If SelectedLEDType = B2SSettings.eLEDTypes.Dream7 Then - For Each leddisplay As KeyValuePair(Of String, Dream7Display) In B2SData.LEDDisplays - leddisplay.Value.Visible = False - Next - ElseIf SelectedLEDType = B2SSettings.eLEDTypes.Rendered Then - For Each led As KeyValuePair(Of String, B2SLEDBox) In B2SData.LEDs - led.Value.Visible = False - Next - End If - - End Sub - Private Function GetLEDType() As B2SSettings.eLEDTypes - Dim ret As B2SSettings.eLEDTypes = B2SSettings.eLEDTypes.Undefined - If B2SData.LEDDisplays.Count > 0 Then - For Each leddisplay As KeyValuePair(Of String, Dream7Display) In B2SData.LEDDisplays - If leddisplay.Value.Visible Then ret = B2SSettings.eLEDTypes.Dream7 - Exit For - Next - ElseIf B2SData.LEDs.Count > 0 Then - For Each led As KeyValuePair(Of String, B2SLEDBox) In B2SData.LEDs - If led.Value.Visible Then ret = B2SSettings.eLEDTypes.Rendered - Exit For - Next - End If - Return ret - End Function - - Public Sub PlaySound(ByVal soundname As String) - - If B2SData.Sounds.ContainsKey(soundname) Then - My.Computer.Audio.Play(B2SData.Sounds(soundname), AudioPlayMode.Background) - End If - - End Sub - Public Sub StopSound(ByVal soundname As String) - - If B2SData.Sounds.ContainsKey(soundname) Then - My.Computer.Audio.Stop() - End If - - End Sub - -#End Region - - -#Region "load B2S data and more B2S stuff" - - Private Sub LoadB2SData() - - Dim filename As String = B2SData.TableFileName & ".directb2s" - Dim shortfilename As String = B2SData.ShortFileName(filename) - Dim hyperpinfilename As String = String.Empty - Dim shorthyperpinfilename As String = String.Empty - - ' check whether the table name can be found - If Not String.IsNullOrEmpty(B2SSettings.GameName) And Not IO.File.Exists(filename) AndAlso Not IO.File.Exists(shortfilename) Then - 'Westworld, check for gamename - If IO.File.Exists(B2SSettings.GameName & ".directb2s") Then - filename = B2SSettings.GameName & ".directb2s" - End If - End If - - If Not B2SSettings.DisableFuzzyMatching Then - If Not IO.File.Exists(filename) AndAlso Not IO.File.Exists(shortfilename) Then - If B2SSettings.LocateHyperpinXMLFile() Then - hyperpinfilename = B2SSettings.HyperpinName & ".directb2s" - shorthyperpinfilename = B2SData.ShortFileName(hyperpinfilename) - End If - ' check whether the hyperpin description can be found - If Not IO.File.Exists(hyperpinfilename) AndAlso Not IO.File.Exists(shorthyperpinfilename) Then - If filename.Length >= 8 Then - ' look for short name - B2SSettings.MatchingFileNames = IO.Directory.GetFiles(IO.Directory.GetCurrentDirectory(), filename.Substring(0, 6) & "*.directb2s") - If B2SSettings.MatchingFileNames Is Nothing OrElse Not IsArray(B2SSettings.MatchingFileNames) OrElse B2SSettings.MatchingFileNames.Length <= 0 Then - B2SSettings.MatchingFileNames = IO.Directory.GetFiles(IO.Directory.GetCurrentDirectory(), filename.Substring(0, 6).Replace(" ", "") & "*.directb2s") - End If - If B2SSettings.MatchingFileNames IsNot Nothing Then - For i As Integer = 0 To B2SSettings.MatchingFileNames.Length - 1 - Dim fileinfo As IO.FileInfo = New IO.FileInfo(B2SSettings.MatchingFileNames(i)) - B2SSettings.MatchingFileNames(i) = fileinfo.Name - Next - End If - shortfilename = String.Empty - For Each file As String In B2SSettings.MatchingFileNames - If String.IsNullOrEmpty(shortfilename) Then - shortfilename = file - End If - If Not String.IsNullOrEmpty(B2SSettings.MatchingFileName) AndAlso file.Equals(B2SSettings.MatchingFileName, StringComparison.CurrentCultureIgnoreCase) Then - shortfilename = file - Exit For - End If - Next - End If - End If - End If - End If - - If Not IO.File.Exists(filename) AndAlso Not IO.File.Exists(shortfilename) AndAlso Not IO.File.Exists(hyperpinfilename) AndAlso Not IO.File.Exists(shorthyperpinfilename) Then - Dim text As String = "File '" & IO.Path.Combine(IO.Directory.GetCurrentDirectory(), filename) - If Not String.IsNullOrEmpty(hyperpinfilename) AndAlso Not filename.Equals(hyperpinfilename, StringComparison.CurrentCultureIgnoreCase) Then - text &= " and file '" & IO.Path.Combine(IO.Directory.GetCurrentDirectory(), hyperpinfilename) & "'" - End If - text &= " not found. Please rename or download the matching directb2s backglass file." - Throw New Exception(text) - End If - - Dim XML As Xml.XmlDocument = New Xml.XmlDocument - If IO.File.Exists(filename) Then - B2SData.BackglassFileName = filename - ElseIf IO.File.Exists(shortfilename) Then - B2SData.BackglassFileName = shortfilename - ElseIf IO.File.Exists(hyperpinfilename) Then - B2SData.BackglassFileName = hyperpinfilename - ElseIf IO.File.Exists(shorthyperpinfilename) Then - B2SData.BackglassFileName = shorthyperpinfilename - End If - ' maybe load XML file - If Not String.IsNullOrEmpty(B2SData.BackglassFileName) Then - Try - XML.Load(B2SData.BackglassFileName) - Catch ex As Exception - MessageBox.Show("The following error occurred opening the file '" & Path.GetFileName(B2SData.BackglassFileName) & "':" & vbCrLf & vbCrLf & ex.Message, My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation) - End Try - End If - - ' try to get into the file and read some XML - If XML Is Nothing OrElse XML.SelectSingleNode("DirectB2SData") Is Nothing Then - - Throw New Exception("File '" & filename & "' is not a valid directb2s backglass file.") - - Else - - B2SSettings.BackglassFileVersion = XML.SelectSingleNode("DirectB2SData").Attributes("Version").InnerText - ' write backglass file version to registry - Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) - regkey.SetValue("B2SBackglassFileVersion", B2SSettings.BackglassFileVersion, RegistryValueKind.String) - End Using - - ' current backglass version is not allowed to be larger than server version and to be smaller minimum B2S version - If B2SSettings.BackglassFileVersion > B2SSettings.DirectB2SVersion Then - - Throw New Exception("B2S.Server version (" & B2SSettings.DirectB2SVersion & ") doesn't match 'directb2s' file version (" & B2SSettings.BackglassFileVersion & "). " & vbCrLf & vbCrLf & - "Please update the B2S.Server.") - - ElseIf B2SSettings.BackglassFileVersion < B2SSettings.MinimumDirectB2SVersion Then - - Throw New Exception("'directB2S' file version (" & B2SSettings.BackglassFileVersion & ") doesn't match minimum 'directb2s' version. " & vbCrLf & vbCrLf & - "Please update the 'directB2S' backglass file.") - - Else - - ' get top node - Dim topnode As Xml.XmlElement = XML.SelectSingleNode("DirectB2SData") - Dim mergeBulbs As Boolean = False - - 'If topnode.SelectSingleNode("MergeBulbs") IsNot Nothing Then - ' mergeBulbs = topnode.SelectSingleNode("MergeBulbs").Attributes("Value").InnerText <> "0" - 'End If - - - ' clear all data - B2SData.ClearAll(True) - - ' get some basic info - B2SData.TableName = topnode.SelectSingleNode("Name").Attributes("Value").InnerText - B2SData.TableType = topnode.SelectSingleNode("TableType").Attributes("Value").InnerText - B2SData.DMDType = topnode.SelectSingleNode("DMDType").Attributes("Value").InnerText - If topnode.SelectSingleNode("DMDDefaultLocation") IsNot Nothing Then - B2SData.DMDDefaultLocation = New Point(CInt(topnode.SelectSingleNode("DMDDefaultLocation").Attributes("LocX").InnerText), CInt(topnode.SelectSingleNode("DMDDefaultLocation").Attributes("LocY").InnerText)) - End If - B2SData.GrillHeight = Math.Max(CInt(topnode.SelectSingleNode("GrillHeight").Attributes("Value").InnerText), 0) - If topnode.SelectSingleNode("GrillHeight").Attributes("Small") IsNot Nothing AndAlso B2SData.GrillHeight > 0 Then - B2SData.SmallGrillHeight = Math.Max(CInt(topnode.SelectSingleNode("GrillHeight").Attributes("Small").InnerText), 0) - End If - If topnode.SelectSingleNode("DualBackglass") IsNot Nothing Then - B2SData.DualBackglass = (topnode.SelectSingleNode("DualBackglass").Attributes("Value").InnerText = "1") - End If - - ' maybe set current dual mode to get for sure - If Not B2SData.DualBackglass Then - B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Authentic - End If - - ' get skip defaults - If topnode.SelectSingleNode("LampsDefaultSkipFrames") IsNot Nothing AndAlso Not B2SSettings.IsGameNameFound Then - B2SSettings.LampsSkipFrames = CInt(topnode.SelectSingleNode("LampsDefaultSkipFrames").Attributes("Value").InnerText) - End If - If topnode.SelectSingleNode("SolenoidsDefaultSkipFrames") IsNot Nothing AndAlso Not B2SSettings.IsGameNameFound Then - B2SSettings.SolenoidsSkipFrames = CInt(topnode.SelectSingleNode("SolenoidsDefaultSkipFrames").Attributes("Value").InnerText) - End If - If topnode.SelectSingleNode("GIStringsDefaultSkipFrames") IsNot Nothing AndAlso Not B2SSettings.IsGameNameFound Then - B2SSettings.GIStringsSkipFrames = CInt(topnode.SelectSingleNode("GIStringsDefaultSkipFrames").Attributes("Value").InnerText) - End If - If topnode.SelectSingleNode("LEDsDefaultSkipFrames") IsNot Nothing AndAlso Not B2SSettings.IsGameNameFound Then - B2SSettings.LEDsSkipFrames = CInt(topnode.SelectSingleNode("LEDsDefaultSkipFrames").Attributes("Value").InnerText) - End If - If Not B2SSettings.IsGameNameFound Then - If B2SSettings.LampsSkipFrames = 0 Then B2SSettings.LampsSkipFrames = 1 - If B2SSettings.SolenoidsSkipFrames = 0 Then B2SSettings.SolenoidsSkipFrames = 3 - If B2SSettings.GIStringsSkipFrames = 0 Then B2SSettings.GIStringsSkipFrames = 3 - End If - - ' get all illumination infos - Dim roms4Authentic As Generic.Dictionary(Of String, Integer) = New Generic.Dictionary(Of String, Integer) - Dim roms4Fantasy As Generic.Dictionary(Of String, Integer) = New Generic.Dictionary(Of String, Integer) - If topnode.SelectSingleNode("Illumination") IsNot Nothing AndAlso topnode.SelectNodes("Illumination/Bulb") IsNot Nothing Then - For Each innerNode As Xml.XmlElement In topnode.SelectNodes("Illumination/Bulb") - Dim parent As String = innerNode.Attributes("Parent").InnerText - Dim id As Integer = CInt(innerNode.Attributes("ID").InnerText) - Dim romid As Integer = 0 - Dim romidtype As Integer = 0 - Dim romidvalue As Integer = 0 - Dim rominverted As Boolean = False - If innerNode.Attributes("B2SID") IsNot Nothing Then - romid = CInt(innerNode.Attributes("B2SID").InnerText) - If innerNode.Attributes("B2SValue") IsNot Nothing Then - romidvalue = CInt(innerNode.Attributes("B2SValue").InnerText) - End If - romidtype = 1 - Else - romid = CInt(innerNode.Attributes("RomID").InnerText) - romidtype = CInt(innerNode.Attributes("RomIDType").InnerText) - If innerNode.Attributes("RomInverted") IsNot Nothing Then - rominverted = (innerNode.Attributes("RomInverted").InnerText = "1") - End If - End If - Dim intensity As Integer = CInt(innerNode.Attributes("Intensity").InnerText) - Dim initialstate As Integer = CInt(innerNode.Attributes("InitialState").InnerText) - Dim dualmode As Integer = 0 - If innerNode.Attributes("DualMode") IsNot Nothing Then - dualmode = CInt(innerNode.Attributes("DualMode").InnerText) - End If - Dim name As String = innerNode.Attributes("Name").InnerText - Dim isimagesnippit As Boolean = False - If innerNode.Attributes("IsImageSnippit") IsNot Nothing Then - isimagesnippit = (innerNode.Attributes("IsImageSnippit").InnerText = "1") - End If - Dim zorder As Integer = 0 - If innerNode.Attributes("ZOrder") IsNot Nothing Then - zorder = CInt(innerNode.Attributes("ZOrder").InnerText) - End If - Dim picboxtype As B2SPictureBox.ePictureBoxType = B2SPictureBox.ePictureBoxType.StandardImage - Dim picboxrotatesteps As Integer = 0 - Dim picboxrotateinterval As Integer = 0 - Dim picboxrotationdirection As B2SPictureBox.eSnippitRotationDirection = B2SPictureBox.eSnippitRotationDirection.Clockwise - Dim picboxrotationstopbehaviour As B2SPictureBox.eSnippitRotationStopBehaviour = B2SPictureBox.eSnippitRotationStopBehaviour.SpinOff - If innerNode.Attributes("SnippitType") IsNot Nothing Then - picboxtype = CInt(innerNode.Attributes("SnippitType").InnerText) - If innerNode.Attributes("SnippitRotatingSteps") IsNot Nothing Then - picboxrotatesteps = CInt(innerNode.Attributes("SnippitRotatingSteps").InnerText) - ElseIf innerNode.Attributes("SnippitRotatingAngle") IsNot Nothing Then - Try - picboxrotatesteps = CInt(360 / CInt(innerNode.Attributes("SnippitRotatingAngle").InnerText)) - Catch - End Try - End If - If innerNode.Attributes("SnippitRotatingInterval") IsNot Nothing Then - picboxrotateinterval = CInt(innerNode.Attributes("SnippitRotatingInterval").InnerText) - End If - If innerNode.Attributes("SnippitRotatingDirection") IsNot Nothing Then - picboxrotationdirection = CInt(innerNode.Attributes("SnippitRotatingDirection").InnerText) - End If - If innerNode.Attributes("SnippitRotatingStopBehaviour") IsNot Nothing Then - picboxrotationstopbehaviour = CInt(innerNode.Attributes("SnippitRotatingStopBehaviour").InnerText) - End If - End If - Dim visible As Boolean = (CInt(innerNode.Attributes("Visible").InnerText) = 1) - Dim loc As Point = New Point(CInt(innerNode.Attributes("LocX").InnerText), CInt(innerNode.Attributes("LocY").InnerText)) - Dim size As Size = New Size(CInt(innerNode.Attributes("Width").InnerText), CInt(innerNode.Attributes("Height").InnerText)) - Dim image As Image = Base64ToImage(innerNode.Attributes("Image").InnerText) - - Dim offimage As Image = Nothing - If innerNode.Attributes("OffImage") IsNot Nothing Then - offimage = Base64ToImage(innerNode.Attributes("OffImage").InnerText) - End If - image = CropImageToTransparency(image, offimage, loc, size) - ' create new picturebox control - Dim picbox As B2SPictureBox = New B2SPictureBox() - Dim IsOnBackglass As Boolean = (parent = "Backglass") - picbox.Name = "PictureBox" & id.ToString() - picbox.GroupName = name - picbox.Location = loc - picbox.Size = size - picbox.RomID = romid - picbox.RomIDType = romidtype - picbox.RomIDValue = romidvalue - picbox.RomInverted = rominverted - picbox.Intensity = intensity - picbox.InitialState = initialstate - picbox.DualMode = dualmode - picbox.BackgroundImage = image - picbox.OffImage = offimage - picbox.IsImageSnippit = isimagesnippit - picbox.SnippitRotationStopBehaviour = picboxrotationstopbehaviour - picbox.ZOrder = zorder - picbox.PictureBoxType = picboxtype - If IsOnBackglass Then - picbox.Type = B2SBaseBox.eType.OnBackglass - Me.Controls.Add(picbox) - ' add to general collection - B2SData.Illuminations.Add(picbox) - ' maybe add ZOrder info - If zorder > 0 Then - B2SData.UseZOrder = True - B2SData.ZOrderImages.Add(picbox) - End If - ' add info to rom collection - If romid > 0 AndAlso picboxtype = B2SPictureBox.ePictureBoxType.StandardImage AndAlso romidtype <> B2SBaseBox.eRomIDType.Mech Then - Dim key As String = If(rominverted, "I", "") & Choose(romidtype, "L", "S", "GI") & romid.ToString() & "|" & romidvalue.ToString() - - If picbox.DualMode = B2SData.eDualMode.Both OrElse picbox.DualMode = B2SData.eDualMode.Authentic Then - If roms4Authentic.ContainsKey(key) Then roms4Authentic(key) += size.Width * size.Height Else roms4Authentic.Add(key, size.Width * size.Height) - End If - If picbox.DualMode = B2SData.eDualMode.Both OrElse picbox.DualMode = B2SData.eDualMode.Fantasy Then - If roms4Fantasy.ContainsKey(key) Then roms4Fantasy(key) += size.Width * size.Height Else roms4Fantasy.Add(key, size.Width * size.Height) - End If - End If - Else - If Not B2SSettings.HideB2SDMD Then - CheckDMDForm() - picbox.Type = B2SBaseBox.eType.OnDMD - formDMD.Controls.Add(picbox) - ' add to general collection - B2SData.DMDIlluminations.Add(picbox) - ' maybe add ZOrder info - If zorder > 0 Then - B2SData.UseDMDZOrder = True - B2SData.ZOrderDMDImages.Add(picbox) - End If - End If - End If - picbox.BringToFront() - picbox.Visible = False - - ' add illumination into group - B2SData.IlluminationGroups.Add(picbox) - - ' maybe do picture rotating - If picboxrotatesteps > 0 Then - If picboxtype = B2SPictureBox.ePictureBoxType.SelfRotatingImage AndAlso B2SData.RotatingImages.Count = 0 Then - Me.rotateSteps = picboxrotatesteps - Me.rotateTimerInterval = picboxrotateinterval - RotateImage(picbox, picboxrotatesteps, picboxrotationdirection, B2SPictureBox.ePictureBoxType.SelfRotatingImage) - ElseIf picboxtype = B2SPictureBox.ePictureBoxType.MechRotatingImage AndAlso B2SData.RotatingImages.Count = 0 Then - Me.rotateSteps = picboxrotatesteps - RotateImage(picbox, picboxrotatesteps, picboxrotationdirection, B2SPictureBox.ePictureBoxType.MechRotatingImage, romidtype, romid) - End If - End If - Next - End If - - ' get all score infos - Dim dream7index As Integer = 1 - Dim renderedandreelindex As Integer = 1 - If topnode.SelectSingleNode("Scores") IsNot Nothing AndAlso topnode.SelectNodes("Scores/Score") IsNot Nothing Then - - Dim rollinginterval As Integer = 0 - If topnode.SelectSingleNode("Scores").Attributes("ReelRollingInterval") IsNot Nothing Then - rollinginterval = CInt(topnode.SelectSingleNode("Scores").Attributes("ReelRollingInterval").InnerText) - End If - - For Each innerNode As Xml.XmlElement In topnode.SelectNodes("Scores/Score") - - Dim parent As String = innerNode.Attributes("Parent").InnerText - Dim id As Integer = CInt(innerNode.Attributes("ID").InnerText) - Dim setid As Integer = 0 - If innerNode.Attributes("ReelIlluImageSet") IsNot Nothing Then - setid = CInt(innerNode.Attributes("ReelIlluImageSet").InnerText) - End If - Dim reeltype As String = innerNode.Attributes("ReelType").InnerText - Dim reellitcolor As Color = String2Color(innerNode.Attributes("ReelLitColor").InnerText) - Dim reeldarkcolor As Color = String2Color(innerNode.Attributes("ReelDarkColor").InnerText) - Dim d7glow As Single = CSng(innerNode.Attributes("Glow").InnerText) / 100 - Dim d7thickness As Single = CSng(innerNode.Attributes("Thickness").InnerText) / 100 - Dim d7shear As Single = CSng(innerNode.Attributes("Shear").InnerText) / 100 - Dim digits As Integer = CInt(innerNode.Attributes("Digits").InnerText) - Dim spacing As Integer = CInt(innerNode.Attributes("Spacing").InnerText) - Dim hidden As Boolean = False - If innerNode.Attributes("DisplayState") IsNot Nothing Then - hidden = (CInt(innerNode.Attributes("DisplayState").InnerText) = 1) - End If - Dim loc As Point = New Point(CInt(innerNode.Attributes("LocX").InnerText) - 1, CInt(innerNode.Attributes("LocY").InnerText)) - Dim size As Size = New Size(CInt(innerNode.Attributes("Width").InnerText), CInt(innerNode.Attributes("Height").InnerText)) - Dim b2sstartdigit As Integer = 0 - Dim b2sscoretype As Integer = 0 - Dim b2splayerno As Integer = 0 - If innerNode.Attributes("B2SStartDigit") IsNot Nothing Then b2sstartdigit = CInt(innerNode.Attributes("B2SStartDigit").InnerText) - If innerNode.Attributes("B2SScoreType") IsNot Nothing Then b2sscoretype = CInt(innerNode.Attributes("B2SScoreType").InnerText) - If innerNode.Attributes("B2SPlayerNo") IsNot Nothing Then b2splayerno = CInt(innerNode.Attributes("B2SPlayerNo").InnerText) - Dim dream7b2sstartdigit As Integer = b2sstartdigit - Dim startdigit As Integer = If(b2sstartdigit > 0, b2sstartdigit, renderedandreelindex) - Dim romid As Integer = 0 - Dim romidtype As Integer = 0 - Dim romidvalue As Integer = 0 - If innerNode.Attributes("ReelIlluB2SID") IsNot Nothing Then - romid = CInt(innerNode.Attributes("ReelIlluB2SID").InnerText) - If innerNode.Attributes("ReelIlluB2SValue") IsNot Nothing Then - romidvalue = CInt(innerNode.Attributes("ReelIlluB2SValue").InnerText) - End If - romidtype = 1 - End If - Dim soundName As String = String.Empty - - ' set some tmp vars - Dim isOnBackglass As Boolean = (parent = "Backglass") - Dim isDream7LEDs As Boolean = (reeltype.StartsWith("dream7", StringComparison.CurrentCultureIgnoreCase)) - Dim isRenderedLEDs As Boolean = (reeltype.StartsWith("rendered", StringComparison.CurrentCultureIgnoreCase)) - Dim isReels As Boolean = Not (isDream7LEDs OrElse isRenderedLEDs) - Dim glowbulb As SizeF = Nothing - Dim glow As Integer = d7glow - Dim ledtype As String = String.Empty - - ' set led type - If isDream7LEDs Then - ledtype = reeltype.Substring(9) - ElseIf isRenderedLEDs Then - ledtype = reeltype.Substring(11) - End If - - ' maybe get default glow value - If B2SSettings.DefaultGlow = -1 Then - B2SSettings.DefaultGlow = d7glow - End If - - ' set preferred LED settings - If isRenderedLEDs OrElse isDream7LEDs Then - If B2SSettings.IsGameNameFound AndAlso B2SSettings.UsedLEDType <> B2SSettings.eLEDTypes.Undefined Then - isDream7LEDs = (B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Dream7) - isRenderedLEDs = (B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Rendered) - ElseIf B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Undefined Then - B2SSettings.UsedLEDType = If(isDream7LEDs, B2SSettings.eLEDTypes.Dream7, B2SSettings.eLEDTypes.Rendered) - End If - If B2SSettings.IsGameNameFound AndAlso B2SSettings.GlowIndex > -1 Then - glow = B2SSettings.GlowIndex * 8 - End If - If B2SSettings.IsGameNameFound AndAlso B2SSettings.IsGlowBulbOn Then - glowbulb = New SizeF(0.1, 0.4) - End If - End If - - ' maybe create Dream 7 LED display controls - If isDream7LEDs OrElse isRenderedLEDs Then - ' add some self rendered Dream7 LED segments - Dim led As Dream7Display = New Dream7Display() - led.Name = "LEDDisplay" & id.ToString() - led.Location = loc - led.Size = size - Select Case ledtype - Case "7", "8" - led.Type = SegmentNumberType.SevenSegment - Case "9", "10" - led.Type = SegmentNumberType.TenSegment - Case "14" - led.Type = SegmentNumberType.FourteenSegment - 'Case "16" - 'led.Type = SegmentNumberType.SixteenSegment - End Select - led.ScaleMode = ScaleMode.Stretch - led.Digits = digits - led.Spacing = spacing * 5 - led.Hidden = hidden - ' color settings - 'led.GlassColor = reellitcolor - 'led.LightColor = Color.FromArgb(Math.Min(reellitcolor.R + 35, 255), Math.Min(reellitcolor.G + 35, 255), Math.Min(reellitcolor.B + 25, 255)) - 'led.GlassColorCenter = Color.FromArgb(Math.Min(reellitcolor.R + 50, 255), Math.Min(reellitcolor.G + 50, 255), Math.Min(reellitcolor.B + 50, 255)) - led.LightColor = reellitcolor - led.GlassColor = Color.FromArgb(Math.Min(reellitcolor.R + 50, 255), Math.Min(reellitcolor.G + 50, 255), Math.Min(reellitcolor.B + 50, 255)) - led.GlassColorCenter = Color.FromArgb(Math.Min(reellitcolor.R + 70, 255), Math.Min(reellitcolor.G + 70, 255), Math.Min(reellitcolor.B + 70, 255)) - led.OffColor = reeldarkcolor - 'led.BackColor = Color.FromArgb(5, 5, 5) - led.BackColor = Color.FromArgb(15, 15, 15) - led.GlassAlpha = 140 - led.GlassAlphaCenter = 255 - led.Thickness = d7thickness * 1.2 - led.Shear = d7shear - led.Glow = glow - If glowbulb <> Nothing Then - led.BulbSize = glowbulb - End If - ' 'TAXI' patch to shear the third LED display - If id = 3 AndAlso B2SData.TableName = "Taxi" Then - led.Angle = 4 - led.Shear = led.Shear / 2 - End If - - 'led.OffsetWidth = -1 * CInt(d7shear * 30) - - 'led.BulbSize = New SizeF(0.1, 0.4) - - - 'led.GlassColor = Color.FromArgb(254, 50, 25) - 'led.LightColor = Color.FromArgb(254, 90, 50) - 'led.GlassColorCenter = Color.FromArgb(254, 50, 25) - 'led.GlassAlpha = 140 - 'led.GlassAlphaCenter = 255 - 'led.Glow = 9 - - - 'led.GlassColor = Color.FromArgb(255, 210, 50) - 'led.LightColor = Color.FromArgb(255, 0, 0) - 'led.GlassColorCenter = Color.FromArgb(255, 230, 65) - 'led.OffColor = Color.FromArgb(20, 20, 20) - 'led.GlassAlpha = 120 - 'led.GlassAlphaCenter = 255 - 'led.Glow = 15 - 'led.BulbSize = New SizeF(0.1, 0.4) - 'led.Thickness = 30 - - - - ' add control to parent - If isOnBackglass Then - 'led.Type = B2SBaseBox.eType.OnBackglass - Me.Controls.Add(led) - ' add to general collection - B2SData.LEDDisplays.Add(led.Name, led) - Else - If Not B2SSettings.HideB2SDMD Then - CheckDMDForm() - formDMD.Controls.Add(led) - ' add to general collection - B2SData.LEDDisplays.Add(led.Name, led) - End If - End If - led.BringToFront() - led.Visible = isDream7LEDs AndAlso Not hidden - ' add digit location info - For i = 0 To digits - 1 - If isOnBackglass OrElse Not B2SSettings.HideB2SDMD Then - Dim leddisplayid As Integer = If(dream7b2sstartdigit > 0, dream7b2sstartdigit, dream7index) - B2SData.LEDDisplayDigits.Add(leddisplayid - 1, New B2SData.LEDDisplayDigitLocation(led, i, id)) - B2SData.ScoreMaxDigit = leddisplayid - End If - dream7index += 1 - If dream7b2sstartdigit > 0 Then dream7b2sstartdigit += 1 - Next - ' add LED area - B2SData.LEDAreas.Add("LEDArea" & id.ToString(), New B2SData.LEDAreaInfo(New Rectangle(loc, size), Not isOnBackglass)) - ' add or update player info collection - If b2splayerno > 0 Then - B2SData.IsAPlayerAdded = True - If Not B2SData.Players.ContainsKey(b2splayerno) Then - B2SData.Players.Add(b2splayerno) - End If - B2SData.Players(b2splayerno).Add(New B2SPlayer.ControlInfo(startdigit, digits, B2SPlayer.eControlType.Dream7LEDDisplay, led)) - End If - End If - - ' create reel or led boxes - Dim width As Integer = CInt((size.Width - (digits - 1) * spacing / 2) / digits) - For i As Integer = 1 To digits - Dim x As Integer = loc.X + ((i - 1) * (width + spacing / 2)) - If isRenderedLEDs OrElse isDream7LEDs Then - ' add some self rendered LEDs - Dim led As B2SLEDBox = New B2SLEDBox() - led.ID = If(b2sstartdigit > 0, b2sstartdigit, renderedandreelindex) - led.DisplayID = id - led.Name = "LEDBox" & led.ID.ToString() - led.StartDigit = startdigit - led.Digits = digits - led.Hidden = hidden - led.Location = New Point(x, loc.Y) - led.Size = New Size(width, size.Height) - Select Case ledtype - Case "7", "8" - led.LEDType = B2SLED.eLEDType.LED8 - Case "9", "10" - led.LEDType = B2SLED.eLEDType.LED10 - Case "14" - led.LEDType = B2SLED.eLEDType.LED14 - 'Case "16" - ' led.LEDType = B2SLED.eLEDType.LED16 - End Select - led.LitLEDSegmentColor = reellitcolor - led.DarkLEDSegmentColor = reeldarkcolor - led.BackColor = Color.FromArgb(5, 5, 5) ' Color.Transparent - If isOnBackglass Then - led.Type = B2SBaseBox.eType.OnBackglass - Me.Controls.Add(led) - ' add to general collection - B2SData.LEDs.Add(led.Name, led) - Else - If Not B2SSettings.HideB2SDMD Then - CheckDMDForm() - led.Type = B2SBaseBox.eType.OnDMD - formDMD.Controls.Add(led) - ' add to general collection - B2SData.LEDs.Add(led.Name, led) - End If - End If - B2SData.ScoreMaxDigit = led.ID - led.BringToFront() - led.Visible = isRenderedLEDs AndAlso Not hidden - ' add LED area - 'B2SData.LEDAreas.Add("LEDArea" & id.ToString(), New B2SData.LEDAreaInfo(New Rectangle(loc, size), Not isOnBackglass)) - ' add or update player info collection - ' no need to do this here since it's done at the dream7 LEDs - ' write reel info into registry - Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) - regkey.SetValue("B2SScoreDigit" & led.ID.ToString(), If(isDream7LEDs, "2", "1") & "," & CInt(led.LEDType).ToString() & "," & led.StartDigit.ToString() & "," & led.Digits, RegistryValueKind.String) - regkey.SetValue("B2SScoreDisplay" & id.ToString(), startdigit.ToString(), RegistryValueKind.String) - End Using - ElseIf isReels Then - ' look for matching reel sound - soundName = String.Empty - If innerNode.Attributes("Sound" & i.ToString()) IsNot Nothing Then - soundName = innerNode.Attributes("Sound" & i.ToString()).InnerText - If String.IsNullOrEmpty(soundName) Then - soundName = "stille" - End If - End If - ' add reel or LED pictures - Dim reel As B2SReelBox = New B2SReelBox() - reel.ID = If(b2sstartdigit > 0, b2sstartdigit, renderedandreelindex) - reel.DisplayID = id - reel.SetID = setid - reel.Name = "ReelBox" & reel.ID.ToString() - reel.StartDigit = startdigit - reel.Digits = digits - reel.RomID = romid - reel.RomIDType = romidtype - reel.RomIDValue = romidvalue - reel.Location = New Point(x, loc.Y) - reel.Size = New Size(width, size.Height) - reel.ReelType = reeltype.Substring(0, reeltype.Length - 2) - reel.ScoreType = b2sscoretype - reel.SoundName = soundName - If rollinginterval >= 10 Then reel.RollingInterval = rollinginterval - If isOnBackglass Then - reel.Type = B2SBaseBox.eType.OnBackglass - Me.Controls.Add(reel) - ' add to general collection - B2SData.Reels.Add(reel) - Else - If Not B2SSettings.HideB2SDMD Then - CheckDMDForm() - reel.Type = B2SBaseBox.eType.OnDMD - formDMD.Controls.Add(reel) - ' add to general collection - B2SData.Reels.Add(reel) - End If - End If - B2SData.ScoreMaxDigit = reel.ID - reel.BringToFront() - reel.Visible = Not hidden - ' add or update reel display - If Not B2SData.ReelDisplays.ContainsKey(id) Then - Dim reeldisplay As B2SReelDisplay = New B2SReelDisplay - reeldisplay.StartDigit = startdigit - reeldisplay.Digits = digits - reeldisplay.Reels.Add(reel.ID, reel) - B2SData.ReelDisplays.Add(id, reeldisplay) - Else - B2SData.ReelDisplays(id).Reels.Add(reel.ID, reel) - End If - ' add or update player info collection - If b2splayerno > 0 Then - B2SData.IsAPlayerAdded = True - If Not B2SData.Players.ContainsKey(b2splayerno) Then - B2SData.Players.Add(b2splayerno) - End If - B2SData.Players(b2splayerno).Add(New B2SPlayer.ControlInfo(startdigit, digits, B2SPlayer.eControlType.ReelDisplay, B2SData.ReelDisplays(id))) - End If - ' write reel info into registry - Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) - regkey.SetValue("B2SScoreDigit" & reel.ID.ToString(), "3,0," & reel.StartDigit.ToString() & "," & reel.Digits, RegistryValueKind.String) - regkey.SetValue("B2SScoreDisplay" & id.ToString(), startdigit.ToString(), RegistryValueKind.String) - End Using - End If - - renderedandreelindex += 1 - If b2sstartdigit > 0 Then b2sstartdigit += 1 - - Next - - dream7index = renderedandreelindex - - Next - - ' write player info into registry - For Each controls As KeyValuePair(Of Integer, B2SPlayer.ControlCollection) In B2SData.Players - Dim player As String = String.Empty - For Each controlinfo As B2SPlayer.ControlInfo In controls.Value - With controlinfo - Dim type As String = "0" - If .LEDBox IsNot Nothing Then - type = CInt(.LEDBox.LEDType).ToString() - ElseIf .LEDDisplay IsNot Nothing Then - type = If(.LEDDisplay.Type = SegmentNumberType.TenSegment, "2", If(.LEDDisplay.Type = SegmentNumberType.FourteenSegment, "3", "1")) - End If - player &= ";" & If(.Type = B2SPlayer.eControlType.ReelDisplay OrElse .Type = B2SPlayer.eControlType.ReelBox, "3", "1") & "," & - type & "," & - controlinfo.StartDigit & "," & - controlinfo.Digits - End With - Next - If Not String.IsNullOrEmpty(player) Then player = player.Substring(1) - Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) - regkey.SetValue("B2SScorePlayer" & controls.Key.ToString(), player, RegistryValueKind.String) - End Using - Next - - End If - - ' maybe get all reel images - If topnode.SelectSingleNode("Reels") IsNot Nothing Then - - If topnode.SelectNodes("Reels/Image") IsNot Nothing AndAlso topnode.SelectNodes("Reels/Image").Count > 0 Then - For Each innerNode As Xml.XmlElement In topnode.SelectNodes("Reels/Image") - Dim name As String = innerNode.Attributes("Name").InnerText - Dim image As Image = Base64ToImage(innerNode.Attributes("Image").InnerText) - If Not B2SData.ReelImages.ContainsKey(name) Then - B2SData.ReelImages.Add(name, image) - End If - Next - - ElseIf topnode.SelectNodes("Reels/Images") IsNot Nothing AndAlso topnode.SelectNodes("Reels/Images/Image") IsNot Nothing AndAlso topnode.SelectNodes("Reels/Images/Image").Count > 0 Then - - For Each innerNode As Xml.XmlElement In topnode.SelectNodes("Reels/Images/Image") - Dim name As String = innerNode.Attributes("Name").InnerText - Dim image As Image = Base64ToImage(innerNode.Attributes("Image").InnerText) - If Not B2SData.ReelImages.ContainsKey(name) Then - B2SData.ReelImages.Add(name, image) - End If - ' maybe get the intermediate reel images - If innerNode.Attributes("CountOfIntermediates") IsNot Nothing Then - Dim countOfIntermediates As Integer = CInt(innerNode.Attributes("CountOfIntermediates").InnerText) - For i As Integer = 1 To countOfIntermediates - Dim intname As String = name & "_" & i.ToString() - Dim intimage As Image = Base64ToImage(innerNode.Attributes("IntermediateImage" & i.ToString()).InnerText) - If Not B2SData.ReelIntermediateImages.ContainsKey(intname) Then - B2SData.ReelIntermediateImages.Add(intname, intimage) - End If - Next - End If - Next - - If topnode.SelectNodes("Reels/IlluminatedImages") IsNot Nothing Then - If topnode.SelectNodes("Reels/IlluminatedImages/IlluminatedImage") IsNot Nothing AndAlso topnode.SelectNodes("Reels/IlluminatedImages/IlluminatedImage").Count > 0 Then - For Each innerNode As Xml.XmlElement In topnode.SelectNodes("Reels/IlluminatedImages/IlluminatedImage") - Dim name As String = innerNode.Attributes("Name").InnerText - Dim image As Image = Base64ToImage(innerNode.Attributes("Image").InnerText) - If Not B2SData.ReelIlluImages.ContainsKey(name) Then - B2SData.ReelIlluImages.Add(name, image) - End If - ' maybe get the intermediate reel images - If innerNode.Attributes("CountOfIntermediates") IsNot Nothing Then - Dim countOfIntermediates As Integer = CInt(innerNode.Attributes("CountOfIntermediates").InnerText) - For i As Integer = 1 To countOfIntermediates - Dim intname As String = name & "_" & i.ToString() - Dim intimage As Image = Base64ToImage(innerNode.Attributes("IntermediateImage" & i.ToString()).InnerText) - If Not B2SData.ReelIntermediateIlluImages.ContainsKey(intname) Then - B2SData.ReelIntermediateIlluImages.Add(intname, intimage) - End If - Next - End If - Next - ElseIf topnode.SelectNodes("Reels/IlluminatedImages/Set") IsNot Nothing AndAlso topnode.SelectNodes("Reels/IlluminatedImages/Set/IlluminatedImage") IsNot Nothing AndAlso topnode.SelectNodes("Reels/IlluminatedImages/Set/IlluminatedImage").Count > 0 Then - For Each setnode As Xml.XmlElement In topnode.SelectNodes("Reels/IlluminatedImages/Set") - Dim setid As Integer = CInt(setnode.Attributes("ID").InnerText) - For Each innerNode As Xml.XmlElement In setnode.SelectNodes("IlluminatedImage") - Dim name As String = innerNode.Attributes("Name").InnerText & "_" & setid.ToString() - Dim image As Image = Base64ToImage(innerNode.Attributes("Image").InnerText) - If Not B2SData.ReelIlluImages.ContainsKey(name) Then - B2SData.ReelIlluImages.Add(name, image) - End If - ' maybe get the intermediate reel images - If innerNode.Attributes("CountOfIntermediates") IsNot Nothing Then - Dim countOfIntermediates As Integer = CInt(innerNode.Attributes("CountOfIntermediates").InnerText) - For i As Integer = 1 To countOfIntermediates - Dim intname As String = name & "_" & i.ToString() - Dim intimage As Image = Base64ToImage(innerNode.Attributes("IntermediateImage" & i.ToString()).InnerText) - If Not B2SData.ReelIntermediateIlluImages.ContainsKey(intname) Then - B2SData.ReelIntermediateIlluImages.Add(intname, intimage) - End If - Next - End If - Next - Next - End If - End If - - End If - - End If - - ' maybe get all sounds - If topnode.SelectSingleNode("Sounds") IsNot Nothing Then - - If topnode.SelectNodes("Sounds/Sound") IsNot Nothing AndAlso topnode.SelectNodes("Sounds/Sound").Count > 0 Then - For Each innerNode As Xml.XmlElement In topnode.SelectNodes("Sounds/Sound") - Dim name As String = innerNode.Attributes("Name").InnerText - Dim stream As IO.MemoryStream = Base64ToWav(innerNode.Attributes("Stream").InnerText) - If Not B2SData.Sounds.ContainsKey(name) Then - B2SData.Sounds.Add(name, stream.ToArray) - End If - Next - End If - For Each reel As KeyValuePair(Of String, B2SReelBox) In B2SData.Reels - If B2SData.Sounds.ContainsKey(reel.Value.SoundName) Then - reel.Value.Sound = B2SData.Sounds(reel.Value.SoundName) - End If - Next - - End If - - ' get background and maybe DMD image(s) - If topnode.SelectSingleNode("Images") IsNot Nothing Then - - ' backglass image - Dim offimagenode As Xml.XmlElement = topnode.SelectSingleNode("Images/BackglassOffImage") - If offimagenode IsNot Nothing Then - B2SData.OnAndOffImage = True - ' get on and off image - Dim offimage As Image = Base64ToImage(offimagenode.Attributes("Value").InnerText) - DarkImage4Authentic = offimage - If B2SData.DualBackglass Then - DarkImage4Fantasy = offimage - End If - Dim onimagenode As Xml.XmlElement = topnode.SelectSingleNode("Images/BackglassOnImage") - If onimagenode IsNot Nothing Then - Dim onimage As Image = Base64ToImage(onimagenode.Attributes("Value").InnerText) - TopLightImage4Authentic = onimage - If B2SData.DualBackglass Then - TopLightImage4Fantasy = onimage - End If - If onimagenode.Attributes("RomID") IsNot Nothing Then - TopRomID4Authentic = CInt(onimagenode.Attributes("RomID").InnerText) - TopRomIDType4Authentic = CInt(onimagenode.Attributes("RomIDType").InnerText) - TopRomInverted4Authentic = False - Select Case TopRomIDType4Authentic - Case B2SBaseBox.eRomIDType.Lamp - B2SData.UsedRomLampIDs4Authentic.Add(TopRomID4Authentic, Nothing) - Case B2SBaseBox.eRomIDType.Solenoid - B2SData.UsedRomSolenoidIDs4Authentic.Add(TopRomID4Authentic, Nothing) - Case B2SBaseBox.eRomIDType.GIString - B2SData.UsedRomGIStringIDs4Authentic.Add(TopRomID4Authentic, Nothing) - End Select - If B2SData.DualBackglass Then - TopRomID4Fantasy = CInt(onimagenode.Attributes("RomID").InnerText) - TopRomIDType4Fantasy = CInt(onimagenode.Attributes("RomIDType").InnerText) - TopRomInverted4Fantasy = False - Select Case TopRomIDType4Authentic - Case B2SBaseBox.eRomIDType.Lamp - B2SData.UsedRomLampIDs4Fantasy.Add(TopRomID4Fantasy, Nothing) - Case B2SBaseBox.eRomIDType.Solenoid - B2SData.UsedRomSolenoidIDs4Fantasy.Add(TopRomID4Fantasy, Nothing) - Case B2SBaseBox.eRomIDType.GIString - B2SData.UsedRomGIStringIDs4Fantasy.Add(TopRomID4Fantasy, Nothing) - End Select - End If - End If - End If - Else - Dim imagenode As Xml.XmlElement = topnode.SelectSingleNode("Images/BackglassImage") - If imagenode IsNot Nothing Then - Dim image As Image = Base64ToImage(imagenode.Attributes("Value").InnerText) - DarkImage4Authentic = image - If B2SData.DualBackglass Then - DarkImage4Fantasy = image - End If - End If - End If - ' starting image is the dark image - Me.BackgroundImage = DarkImage - - ' DMD image - Dim dmdimagenode As Xml.XmlElement = topnode.SelectSingleNode("Images/DMDImage") - If dmdimagenode IsNot Nothing Then - Dim image As Image = Base64ToImage(dmdimagenode.Attributes("Value").InnerText) - If image IsNot Nothing Then - If Not B2SSettings.HideB2SDMD Then - CheckDMDForm() - formDMD.BackgroundImage = image - End If - End If - End If - - If mergeBulbs Then - ' look for the largest bulb amount - Dim topSize4Authentic As Integer = 0 - Dim topkey4Authentic As String = String.Empty - Dim secondSize4Authentic As Integer = 0 - Dim secondkey4Authentic As String = String.Empty - For Each romsize As KeyValuePair(Of String, Integer) In roms4Authentic - If romsize.Value > secondSize4Authentic Then - secondSize4Authentic = romsize.Value - secondkey4Authentic = romsize.Key - End If - If romsize.Value > topSize4Authentic Then - secondSize4Authentic = topSize4Authentic - secondkey4Authentic = topkey4Authentic - topSize4Authentic = romsize.Value - topkey4Authentic = romsize.Key - End If - Next - Dim top4Fantasy As Integer = 0 - Dim topkey4Fantasy As String = String.Empty - Dim secondSize4Fantasy As Integer = 0 - Dim secondkey4Fantasy As String = String.Empty - If B2SData.DualBackglass Then - For Each romsize As KeyValuePair(Of String, Integer) In roms4Fantasy - If romsize.Value > secondSize4Fantasy Then - secondSize4Fantasy = romsize.Value - secondkey4Fantasy = romsize.Key - End If - If romsize.Value > top4Fantasy Then - secondSize4Fantasy = top4Fantasy - secondkey4Fantasy = topkey4Fantasy - top4Fantasy = romsize.Value - topkey4Fantasy = romsize.Key - End If - Next - End If - ' maybe draw some light images for pretty fast image changing - If topSize4Authentic >= minSize4Image Then - ' create some light images - If TopLightImage4Authentic Is Nothing Then - TopLightImage4Authentic = CreateLightImage(DarkImage4Authentic, B2SData.eDualMode.Authentic, topkey4Authentic, , TopRomID4Authentic, TopRomIDType4Authentic, TopRomInverted4Authentic) - If secondSize4Authentic > minSize4Image Then - SecondLightImage4Authentic = CreateLightImage(DarkImage4Authentic, B2SData.eDualMode.Authentic, secondkey4Authentic, , SecondRomID4Authentic, SecondRomIDType4Authentic, SecondRomInverted4Authentic) - TopAndSecondLightImage4Authentic = CreateLightImage(DarkImage4Authentic, B2SData.eDualMode.Authentic, topkey4Authentic, secondkey4Authentic) - End If - Else - SecondLightImage4Authentic = CreateLightImage(DarkImage4Authentic, B2SData.eDualMode.Authentic, topkey4Authentic, , SecondRomID4Authentic, SecondRomIDType4Authentic, SecondRomInverted4Authentic) - TopAndSecondLightImage4Authentic = CreateLightImage(TopLightImage4Authentic, B2SData.eDualMode.Authentic, topkey4Authentic) - End If - End If - If B2SData.DualBackglass AndAlso top4Fantasy >= minSize4Image Then - ' create some light images - If TopLightImage4Fantasy Is Nothing Then - TopLightImage4Fantasy = CreateLightImage(DarkImage4Fantasy, B2SData.eDualMode.Fantasy, topkey4Fantasy, , TopRomID4Fantasy, TopRomIDType4Fantasy, TopRomInverted4Fantasy) - If secondSize4Fantasy > minSize4Image Then - SecondLightImage4Fantasy = CreateLightImage(DarkImage4Fantasy, B2SData.eDualMode.Fantasy, secondkey4Fantasy, , SecondRomID4Fantasy, SecondRomIDType4Fantasy, SecondRomInverted4Fantasy) - TopAndSecondLightImage4Fantasy = CreateLightImage(DarkImage4Fantasy, B2SData.eDualMode.Fantasy, topkey4Fantasy, secondkey4Fantasy) - End If - Else - SecondLightImage4Fantasy = CreateLightImage(DarkImage4Fantasy, B2SData.eDualMode.Fantasy, topkey4Fantasy, , SecondRomID4Fantasy, SecondRomIDType4Fantasy, SecondRomInverted4Fantasy) - TopAndSecondLightImage4Fantasy = CreateLightImage(TopLightImage4Fantasy, B2SData.eDualMode.Fantasy, topkey4Fantasy) - End If - End If - B2SData.UsedTopRomIDType4Authentic = TopRomIDType4Authentic - B2SData.UsedSecondRomIDType4Authentic = SecondRomIDType4Authentic - If B2SData.DualBackglass Then - B2SData.UsedTopRomIDType4Fantasy = TopRomIDType4Fantasy - B2SData.UsedSecondRomIDType4Fantasy = SecondRomIDType4Fantasy - End If - - ' remove top and second rom bulbs - CheckBulbs(TopRomID4Authentic, TopRomIDType4Authentic, TopRomInverted4Authentic, B2SData.eDualMode.Authentic) - CheckBulbs(SecondRomID4Authentic, SecondRomIDType4Authentic, SecondRomInverted4Authentic, B2SData.eDualMode.Authentic) - If B2SData.DualBackglass Then - CheckBulbs(TopRomID4Fantasy, TopRomIDType4Fantasy, TopRomInverted4Fantasy, B2SData.eDualMode.Fantasy) - CheckBulbs(SecondRomID4Fantasy, SecondRomIDType4Fantasy, SecondRomInverted4Fantasy, B2SData.eDualMode.Fantasy) - End If - End If - End If - - ' get all animation info - Dim animationpulseswitch As Boolean = False - If topnode.SelectSingleNode("Animations") IsNot Nothing AndAlso topnode.SelectNodes("Animations/Animation") IsNot Nothing Then - For Each innerNode As Xml.XmlElement In topnode.SelectNodes("Animations/Animation") - Dim name As String = innerNode.Attributes("Name").InnerText - Dim dualmode As B2SData.eDualMode = B2SData.eDualMode.Both - If innerNode.Attributes("DualMode") IsNot Nothing Then - dualmode = CInt(innerNode.Attributes("DualMode").InnerText) - End If - Dim interval As Integer = CInt(innerNode.Attributes("Interval").InnerText) - Dim loops As Integer = CInt(innerNode.Attributes("Loops").InnerText) - Dim idJoins As String = innerNode.Attributes("IDJoin").InnerText - Dim startAnimationAtBackglassStartup As Boolean = (innerNode.Attributes("StartAnimationAtBackglassStartup").InnerText = "1") - Dim lightsStateAtAnimationStart As B2SAnimation.eLightsStateAtAnimationStart = B2SAnimation.eLightsStateAtAnimationStart.NoChange - Dim lightsStateAtAnimationEnd As B2SAnimation.eLightsStateAtAnimationEnd = B2SAnimation.eLightsStateAtAnimationEnd.InvolvedLightsOff - Dim animationstopbehaviour As B2SAnimation.eAnimationStopBehaviour = B2S.B2SAnimation.eAnimationStopBehaviour.StopImmediatelly - Dim lockInvolvedLamps As Boolean = False - Dim hidescoredisplays As Boolean = False - Dim bringtofront As Boolean = False - Dim randomstart As Boolean = False - Dim randomquality As Integer = 1 - If innerNode.Attributes("LightsStateAtAnimationStart") IsNot Nothing Then - lightsStateAtAnimationStart = CInt(innerNode.Attributes("LightsStateAtAnimationStart").InnerText) - ElseIf innerNode.Attributes("AllLightsOffAtAnimationStart") IsNot Nothing Then - lightsStateAtAnimationStart = If((innerNode.Attributes("AllLightsOffAtAnimationStart").InnerText = "1"), B2SAnimation.eLightsStateAtAnimationStart.LightsOff, B2SAnimation.eLightsStateAtAnimationStart.NoChange) - End If - If innerNode.Attributes("LightsStateAtAnimationEnd") IsNot Nothing Then - lightsStateAtAnimationEnd = CInt(innerNode.Attributes("LightsStateAtAnimationEnd").InnerText) - ElseIf innerNode.Attributes("ResetLightsAtAnimationEnd") IsNot Nothing Then - lightsStateAtAnimationEnd = If((innerNode.Attributes("ResetLightsAtAnimationEnd").InnerText = "1"), B2SAnimation.eLightsStateAtAnimationEnd.LightsReseted, B2SAnimation.eLightsStateAtAnimationEnd.Undefined) - End If - If innerNode.Attributes("AnimationStopBehaviour") IsNot Nothing Then - animationstopbehaviour = CInt(innerNode.Attributes("AnimationStopBehaviour").InnerText) - ElseIf innerNode.Attributes("RunAnimationTilEnd") IsNot Nothing Then - animationstopbehaviour = If((innerNode.Attributes("RunAnimationTilEnd").InnerText = "1"), B2SAnimation.eAnimationStopBehaviour.RunAnimationTillEnd, B2SAnimation.eAnimationStopBehaviour.StopImmediatelly) - End If - lockInvolvedLamps = (innerNode.Attributes("LockInvolvedLamps").InnerText = "1") - If innerNode.Attributes("HideScoreDisplays") IsNot Nothing Then - hidescoredisplays = (innerNode.Attributes("HideScoreDisplays").InnerText = "1") - End If - If innerNode.Attributes("BringToFront") IsNot Nothing Then - bringtofront = (innerNode.Attributes("BringToFront").InnerText = "1") - End If - If innerNode.Attributes("RandomStart") IsNot Nothing Then - randomstart = (innerNode.Attributes("RandomStart").InnerText = "1") - End If - If randomstart AndAlso innerNode.Attributes("RandomQuality") IsNot Nothing Then - randomquality = CInt(innerNode.Attributes("RandomQuality").InnerText) - End If - If lightsStateAtAnimationStart = B2SAnimation.eLightsStateAtAnimationStart.Undefined Then lightsStateAtAnimationStart = B2SAnimation.eLightsStateAtAnimationStart.NoChange - If lightsStateAtAnimationEnd = B2SAnimation.eLightsStateAtAnimationEnd.Undefined Then lightsStateAtAnimationEnd = B2SAnimation.eLightsStateAtAnimationEnd.InvolvedLightsOff - If animationstopbehaviour = B2SAnimation.eAnimationStopBehaviour.Undefined Then animationstopbehaviour = B2SAnimation.eAnimationStopBehaviour.StopImmediatelly - Dim entries As B2SAnimation.PictureBoxAnimationEntry() = Nothing - For Each stepnode As Xml.XmlElement In innerNode.SelectNodes("AnimationStep") - Dim [step] As Integer = CInt(stepnode.Attributes("Step").InnerText) - Dim [on] As String = stepnode.Attributes("On").InnerText - Dim waitLoopsAfterOn As Integer = CInt(stepnode.Attributes("WaitLoopsAfterOn").InnerText) - Dim off As String = stepnode.Attributes("Off").InnerText - Dim waitLoopsAfterOff As Integer = CInt(stepnode.Attributes("WaitLoopsAfterOff").InnerText) - Dim pulseswitch As Integer = 0 - If stepnode.Attributes("PulseSwitch") IsNot Nothing Then - pulseswitch = CInt(stepnode.Attributes("PulseSwitch").InnerText) - If pulseswitch > 0 Then animationpulseswitch = True - End If - Dim entry As B2SAnimation.PictureBoxAnimationEntry = New B2SAnimation.PictureBoxAnimationEntry([on], waitLoopsAfterOn, off, waitLoopsAfterOff, , , , , pulseswitch) - If entries Is Nothing Then - ReDim entries(0) - entries(0) = entry - Else - ReDim Preserve entries(entries.Length) - entries(entries.Length - 1) = entry - End If - Next - ' maybe add animation - If interval > 0 AndAlso entries.Length > 0 Then - B2SAnimation.AddAnimation(name, Me, formDMD, dualmode, interval, loops, startAnimationAtBackglassStartup, lightsStateAtAnimationStart, lightsStateAtAnimationEnd, - animationstopbehaviour, lockInvolvedLamps, hidescoredisplays, bringtofront, randomstart, randomquality, - entries) - ' maybe set slowdown - If B2SSettings.AnimationSlowDowns.ContainsKey(name) Then - B2SAnimation.AnimationSlowDown(name) = B2SSettings.AnimationSlowDowns(name) - End If - ' add join to ID - If Not String.IsNullOrEmpty(idJoins) Then - For Each idJoin As String In idJoins.Split(",") - If Not String.IsNullOrEmpty(idJoin) Then - Dim id0 As Integer = 0 - Dim id1 As Integer = 0 - Dim id2 As Integer = 0 - Dim id3 As Integer = 0 - If idJoin.Length >= 1 AndAlso IsNumeric(idJoin) Then id0 = CInt(idJoin) - If idJoin.Length >= 2 AndAlso IsNumeric(idJoin.Substring(1)) Then id1 = CInt(idJoin.Substring(1)) - If idJoin.Length >= 3 AndAlso IsNumeric(idJoin.Substring(2)) Then id2 = CInt(idJoin.Substring(2)) - If idJoin.Length >= 4 AndAlso IsNumeric(idJoin.Substring(3)) Then id3 = CInt(idJoin.Substring(3)) - Select Case idJoin.Substring(0, 1).ToUpper - Case "L" - Dim animations As B2SData.AnimationCollection = If(randomstart, B2SData.UsedRandomAnimationLampIDs, B2SData.UsedAnimationLampIDs) - If id1 > 0 Then animations.Add(id1, New B2SData.AnimationInfo(name, False)) - Case "S" - Dim animations As B2SData.AnimationCollection = If(randomstart, B2SData.UsedRandomAnimationSolenoidIDs, B2SData.UsedAnimationSolenoidIDs) - If id1 > 0 Then animations.Add(id1, New B2SData.AnimationInfo(name, False)) - Case "G" - Dim animations As B2SData.AnimationCollection = If(randomstart, B2SData.UsedRandomAnimationGIStringIDs, B2SData.UsedAnimationGIStringIDs) - If idJoin.Substring(1, 1).ToUpper = "I" Then - If id2 > 0 Then animations.Add(id2, New B2SData.AnimationInfo(name, False)) - Else - If id1 > 0 Then animations.Add(id1, New B2SData.AnimationInfo(name, False)) - End If - Case "I" - If idJoin.Length >= 2 Then - Select Case idJoin.Substring(0, 2).ToUpper - Case "IL" - Dim animations As B2SData.AnimationCollection = If(randomstart, B2SData.UsedRandomAnimationLampIDs, B2SData.UsedAnimationLampIDs) - If id2 > 0 Then animations.Add(id2, New B2SData.AnimationInfo(name, True)) - Case "IS" - Dim animations As B2SData.AnimationCollection = If(randomstart, B2SData.UsedRandomAnimationSolenoidIDs, B2SData.UsedAnimationSolenoidIDs) - If id2 > 0 Then animations.Add(id2, New B2SData.AnimationInfo(name, True)) - Case "IG" - Dim animations As B2SData.AnimationCollection = If(randomstart, B2SData.UsedRandomAnimationGIStringIDs, B2SData.UsedAnimationGIStringIDs) - If idJoin.Substring(2, 1).ToUpper = "I" Then - If id3 > 0 Then animations.Add(id3, New B2SData.AnimationInfo(name, True)) - Else - If id2 > 0 Then animations.Add(id2, New B2SData.AnimationInfo(name, True)) - End If - Case Else - Dim animations As B2SData.AnimationCollection = If(randomstart, B2SData.UsedRandomAnimationLampIDs, B2SData.UsedAnimationLampIDs) - If id1 > 0 Then animations.Add(id1, New B2SData.AnimationInfo(name, True)) - End Select - End If - Case Else - Dim animations As B2SData.AnimationCollection = If(randomstart, B2SData.UsedRandomAnimationLampIDs, B2SData.UsedAnimationLampIDs) - If id0 > 0 Then animations.Add(id0, New B2SData.AnimationInfo(name, False)) - End Select - End If - Next - End If - End If - Next - End If - Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) - regkey.SetValue("B2SSetSwitch", If(animationpulseswitch, 1, 0), RegistryValueKind.DWord) - End Using - - ' set backglass to topmost window - 'Me.TopMost = True - 'Me.BringToFront() - 'Me.TopMost = False - - End If - - End If - - End Sub - - Private Sub InitB2SScreen() - - ' initialize screen settings - If formDMD IsNot Nothing Then - If B2SData.DMDType = B2SData.eDMDType.B2SAlwaysOnSecondMonitor Then - B2SScreen.Start(Me, formDMD, B2SData.DMDDefaultLocation, B2SScreen.eDMDViewMode.ShowDMDOnlyAtDefaultLocation, B2SData.GrillHeight, B2SData.SmallGrillHeight) - ElseIf B2SData.DMDType = B2SData.eDMDType.B2SAlwaysOnThirdMonitor Then - B2SScreen.Start(Me, formDMD, B2SData.DMDDefaultLocation, B2SScreen.eDMDViewMode.DoNotShowDMDAtDefaultLocation, B2SData.GrillHeight, B2SData.SmallGrillHeight) - ElseIf B2SData.DMDType = B2SData.eDMDType.B2SOnSecondOrThirdMonitor Then - B2SScreen.Start(Me, formDMD, B2SData.DMDDefaultLocation, B2SScreen.eDMDViewMode.ShowDMD, B2SData.GrillHeight, B2SData.SmallGrillHeight) - Else - B2SScreen.Start(Me, B2SData.GrillHeight, B2SData.SmallGrillHeight) - End If - Else - B2SScreen.Start(Me, B2SData.GrillHeight, B2SData.SmallGrillHeight) - End If - - End Sub - - Private Sub ResizeSomeImages() - - ' resize images - Dim xResizeFactor As Single = 1 - Dim yResizeFactor As Single = 1 - If DarkImage4Authentic IsNot Nothing Then - Dim width As Integer = DarkImage4Authentic.Width - Dim height As Integer = DarkImage4Authentic.Height - Dim image As Image = DarkImage4Authentic.Resized(B2SScreen.BackglassSize) - DarkImage4Authentic.Dispose() - DarkImage4Authentic = Nothing - DarkImage4Authentic = image - xResizeFactor = width / DarkImage4Authentic.Width - yResizeFactor = height / DarkImage4Authentic.Height - End If - If DarkImage4Fantasy IsNot Nothing Then - DarkImage4Fantasy = DarkImage4Authentic - End If - If TopLightImage4Authentic IsNot Nothing Then - Dim image As Image = TopLightImage4Authentic.Resized(B2SScreen.BackglassSize) - TopLightImage4Authentic.Dispose() - TopLightImage4Authentic = Nothing - TopLightImage4Authentic = image - End If - If TopLightImage4Fantasy IsNot Nothing Then - Dim image As Image = TopLightImage4Fantasy.Resized(B2SScreen.BackglassSize) - TopLightImage4Fantasy.Dispose() - TopLightImage4Fantasy = Nothing - TopLightImage4Fantasy = image - End If - If SecondLightImage4Authentic IsNot Nothing Then - Dim image As Image = SecondLightImage4Authentic.Resized(B2SScreen.BackglassSize) - SecondLightImage4Authentic.Dispose() - SecondLightImage4Authentic = Nothing - SecondLightImage4Authentic = image - End If - If SecondLightImage4Fantasy IsNot Nothing Then - Dim image As Image = SecondLightImage4Fantasy.Resized(B2SScreen.BackglassSize) - SecondLightImage4Fantasy.Dispose() - SecondLightImage4Fantasy = Nothing - SecondLightImage4Fantasy = image - End If - If TopAndSecondLightImage4Authentic IsNot Nothing Then - Dim image As Image = TopAndSecondLightImage4Authentic.Resized(B2SScreen.BackglassSize) - TopAndSecondLightImage4Authentic.Dispose() - TopAndSecondLightImage4Authentic = Nothing - TopAndSecondLightImage4Authentic = image - End If - If TopAndSecondLightImage4Fantasy IsNot Nothing Then - Dim image As Image = TopAndSecondLightImage4Fantasy.Resized(B2SScreen.BackglassSize) - TopAndSecondLightImage4Fantasy.Dispose() - TopAndSecondLightImage4Fantasy = Nothing - TopAndSecondLightImage4Fantasy = image - End If - Me.BackgroundImage = DarkImage - - ' now resize the detail images - If xResizeFactor <> 1 OrElse yResizeFactor <> 1 Then - For Each illu As KeyValuePair(Of String, B2SPictureBox) In B2SData.Illuminations - If illu.Value.PictureBoxType = B2SPictureBox.ePictureBoxType.StandardImage Then - If illu.Value.BackgroundImage IsNot Nothing Then - Dim newsize As SizeF = New SizeF(illu.Value.BackgroundImage.Size.Width / xResizeFactor, illu.Value.BackgroundImage.Size.Height / yResizeFactor) - 'Dim image As Image = illu.Value.BackgroundImage.ResizedF(newsize, True) - 'Dim offimage As Image = illu.Value.OffImage.ResizedF(newsize, True) - Dim image As Image = illu.Value.BackgroundImage.Resized(Size.Round(newsize), True) - Dim offimage As Image = illu.Value.OffImage.Resized(Size.Round(newsize), True) - illu.Value.BackgroundImage = image - illu.Value.OffImage = offimage - End If - End If - Next - End If - - ' and now rotate and resize the rotation images - For Each rotatingImageColl As KeyValuePair(Of Integer, Generic.Dictionary(Of Integer, Image)) In B2SData.RotatingImages - For I As Integer = 0 To 359 - If rotatingImageColl.Value.ContainsKey(I) Then - If xResizeFactor <> 1 OrElse yResizeFactor <> 1 Then - Dim image As Image = rotatingImageColl.Value(I) - image = image.Resized(New Size(image.Width / xResizeFactor, image.Height / yResizeFactor), True) - rotatingImageColl.Value.Remove(I) - rotatingImageColl.Value.Add(I, image) - End If - End If - Next - ' maybe draw the starting rotate image - If B2SData.UseRotatingImage OrElse B2SData.UseMechRotatingImage Then - B2SData.RotatingPictureBox(rotatingImageColl.Key).BackgroundImage = rotatingImageColl.Value(0) - B2SData.RotatingPictureBox(rotatingImageColl.Key).Visible = True - End If - Next - - End Sub - - Private Sub ShowStartupSnippits() - - ' maybe show some 'startup on' snippits - Dim topIsOn As Boolean = False - For Each picbox As KeyValuePair(Of String, B2SPictureBox) In B2SData.Illuminations - If picbox.Value.InitialState = 1 AndAlso picbox.Value.IsImageSnippit Then - picbox.Value.Visible = True - End If - Next - - End Sub - Private Sub ShowStartupImages() - - Static isdone As Boolean = False - If Not isdone Then - isdone = True - ' maybe show some 'startup on' images - Dim topIsOn As Boolean = False - For Each picbox As KeyValuePair(Of String, B2SPictureBox) In B2SData.Illuminations - If picbox.Value.InitialState = 1 AndAlso Not picbox.Value.IsImageSnippit Then - If TopRomID > 0 AndAlso picbox.Value.RomID = TopRomID AndAlso picbox.Value.RomIDType = TopRomIDType AndAlso picbox.Value.RomInverted = TopRomInverted Then - topIsOn = True - If TopLightImage IsNot Nothing AndAlso Not TopLightImage.Equals(Me.BackgroundImage) Then - Me.BackgroundImage = TopLightImage - End If - ElseIf Not topIsOn AndAlso SecondRomID > 0 AndAlso picbox.Value.RomID = SecondRomID AndAlso picbox.Value.RomIDType = SecondRomIDType AndAlso picbox.Value.RomInverted = SecondRomInverted Then - If SecondLightImage IsNot Nothing AndAlso Not SecondLightImage.Equals(Me.BackgroundImage) Then - Me.BackgroundImage = SecondLightImage - End If - Else - picbox.Value.Visible = True - End If - End If - Next - End If - - End Sub - - Private Sub RotateImage(ByVal picbox As B2SPictureBox, - ByVal rotationsteps As Integer, - ByVal rotationdirection As B2SPictureBox.eSnippitRotationDirection, - ByVal type As B2SPictureBox.ePictureBoxType, - Optional ByVal romidtype As Integer = 0, - Optional ByVal romid As Integer = 0) - - If picbox IsNot Nothing AndAlso rotationsteps > 0 Then - - ' store some data - If romid = 0 Then - B2SData.UseRotatingImage = True - Else - B2SData.UseMechRotatingImage = True - End If - If Not B2SData.RotatingPictureBox.ContainsKey(romid) Then - B2SData.RotatingPictureBox.Add(romid, picbox) - Else - B2SData.RotatingPictureBox(romid) = picbox - End If - - ' calc rotation angle - Me.rotateAngle = 360 / rotationsteps - - ' rotate the image the whole circle - Dim rotatingangleS As Single = 0 - Dim index As Integer = 0 - Do While rotatingangleS < 360 - Dim rotatingAngle As Integer = CInt(rotatingangleS) - Dim image As Image = B2SData.RotatingPictureBox(romid).BackgroundImage.Rotated(If(rotationdirection = B2SPictureBox.eSnippitRotationDirection.AntiClockwise, rotatingAngle, 360 - rotatingAngle)) - If Not B2SData.RotatingImages.ContainsKey(romid) Then B2SData.RotatingImages.Add(romid, New Generic.Dictionary(Of Integer, Image)) - B2SData.RotatingImages(romid).Add(If(picbox.PictureBoxType = B2SPictureBox.ePictureBoxType.MechRotatingImage, index, rotatingAngle), image) - rotatingangleS += Me.rotateAngle - index += 1 - Loop - - ' set start image - 'B2SData.RotatingPictureBox(romid).BackgroundImage = B2SData.RotatingImages(romid)(0) - 'B2SData.RotatingPictureBox(romid).Visible = True - - End If - - End Sub - -#End Region - - -#Region "image cache stuff" - - Public ReadOnly Property DarkImage() As Image - Get - If B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy Then - Return DarkImage4Fantasy - Else - Return DarkImage4Authentic - End If - End Get - End Property - Public ReadOnly Property TopLightImage() As Image - Get - If B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy Then - Return TopLightImage4Fantasy - Else - Return TopLightImage4Authentic - End If - End Get - End Property - Public ReadOnly Property SecondLightImage() As Image - Get - If B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy Then - Return SecondLightImage4Fantasy - Else - Return SecondLightImage4Authentic - End If - End Get - End Property - Public ReadOnly Property TopAndSecondLightImage() As Image - Get - If B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy Then - Return TopAndSecondLightImage4Fantasy - Else - Return TopAndSecondLightImage4Authentic - End If - End Get - End Property - Public Property DarkImage4Authentic() As Image = Nothing - Public Property TopLightImage4Authentic() As Image = Nothing - Public Property SecondLightImage4Authentic() As Image = Nothing - Public Property TopAndSecondLightImage4Authentic() As Image = Nothing - Public Property DarkImage4Fantasy() As Image = Nothing - Public Property TopLightImage4Fantasy() As Image = Nothing - Public Property SecondLightImage4Fantasy() As Image = Nothing - Public Property TopAndSecondLightImage4Fantasy() As Image = Nothing - - Public ReadOnly Property TopRomID() As Integer - Get - If B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy Then - Return TopRomID4Fantasy - Else - Return TopRomID4Authentic - End If - End Get - End Property - Public ReadOnly Property TopRomIDType() As B2SBaseBox.eRomIDType - Get - If B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy Then - Return TopRomIDType4Fantasy - Else - Return TopRomIDType4Authentic - End If - End Get - End Property - Public ReadOnly Property TopRomInverted() As Boolean - Get - If B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy Then - Return TopRomInverted4Fantasy - Else - Return TopRomInverted4Authentic - End If - End Get - End Property - Public ReadOnly Property SecondRomID() As Integer - Get - If B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy Then - Return SecondRomID4Fantasy - Else - Return SecondRomID4Authentic - End If - End Get - End Property - Public ReadOnly Property SecondRomIDType() As B2SBaseBox.eRomIDType - Get - If B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy Then - Return SecondRomIDType4Fantasy - Else - Return SecondRomIDType4Authentic - End If - End Get - End Property - Public ReadOnly Property SecondRomInverted() As Boolean - Get - If B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy Then - Return SecondRomInverted4Fantasy - Else - Return SecondRomInverted4Authentic - End If - End Get - End Property - Public Property TopRomID4Authentic() As Integer = 0 - Public Property TopRomIDType4Authentic() As B2SBaseBox.eRomIDType = B2SBaseBox.eRomIDType.NotDefined - Public Property TopRomInverted4Authentic() As Boolean = False - Public Property SecondRomID4Authentic() As Integer = 0 - Public Property SecondRomIDType4Authentic() As B2SBaseBox.eRomIDType = B2SBaseBox.eRomIDType.NotDefined - Public Property SecondRomInverted4Authentic() As Boolean = False - Public Property TopRomID4Fantasy() As Integer = 0 - Public Property TopRomIDType4Fantasy() As B2SBaseBox.eRomIDType = B2SBaseBox.eRomIDType.NotDefined - Public Property TopRomInverted4Fantasy() As Boolean = False - Public Property SecondRomID4Fantasy() As Integer = 0 - Public Property SecondRomIDType4Fantasy() As B2SBaseBox.eRomIDType = B2SBaseBox.eRomIDType.NotDefined - Public Property SecondRomInverted4Fantasy() As Boolean = False - -#End Region - - -#Region "more private methods" - - Private Sub CheckDMDForm() - If formDMD Is Nothing AndAlso Not B2SSettings.HideB2SDMD Then - formDMD = New formDMD() - End If - End Sub - - Private Function CreateLightImage(ByRef image As Image, - ByVal dualmode As B2SData.eDualMode, - Optional ByVal firstromkey As String = "", - Optional ByVal secondromkey As String = "", - Optional ByRef romid As Integer = 0, - Optional ByRef romidtype As B2SBaseBox.eRomIDType = B2SBaseBox.eRomIDType.NotDefined, - Optional ByRef rominverted As Boolean = False) As Image - Dim firstromValue As Integer = 0 - - Dim secondromid As Integer = 0 - Dim secondromValue As Integer = 0 - Dim secondromidtype As B2SBaseBox.eRomIDType = B2SBaseBox.eRomIDType.NotDefined - Dim secondrominverted As Boolean = False - If firstromkey.Substring(0, 1) = "I" Then - rominverted = True - firstromkey = firstromkey.Substring(1) - End If - firstromValue = CInt(secondromkey.Split("|")(1)) - firstromkey = firstromkey.Split("|")(0) - - romidtype = If((firstromkey.Substring(0, 1) = "S"), B2SBaseBox.eRomIDType.Solenoid, If((firstromkey.Substring(0, 2) = "GI"), B2SBaseBox.eRomIDType.GIString, B2SBaseBox.eRomIDType.Lamp)) - romid = CInt(If((romidtype = B2SBaseBox.eRomIDType.GIString), firstromkey.Substring(2), firstromkey.Substring(1))) - - If Not String.IsNullOrEmpty(secondromkey) Then - secondromValue = CInt(secondromkey.Split("|")(1)) - secondromkey = secondromkey.Split("|")(0) - If secondromkey.Substring(0, 1) = "I" Then - secondrominverted = True - secondromkey = secondromkey.Substring(1) - End If - secondromidtype = If((secondromkey.Substring(0, 1) = "S"), B2SBaseBox.eRomIDType.Solenoid, If((secondromkey.Substring(0, 2) = "GI"), B2SBaseBox.eRomIDType.GIString, B2SBaseBox.eRomIDType.Lamp)) - secondromid = CInt(If((secondromidtype = B2SBaseBox.eRomIDType.GIString), secondromkey.Substring(2), secondromkey.Substring(1))) - End If - ' create image copy - Dim ret As Image = New Bitmap(image.Width, image.Height) - Using gr As Graphics = Graphics.FromImage(ret) - gr.InterpolationMode = Drawing2D.InterpolationMode.High - gr.SmoothingMode = Drawing2D.SmoothingMode.HighQuality - gr.DrawImage(image, New Rectangle(0, 0, ret.Width, ret.Height)) - End Using - ' draw matching bulbs into image - For Each picbox As B2SPictureBox In Me.Controls.OfType(Of B2SPictureBox)() - If picbox.RomID = romid AndAlso picbox.RomIDValue = firstromValue AndAlso picbox.RomIDType = romidtype AndAlso picbox.RomInverted = rominverted AndAlso (picbox.DualMode = B2SData.eDualMode.Both OrElse picbox.DualMode = dualmode) Then - Using gr As Graphics = Graphics.FromImage(ret) - gr.InterpolationMode = Drawing2D.InterpolationMode.High - gr.SmoothingMode = Drawing2D.SmoothingMode.HighQuality - gr.DrawImage(picbox.BackgroundImage, New Rectangle(picbox.Location.X, picbox.Location.Y, picbox.Size.Width, picbox.Size.Height)) - End Using - End If - Next - ' maybe draw second matching bulbs into image - If Not String.IsNullOrEmpty(secondromkey) Then - For Each picbox As B2SPictureBox In Me.Controls.OfType(Of B2SPictureBox)() - If picbox.RomID = secondromid AndAlso picbox.RomIDValue = secondromValue AndAlso picbox.RomIDType = secondromidtype AndAlso picbox.RomInverted = secondrominverted AndAlso (picbox.DualMode = B2SData.eDualMode.Both OrElse picbox.DualMode = dualmode) Then - Using gr As Graphics = Graphics.FromImage(ret) - gr.InterpolationMode = Drawing2D.InterpolationMode.High - gr.DrawImage(picbox.BackgroundImage, New Rectangle(picbox.Location.X, picbox.Location.Y, picbox.Size.Width, picbox.Size.Height)) - End Using - End If - Next - End If - ' that's it - Return ret - End Function - Private Sub CheckBulbs(ByVal romid As Integer, - ByVal romidtype As B2SBaseBox.eRomIDType, - ByVal rominverted As Boolean, - ByVal dualmode As B2SData.eDualMode) - If romid > 0 AndAlso romidtype <> B2SBaseBox.eRomIDType.NotDefined Then - Dim UsedRomIDs As Generic.SortedList(Of Integer, B2SBaseBox()) = Nothing - If romidtype = B2SBaseBox.eRomIDType.Lamp Then - UsedRomIDs = If(dualmode = B2SData.eDualMode.Fantasy, B2SData.UsedRomLampIDs4Fantasy, B2SData.UsedRomLampIDs4Authentic) - ElseIf romidtype = B2SBaseBox.eRomIDType.Solenoid Then - UsedRomIDs = If(dualmode = B2SData.eDualMode.Fantasy, B2SData.UsedRomSolenoidIDs4Fantasy, B2SData.UsedRomSolenoidIDs4Authentic) - ElseIf romidtype = B2SBaseBox.eRomIDType.GIString Then - UsedRomIDs = If(dualmode = B2SData.eDualMode.Fantasy, B2SData.UsedRomGIStringIDs4Fantasy, B2SData.UsedRomGIStringIDs4Authentic) - End If - If UsedRomIDs.ContainsKey(romid) Then - UsedRomIDs.Remove(romid) - For Each picbox As KeyValuePair(Of String, B2SPictureBox) In B2SData.Illuminations - With picbox.Value - If .RomID = romid AndAlso .RomIDType = romidtype AndAlso .RomInverted <> rominverted AndAlso (.DualMode = B2SData.eDualMode.Both OrElse .DualMode = dualmode) Then - B2SData.Illuminations.Add(picbox.Value, dualmode) - End If - End With - Next - End If - End If - End Sub - Public Function GetBoundingRectangle(image As Bitmap) As Rectangle - Dim rect As New Rectangle(0, 0, image.Width, image.Height) - Dim bmpData As Imaging.BitmapData = image.LockBits(rect, Imaging.ImageLockMode.ReadOnly, Imaging.PixelFormat.Format32bppArgb) - - Dim stride As Integer = bmpData.Stride - Dim scan0 As IntPtr = bmpData.Scan0 - - Dim minX As Integer = image.Width - Dim minY As Integer = image.Height - Dim maxX As Integer = 0 - Dim maxY As Integer = 0 - - Dim foundNonTransparent As Boolean = False - - Dim pixels(image.Height * stride - 1) As Byte - System.Runtime.InteropServices.Marshal.Copy(scan0, pixels, 0, pixels.Length) - - For y As Integer = 0 To image.Height - 1 - For x As Integer = 0 To image.Width - 1 - Dim index As Integer = (y * stride) + (x * 4) ' 4 bytes per pixel (32bpp) - Dim alpha As Byte = pixels(index + 3) - - If alpha <> 0 Then - foundNonTransparent = True - If x < minX Then minX = x - If y < minY Then minY = y - If x > maxX Then maxX = x - If y > maxY Then maxY = y - End If - Next - Next - - image.UnlockBits(bmpData) - - If Not foundNonTransparent Then - ' No non-transparent pixels found - Return Rectangle.Empty - End If - - Return New Rectangle(minX, minY, maxX - minX + 1, maxY - minY + 1) - End Function - - Public Function CropImageToTransparency(image As Image, offimage As Image, ByRef loc As Point, ByRef size As Size) As Image - Dim bitmap As Bitmap = CType(image, Bitmap) - Dim boundingRect As Rectangle = GetBoundingRectangle(bitmap) - - If boundingRect = Rectangle.Empty Then - ' Return an empty image or the original image as needed - Return image - End If - - Dim croppedImage As New Bitmap(boundingRect.Width, boundingRect.Height) - - If offimage IsNot Nothing Then - Dim offbitmap As Bitmap = CType(offimage, Bitmap) - Dim offboundingRect As Rectangle = GetBoundingRectangle(offbitmap) - If offboundingRect = Rectangle.Empty Then - ' Return an empty image or the original image as needed - Return image - End If - ' Crop the image - boundingRect = Rectangle.Union(boundingRect, offboundingRect) - Using g As Graphics = Graphics.FromImage(croppedImage) - g.DrawImage(offbitmap, New Rectangle(0, 0, boundingRect.Width, boundingRect.Height), boundingRect, GraphicsUnit.Pixel) - End Using - offimage = offbitmap - End If - - Using g As Graphics = Graphics.FromImage(croppedImage) - g.DrawImage(bitmap, New Rectangle(0, 0, boundingRect.Width, boundingRect.Height), boundingRect, GraphicsUnit.Pixel) - End Using - - ' Update loc and size based on the new dimensions - Dim sizeOrg As Size = size - size = New Size(CInt(size.Width * (boundingRect.Width / image.Width)), CInt(size.Height * (boundingRect.Height / image.Height))) - loc = New Point(loc.X + boundingRect.X, loc.Y + boundingRect.Y) - - Return croppedImage - End Function - Private Function ImageToBase64(image As Image) As String - If image IsNot Nothing Then - With New System.Drawing.ImageConverter - Dim bytes() As Byte = CType(.ConvertTo(image, GetType(Byte())), Byte()) - Return Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks) - End With - Else - Return String.Empty - End If - End Function - Private Function Base64ToImage(data As String) As Image - Dim image As Image = Nothing - If data.Length > 0 Then - Dim bytes() As Byte = Convert.FromBase64String(data) - If bytes IsNot Nothing AndAlso bytes.Length > 0 Then - With New System.Drawing.ImageConverter - image = CType(.ConvertFrom(bytes), Image) - End With - End If - End If - Return image - End Function - - Public Function WavToBase64(stream As IO.Stream) As String - If stream IsNot Nothing Then - Dim bytes() As Byte - ReDim bytes(stream.Length - 1) - Using reader As IO.BinaryReader = New IO.BinaryReader(stream) - Dim length As Integer = reader.Read(bytes, 0, stream.Length) - End Using - Return Convert.ToBase64String(bytes, Base64FormattingOptions.InsertLineBreaks) - Else - Return String.Empty - End If - End Function - Public Function Base64ToWav(data As String) As IO.Stream - If data.Length > 0 Then - Dim bytes() As Byte = Convert.FromBase64String(data) - Return New IO.MemoryStream(bytes) - Else - Return Nothing - End If - End Function - - Private Function Color2String(ByVal color As Color) As String - Return color.R.ToString() & "." & color.G.ToString() & "." & color.B.ToString() - End Function - Private Function String2Color(ByVal color As String) As Color - Dim colorvalues As String() = color.Split(".") - 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 - - -End Class \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formDMD.Designer.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formDMD.Designer.vb deleted file mode 100644 index e3b596a..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formDMD.Designer.vb +++ /dev/null @@ -1,42 +0,0 @@ - _ -Partial Class formDMD - Inherits System.Windows.Forms.Form - - 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. - _ - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - Try - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - Finally - MyBase.Dispose(disposing) - End Try - End Sub - - 'Wird vom Windows Form-Designer benötigt. - Private components As System.ComponentModel.IContainer - - 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich. - 'Das Bearbeiten ist mit dem Windows Form-Designer möglich. - 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. - _ - Private Sub InitializeComponent() - Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(formDMD)) - Me.SuspendLayout() - ' - 'formDMD - ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(435, 251) - Me.ControlBox = False - Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon) - Me.MaximizeBox = False - Me.MinimizeBox = False - Me.Name = "formDMD" - Me.Text = "formDMD" - Me.ResumeLayout(False) - - End Sub -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formDMD.resx b/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formDMD.resx deleted file mode 100644 index 6a23e00..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formDMD.resx +++ /dev/null @@ -1,1734 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOzs5gG9ubgOinaELHVS - bz15XXQ8m5OWGLWzsQwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAC0q645l2mRt4U1f/5+J3v/eyp4/4FLgfKfip5+u7S3GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAC9r7capHabrqE8mf+gPJn/nkCY/59Hm/+fTpz/oWWk+6ucqnDp6OMCAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAua+zP6NRnPinQ6H/pUKd/6RHnP+lUJ//qFmk/61s - rv+si67Ev7a/GwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKSZn2elVaP/oUef/55G - m/+cSZj/nk+Z/59VnP+maKb/p4Wr4rOpszIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAC6tLY5m2ef95teof+aX57/mV+c/5Vbmf+WXJv/m2ig/6OLp8G+t74aAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAuLG2G56Go7eac6T/m3ek/5h0oP+TbZz/j2mZ/5Z0n/6mnad36+rlAQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsp6xTlX+g95N7n/+Pd5r/h3CU/4Zw - lf+WiJ3HvLq8JgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAure5FZWP - n6p5cZL/dG2O/2hihP9ubIv+paSnY+zs5gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAKmrrQ6gpqceztTRCuzs5gEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - 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 - Jf8JKDH/CSw4/wouOv8LKzf/DCg0/wsvQv8FOlX/AVFy/wFWf/8Beq//AYCt/wF0of8BZ5n/CEBb/xI5 - Sv8fLTD/KzQ3/ys9Qv8jQEr/F0JV/wo+VP8ENUv/eX+DiszNyQkAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAC6urYYSkxL4ggQGP8IEh7/CBIe/wgVI/8KHS7/CyIv/wskMf8LIiz/CRIW/wkR - FP8HDA//BwwP/wkVGP8KHyX/CyYu/wsoMv8MKDP/DCYv/wwjK/8MKDf/Ci5E/wYxSv8BRWH/AlFs/wNX - gf8DY5D/BlB7/wkrOP8PIST/EiEj/xYjJv8aJyr/Gyov/yE1RP8jOVH/ECw+/2lubpiVmJURAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuLi0GzI0OPoIFyb/BC5A/wYXLf8IGC7/DCI2/wwi - M/8MITD/DB8s/woXH/8JERb/BgsO/wYLDv8IEhX/Chsh/wsdJP8LHSX/DB0l/wwcI/8LGyL/Cxsj/wwd - Kf8KIDD/CSIy/wVDZv8EOVf/CiUz/wwgKv8MHiT/DB0i/w0bHv8PHB7/EB0g/w8dIP8QHyP/ER8n/w4Z - IP9XWVi24uLdBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqamDMaISr+ByEs/wM1 - RP8GFiv/CRgt/w0gMP8MHi7/DB8x/wwgMf8MHCv/CRAW/wYKDv8HCw7/CBAT/woYH/8LGyP/Cxol/wwa - Jf8MGiP/DBkg/wwYIv8LGSX/Choo/wocLP8LHS7/DCEy/wsiMP8MICr/DR8n/wwdI/8MHCD/DRwe/w0c - Hv8KGhz/CBkc/wgbIP8IGiD/UlRTzuzs5gIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAB8fnxQCxki/wgjK/8FLjj/BhYq/woXLf8NGyv/DBws/w0eMP8NHS7/DBcj/wkNEv8HCw//BwoO/wgO - Ev8KFBr/CxYe/w0YIP8NGCD/DRcg/wwXHv8MFh7/DBYf/wwXIf8LGCT/DBop/wsbKv8LGyb/Chsj/wsb - Iv8LHCL/Cx0i/wwfJP8MHyL/Chse/wcaHf8GHCD/BCEr/0FHS+zl5d8FAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAbW9uZQkXIf8JIyn/CCkv/wgXKP8LFin/DRkp/w0YJv8NGir/DRgo/w0V - H/8LEBX/BwsP/wcLDv8KEBT/ChMX/wsVGv8NFhz/DRce/w0WHf8NFhz/DRQa/w0VGv8MFRz/DBYe/w0Y - If8NGSL/DBok/wsZIv8LGiH/Cxsh/wweJf8MISr/CyUu/wojLf8HGRz/Bhoe/wQgK/8yPkf6rK2qEQAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGBjYnIIGSH/CiIn/wkjKv8IFiX/CxUm/w0X - Jv8NFiT/Dhkl/w4ZJf8NFB7/CxEW/wgMD/8IDA//DBMW/wsTFv8LExf/CxMY/wwTGf8MExj/DBMX/wwT - Fv8NExf/DBQY/w0VG/8NFx3/DRgf/w0YH/8NGB7/DBkf/w0ZIP8NGyP/DR8o/wwiLv8LISv/CBYZ/wga - Hv8FHyv/MT5K/W9ydBsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB5e3pVER8l/wof - JP8KHyb/CRUj/yUpMf1RU1XSV1lasFdZWsAzNjv4DBQc/wsRFv8IDA//BwsO/wsRFf8LExb/CxIV/wsR - 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 - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ13vBWBW3RxbUtIqYVjfH3N2kHw/S1f/MkFG/yg1 - OP8jMDL/ICss/xwjKP8TFx3/DRAU/woOD/8KDA3/CQsM/wkLDP8ICgv/CAsM/wgLDv8JDA//CgwP/woM - Dv8KCw//CwsP/w0NEP8MDRH/DQ4R/w0PEv8NEBL/DxIT/w8UFf8PFRf/DxYZ/xAYGv8PGh3/DRgb/w0V - GP8NFRn/Dhkh/xAcLP8VIjf/OD9Q+qSizRhnXu8IZ17vBmdd7wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ13vA1NJvjYpGUqnIQ4szicX - RL1MR2zJTU5y/01ReP9AR3L/Nj1q/y4zW/8oLE3/ISQ//xYZLf8OEBv/CwwQ/wkMDf8JCw3/CQsM/wkL - DP8KDA3/CQwN/wsLDv8MCw7/DAsP/wsLEP8NDBD/DQ0Q/w0OEf8ODxP/DhAT/w4RFP8PExT/EBQW/w8V - GP8PFxr/Dhkd/w4XG/8QFyX/Gx9B/ycpX/8sLmn/LC1m/z48avdFPYSGOzCBfkI4lGVVSsE8ZVroF2dc - 7wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1zvAWdd - 7ws+M4htHAUL6xwFC/0cBQv9HwwQ/SMVF/8oHh3/KSEk/ysmNP8pJEf/LCVU/y4pX/8uKmX/LCll/yUk - WP8XFzb/DhAb/wwMD/8LCw3/CwwN/wwMEv8QDx7/EBAh/xEQIv8RECL/EhEk/xUULP8WFjD/FhYx/xgZ - N/8bHED/HB1B/x8gSP8fIkr/Fxwz/xEbJ/8eIUj/LCpm/yomXf8hGDn/GwsU/xwID/8fDBH+HAYM+BwF - C/YcBQvwHggY2TAiYaFRRrlIZlzvDQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAZVrqDFRJwDBQRbZBVErAbCgZSdgcBQv8HAUL/xwFC/8cBQv/HAYM/x0GDP8cBwz/HAcM/xwG - DP8cBgz/HAcN/x0MHf8kGUL/LCZf/ysoY/8aGTv/Dw4X/w8PG/8hIE3/Kidh/ywpZv8sKGP/Kydf/yol - XP8sJ2D/LShj/yslXf8qI1f/KyNa/yghVP8mHUr/Jh5K/y0rZv8uL23/KyZd/x0OI/8cBg3/HAUL/xwF - C/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/4cBQv3IQ8vzko/qFxmW+4LAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAZlvvB0c8oVQiGjPHIzBF3yMcOtslFTvrHAUL/RwFC/8cBQv/HAUL/xwF - C/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwGDP8gEzH/Lill/yMhUv8gH0v/KCJV/xsH - E/8bBQv/GwUL/xsFC/8bBQv/GwUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8eDyT/KiFU/xsH - Dv8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/okEjrDWEzKOGZb - 7wMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZb7gw5LHp7Llh371Cv6/5NquP+RZbJ/jt8 - p/8wX4D/KERd/yAkNP8dDxn/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xsH - D/8rJVz/NDJ5/yEVN/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwF - C/8cBQv/HAUL/xwGDP8gIjH/LVVz/zh0nf8+hLH/QIq5/z2Cr/81bZP/JTlQ/xwGDP8cBQv/HAUL/xwF - C/8cBQv+HAUL8TsugYBmW+8NAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnXO8DU0i+Oikc - TbMrT2zxSqTb/1O59/9Tuff/U7j2/1K28/9Qse3/TKjh/0eb0P9Aibj/NWyR/yhEXf8dDxn/HAUL/xwF - C/8cBQv/HAUL/xwFC/8cBQv/HAgW/zIrav8oHEj/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwG - DP8cCBD/HAcP/xwFC/8cBQv/HAUL/yhDXf9Aibj/T67o/1K29P9QsOv/Tarj/1G18v9Tuff/U7n3/1Cy - 7v89ga7/Hhkm/xwFC/8cBQv/HAUL/xwFC/spGUq0YlfkIGZb7wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAGdc7wZeU9k0MSRmuDh2n/tTuff/U7n3/1O59/9Tuff/U7n3/1K29P9Qs+//U7j2/1O5 - 9/9RtfL/SZ/V/zVrkf8eFyP/HAUL/xwFC/8cBQv/HAUL/y1ScP82b5b/OHSc/zp6pf86e6b/O32o/z6D - sP9BjLz/Q5DC/0WWyf9IntP/SqLZ/0KOv/8dEx7/HAoT/zdymv9Qsez/U7n3/06s5v81a5H/Ii1A/yId - MP8uUm//Tani/1O59/9Tuff/U7j2/z+GtP8cCRH/HAUL/xwFC/8cBQv+IAwn0VlNzTZmW+8CAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnXO8BZlvtHC0eWK89ga77U7n3/1O59/9Tuff/U7n3/1Cy - 7f8uVXT/Hhso/zFggv9OrOb/U7n3/1O59/9Tufb/SJ3S/yU8U/8cBQv/HAUL/xwGDf9DkcP/U7n3/1O5 - 9/9Tuff/U7n3/1O59/9Tuff/U7n3/1O59/9Tuff/U7n3/1O59/9StvP/J0Jb/ypKZf9StfL/U7n3/0+v - 6v8qTGj/HAUL/yASIP9UUI//Xld0/zxlhv9TuPb/U7n3/1O59/9RtfH/Kkxo/xwFC/8cBQv/HAUL/h4J - HtdUSMA7ZlvvAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ1zvAl5T2S4jFTXJR5rO/VO5 - 9/9Tuff/U7n3/1O59/9Ek8X/HAYN/xwFC/8cBQv/MF5//1K39f9Tuff/U7n3/1O59/9LpNz/Ii5B/xwF - C/8cBQv/ICQ0/0ORw/9TuPb/U7n3/1O59/9Tuff/U7n3/1O59/9Tuff/U7n3/1O59/9Tuff/U7n3/zt9 - qP8vWnr/U7j2/1O49v86eKH/HAUL/xwGDP83Lz7/h4Gb/5qQrP9GUGD/UbPv/1O59/9Tuff/U7n3/zyA - rP8cBQv/HAUL/xwFC/0hDzDLXFDVMWZb7wIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdc - 7wNQRbZJISQ33k2r5P5Tuff/U7n3/1O59/9Tuff/O3ym/xwFC/8cBQv/HAUL/x8eLP9NqeL/U7n3/1O5 - 9/9Tuff/U7n3/zt7pv8cBQv/HAUL/xwFC/8fHCn9QIm5/lO49v9Pr+r/Q5HC/z+Htf88gKv/Onmj/zp4 - ov89ga7/RpjM/1K28/9MqOD/Llh3/1O49v9QsOv/JC9B/SMVGPwvJib/c2+F/7SuyP+Oh5j/QGaF/1O4 - 9f9Tuff/U7n3/1O59/9Gl8v/HAoS/xwFC/8cBQv3MCJjnWVa7RcAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABmXO8IQzeVaCxPXu1cyPX/Vb33/1O59/9Tuff/U7n2/y9be/8cBQv/HAUL/xwF - C/8dERv/S6Xd/1O59/9Tuff/U7n3/1O59/9Gl8v/HAUL/xwFC/8cBQv5LB9S0ykhOt9AhrT8UbPv/zhz - nP8dERv/Kx1O/yYXPv8cBQv/HAUL/xwGDf8zZor/UbTw/zdxmf9Qs+//R5zQ/SgbNN1dWJ+KenemhpCO - u792c4fxQU5g/0ym3v9Tuff/U7n3/1O59/9Uu/f/TaXR/x0NFf8cBQv8Hwoh1E9DtExmW+8FAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZlvvDzcqdYw+e471Z9z7/2bZ+/9fzvn/V8H4/1G0 - 8P8lOlD/HAUL/xwFC/8cBQv/JDRI/1Cw7P9Tuff/U7n3/1O59/9Tuff/RpjM/xwFC/8cBQv8Hgoe1lFK - t1xSS65eOjZH2Tp7pv9RtfH/Qo6//yQsRP8vIVf/HAYO/xwFC/8cBQv/HAcO/zZwlv81ao//SqHX/z6C - r/oqHU+wZV3pKVhPyD8vI12nLExo8Uyn4P9Tuff/U7n3/1a/+P9dy/n/ZNf6/02huP8cBgz9HQcW4EE1 - knJlWuwUZlrvAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRZ6RssHVatSpqz+mXa - +/9l2fv/Zdr7/2XZ+/9awOP/Hxwm/xwFC/8cBQv/HAYM/zl2n/9Tuff/U7n3/1O59/9Tuff/U7n3/z2C - rv8cBQv2IA0o0EI6kW1nYewToZ/bF3BtnZchFzX/O3yn/1K39P9Kotn/KERe/xwFDP8cBQv/HAUL/xwF - C/8cBQv/HAUL/yIwRPwhIDXZRz6ecFRLvlcnGUO+M2iM9U+w6v5VvPf/W8b4/2HR+v9l2Pv/Zdr7/2LS - 8v8xXGv8HggY4EAzjH9eU9o9TECsSlVJxTNmWu0JAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZb - 7wFcUNUuIxE2ylSy0P1k1/r/ZNf6/2TX+v9k1/r/W8Pj/yU2Qf8cBQv/HhMa/zx4j/9Vu+7/VLr3/1O5 - 9/9Tuff/U7n3/1G08f8rT2v1NSpvp1VNv0JoYu8OgHzvAcXFwShPTlveMCts/yEVM/8/hbP/U7n3/0+u - 6f8vXH3/HAYN/xwFC/8cBQv/HAUL/xwFC/8cBQzySD+gjldPx10kFznHPoGi+VrF9f9g0Pn/Y9b6/2TX - +v9k1/r/ZNf6/2PV+P9EjKT7Hwwi2EI2knVaT9FKJxdGsRwFDOMhDSzDT0K1Q2ZZ7wQAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABmWu8EUES3SSAbKd5bxOf+YtX6/2LV+v9i1fr/YtX6/2LV+v9dyOz/Vrvc/1rC - 5P9h0/f/YtX6/2HT+v9fzvn/XMn5/1W67v83cZj+HQoX7UpBpXJoYe8NAAAAAMTEvxJ+fnuDGBMk/yMf - Tf8zLXH/ISM4/0mg1v9Tuff/UbPw/zNnjP8cBgz/HAUL/xwFC/8cBQv/HAUL+i8hW8ouIVrFQIOb92HS - 9/9i1fr/YtX6/2LV+v9i1fr/YtX6/2HT9/9ImLP7Ihkz0Eo+pmBlW+wfQjeVbxwFC+wcBQv9HAUL8jwv - hH9mWe8MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZlrvCEQ4mmkqSVntX871/2HT+v9h0/r/YdP6/2HT - +v9Us9X/SZq2/1a52/9g0vn/YdP6/17M8f9Vtdb/T6nI/0GGoP8qSVn/HAYN/xwFC/kqHU+xYVreImhh - 7wHJyMMcU1JY1ywnXv8rI1n/NC1z/zUscv8xXXr/WsX2/1vI+f9aw/D/MmB0/xwFC/8cBQv/HAUL/xwF - C/8cBQv7KENS+1zI7f9h0/r/YdP6/2HT+v9h0/r/YdP6/1/P9v9CiqT9IRcv3E5DsmxTSL9OQTWSbTQm - bbYcBQv4HAUL/xwFC/kwIWKiZFfqFgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVZ7g44K3mJOnSN9V/Q - +f9g0fr/YNH6/2DR+v9dyvL/KUVU/xwFC/8eFx//RZGu/1/Q+f9dyvL/RpKw/yAlMP8cBQv/HAUL/xwF - C/8cBQv9Hgkc2VNLvT9oYe8Du7u6LkpGZvQvI0r/HAYM/xwGDP8mF0D/Hx8o/1a53v9g0fr/YNH6/1a6 - 3/8iKzb/HAUL/xwFC/8cBQv/HAUL/0CFof9g0fr/YNH6/2DR+v9g0fr/YNH6/13L8v86dIz/HAgP+zUo - cbdUSL9tIRwwzjNiePEeFh75HAUL/xwFC/8cBQv7KRhKsmBT4R1lWO8BAAAAAAAAAAAAAAAAAAAAAAAA - AABjVuYbLR5Yq0aTs/pez/n/Xs/5/17P+f9ez/n/Vrzi/x4XIP8cBQv/HAUL/yMvO/9aw+z/Xs/5/17O - +f9Pqs7/ICcy/xwFC/8cBQv/HAUL/h0GEt9RSbpJaGDvCquqyzNZU3zrMiRJ/xwGDP8cBQv/HAUL/xwF - C/9Jm7z/Xs/5/17P+f9ezvj/PX2Z/xwFC/8cBQv/HAUL/xwFC/9Jnb3/Xs/5/17P+f9ez/n/Xs/5/1zJ - 8v83bof/HAcN/xwFC/4jEjfiMyVqzDlyi/hcyvP/LlVp/xwFC/8cBQv/HAUL+ycVQrZfUt4gZljvAQAA - AAAAAAAAAAAAAAAAAABmWe8DXE/WLyMTNslPq9D9Xsz5/17M+f9ezPn/Xsz5/02lyf8cBgz/HAUL/xwF - C/8eEhr/V73m/17M+f9ezPn/Xsz5/0GJp/8cBQv/HAUL/xwFC/wjETPKXVXWPUY8mlpEPmWgUk171D00 - f/8dCBL/HAUL/xwFC/8cBQv/QIel/17M+f9ezPn/Xsz5/0+q0P8dDRX/HAUL/xwFC/8cBQv+RZGx/17M - +f9ezPn/Xsz5/17M+f9FkbL/HAcO/xwFC/8cBQv/HAUL/hwFC/xEjq7/Xcz4/zp3k/8cBQv/HAUL/RwF - DO40Jm+LY1bqEgAAAAAAAAAAAAAAAGVY7wFkVusQWkzQL0o9qHAhJTLlVrzn/lzK+f9cyvn/XMr5/1zK - +f9Ci6z/HAUL/xwFC/8cBQv/JTlJ/1nC7/9cyvn/XMr5/1zK+f9RsNn/HAkQ/xwFC/8cBQzwNyx1jWJa - 4jkkFzu6PoGg9zdmf/YwJ035KBlF/xwFC/8cBQv/HAUL/0GIqf9cyvn/XMr5/1zK+f9Ts9z/HhUe/xwF - C/4cBQ7vKhtN2zVpgvlbyff/XMr5/1zK+f9cyvn/OHCM/xwFC/8cBQv/HAUL/xwFC/8gIy//U7Te/1zK - +f9Dj7D/HAUL+B8KItg2KHONWk3TKmVY7wMAAAAAAAAAAAAAAABiVOUTNyl3eyMjO80oQFXpQIWo/FrG - 9/9ayPn/Wsj5/1rI+f9ax/j/NGiD/xwFC/8cBQv/HAUL/zp2lf9ax/j/Wsj5/1rI+f9ayPn/UK/a/xwJ - Ef0cBQvtKx1SqFpRzjJiWeIoJhhBuUeZwPtZxPT/RZO4/iU3R/8cBgz/HAUL/yMxQP9Sst7/Wsj5/1rI - +f9ayPn/TKbO/x0NFPwdBhLnNyt1lVNJvmohIjTYTqnS/VrI+f9ayPn/Wsj5/0uhyf8eFyD/HAUL/xwF - C/8hJzT/RpW7/1rH+P9ayPn/QYqt+isbUcFTRr9MZFfrE2ZY7wIAAAAAAAAAAAAAAABlV+8BWEnMJyEP - LL9HmMD6Vr7v/lnF+P9Zxvj/Wcb5/1rG+f9Zxvn/WcX4/z1/of8eGSP/HRAY/yxRaP9Tt+b/Wcb5/1rG - +f9Zxvn/Wcb5/0ONsvwjETbUQDWMelxT1ChnXu8FZ17vDEA1jXEmPlHlUK/d/VnG+P9Vu+z/SqDJ/0aW - vv9RsuD/Wcb4/1nG+f9Zxvn/WcX3/zh0k/kkEzrMQDWNcWFY4R9lW+oWPDGDeiY8T+RNp9L9WcX3/1nG - +f9Zxff/TKXQ/0GKr/9FlLr/UrPi/1nF+P9Xv/D/Rpa9+yU0Rt9CNJNrZVjuDAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAGBS4hc0JW6KIik52StNY+wzZ4TzOXSU9kCHq/lIm8X8UbLh/lfA8/9Ywvb/UrTk/1Cv - 3v9XwPP/WcT4/1nE+P9ZxPj/WMT4/1Ct3P0lNUfjRDqZbWdd7xFnXu8CAAAAAGde8AFjWeQcOS57hCQ0 - R+NJncf8WML1/1nE+P9ZxPj/WMT4/1nE+P9ZxPj/WMP3/0ibxPwhHjPUUEa3U2de7w1nXu8BZ13wAmNZ - 5Rk+Mol2IRkx0TdvjvVKoMv9U7fo/la87v5Wve/+U7bn/kyk0P09f6H5J0BT6ScXRrtEN5plYlXnFmZZ - 7wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlV+8CYVPkF1JEvTxHOaFWQDKPbDstgXo1KHORLB5YryMf - OtAnQVboNWyM9EGMtPlInMn8TajY/U+t3v1OrNz9SJ3J/Dx9ovckMETcOSx6gmNY5BtnXe8BAAAAAAAA - AAAAAAAAZ17vAmNa5RlDOZZrJRs/xTFgffBHmcT8UrTn/lS67v5Uue3+Tqra/Tp5nPciHzfTRDqZamVb - 7BAAAAAAAAAAAAAAAABnXe8BZlvtD1JGukA2KnWIKBpIuyIlO9UkL0LeJDBE3iMjOtYmGUS/MyVrlkc6 - oVxeUdsmZlnvCWZZ7wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlV+8CZVfvA2VY - 7wZlWO8IZlnvDGRX6xhZTM4wSTylUzwvhXkyJGeZKxxUsiUUO8QjEjTMJBM3yCkZSrM1KHGOTEGtT2RZ - 6BVnXO8CAAAAAAAAAAAAAAAAAAAAAAAAAABnXe8BZ13vC1lPzTM8MYR6KRlKtiIkOtYkMkbgJC9D3iIY - M80xJGWcT0SySmZc7A9nXe8BAAAAAAAAAAAAAAAAAAAAAAAAAABmXO8DZlvvDWFW4R5XS8gyUES3OlFF - ujtWSsgyYFPfIGZZ7xBmWe8FZlnvAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZlnvAWZZ7wNmWu8HZlrvDmVZ7hdjV+ghY1jnJmNY - 5yNlWusYZlvvDGZc7wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnXe8CZ13vCmRa - 6RxaT80xVUvEPVZLxTteVNgrZlztE2dd7wQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAZlvvAWZa7wFmWu8BZlrvAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAZ1zvAWdc7wJnXO8CZ1zvAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////////////////8B/////////wD/////// - /+AH////////4Af////////gB////////+AH////////4Af////////wD/////////AP//////h/8B/+ - P///+AHwD4Af///4AAAAAB////gAAAAAH///8AAAAAAf///wAAAAAB////AAAAAAD///8AAAAAAP///w - AAAAAA////AAAAAAD///8AAAAAAP///wAAAAAA////AAAAAAD///8AAAAAAP///wAAAAAA////AAAAAA - D///8DgAADwf///8/AAAfz/////+AAB///////4AAH/////8/AAAfz////A4AAA8H///8AAAAAAP///w - AAAAAA///9AAAAAAD///AAAAAAAB//4AAAAAAAB//AAAAAAAAD/4AAAAAAAAH/AAAAAAAAAP8AAAAAAA - AA/wAAAAAAAAB/gAAAAAAAAH+AAAAAAAAAf4AAAAAAAAB/gAAAAAAAAP+AAAAAAAAA/4AAAAAAAAD/gA - AAAAAAAH8AAAAAAAAAPwAAAgAAAAA/AAAAAAAAAD8AAAAAAAAAHwAAAAAAAAAeAAAAAAAAADgAAAAAAA - AAOAAAAAAAAABwAAAAAAAAAfgAAAgAAAAB+AAAHAAOAAP+AAA+AA+AD//4AP+AP/D///////D////ygA - AAAwAAAAYAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsnKY+j1eIvn41eux7PHnpkG6Qm7exsx0AAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMC0uhijYZvPoz2c/6BAmf+hSpz/olqi/6iK - qp/Ryc8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKugpUOlT6D+o0Se/6FG - mv+jUJz/p2Cl/6uBruG2rLUfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALOs - rzGdYaH6m1qf/5lbm/+XWJn/mmCe/6OCp9a7s7wXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAALmxtw+dhKS+mnek/5d2oP+QbZr/kXCb/6OTpojr6uUBAAAAAAAAAAAAAAAAAAAAAAAA - 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 - QP8vep3/CkZf/wsPE/8KDA//Cw0Q/wwPEf8NERP/DhMV/w8VF/8iJif7ZWZkoo2OilGNjotUaGlnmjI1 - NvINGiT/NDk+7peYlSIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABSWVmWJjU2/yEuL/8gLzD/GiIp/xkcIP8QExb/CQ0P/wkM - Df8ICwz/CAsN/y5GXv8kSWP/Cw8T/woMEP8KDA//CwwQ/wwOEf8NEBL/DhIT/w8VFv8PFhj/EBca/xce - If8WHiH/DRMX/w0XHP8NGiP/Dh4o/2VoaE8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABdUtURRz2gQUtBqj1iZoalQEtd/y07Rf8kMDb/ICgt/xcb - I/8NEBX/Cg0O/wkLDP8JCwz/CAoM/wgLDv8JDA7/CgwO/woLD/8LCw//DA0Q/w0OEf8NDxL/DhET/w8T - FP8PFRf/DxcZ/w8aHP8NFxr/DRUa/xAaJ/8XIT3/ICpP/25um1ZiWeMVZVzrC2dd7wIAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGdd7wU5LXtxHAUO6RwGEOszKzrwPjxV/zw9 - Xv80Nl//Ly9f/y0sX/8mJVb/Gho+/w8QH/8LDRD/CgsN/wsMDf8LDA//DQwT/w0ME/8NDRT/Dg4W/w8P - Gv8QEBv/ERMg/xIVIv8TFyj/Ehgl/w8ZH/8VGzL/JSZY/yknW/8nI1H/JR5D/y8kRNYmFkLGLiFdpEA1 - j15gVd4WZ1zvAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABnXO8BXFHUFlFGuDJFO5yDHgkc8hwF - C/8cBQv/HQcN/x0JDv8eCw//HQkP/x0KFP8gESz/Jh1J/ykkWv8kIlP/EhEj/w4NF/8fHkn/JyRa/ygl - W/8mI1b/JyNW/yklXP8nI1f/KSNY/ygjV/8nIVL/KCVY/yorY/8pJVn/HxIt/xwHDv8cBQz/HAUL/xwF - C/8cBQv/HAUL/RwGD/EuIF2mWU7OIgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABhVuESLSZboDJi - huUtSm3lIR4z+BwGDP8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFDP8hFDb/KiZf/yMh - Uv8kG0X/GwYM/xsFC/8bBQv/GwUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAcO/yYbRf8cBg3/HAYN/x0Q - G/8eGCX/HQwU/xwFC/8cBQv/HAUL/xwFC/8cBQz3NShxjGRZ6wsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - AABiVuISLSdcpT+GtPdRs+//T67o/0id0v9BjLz/O3um/zNnjP8pSWT/HyEv/xwGDP8cBQv/HAUL/xwF - C/8cBQv/HQsf/zUwdv8lGED/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAUL/xwFC/8cBQv/HAkR/ylI - Y/89g6//SJ3T/02p4v9Prej/TKff/0GNvf8nQVr/HAUL/xwFC/8cBQv+IQ0s1ldLyCoAAAAAAAAAAAAA - AAAAAAAAAAAAAAAAAABmXO8BWE3KJTImaaxCj7/9U7n3/1O59/9Tuff/U7n2/1G18f9StvP/T67o/0OS - w/8sU3H/HAcP/xwFC/8cBQv/ISg6/zFgg/8zZ4v/NGuR/zVtk/84dJz/O32p/z2Cr/9Ai7v/QYy8/yMy - Rv8fHy7/QIm4/1G18f9NqeH/Nm+W/yxPbf89f6v/Urb0/1O59/9Oruj/KEZh/xwFC/8cBQv/HAUO70Y6 - nk9mW+8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZlzuCTQnbZVFlcj8U7n3/1O59/9Tuff/P4a0/x4b - KP8yZIj/ULLu/1O59/9St/T/P4a0/x4WIf8cBQv/K1Bu/1Cx7f9Tuff/U7n3/1O59/9Tuff/U7n3/1O5 - 9/9Tuff/U7n3/zdymv83cZn/U7n3/06s5v8lOVD/HQkP/1RPgf9kXHX/SJfK/1O59/9Tuff/RJXH/xwG - Df8cBQv/HAUL8kE1k1hmW+8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZFjnFCsjU7lNqeL+U7n3/1O5 - 9/9St/T/Kk1p/xwFC/8cBQz/P4e1/1O59/9Tuff/U7j2/zl2oP8cBQv/HAUL/yxUcv9Pruj/U7n3/1Cy - 7v9OrOb/TKjg/0um3v9OrOX/Urf0/0mf1f86eaT/U7n3/zh1nf8dBw3/Myow/5aQp/+Ohpv/R5DA/1O5 - 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 - - - \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formDMD.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formDMD.vb deleted file mode 100644 index 32750d4..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formDMD.vb +++ /dev/null @@ -1,80 +0,0 @@ -Imports System -Imports System.Windows.Forms - -Public Class formDMD - Private Const MA_NOACTIVATE As System.Int32 = 3 - Private Const WM_MOUSEACTIVATE As Integer = &H21 -#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" - - Public Sub New() - - InitializeComponent() - - ' set some styles - 'Me.SetStyle(ControlStyles.AllPaintingInWmPaint Or ControlStyles.UserPaint Or ControlStyles.OptimizedDoubleBuffer, True) - Me.DoubleBuffered = True - - End Sub - -#End Region - -#Region "painting" - - Private Sub formDMD_Paint(sender As Object, e As System.Windows.Forms.PaintEventArgs) Handles Me.Paint - - If B2SData.DMDIlluminations.Count > 0 Then - - If Not B2SData.UseDMDZOrder Then - - ' draw all standard images - For Each illu As KeyValuePair(Of String, B2SPictureBox) In B2SData.DMDIlluminations - If illu.Value.Visible Then - e.Graphics.DrawImage(illu.Value.BackgroundImage, illu.Value.RectangleF) - End If - Next - - Else - - ' first of all draw zorderd images - For Each illus As KeyValuePair(Of Integer, B2SPictureBox()) In B2SData.ZOrderDMDImages - For Each illu As B2SPictureBox In illus.Value - If illu.Visible Then - e.Graphics.DrawImage(illu.BackgroundImage, illu.RectangleF) - End If - Next - Next - ' now draw all standard images - For Each illu As KeyValuePair(Of String, B2SPictureBox) In B2SData.DMDIlluminations - If illu.Value.Visible AndAlso illu.Value.ZOrder = 0 Then - e.Graphics.DrawImage(illu.Value.BackgroundImage, illu.Value.RectangleF) - End If - Next - - End If - - End If - - End Sub - - Private Sub formDMD_MouseClick(sender As Object, e As MouseEventArgs) Handles MyBase.MouseClick - If e.Button = Windows.Forms.MouseButtons.Right Then - formBackglass.formBackglass_MouseClick(sender, e) - End If - End Sub - -#End Region - -End Class \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formMode.Designer.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formMode.Designer.vb deleted file mode 100644 index b5877e8..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formMode.Designer.vb +++ /dev/null @@ -1,67 +0,0 @@ - _ -Partial Class formMode - Inherits System.Windows.Forms.Form - - 'Form overrides dispose to clean up the component list. - _ - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - Try - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - Finally - MyBase.Dispose(disposing) - End Try - End Sub - - 'Required by the Windows Form Designer - Private components As System.ComponentModel.IContainer - - 'NOTE: The following procedure is required by the Windows Form Designer - 'It can be modified using the Windows Form Designer. - 'Do not modify it using the code editor. - _ - Private Sub InitializeComponent() - Me.components = New System.ComponentModel.Container() - Me.lblInfo = New System.Windows.Forms.Label() - Me.TimerOpacity = New System.Windows.Forms.Timer(Me.components) - Me.TimerShutDown = New System.Windows.Forms.Timer(Me.components) - Me.SuspendLayout() - ' - 'lblInfo - ' - Me.lblInfo.Font = New System.Drawing.Font("Tahoma", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.lblInfo.Location = New System.Drawing.Point(12, 20) - Me.lblInfo.Name = "lblInfo" - Me.lblInfo.Size = New System.Drawing.Size(338, 20) - Me.lblInfo.TabIndex = 0 - Me.lblInfo.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - ' - 'TimerOpacity - ' - ' - 'TimerShutDown - ' - ' - 'formMode - ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font - Me.ClientSize = New System.Drawing.Size(362, 62) - Me.Controls.Add(Me.lblInfo) - Me.Font = New System.Drawing.Font("Tahoma", 8.25!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow - Me.MaximizeBox = False - Me.MinimizeBox = False - Me.Name = "formMode" - Me.Opacity = 0R - Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen - Me.Text = "Backglass dual mode ..." - Me.TopMost = True - Me.ResumeLayout(False) - - End Sub - Friend WithEvents lblInfo As System.Windows.Forms.Label - Friend WithEvents TimerOpacity As System.Windows.Forms.Timer - Friend WithEvents TimerShutDown As System.Windows.Forms.Timer -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formMode.resx b/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formMode.resx deleted file mode 100644 index fd60bcb..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formMode.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 141, 17 - - \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formMode.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formMode.vb deleted file mode 100644 index 9a6a911..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formMode.vb +++ /dev/null @@ -1,56 +0,0 @@ -Imports System - -Public Class formMode - - Private Const stayInSeconds As Integer = 3 - - Private fadeIn As Boolean = True - Private Const fadeStep As Single = 0.02 - Private shutDownCounter As Integer = 0 - - Private Sub formMode_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load - - ' set info label - lblInfo.Text = "Backglass mode is set to '" & If(B2SSettings.CurrentDualMode = B2SSettings.eDualMode.Fantasy, "FANTASY", "AUTHENTIC") & "'." - - ' set and start timers - TimerShutDown.Interval = 1000 - TimerOpacity.Interval = 10 - TimerOpacity.Start() - - End Sub - - Private Sub TimerOpacity_Tick(sender As System.Object, e As System.EventArgs) Handles TimerOpacity.Tick - - If fadeIn Then - Me.Opacity += fadeStep - If Me.Opacity >= 1 Then - TimerOpacity.Stop() - TimerShutDown.Start() - fadeIn = False - End If - Else - Me.Opacity -= fadeStep - If Me.Opacity <= 0 Then - TimerOpacity.Stop() - Try - Me.Close() - Me.Dispose() - Catch - End Try - End If - End If - - End Sub - - Private Sub TimerShutDown_Tick(sender As System.Object, e As System.EventArgs) Handles TimerShutDown.Tick - - shutDownCounter += 1 - If shutDownCounter >= stayInSeconds Then - TimerShutDown.Stop() - TimerOpacity.Start() - End If - - End Sub - -End Class \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettings.Designer.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettings.Designer.vb deleted file mode 100644 index d00fe4b..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettings.Designer.vb +++ /dev/null @@ -1,901 +0,0 @@ - _ -Partial Class formSettings - Inherits System.Windows.Forms.Form - - 'Das Formular überschreibt den Löschvorgang, um die Komponentenliste zu bereinigen. - _ - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - Try - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - Finally - MyBase.Dispose(disposing) - End Try - End Sub - - 'Wird vom Windows Form-Designer benötigt. - Private components As System.ComponentModel.IContainer - - 'Hinweis: Die folgende Prozedur ist für den Windows Form-Designer erforderlich. - 'Das Bearbeiten ist mit dem Windows Form-Designer möglich. - 'Das Bearbeiten mit dem Code-Editor ist nicht möglich. - _ - Private Sub InitializeComponent() - Me.components = New System.ComponentModel.Container() - Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(formSettings)) - Me.TimerOpacity = New System.Windows.Forms.Timer(Me.components) - Me.PanelSettings = New System.Windows.Forms.Panel() - Me.lowerPanel = New System.Windows.Forms.Panel() - Me.btnCloseSettings = New System.Windows.Forms.Button() - Me.btnSaveSettings = New System.Windows.Forms.Button() - Me.lblNonAvailableSettings = New System.Windows.Forms.Label() - Me.btnEditScreenRes = New System.Windows.Forms.Button() - Me.btnMore = New System.Windows.Forms.Button() - Me.headerPanel = New System.Windows.Forms.Panel() - Me.lblVersion = New System.Windows.Forms.Label() - Me.B2SLogo = New System.Windows.Forms.PictureBox() - Me.lblCopyright = New System.Windows.Forms.Label() - Me.grpPlugins = New System.Windows.Forms.GroupBox() - Me.chkShowStartupError = New System.Windows.Forms.CheckBox() - Me.chkActivatePlugins = New System.Windows.Forms.CheckBox() - Me.btnPluginSettings = New System.Windows.Forms.Button() - Me.grpStartMode = New System.Windows.Forms.GroupBox() - Me.chkDisableFuzzyMatching = New System.Windows.Forms.CheckBox() - Me.lblDefaultStartMode = New System.Windows.Forms.Label() - Me.chkStartAsEXE = New System.Windows.Forms.CheckBox() - Me.cmbDefaultStartMode = New System.Windows.Forms.ComboBox() - Me.grpGeneral = New System.Windows.Forms.GroupBox() - Me.btnHyperpin = New System.Windows.Forms.Button() - Me.lblFile = New System.Windows.Forms.Label() - Me.cmbMode = New System.Windows.Forms.ComboBox() - Me.lblMode = New System.Windows.Forms.Label() - Me.cmbMatchingFileNames = New System.Windows.Forms.ComboBox() - Me.btnCheck = New System.Windows.Forms.Button() - Me.grpAnimationSettings = New System.Windows.Forms.GroupBox() - Me.cmbAnimationSetting = New System.Windows.Forms.ComboBox() - Me.cmbAnimations = New System.Windows.Forms.ComboBox() - Me.grpScreenshot = New System.Windows.Forms.GroupBox() - Me.lblFileType = New System.Windows.Forms.Label() - Me.cmbScreenshotType = New System.Windows.Forms.ComboBox() - Me.btnScreenshotPath = New System.Windows.Forms.Button() - Me.grpVisibility = New System.Windows.Forms.GroupBox() - Me.cmbB2SBackglass = New System.Windows.Forms.ComboBox() - Me.lblB2SBackglass = New System.Windows.Forms.Label() - Me.chkFormNoFocus = New System.Windows.Forms.CheckBox() - Me.lblBackground = New System.Windows.Forms.Label() - Me.lblFormFront = New System.Windows.Forms.Label() - Me.cmbFormFront = New System.Windows.Forms.ComboBox() - Me.cmbBackground = New System.Windows.Forms.ComboBox() - Me.cmbB2SDMD = New System.Windows.Forms.ComboBox() - Me.lblB2SDMD = New System.Windows.Forms.Label() - Me.cmbDMD = New System.Windows.Forms.ComboBox() - Me.lblDMD = New System.Windows.Forms.Label() - Me.cmbGrill = New System.Windows.Forms.ComboBox() - Me.lblGrill = New System.Windows.Forms.Label() - Me.grpLEDs = New System.Windows.Forms.GroupBox() - Me.lblGlowing = New System.Windows.Forms.Label() - Me.radioStandardLED = New System.Windows.Forms.RadioButton() - Me.cmbGlowing = New System.Windows.Forms.ComboBox() - Me.radioDream7LED = New System.Windows.Forms.RadioButton() - Me.chkWireframe = New System.Windows.Forms.CheckBox() - Me.chkBulbs = New System.Windows.Forms.CheckBox() - Me.grpPerfTuning = New System.Windows.Forms.GroupBox() - Me.numLampsSkipFrames = New System.Windows.Forms.NumericUpDown() - Me.lblLampsBlackTurns = New System.Windows.Forms.Label() - Me.lblLEDBlackTurns = New System.Windows.Forms.Label() - Me.numSolenoidsSkipFrames = New System.Windows.Forms.NumericUpDown() - Me.numLEDSkipFrames = New System.Windows.Forms.NumericUpDown() - Me.lblSolenoidBlackTurns = New System.Windows.Forms.Label() - Me.numGISkipFrames = New System.Windows.Forms.NumericUpDown() - Me.lblGIBlackTurns = New System.Windows.Forms.Label() - Me.B2SLogoToolTip = New System.Windows.Forms.ToolTip(Me.components) - Me.PanelSettings.SuspendLayout() - Me.lowerPanel.SuspendLayout() - Me.headerPanel.SuspendLayout() - CType(Me.B2SLogo, System.ComponentModel.ISupportInitialize).BeginInit() - Me.grpPlugins.SuspendLayout() - Me.grpStartMode.SuspendLayout() - Me.grpGeneral.SuspendLayout() - Me.grpAnimationSettings.SuspendLayout() - Me.grpScreenshot.SuspendLayout() - Me.grpVisibility.SuspendLayout() - Me.grpLEDs.SuspendLayout() - Me.grpPerfTuning.SuspendLayout() - CType(Me.numLampsSkipFrames, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.numSolenoidsSkipFrames, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.numLEDSkipFrames, System.ComponentModel.ISupportInitialize).BeginInit() - CType(Me.numGISkipFrames, System.ComponentModel.ISupportInitialize).BeginInit() - Me.SuspendLayout() - ' - 'TimerOpacity - ' - ' - 'PanelSettings - ' - Me.PanelSettings.Controls.Add(Me.lowerPanel) - Me.PanelSettings.Controls.Add(Me.headerPanel) - Me.PanelSettings.Controls.Add(Me.grpPlugins) - Me.PanelSettings.Controls.Add(Me.grpStartMode) - Me.PanelSettings.Controls.Add(Me.grpGeneral) - Me.PanelSettings.Controls.Add(Me.grpAnimationSettings) - Me.PanelSettings.Controls.Add(Me.grpScreenshot) - Me.PanelSettings.Controls.Add(Me.grpVisibility) - Me.PanelSettings.Controls.Add(Me.grpLEDs) - Me.PanelSettings.Controls.Add(Me.grpPerfTuning) - Me.PanelSettings.Dock = System.Windows.Forms.DockStyle.Fill - Me.PanelSettings.Location = New System.Drawing.Point(0, 0) - Me.PanelSettings.Margin = New System.Windows.Forms.Padding(6) - Me.PanelSettings.Name = "PanelSettings" - Me.PanelSettings.Size = New System.Drawing.Size(536, 693) - Me.PanelSettings.TabIndex = 2 - ' - 'lowerPanel - ' - Me.lowerPanel.Controls.Add(Me.btnCloseSettings) - Me.lowerPanel.Controls.Add(Me.btnSaveSettings) - Me.lowerPanel.Controls.Add(Me.lblNonAvailableSettings) - Me.lowerPanel.Controls.Add(Me.btnEditScreenRes) - Me.lowerPanel.Controls.Add(Me.btnMore) - Me.lowerPanel.Dock = System.Windows.Forms.DockStyle.Bottom - Me.lowerPanel.Location = New System.Drawing.Point(0, 620) - Me.lowerPanel.Name = "lowerPanel" - Me.lowerPanel.Size = New System.Drawing.Size(536, 73) - Me.lowerPanel.TabIndex = 42 - ' - 'btnCloseSettings - ' - Me.btnCloseSettings.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) - Me.btnCloseSettings.DialogResult = System.Windows.Forms.DialogResult.Cancel - Me.btnCloseSettings.Location = New System.Drawing.Point(446, 37) - Me.btnCloseSettings.Name = "btnCloseSettings" - Me.btnCloseSettings.Size = New System.Drawing.Size(78, 24) - Me.btnCloseSettings.TabIndex = 35 - Me.btnCloseSettings.Text = "Close" - Me.btnCloseSettings.UseVisualStyleBackColor = True - ' - 'btnSaveSettings - ' - Me.btnSaveSettings.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) - Me.btnSaveSettings.Location = New System.Drawing.Point(312, 37) - Me.btnSaveSettings.Name = "btnSaveSettings" - Me.btnSaveSettings.Size = New System.Drawing.Size(128, 24) - Me.btnSaveSettings.TabIndex = 34 - Me.btnSaveSettings.Text = "Save settings" - Me.btnSaveSettings.UseVisualStyleBackColor = True - ' - 'lblNonAvailableSettings - ' - Me.lblNonAvailableSettings.Anchor = CType((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) - Me.lblNonAvailableSettings.Location = New System.Drawing.Point(229, 16) - Me.lblNonAvailableSettings.Name = "lblNonAvailableSettings" - Me.lblNonAvailableSettings.Size = New System.Drawing.Size(295, 13) - Me.lblNonAvailableSettings.TabIndex = 40 - Me.lblNonAvailableSettings.Text = "* all settings in Italic is only available when run in EXE mode!" - ' - 'btnEditScreenRes - ' - Me.btnEditScreenRes.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles) - Me.btnEditScreenRes.Location = New System.Drawing.Point(91, 37) - Me.btnEditScreenRes.Name = "btnEditScreenRes" - Me.btnEditScreenRes.Size = New System.Drawing.Size(99, 24) - Me.btnEditScreenRes.TabIndex = 39 - Me.btnEditScreenRes.Text = "Edit ScreenRes..." - Me.btnEditScreenRes.UseVisualStyleBackColor = True - ' - 'btnMore - ' - Me.btnMore.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Left), System.Windows.Forms.AnchorStyles) - Me.btnMore.Location = New System.Drawing.Point(12, 37) - Me.btnMore.Name = "btnMore" - Me.btnMore.Size = New System.Drawing.Size(73, 24) - Me.btnMore.TabIndex = 32 - Me.btnMore.Text = "More ..." - Me.btnMore.UseVisualStyleBackColor = True - ' - 'headerPanel - ' - Me.headerPanel.Controls.Add(Me.lblVersion) - Me.headerPanel.Controls.Add(Me.B2SLogo) - Me.headerPanel.Controls.Add(Me.lblCopyright) - Me.headerPanel.Dock = System.Windows.Forms.DockStyle.Top - Me.headerPanel.Location = New System.Drawing.Point(0, 0) - Me.headerPanel.Name = "headerPanel" - Me.headerPanel.Size = New System.Drawing.Size(536, 58) - Me.headerPanel.TabIndex = 41 - ' - 'lblVersion - ' - Me.lblVersion.AutoSize = True - Me.lblVersion.Location = New System.Drawing.Point(70, 35) - Me.lblVersion.Name = "lblVersion" - Me.lblVersion.Size = New System.Drawing.Size(217, 13) - Me.lblVersion.TabIndex = 38 - Me.lblVersion.Text = "Server version {0}, Backglass file version {1}" - ' - 'B2SLogo - ' - Me.B2SLogo.Image = CType(resources.GetObject("B2SLogo.Image"), System.Drawing.Image) - Me.B2SLogo.Location = New System.Drawing.Point(6, 0) - Me.B2SLogo.Name = "B2SLogo" - Me.B2SLogo.Size = New System.Drawing.Size(58, 48) - Me.B2SLogo.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom - Me.B2SLogo.TabIndex = 2 - Me.B2SLogo.TabStop = False - ' - 'lblCopyright - ' - Me.lblCopyright.AutoSize = True - Me.lblCopyright.Location = New System.Drawing.Point(70, 2) - Me.lblCopyright.Name = "lblCopyright" - Me.lblCopyright.Size = New System.Drawing.Size(229, 26) - Me.lblCopyright.TabIndex = 23 - Me.lblCopyright.Text = "{0}" & Global.Microsoft.VisualBasic.ChrW(13) & Global.Microsoft.VisualBasic.ChrW(10) & "{1} by Herweh && B2S Team. All rights reserved." - ' - 'grpPlugins - ' - Me.grpPlugins.Anchor = System.Windows.Forms.AnchorStyles.None - Me.grpPlugins.AutoSize = True - Me.grpPlugins.Controls.Add(Me.chkShowStartupError) - Me.grpPlugins.Controls.Add(Me.chkActivatePlugins) - Me.grpPlugins.Controls.Add(Me.btnPluginSettings) - Me.grpPlugins.Location = New System.Drawing.Point(12, 533) - Me.grpPlugins.Name = "grpPlugins" - Me.grpPlugins.Size = New System.Drawing.Size(515, 75) - Me.grpPlugins.TabIndex = 37 - Me.grpPlugins.TabStop = False - Me.grpPlugins.Text = "Plugins" - ' - 'chkShowStartupError - ' - Me.chkShowStartupError.AutoSize = True - Me.chkShowStartupError.Location = New System.Drawing.Point(148, 30) - Me.chkShowStartupError.Name = "chkShowStartupError" - Me.chkShowStartupError.Size = New System.Drawing.Size(181, 17) - Me.chkShowStartupError.TabIndex = 21 - Me.chkShowStartupError.Text = "Error message without backglass" - Me.chkShowStartupError.UseVisualStyleBackColor = True - ' - 'chkActivatePlugins - ' - Me.chkActivatePlugins.AutoSize = True - Me.chkActivatePlugins.Location = New System.Drawing.Point(6, 30) - Me.chkActivatePlugins.Name = "chkActivatePlugins" - Me.chkActivatePlugins.Size = New System.Drawing.Size(101, 17) - Me.chkActivatePlugins.TabIndex = 20 - Me.chkActivatePlugins.Text = "Activate plugins" - Me.chkActivatePlugins.UseVisualStyleBackColor = True - ' - 'btnPluginSettings - ' - Me.btnPluginSettings.Enabled = False - Me.btnPluginSettings.Location = New System.Drawing.Point(361, 25) - Me.btnPluginSettings.Name = "btnPluginSettings" - Me.btnPluginSettings.Size = New System.Drawing.Size(120, 24) - Me.btnPluginSettings.TabIndex = 22 - Me.btnPluginSettings.Text = "Plugin settings" - Me.btnPluginSettings.UseVisualStyleBackColor = True - ' - 'grpStartMode - ' - Me.grpStartMode.Controls.Add(Me.chkDisableFuzzyMatching) - Me.grpStartMode.Controls.Add(Me.lblDefaultStartMode) - Me.grpStartMode.Controls.Add(Me.chkStartAsEXE) - Me.grpStartMode.Controls.Add(Me.cmbDefaultStartMode) - Me.grpStartMode.Location = New System.Drawing.Point(12, 205) - Me.grpStartMode.Name = "grpStartMode" - Me.grpStartMode.Size = New System.Drawing.Size(515, 49) - Me.grpStartMode.TabIndex = 2 - Me.grpStartMode.TabStop = False - Me.grpStartMode.Text = "Backglass start mode" - ' - 'chkDisableFuzzyMatching - ' - Me.chkDisableFuzzyMatching.AutoSize = True - Me.chkDisableFuzzyMatching.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.chkDisableFuzzyMatching.Location = New System.Drawing.Point(327, 23) - Me.chkDisableFuzzyMatching.Name = "chkDisableFuzzyMatching" - Me.chkDisableFuzzyMatching.Size = New System.Drawing.Size(134, 17) - Me.chkDisableFuzzyMatching.TabIndex = 40 - Me.chkDisableFuzzyMatching.Text = "Exact .directb2s match" - Me.chkDisableFuzzyMatching.UseVisualStyleBackColor = True - ' - 'lblDefaultStartMode - ' - Me.lblDefaultStartMode.AutoSize = True - Me.lblDefaultStartMode.Location = New System.Drawing.Point(162, 23) - Me.lblDefaultStartMode.Name = "lblDefaultStartMode" - Me.lblDefaultStartMode.Size = New System.Drawing.Size(73, 13) - Me.lblDefaultStartMode.TabIndex = 26 - Me.lblDefaultStartMode.Text = "Default mode:" - ' - 'chkStartAsEXE - ' - Me.chkStartAsEXE.Appearance = System.Windows.Forms.Appearance.Button - Me.chkStartAsEXE.Location = New System.Drawing.Point(6, 20) - Me.chkStartAsEXE.Name = "chkStartAsEXE" - Me.chkStartAsEXE.Size = New System.Drawing.Size(151, 21) - Me.chkStartAsEXE.TabIndex = 6 - Me.chkStartAsEXE.Text = "Start this backglass as EXE" - Me.chkStartAsEXE.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.chkStartAsEXE.UseVisualStyleBackColor = True - ' - 'cmbDefaultStartMode - ' - Me.cmbDefaultStartMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.cmbDefaultStartMode.FormattingEnabled = True - Me.cmbDefaultStartMode.Items.AddRange(New Object() {"Standard", "In EXE"}) - Me.cmbDefaultStartMode.Location = New System.Drawing.Point(242, 20) - Me.cmbDefaultStartMode.Name = "cmbDefaultStartMode" - Me.cmbDefaultStartMode.Size = New System.Drawing.Size(76, 21) - Me.cmbDefaultStartMode.TabIndex = 7 - ' - 'grpGeneral - ' - Me.grpGeneral.Controls.Add(Me.btnHyperpin) - Me.grpGeneral.Controls.Add(Me.lblFile) - Me.grpGeneral.Controls.Add(Me.cmbMode) - Me.grpGeneral.Controls.Add(Me.lblMode) - Me.grpGeneral.Controls.Add(Me.cmbMatchingFileNames) - Me.grpGeneral.Controls.Add(Me.btnCheck) - Me.grpGeneral.Location = New System.Drawing.Point(12, 64) - Me.grpGeneral.Name = "grpGeneral" - Me.grpGeneral.Size = New System.Drawing.Size(515, 51) - Me.grpGeneral.TabIndex = 0 - Me.grpGeneral.TabStop = False - Me.grpGeneral.Text = "General" - ' - 'btnHyperpin - ' - Me.btnHyperpin.Location = New System.Drawing.Point(370, 18) - Me.btnHyperpin.Name = "btnHyperpin" - Me.btnHyperpin.Size = New System.Drawing.Size(98, 24) - Me.btnHyperpin.TabIndex = 2 - Me.btnHyperpin.Text = "Locate VP.xml" - Me.btnHyperpin.UseVisualStyleBackColor = True - ' - 'lblFile - ' - Me.lblFile.AutoSize = True - Me.lblFile.Location = New System.Drawing.Point(162, 24) - Me.lblFile.Name = "lblFile" - Me.lblFile.Size = New System.Drawing.Size(26, 13) - Me.lblFile.TabIndex = 15 - Me.lblFile.Text = "File:" - Me.lblFile.Visible = False - ' - 'cmbMode - ' - Me.cmbMode.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.cmbMode.FormattingEnabled = True - Me.cmbMode.Items.AddRange(New Object() {"Authentic", "Fantasy"}) - Me.cmbMode.Location = New System.Drawing.Point(47, 20) - Me.cmbMode.Name = "cmbMode" - Me.cmbMode.Size = New System.Drawing.Size(246, 21) - Me.cmbMode.TabIndex = 0 - ' - 'lblMode - ' - Me.lblMode.AutoSize = True - Me.lblMode.Location = New System.Drawing.Point(4, 23) - Me.lblMode.Name = "lblMode" - Me.lblMode.Size = New System.Drawing.Size(37, 13) - Me.lblMode.TabIndex = 13 - Me.lblMode.Text = "Mode:" - Me.lblMode.TextAlign = System.Drawing.ContentAlignment.MiddleRight - ' - 'cmbMatchingFileNames - ' - Me.cmbMatchingFileNames.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.cmbMatchingFileNames.FormattingEnabled = True - Me.cmbMatchingFileNames.Location = New System.Drawing.Point(207, 20) - Me.cmbMatchingFileNames.Name = "cmbMatchingFileNames" - Me.cmbMatchingFileNames.Size = New System.Drawing.Size(156, 21) - Me.cmbMatchingFileNames.Sorted = True - Me.cmbMatchingFileNames.TabIndex = 1 - Me.cmbMatchingFileNames.Visible = False - ' - 'btnCheck - ' - Me.btnCheck.Location = New System.Drawing.Point(370, 18) - Me.btnCheck.Name = "btnCheck" - Me.btnCheck.Size = New System.Drawing.Size(98, 24) - Me.btnCheck.TabIndex = 2 - Me.btnCheck.Text = "Check monitors" - Me.btnCheck.UseVisualStyleBackColor = True - Me.btnCheck.Visible = False - ' - 'grpAnimationSettings - ' - Me.grpAnimationSettings.Controls.Add(Me.cmbAnimationSetting) - Me.grpAnimationSettings.Controls.Add(Me.cmbAnimations) - Me.grpAnimationSettings.Location = New System.Drawing.Point(12, 425) - Me.grpAnimationSettings.Name = "grpAnimationSettings" - Me.grpAnimationSettings.Size = New System.Drawing.Size(515, 51) - Me.grpAnimationSettings.TabIndex = 5 - Me.grpAnimationSettings.TabStop = False - Me.grpAnimationSettings.Text = "Animation settings and tuning" - ' - 'cmbAnimationSetting - ' - Me.cmbAnimationSetting.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.cmbAnimationSetting.FormattingEnabled = True - Me.cmbAnimationSetting.Items.AddRange(New Object() {"1 x", "2 x", "3 x", "4 x", "5 x", "10 x", "Off"}) - Me.cmbAnimationSetting.Location = New System.Drawing.Point(239, 20) - Me.cmbAnimationSetting.Name = "cmbAnimationSetting" - Me.cmbAnimationSetting.Size = New System.Drawing.Size(111, 21) - Me.cmbAnimationSetting.TabIndex = 17 - ' - 'cmbAnimations - ' - Me.cmbAnimations.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.cmbAnimations.FormattingEnabled = True - Me.cmbAnimations.Location = New System.Drawing.Point(7, 20) - Me.cmbAnimations.Name = "cmbAnimations" - Me.cmbAnimations.Size = New System.Drawing.Size(226, 21) - Me.cmbAnimations.TabIndex = 16 - ' - 'grpScreenshot - ' - Me.grpScreenshot.Controls.Add(Me.lblFileType) - Me.grpScreenshot.Controls.Add(Me.cmbScreenshotType) - Me.grpScreenshot.Controls.Add(Me.btnScreenshotPath) - Me.grpScreenshot.Location = New System.Drawing.Point(12, 482) - Me.grpScreenshot.Name = "grpScreenshot" - Me.grpScreenshot.Size = New System.Drawing.Size(515, 50) - Me.grpScreenshot.TabIndex = 6 - Me.grpScreenshot.TabStop = False - Me.grpScreenshot.Text = "Screenshot" - ' - 'lblFileType - ' - Me.lblFileType.AutoSize = True - Me.lblFileType.Location = New System.Drawing.Point(268, 19) - Me.lblFileType.Name = "lblFileType" - Me.lblFileType.Size = New System.Drawing.Size(78, 13) - Me.lblFileType.TabIndex = 0 - Me.lblFileType.Text = "Image file type:" - Me.lblFileType.TextAlign = System.Drawing.ContentAlignment.MiddleRight - ' - 'cmbScreenshotType - ' - Me.cmbScreenshotType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.cmbScreenshotType.FormattingEnabled = True - Me.cmbScreenshotType.Items.AddRange(New Object() {"PNG", "JPG", "GIF", "BMP"}) - Me.cmbScreenshotType.Location = New System.Drawing.Point(357, 16) - Me.cmbScreenshotType.Name = "cmbScreenshotType" - Me.cmbScreenshotType.Size = New System.Drawing.Size(111, 21) - Me.cmbScreenshotType.TabIndex = 19 - ' - 'btnScreenshotPath - ' - Me.btnScreenshotPath.Location = New System.Drawing.Point(8, 16) - Me.btnScreenshotPath.Name = "btnScreenshotPath" - Me.btnScreenshotPath.Size = New System.Drawing.Size(226, 24) - Me.btnScreenshotPath.TabIndex = 18 - Me.btnScreenshotPath.Text = "Screenshot path" - Me.btnScreenshotPath.UseVisualStyleBackColor = True - ' - 'grpVisibility - ' - Me.grpVisibility.Controls.Add(Me.cmbB2SBackglass) - Me.grpVisibility.Controls.Add(Me.lblB2SBackglass) - Me.grpVisibility.Controls.Add(Me.chkFormNoFocus) - Me.grpVisibility.Controls.Add(Me.lblBackground) - Me.grpVisibility.Controls.Add(Me.lblFormFront) - Me.grpVisibility.Controls.Add(Me.cmbFormFront) - Me.grpVisibility.Controls.Add(Me.cmbBackground) - Me.grpVisibility.Controls.Add(Me.cmbB2SDMD) - Me.grpVisibility.Controls.Add(Me.lblB2SDMD) - Me.grpVisibility.Controls.Add(Me.cmbDMD) - Me.grpVisibility.Controls.Add(Me.lblDMD) - Me.grpVisibility.Controls.Add(Me.cmbGrill) - Me.grpVisibility.Controls.Add(Me.lblGrill) - Me.grpVisibility.Location = New System.Drawing.Point(12, 120) - Me.grpVisibility.Name = "grpVisibility" - Me.grpVisibility.Size = New System.Drawing.Size(515, 79) - Me.grpVisibility.TabIndex = 1 - Me.grpVisibility.TabStop = False - Me.grpVisibility.Text = "Visibility" - ' - 'cmbB2SBackglass - ' - Me.cmbB2SBackglass.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.cmbB2SBackglass.FormattingEnabled = True - Me.cmbB2SBackglass.Items.AddRange(New Object() {"Visible", "Hidden"}) - Me.cmbB2SBackglass.Location = New System.Drawing.Point(75, 14) - Me.cmbB2SBackglass.Margin = New System.Windows.Forms.Padding(6) - Me.cmbB2SBackglass.Name = "cmbB2SBackglass" - Me.cmbB2SBackglass.Size = New System.Drawing.Size(93, 21) - Me.cmbB2SBackglass.TabIndex = 43 - ' - 'lblB2SBackglass - ' - Me.lblB2SBackglass.AutoSize = True - Me.lblB2SBackglass.Location = New System.Drawing.Point(4, 19) - Me.lblB2SBackglass.Margin = New System.Windows.Forms.Padding(6, 0, 6, 0) - Me.lblB2SBackglass.Name = "lblB2SBackglass" - Me.lblB2SBackglass.Size = New System.Drawing.Size(59, 13) - Me.lblB2SBackglass.TabIndex = 44 - Me.lblB2SBackglass.Text = "Backglass:" - ' - 'chkFormNoFocus - ' - Me.chkFormNoFocus.AutoSize = True - Me.chkFormNoFocus.Font = New System.Drawing.Font("Microsoft Sans Serif", 8.25!, System.Drawing.FontStyle.Italic, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) - Me.chkFormNoFocus.Location = New System.Drawing.Point(441, 50) - Me.chkFormNoFocus.Name = "chkFormNoFocus" - Me.chkFormNoFocus.Size = New System.Drawing.Size(72, 17) - Me.chkFormNoFocus.TabIndex = 42 - Me.chkFormNoFocus.Text = "No Focus" - Me.chkFormNoFocus.UseVisualStyleBackColor = True - ' - 'lblBackground - ' - Me.lblBackground.AutoSize = True - Me.lblBackground.Location = New System.Drawing.Point(296, 17) - Me.lblBackground.Name = "lblBackground" - Me.lblBackground.Size = New System.Drawing.Size(68, 13) - Me.lblBackground.TabIndex = 17 - Me.lblBackground.Text = "Background:" - ' - 'lblFormFront - ' - Me.lblFormFront.AutoSize = True - Me.lblFormFront.Location = New System.Drawing.Point(281, 51) - Me.lblFormFront.Name = "lblFormFront" - Me.lblFormFront.Size = New System.Drawing.Size(62, 13) - Me.lblFormFront.TabIndex = 41 - Me.lblFormFront.Text = "Bring Forms" - ' - 'cmbFormFront - ' - Me.cmbFormFront.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.cmbFormFront.FormattingEnabled = True - Me.cmbFormFront.Items.AddRange(New Object() {"Form to Back", "Standard", "Form to Top"}) - Me.cmbFormFront.Location = New System.Drawing.Point(345, 48) - Me.cmbFormFront.Name = "cmbFormFront" - Me.cmbFormFront.Size = New System.Drawing.Size(90, 21) - Me.cmbFormFront.TabIndex = 27 - ' - 'cmbBackground - ' - Me.cmbBackground.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.cmbBackground.FormattingEnabled = True - Me.cmbBackground.Items.AddRange(New Object() {"Visible", "Hidden", "Standard"}) - Me.cmbBackground.Location = New System.Drawing.Point(370, 14) - Me.cmbBackground.Name = "cmbBackground" - Me.cmbBackground.Size = New System.Drawing.Size(80, 21) - Me.cmbBackground.TabIndex = 16 - ' - 'cmbB2SDMD - ' - Me.cmbB2SDMD.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.cmbB2SDMD.FormattingEnabled = True - Me.cmbB2SDMD.Items.AddRange(New Object() {"Visible", "Hidden"}) - Me.cmbB2SDMD.Location = New System.Drawing.Point(188, 48) - Me.cmbB2SDMD.Name = "cmbB2SDMD" - Me.cmbB2SDMD.Size = New System.Drawing.Size(80, 21) - Me.cmbB2SDMD.TabIndex = 5 - ' - 'lblB2SDMD - ' - Me.lblB2SDMD.AutoSize = True - Me.lblB2SDMD.Location = New System.Drawing.Point(127, 51) - Me.lblB2SDMD.Name = "lblB2SDMD" - Me.lblB2SDMD.Size = New System.Drawing.Size(58, 13) - Me.lblB2SDMD.TabIndex = 15 - Me.lblB2SDMD.Text = "B2S DMD:" - ' - 'cmbDMD - ' - Me.cmbDMD.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.cmbDMD.FormattingEnabled = True - Me.cmbDMD.Items.AddRange(New Object() {"Visible", "Hidden", "Standard"}) - Me.cmbDMD.Location = New System.Drawing.Point(40, 48) - Me.cmbDMD.Name = "cmbDMD" - Me.cmbDMD.Size = New System.Drawing.Size(80, 21) - Me.cmbDMD.TabIndex = 4 - ' - 'lblDMD - ' - Me.lblDMD.AutoSize = True - Me.lblDMD.Location = New System.Drawing.Point(5, 51) - Me.lblDMD.Name = "lblDMD" - Me.lblDMD.Size = New System.Drawing.Size(35, 13) - Me.lblDMD.TabIndex = 13 - Me.lblDMD.Text = "DMD:" - ' - 'cmbGrill - ' - Me.cmbGrill.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.cmbGrill.FormattingEnabled = True - Me.cmbGrill.Items.AddRange(New Object() {"Visible", "Hidden", "Standard"}) - Me.cmbGrill.Location = New System.Drawing.Point(210, 14) - Me.cmbGrill.Name = "cmbGrill" - Me.cmbGrill.Size = New System.Drawing.Size(80, 21) - Me.cmbGrill.TabIndex = 3 - ' - 'lblGrill - ' - Me.lblGrill.AutoSize = True - Me.lblGrill.Location = New System.Drawing.Point(177, 17) - Me.lblGrill.Name = "lblGrill" - Me.lblGrill.Size = New System.Drawing.Size(27, 13) - Me.lblGrill.TabIndex = 11 - Me.lblGrill.Text = "Grill:" - ' - 'grpLEDs - ' - Me.grpLEDs.Controls.Add(Me.lblGlowing) - Me.grpLEDs.Controls.Add(Me.radioStandardLED) - Me.grpLEDs.Controls.Add(Me.cmbGlowing) - Me.grpLEDs.Controls.Add(Me.radioDream7LED) - Me.grpLEDs.Controls.Add(Me.chkWireframe) - Me.grpLEDs.Controls.Add(Me.chkBulbs) - Me.grpLEDs.Location = New System.Drawing.Point(12, 339) - Me.grpLEDs.Name = "grpLEDs" - Me.grpLEDs.Size = New System.Drawing.Size(515, 80) - Me.grpLEDs.TabIndex = 4 - Me.grpLEDs.TabStop = False - Me.grpLEDs.Text = "LED settings and tuning" - ' - 'lblGlowing - ' - Me.lblGlowing.Location = New System.Drawing.Point(303, 53) - Me.lblGlowing.Name = "lblGlowing" - Me.lblGlowing.Size = New System.Drawing.Size(48, 13) - Me.lblGlowing.TabIndex = 25 - Me.lblGlowing.Text = "Glowing:" - Me.lblGlowing.TextAlign = System.Drawing.ContentAlignment.MiddleRight - ' - 'radioStandardLED - ' - Me.radioStandardLED.Appearance = System.Windows.Forms.Appearance.Button - Me.radioStandardLED.Location = New System.Drawing.Point(6, 20) - Me.radioStandardLED.Name = "radioStandardLED" - Me.radioStandardLED.Size = New System.Drawing.Size(111, 24) - Me.radioStandardLED.TabIndex = 11 - Me.radioStandardLED.TabStop = True - Me.radioStandardLED.Text = "Use simple LEDs" - Me.radioStandardLED.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.radioStandardLED.UseVisualStyleBackColor = True - ' - 'cmbGlowing - ' - Me.cmbGlowing.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList - Me.cmbGlowing.FormattingEnabled = True - Me.cmbGlowing.Items.AddRange(New Object() {"Off", "Low", "Medium", "High", "Default"}) - Me.cmbGlowing.Location = New System.Drawing.Point(357, 50) - Me.cmbGlowing.Name = "cmbGlowing" - Me.cmbGlowing.Size = New System.Drawing.Size(111, 21) - Me.cmbGlowing.TabIndex = 15 - ' - 'radioDream7LED - ' - Me.radioDream7LED.Appearance = System.Windows.Forms.Appearance.Button - Me.radioDream7LED.Location = New System.Drawing.Point(124, 20) - Me.radioDream7LED.Name = "radioDream7LED" - Me.radioDream7LED.Size = New System.Drawing.Size(110, 24) - Me.radioDream7LED.TabIndex = 12 - Me.radioDream7LED.TabStop = True - Me.radioDream7LED.Text = "Use 'Dream7' LEDs" - Me.radioDream7LED.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.radioDream7LED.UseVisualStyleBackColor = True - ' - 'chkWireframe - ' - Me.chkWireframe.Appearance = System.Windows.Forms.Appearance.Button - Me.chkWireframe.Location = New System.Drawing.Point(240, 20) - Me.chkWireframe.Name = "chkWireframe" - Me.chkWireframe.Size = New System.Drawing.Size(111, 24) - Me.chkWireframe.TabIndex = 13 - Me.chkWireframe.Text = "LED &wireframe on" - Me.chkWireframe.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.chkWireframe.UseVisualStyleBackColor = True - ' - 'chkBulbs - ' - Me.chkBulbs.Appearance = System.Windows.Forms.Appearance.Button - Me.chkBulbs.Location = New System.Drawing.Point(357, 20) - Me.chkBulbs.Name = "chkBulbs" - Me.chkBulbs.Size = New System.Drawing.Size(111, 24) - Me.chkBulbs.TabIndex = 14 - Me.chkBulbs.Text = "LED &bulb light on" - Me.chkBulbs.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.chkBulbs.UseVisualStyleBackColor = True - ' - 'grpPerfTuning - ' - Me.grpPerfTuning.Controls.Add(Me.numLampsSkipFrames) - Me.grpPerfTuning.Controls.Add(Me.lblLampsBlackTurns) - Me.grpPerfTuning.Controls.Add(Me.lblLEDBlackTurns) - Me.grpPerfTuning.Controls.Add(Me.numSolenoidsSkipFrames) - Me.grpPerfTuning.Controls.Add(Me.numLEDSkipFrames) - Me.grpPerfTuning.Controls.Add(Me.lblSolenoidBlackTurns) - Me.grpPerfTuning.Controls.Add(Me.numGISkipFrames) - Me.grpPerfTuning.Controls.Add(Me.lblGIBlackTurns) - Me.grpPerfTuning.Location = New System.Drawing.Point(12, 260) - Me.grpPerfTuning.Name = "grpPerfTuning" - Me.grpPerfTuning.Size = New System.Drawing.Size(515, 73) - Me.grpPerfTuning.TabIndex = 3 - Me.grpPerfTuning.TabStop = False - Me.grpPerfTuning.Text = "Performance tuning" - ' - 'numLampsSkipFrames - ' - Me.numLampsSkipFrames.Location = New System.Drawing.Point(117, 18) - Me.numLampsSkipFrames.Maximum = New Decimal(New Integer() {10, 0, 0, 0}) - Me.numLampsSkipFrames.Name = "numLampsSkipFrames" - Me.numLampsSkipFrames.Size = New System.Drawing.Size(51, 20) - Me.numLampsSkipFrames.TabIndex = 8 - ' - 'lblLampsBlackTurns - ' - Me.lblLampsBlackTurns.AutoSize = True - Me.lblLampsBlackTurns.Location = New System.Drawing.Point(14, 22) - Me.lblLampsBlackTurns.Name = "lblLampsBlackTurns" - Me.lblLampsBlackTurns.Size = New System.Drawing.Size(90, 13) - Me.lblLampsBlackTurns.TabIndex = 10 - Me.lblLampsBlackTurns.Text = "Skip lamp frames:" - ' - 'lblLEDBlackTurns - ' - Me.lblLEDBlackTurns.AutoSize = True - Me.lblLEDBlackTurns.Location = New System.Drawing.Point(251, 46) - Me.lblLEDBlackTurns.Name = "lblLEDBlackTurns" - Me.lblLEDBlackTurns.Size = New System.Drawing.Size(89, 13) - Me.lblLEDBlackTurns.TabIndex = 22 - Me.lblLEDBlackTurns.Text = "Skip LED frames:" - ' - 'numSolenoidsSkipFrames - ' - Me.numSolenoidsSkipFrames.Location = New System.Drawing.Point(345, 18) - Me.numSolenoidsSkipFrames.Maximum = New Decimal(New Integer() {30, 0, 0, 0}) - Me.numSolenoidsSkipFrames.Name = "numSolenoidsSkipFrames" - Me.numSolenoidsSkipFrames.Size = New System.Drawing.Size(51, 20) - Me.numSolenoidsSkipFrames.TabIndex = 9 - ' - 'numLEDSkipFrames - ' - Me.numLEDSkipFrames.Location = New System.Drawing.Point(345, 44) - Me.numLEDSkipFrames.Maximum = New Decimal(New Integer() {5, 0, 0, 0}) - Me.numLEDSkipFrames.Name = "numLEDSkipFrames" - Me.numLEDSkipFrames.Size = New System.Drawing.Size(51, 20) - Me.numLEDSkipFrames.TabIndex = 11 - ' - 'lblSolenoidBlackTurns - ' - Me.lblSolenoidBlackTurns.AutoSize = True - Me.lblSolenoidBlackTurns.Location = New System.Drawing.Point(230, 20) - Me.lblSolenoidBlackTurns.Name = "lblSolenoidBlackTurns" - Me.lblSolenoidBlackTurns.Size = New System.Drawing.Size(107, 13) - Me.lblSolenoidBlackTurns.TabIndex = 12 - Me.lblSolenoidBlackTurns.Text = "Skip solenoid frames:" - ' - 'numGISkipFrames - ' - Me.numGISkipFrames.Location = New System.Drawing.Point(117, 44) - Me.numGISkipFrames.Maximum = New Decimal(New Integer() {30, 0, 0, 0}) - Me.numGISkipFrames.Name = "numGISkipFrames" - Me.numGISkipFrames.Size = New System.Drawing.Size(51, 20) - Me.numGISkipFrames.TabIndex = 10 - ' - 'lblGIBlackTurns - ' - Me.lblGIBlackTurns.AutoSize = True - Me.lblGIBlackTurns.Location = New System.Drawing.Point(25, 47) - Me.lblGIBlackTurns.Name = "lblGIBlackTurns" - Me.lblGIBlackTurns.Size = New System.Drawing.Size(79, 13) - Me.lblGIBlackTurns.TabIndex = 19 - Me.lblGIBlackTurns.Text = "Skip GI frames:" - ' - 'formSettings - ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi - Me.ClientSize = New System.Drawing.Size(536, 693) - Me.Controls.Add(Me.PanelSettings) - Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow - Me.KeyPreview = True - Me.MaximizeBox = False - Me.MinimizeBox = False - Me.Name = "formSettings" - Me.Opacity = 0R - Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen - Me.Text = "Settings..." - Me.TopMost = True - Me.PanelSettings.ResumeLayout(False) - Me.PanelSettings.PerformLayout() - Me.lowerPanel.ResumeLayout(False) - Me.headerPanel.ResumeLayout(False) - Me.headerPanel.PerformLayout() - CType(Me.B2SLogo, System.ComponentModel.ISupportInitialize).EndInit() - Me.grpPlugins.ResumeLayout(False) - Me.grpPlugins.PerformLayout() - Me.grpStartMode.ResumeLayout(False) - Me.grpStartMode.PerformLayout() - Me.grpGeneral.ResumeLayout(False) - Me.grpGeneral.PerformLayout() - Me.grpAnimationSettings.ResumeLayout(False) - Me.grpScreenshot.ResumeLayout(False) - Me.grpScreenshot.PerformLayout() - Me.grpVisibility.ResumeLayout(False) - Me.grpVisibility.PerformLayout() - Me.grpLEDs.ResumeLayout(False) - Me.grpPerfTuning.ResumeLayout(False) - Me.grpPerfTuning.PerformLayout() - CType(Me.numLampsSkipFrames, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.numSolenoidsSkipFrames, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.numLEDSkipFrames, System.ComponentModel.ISupportInitialize).EndInit() - CType(Me.numGISkipFrames, System.ComponentModel.ISupportInitialize).EndInit() - Me.ResumeLayout(False) - - End Sub - Friend WithEvents TimerOpacity As System.Windows.Forms.Timer - Friend WithEvents PanelSettings As System.Windows.Forms.Panel - Friend WithEvents grpAnimationSettings As System.Windows.Forms.GroupBox - Friend WithEvents cmbAnimationSetting As System.Windows.Forms.ComboBox - Friend WithEvents cmbAnimations As System.Windows.Forms.ComboBox - Friend WithEvents lblVersion As System.Windows.Forms.Label - Friend WithEvents grpScreenshot As System.Windows.Forms.GroupBox - Friend WithEvents lblFileType As System.Windows.Forms.Label - Friend WithEvents cmbScreenshotType As System.Windows.Forms.ComboBox - Friend WithEvents btnScreenshotPath As System.Windows.Forms.Button - Friend WithEvents btnCloseSettings As System.Windows.Forms.Button - Friend WithEvents B2SLogo As System.Windows.Forms.PictureBox - Friend WithEvents lblCopyright As System.Windows.Forms.Label - Friend WithEvents grpVisibility As System.Windows.Forms.GroupBox - Friend WithEvents cmbB2SDMD As System.Windows.Forms.ComboBox - Friend WithEvents lblB2SDMD As System.Windows.Forms.Label - Friend WithEvents cmbDMD As System.Windows.Forms.ComboBox - Friend WithEvents lblDMD As System.Windows.Forms.Label - Friend WithEvents cmbGrill As System.Windows.Forms.ComboBox - Friend WithEvents lblGrill As System.Windows.Forms.Label - Friend WithEvents cmbMatchingFileNames As System.Windows.Forms.ComboBox - Friend WithEvents btnCheck As System.Windows.Forms.Button - Friend WithEvents btnSaveSettings As System.Windows.Forms.Button - Friend WithEvents grpLEDs As System.Windows.Forms.GroupBox - Friend WithEvents lblGlowing As System.Windows.Forms.Label - Friend WithEvents radioStandardLED As System.Windows.Forms.RadioButton - Friend WithEvents cmbGlowing As System.Windows.Forms.ComboBox - Friend WithEvents radioDream7LED As System.Windows.Forms.RadioButton - Friend WithEvents chkWireframe As System.Windows.Forms.CheckBox - Friend WithEvents chkBulbs As System.Windows.Forms.CheckBox - Friend WithEvents grpPerfTuning As System.Windows.Forms.GroupBox - Friend WithEvents chkStartAsEXE As System.Windows.Forms.CheckBox - Friend WithEvents numLampsSkipFrames As System.Windows.Forms.NumericUpDown - Friend WithEvents lblLampsBlackTurns As System.Windows.Forms.Label - Friend WithEvents lblLEDBlackTurns As System.Windows.Forms.Label - Friend WithEvents numSolenoidsSkipFrames As System.Windows.Forms.NumericUpDown - Friend WithEvents numLEDSkipFrames As System.Windows.Forms.NumericUpDown - Friend WithEvents lblSolenoidBlackTurns As System.Windows.Forms.Label - Friend WithEvents numGISkipFrames As System.Windows.Forms.NumericUpDown - Friend WithEvents lblGIBlackTurns As System.Windows.Forms.Label - Friend WithEvents grpGeneral As System.Windows.Forms.GroupBox - Friend WithEvents btnMore As System.Windows.Forms.Button - Friend WithEvents cmbMode As System.Windows.Forms.ComboBox - Friend WithEvents lblMode As System.Windows.Forms.Label - Friend WithEvents lblFile As System.Windows.Forms.Label - Friend WithEvents btnHyperpin As System.Windows.Forms.Button - Friend WithEvents lblDefaultStartMode As System.Windows.Forms.Label - Friend WithEvents cmbDefaultStartMode As System.Windows.Forms.ComboBox - Friend WithEvents grpStartMode As System.Windows.Forms.GroupBox - Friend WithEvents grpPlugins As System.Windows.Forms.GroupBox - Friend WithEvents chkShowStartupError As System.Windows.Forms.CheckBox - Friend WithEvents chkActivatePlugins As System.Windows.Forms.CheckBox - Friend WithEvents btnPluginSettings As System.Windows.Forms.Button - Friend WithEvents lblFormFront As Windows.Forms.Label - Friend WithEvents cmbFormFront As Windows.Forms.ComboBox - Friend WithEvents chkDisableFuzzyMatching As Windows.Forms.CheckBox - Friend WithEvents chkFormNoFocus As Windows.Forms.CheckBox - Friend WithEvents btnEditScreenRes As Windows.Forms.Button - Friend WithEvents lblBackground As Windows.Forms.Label - Friend WithEvents cmbBackground As Windows.Forms.ComboBox - Friend WithEvents lblNonAvailableSettings As Windows.Forms.Label - Friend WithEvents B2SLogoToolTip As Windows.Forms.ToolTip - Friend WithEvents lowerPanel As Windows.Forms.Panel - Friend WithEvents headerPanel As Windows.Forms.Panel - Friend WithEvents cmbB2SBackglass As Windows.Forms.ComboBox - Friend WithEvents lblB2SBackglass As Windows.Forms.Label -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettings.resx b/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettings.resx deleted file mode 100644 index 865f20d..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettings.resx +++ /dev/null @@ -1,258 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 155, 17 - - - - - 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 - NRABIwAAAABJRU5ErkJggg== - - - - 17, 17 - - - 29 - - \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettings.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettings.vb deleted file mode 100644 index b784bf8..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettings.vb +++ /dev/null @@ -1,523 +0,0 @@ -Imports System -Imports System.Drawing -Imports System.Windows.Forms -Imports Microsoft.Win32 -Imports System.IO -Imports System.Windows.Forms.VisualStyles.VisualStyleElement - -Public Class formSettings - - Public B2SScreen As B2SScreen = Nothing - Public B2SAnimation As B2SAnimation = Nothing - Public formBackglass As formBackglass = Nothing - - Public activateMsgBoxAtSaving As Boolean = False - Public isSettingsScreenDirty As Boolean = False - - Private formSettingsMore As formSettingsMore = Nothing - - Private fadeIn As Boolean = True - Private Const fadeStep As Single = 0.2 - - Private Class Animations4Settings - Public Name As String = String.Empty - Public SlowDown As Integer = 1 - - Public Sub New(ByVal _name As String, ByVal _slowdown As Integer) - Name = _name - SlowDown = _slowdown - End Sub - - Public Overrides Function ToString() As String - Return Name + If(SlowDown = 1, "", " (" & If(SlowDown = 0, "Off", SlowDown.ToString & "x") & ")") - End Function - End Class - - Private Sub formSettings_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load - - formSettingsMore = New formSettingsMore(Me, formBackglass) - - ' Set labels Bold/Italic - 'Me.lblVersion.Font = New Font(Me.lblVersion.Font, FontStyle.Bold) - 'Me.lblCopyright.Font = New Font(Me.lblCopyright.Font, FontStyle.Bold) - - 'Me.lblNonAvailableSettings.Font = New Font(Me.lblNonAvailableSettings.Font, FontStyle.Italic) - 'Me.lblBackgound.Font = New Font(Me.lblBackgound.Font, FontStyle.Italic) - 'Me.chkDisableFuzzyMatching.Font = New Font(Me.chkDisableFuzzyMatching.Font, FontStyle.Italic) - 'Me.chkFormNoFocus.Font = New Font(Me.chkFormNoFocus.Font, FontStyle.Italic) - - ' load data - Dim _isdirty As Boolean = isSettingsScreenDirty - Me.Text = "Settings... [" & B2SData.TableFileName & "] " & " (" & If(Not String.IsNullOrEmpty(B2SSettings.GameName), B2SSettings.GameName, B2SSettings.B2SName) & ")" - - 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) - lblVersion.Text = String.Format("Server version {0} {1}, backglass file version {2}", Application.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 - formSettingsMore.chkLogGIStrings.Checked = B2SSettings.IsGIStringsStateLogOn - formSettingsMore.chkLogLEDs.Checked = B2SSettings.IsLEDsStateLogOn - formSettingsMore.chkAllOut.Enabled = B2SSettings.IsROMControlled - formSettingsMore.chkAllOff.Enabled = B2SSettings.IsROMControlled - formSettingsMore.chkLampsOff.Enabled = (B2SData.UseRomLamps OrElse B2SData.UseAnimationLamps) AndAlso B2SSettings.IsROMControlled - formSettingsMore.chkSolenoidsOff.Enabled = (B2SData.UseRomSolenoids OrElse B2SData.UseAnimationSolenoids) AndAlso B2SSettings.IsROMControlled - formSettingsMore.chkGIStringsOff.Enabled = (B2SData.UseRomGIStrings OrElse B2SData.UseAnimationGIStrings) AndAlso B2SSettings.IsROMControlled - formSettingsMore.chkLEDsOff.Enabled = (B2SData.UseLEDs OrElse B2SData.UseLEDDisplays OrElse B2SData.UseReels) - ' get panel data - If B2SData.DualBackglass Then - cmbMode.SelectedIndex = CInt(B2SSettings.CurrentDualMode) - 1 - Else - cmbMode.Text = String.Empty - cmbMode.Enabled = False - cmbGrill.Focus() - End If - cmbDMD.SelectedIndex = B2SSettings.HideDMD - cmbGrill.SelectedIndex = B2SSettings.HideGrill - cmbB2SDMD.SelectedIndex = If(B2SSettings.HideB2SDMD, 1, 0) - cmbB2SBackglass.SelectedIndex = If(B2SSettings.HideB2SBackglass, 1, 0) - btnScreenshotPath.Text = "Screenshot path: " & B2SSettings.ScreenshotPath - cmbScreenshotType.SelectedIndex = B2SSettings.ScreenshotFileType - numLampsSkipFrames.Enabled = (B2SData.UseRomLamps OrElse B2SData.UseAnimationLamps) AndAlso B2SSettings.IsROMControlled - numLampsSkipFrames.Value = B2SSettings.LampsSkipFrames - numSolenoidsSkipFrames.Enabled = (B2SData.UseRomSolenoids OrElse B2SData.UseAnimationSolenoids) AndAlso B2SSettings.IsROMControlled - numSolenoidsSkipFrames.Value = B2SSettings.SolenoidsSkipFrames - numGISkipFrames.Enabled = (B2SData.UseRomGIStrings OrElse B2SData.UseAnimationGIStrings) AndAlso B2SSettings.IsROMControlled - numGISkipFrames.Value = B2SSettings.GIStringsSkipFrames - chkStartAsEXE.Checked = B2SSettings.StartAsEXE - cmbDefaultStartMode.SelectedIndex = B2SSettings.DefaultStartMode - 1 - numLEDSkipFrames.Enabled = (B2SData.UseLEDs OrElse B2SData.UseLEDDisplays OrElse B2SData.UseReels) AndAlso B2SSettings.IsROMControlled - numLEDSkipFrames.Value = B2SSettings.LEDsSkipFrames - If Not B2SData.UseReels Then - radioStandardLED.Checked = (B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Rendered) - radioDream7LED.Checked = (B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Dream7) - Else - radioStandardLED.Enabled = False - radioDream7LED.Enabled = False - End If - chkBulbs.Checked = B2SSettings.IsGlowBulbOn - cmbFormFront.SelectedIndex = If(B2SSettings.FormToBack, 0, If(B2SSettings.FormToFront, 2, 1)) - chkDisableFuzzyMatching.Checked = B2SSettings.DisableFuzzyMatching - - cmbGlowing.SelectedIndex = If(B2SSettings.GlowIndex <> -1, B2SSettings.GlowIndex, cmbGlowing.Items.Count - 1) - activateMsgBoxAtSaving = False - ' get animation info - cmbAnimations.Items.Clear() - For Each animation As String In B2SAnimation.Animations - cmbAnimations.Items.Add(New Animations4Settings(animation, B2SAnimation.AnimationSlowDown(animation))) - Next - If cmbAnimations.Items.Count > 0 Then - cmbAnimations.SelectedIndex = 0 - cmbAnimations.Items.Add(New Animations4Settings("(All animations)", B2SSettings.AllAnimationSlowDown)) - End If - ' maybe show matching file names combo box - If B2SSettings.MatchingFileNames IsNot Nothing AndAlso B2SSettings.MatchingFileNames.Length >= 2 Then - cmbMatchingFileNames.Items.Clear() - For Each filename As String In B2SSettings.MatchingFileNames - cmbMatchingFileNames.Items.Add(filename) - Next - If Not String.IsNullOrEmpty(B2SSettings.MatchingFileName) Then - cmbMatchingFileNames.Text = B2SSettings.MatchingFileName - Else - cmbMatchingFileNames.SelectedIndex = 0 - End If - btnCheck.Visible = False - cmbMode.Width = cmbDMD.Width - lblFile.Visible = True - cmbMatchingFileNames.Visible = True - End If - cmbBackground.SelectedIndex = If(B2SSettings.StartBackground.HasValue, If(B2SSettings.StartBackground, 0, 1), 2) - chkFormNoFocus.Checked = B2SSettings.FormNoFocus - ' plugin stuff - chkActivatePlugins.Checked = B2SSettings.ArePluginsOn - chkShowStartupError.Checked = B2SSettings.ShowStartupError - If B2SSettings.ArePluginsOn AndAlso Registry.CurrentUser.OpenSubKey("Software\B2S").GetValue("Plugins", 0) > 0 Then - btnPluginSettings.Enabled = True - End If - ' size panel - PanelSettings.Location = New Point((Me.Size.Width - PanelSettings.Width) / 2, (Me.Size.Height - PanelSettings.Height) / 2) - ' reset dirty flag to previous state - isSettingsScreenDirty = _isdirty - - ' set and start timers - TimerOpacity.Interval = 10 - TimerOpacity.Start() - - End Sub - - Private Sub formSettings_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyUp - If e.KeyCode = Keys.Escape OrElse e.KeyCode = Keys.S Then - btnCloseSettings.PerformClick() - End If - End Sub - - Private Sub TimerOpacity_Tick(sender As System.Object, e As System.EventArgs) Handles TimerOpacity.Tick - - If fadeIn Then - Me.Opacity += fadeStep - If Me.Opacity >= 1 Then - TimerOpacity.Stop() - fadeIn = False - End If - Else - Me.Opacity -= fadeStep - If Me.Opacity <= 0 Then - TimerOpacity.Stop() - Try - Me.Close() - Me.Dispose() - Catch - End Try - End If - End If - - End Sub - - Private Sub btnMore_Click(sender As System.Object, e As System.EventArgs) Handles btnMore.Click - - formSettingsMore.ShowDialog(Me, formBackglass) - - End Sub - Private Sub btnSaveSettings_Click(sender As System.Object, e As System.EventArgs) Handles btnSaveSettings.Click - If B2SSettings.HideB2SBackglass Then - Dim result As DialogResult = MessageBox.Show("If you save the settings with the backglass hidden, it will become hard to open the settings for this table!" & vbCrLf & vbCrLf & - "To edit the B2SBackglassSettings.xml file manually search for " & vbCrLf & vbCrLf & "1" & vbCrLf & vbCrLf & "in the B2SBackglassSettings.xml file" & vbCrLf & vbCrLf & "Do you want to continue?", - My.Resources.AppTitle, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) - If result = Windows.Forms.DialogResult.No Then - Return - End If - End If - B2SSettings.Save(B2SAnimation) - B2SSettings.Save(, True) - isSettingsScreenDirty = False - If activateMsgBoxAtSaving Then - MessageBox.Show(My.Resources.MSG_ChangesNeedARestart, My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation) - End If - - End Sub - Private Sub btnCloseSettings_Click(sender As System.Object, e As System.EventArgs) Handles btnCloseSettings.Click - - If IsDirty() Then Return - fadeIn = False - TimerOpacity.Start() - - End Sub - - Private Sub cmbMode_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbMode.SelectedIndexChanged - isSettingsScreenDirty = True - B2SSettings.CurrentDualMode = cmbMode.SelectedIndex + 1 - If formBackglass IsNot Nothing Then - formBackglass.BackgroundImage = formBackglass.DarkImage - formBackglass.Refresh() - End If - B2SAnimation.RestartAnimations() - End Sub - Private Sub btnCheck_Click(sender As System.Object, e As System.EventArgs) Handles btnCheck.Click - Dim text As String = "Your backglass monitor is " & B2SScreen.BackglassMonitor & vbCrLf & vbCrLf - For Each scr As Screen In Screen.AllScreens - text &= scr.DeviceName & ": Running on " & scr.BitsPerPixel.ToString() & " bit" & vbCrLf - Next - MessageBox.Show(text, "Check monitors", MessageBoxButtons.OK, MessageBoxIcon.Information) - End Sub - Private Sub btnHyperpin_Click(sender As System.Object, e As System.EventArgs) Handles btnHyperpin.Click - B2SSettings.HyperpinXMLFile = String.Empty - 'If Not B2SSettings.LocateHyperpinXMLFile() Then - If MessageBox.Show("Please locate and select your 'Visual Pinball.xml' file.", My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation) = Windows.Forms.DialogResult.OK Then - Using ofd As OpenFileDialog = New OpenFileDialog - ofd.Filter = "XML file (*.xml)|*.xml|ALL (*.*)|*.*" - ofd.FileName = "Visual Pinball.xml" - If ofd.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then - Dim name As String = ofd.FileName - Dim fi As FileInfo = New FileInfo(name) - If Not fi.Name.Equals("Visual Pinball.xml") Then - MessageBox.Show("Sorry, this file isn't a 'Visual Pinball.xml' file.", My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation) - ElseIf File.Exists(name) Then - Try - Dim xml As Xml.XmlDocument = New Xml.XmlDocument() - xml.Load(name) - Catch ex As Exception - MessageBox.Show("The following error occurred opening the file '" & name & "':" & vbCrLf & vbCrLf & ex.Message, My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation) - End Try - B2SSettings.HyperpinXMLFile = name - B2SSettings.Save(, , True) - MessageBox.Show("Your 'Visual Pinball.xml' file could be located correctly.", My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Information) - Else - MessageBox.Show("'Visual Pinball.xml' could not be found.", My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation) - End If - End If - End Using - End If - 'If MessageBox.Show("To locate 'Hyperpin' correctly please select the 'Hyperpin' folder.", My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation) = Windows.Forms.DialogResult.OK Then - ' Using fbd As FolderBrowserDialog = New FolderBrowserDialog - ' If fbd.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then - ' If IO.File.Exists(IO.Path.Combine(fbd.SelectedPath, "hyperpin.exe")) Then - ' If IO.File.Exists(IO.Path.Combine(fbd.SelectedPath, "Databases", "Visual Pinball", "Visual Pinball.xml")) Then - ' B2SSettings.HyperpinXMLFile = IO.Path.Combine(fbd.SelectedPath, "Databases", "Visual Pinball", "Visual Pinball.xml") - ' B2SSettings.Save(, , True) - ' MessageBox.Show("'Hyperpin' could be located correctly.", My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Information) - ' Else - ' MessageBox.Show("'Visual Pinball.xml' could not be found in folder '" & IO.Path.Combine(fbd.SelectedPath, "Databases", "Visual Pinball") & "'.", My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation) - ' End If - ' Else - ' MessageBox.Show("'Hyperpin.exe' could not be found in folder '" & fbd.SelectedPath & "'.", My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Exclamation) - ' End If - ' End If - ' End Using - 'End If - 'Else - 'MessageBox.Show("'Hyperpin' could be found in '" & IO.Directory.GetParent(B2SSettings.HyperpinXMLFile).FullName & "'.", My.Resources.AppTitle, MessageBoxButtons.OK, MessageBoxIcon.Information) - 'End If - End Sub - Private Sub cmbMatchingFileNames_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles cmbMatchingFileNames.SelectedIndexChanged - isSettingsScreenDirty = True - B2SSettings.MatchingFileName = cmbMatchingFileNames.Text - End Sub - - Private Sub cmbGrill_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbGrill.SelectedIndexChanged - activateMsgBoxAtSaving = True - isSettingsScreenDirty = True - B2SSettings.HideGrill = cmbGrill.SelectedIndex - End Sub - Private Sub cmbDMD_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbDMD.SelectedIndexChanged - activateMsgBoxAtSaving = True - isSettingsScreenDirty = True - B2SSettings.HideDMD = cmbDMD.SelectedIndex - End Sub - Private Sub cmbB2SDMD_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbB2SDMD.SelectedIndexChanged - activateMsgBoxAtSaving = True - isSettingsScreenDirty = True - B2SSettings.HideB2SDMD = (cmbB2SDMD.SelectedIndex = 1) - End Sub - Private Sub cmbB2SBackglass_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbB2SBackglass.SelectedIndexChanged - activateMsgBoxAtSaving = True - isSettingsScreenDirty = True - B2SSettings.HideB2SBackglass = (cmbB2SBackglass.SelectedIndex = 1) - End Sub - Private Sub chkStartAsEXE_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkStartAsEXE.CheckedChanged - activateMsgBoxAtSaving = True - isSettingsScreenDirty = True - B2SSettings.StartAsEXE = chkStartAsEXE.Checked - End Sub - Private Sub cmbDefaultStartMode_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbDefaultStartMode.SelectedIndexChanged - isSettingsScreenDirty = True - B2SSettings.DefaultStartMode = cmbDefaultStartMode.SelectedIndex + 1 - End Sub - - Private Sub radioDream7LED_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles radioDream7LED.CheckedChanged - isSettingsScreenDirty = True - If radioDream7LED.Checked Then - B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Dream7 - ElseIf radioStandardLED.Checked Then - B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Rendered - End If - For Each led As KeyValuePair(Of String, B2SLEDBox) In B2SData.LEDs - led.Value.Visible = (B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Rendered) AndAlso Not led.Value.Hidden - Next - For Each leddisplay As KeyValuePair(Of String, Dream7Display) In B2SData.LEDDisplays - leddisplay.Value.Visible = (B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Dream7) AndAlso Not leddisplay.Value.Hidden - Next - chkWireframe.Enabled = radioDream7LED.Checked - chkBulbs.Enabled = radioDream7LED.Checked - cmbGlowing.Enabled = radioDream7LED.Checked - End Sub - Private Sub radioStandardLED_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles radioStandardLED.CheckedChanged - ' nothing to do, all handled at radioDream7LED - End Sub - 'Private Sub chkUseDream7_CheckedChanged(sender As System.Object, e As System.EventArgs) - 'B2SSettings.UsedLEDType = If(chkUseDream7.Checked, B2SSettings.eLEDTypes.Dream7, B2SSettings.eLEDTypes.Rendered) - 'For Each led As KeyValuePair(Of String, B2SLEDBox) In B2SData.LEDs - ' led.Value.Visible = (B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Rendered) - 'Next - 'For Each leddisplay As KeyValuePair(Of String, Dream7Display) In B2SData.LEDDisplays - ' leddisplay.Value.Visible = (B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Dream7) - 'Next - 'chkWireframe.Enabled = chkUseDream7.Checked - 'chkBulbs.Enabled = chkUseDream7.Checked - 'btnGlow.Enabled = chkUseDream7.Checked - 'End Sub - Private Sub chkWireframe_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkWireframe.CheckedChanged - Static wireframe As Boolean = False - wireframe = Not wireframe - For Each leddisplay As KeyValuePair(Of String, Dream7Display) In B2SData.LEDDisplays - leddisplay.Value.WireFrame = wireframe - Next - End Sub - Private Sub chkBulbs_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkBulbs.CheckedChanged - isSettingsScreenDirty = True - B2SSettings.IsGlowBulbOn = chkBulbs.Checked - Static bulbsizeF As SizeF = SizeF.Empty - bulbsizeF = If(bulbsizeF.Equals(SizeF.Empty), New SizeF(0.1, 0.4), SizeF.Empty) - For Each leddisplay As KeyValuePair(Of String, Dream7Display) In B2SData.LEDDisplays - leddisplay.Value.BulbSize = bulbsizeF - Next - End Sub - Private Sub cmbGlowing_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbGlowing.SelectedIndexChanged - isSettingsScreenDirty = True - B2SSettings.GlowIndex = cmbGlowing.SelectedIndex - Dim glow As Integer = B2SSettings.GlowIndex * 8 - If glow = 32 Then glow = B2SSettings.DefaultGlow - For Each leddisplay As KeyValuePair(Of String, Dream7Display) In B2SData.LEDDisplays - leddisplay.Value.Glow = glow - Next - If B2SSettings.GlowIndex = cmbGlowing.Items.Count - 1 Then B2SSettings.GlowIndex = -1 - End Sub - - Private Sub numLampsSkipFrames_ValueChanged(sender As System.Object, e As System.EventArgs) Handles numLampsSkipFrames.ValueChanged - isSettingsScreenDirty = True - B2SSettings.LampsSkipFrames = numLampsSkipFrames.Value - End Sub - Private Sub numSolenoidSkipFrames_ValueChanged(sender As System.Object, e As System.EventArgs) Handles numSolenoidsSkipFrames.ValueChanged - isSettingsScreenDirty = True - B2SSettings.SolenoidsSkipFrames = numSolenoidsSkipFrames.Value - End Sub - Private Sub numGISkipFrames_ValueChanged(sender As System.Object, e As System.EventArgs) Handles numGISkipFrames.ValueChanged - isSettingsScreenDirty = True - B2SSettings.GIStringsSkipFrames = numGISkipFrames.Value - End Sub - Private Sub numLEDSkipFrames_ValueChanged(sender As System.Object, e As System.EventArgs) Handles numLEDSkipFrames.ValueChanged - isSettingsScreenDirty = True - B2SSettings.LEDsSkipFrames = numLEDSkipFrames.Value - End Sub - - Private ignoreChanges As Boolean = False - Private Sub cmbAnimations_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbAnimations.SelectedIndexChanged - If ignoreChanges Then Return - If cmbAnimations.SelectedItem IsNot Nothing Then - ignoreChanges = True - Dim slowdown As Integer = DirectCast(cmbAnimations.SelectedItem, Animations4Settings).SlowDown - If slowdown = 0 Then - cmbAnimationSetting.SelectedIndex = cmbAnimationSetting.Items.Count - 1 - ElseIf slowdown >= 1 AndAlso slowdown <= 5 Then - cmbAnimationSetting.SelectedIndex = slowdown - 1 - ElseIf slowdown = 10 Then - cmbAnimationSetting.SelectedIndex = 5 - End If - cmbAnimationSetting.Enabled = Not (B2SSettings.AllAnimationSlowDown <> 1 AndAlso cmbAnimations.SelectedIndex < cmbAnimations.Items.Count - 1) - ignoreChanges = False - End If - End Sub - Private Sub cmbAnimationSetting_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbAnimationSetting.SelectedIndexChanged - If ignoreChanges Then Return - If cmbAnimations.SelectedItem IsNot Nothing Then - Dim name As String = DirectCast(cmbAnimations.SelectedItem, Animations4Settings).Name - Dim slowdown As Integer = DirectCast(cmbAnimations.SelectedItem, Animations4Settings).SlowDown - If cmbAnimationSetting.Text = "Off" Then - slowdown = 0 - Else - slowdown = CInt(cmbAnimationSetting.Text.Replace(" x", "")) - End If - Dim index As Integer = cmbAnimations.SelectedIndex - ignoreChanges = True - cmbAnimations.Items.RemoveAt(index) - cmbAnimations.Items.Insert(index, New Animations4Settings(name, slowdown)) - cmbAnimations.SelectedIndex = index - If cmbAnimations.SelectedIndex < cmbAnimations.Items.Count - 1 Then - B2SAnimation.AnimationSlowDown(name) = slowdown - Else - B2SSettings.AllAnimationSlowDown = slowdown - End If - ignoreChanges = False - End If - End Sub - - Private Sub btnScreenshotPath_Click(sender As System.Object, e As System.EventArgs) Handles btnScreenshotPath.Click - Using fbd As FolderBrowserDialog = New FolderBrowserDialog() - fbd.SelectedPath = B2SSettings.ScreenshotPath - If fbd.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then - isSettingsScreenDirty = True - B2SSettings.ScreenshotPath = fbd.SelectedPath - btnScreenshotPath.Text = "Screenshot path: " & B2SSettings.ScreenshotPath - End If - End Using - End Sub - Private Sub cmbScreenshotType_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles cmbScreenshotType.SelectedIndexChanged - isSettingsScreenDirty = True - B2SSettings.ScreenshotFileType = cmbScreenshotType.SelectedIndex - End Sub - - Private Sub chkActivatePlugins_CheckedChanged(sender As Object, e As EventArgs) Handles chkActivatePlugins.CheckedChanged - activateMsgBoxAtSaving = True - isSettingsScreenDirty = True - B2SSettings.ArePluginsOn = chkActivatePlugins.Checked - End Sub - Private Sub chkShowStartupError_CheckedChanged(sender As Object, e As EventArgs) Handles chkShowStartupError.CheckedChanged - isSettingsScreenDirty = True - B2SSettings.ShowStartupError = chkShowStartupError.Checked - End Sub - Private Sub btnPluginSettings_Click(sender As Object, e As EventArgs) Handles btnPluginSettings.Click - 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 Sub - - Private Function IsDirty() As Boolean - Dim ret As Boolean = False - If isSettingsScreenDirty Then - Dim result As DialogResult = MessageBox.Show(My.Resources.MSG_IsDirty, My.Resources.AppTitle, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question) - If result = Windows.Forms.DialogResult.Yes Then - btnSaveSettings.PerformClick() - ElseIf result = Windows.Forms.DialogResult.Cancel Then - ret = True - End If - End If - Return ret - End Function - - Private Sub cmbFormFront_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbFormFront.SelectedIndexChanged - B2SSettings.FormToBack = False - B2SSettings.FormToFront = False - - If cmbFormFront.SelectedIndex = 0 Then - B2SSettings.FormToBack = True - ElseIf cmbFormFront.SelectedIndex = 2 Then - B2SSettings.FormToFront = True - End If - End Sub - - Private Sub chkDisableFuzzyMatching_CheckedChanged(sender As Object, e As EventArgs) Handles chkDisableFuzzyMatching.CheckedChanged - B2SSettings.DisableFuzzyMatching = chkDisableFuzzyMatching.Checked - End Sub - - Private Sub chkFormNoFocus_CheckedChanged(sender As Object, e As EventArgs) Handles chkFormNoFocus.CheckedChanged - B2SSettings.FormNoFocus = chkFormNoFocus.Checked - End Sub - - Private Sub btnEditScreenRes_Click(sender As Object, e As EventArgs) Handles btnEditScreenRes.Click - Dim p As Process = New Process() - Dim pi As ProcessStartInfo = New ProcessStartInfo() - Dim B2S_Identifier As String = IO.Path.Combine(Application.StartupPath, "B2S_ScreenResIdentifier.exe") - - If IO.File.Exists(B2S_Identifier) Then - pi.Arguments = """" & B2SData.TableFileName & ".res" & """" - pi.FileName = B2S_Identifier - - p.StartInfo = pi - Me.Visible = False - p.Start() - p.WaitForExit() - Me.Visible = True - End If - End Sub - - Private Sub cmbSmall_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbBackground.SelectedIndexChanged - activateMsgBoxAtSaving = True - isSettingsScreenDirty = True - If cmbBackground.SelectedIndex = 2 Then - B2SSettings.StartBackground = Nothing - Else - B2SSettings.StartBackground = (cmbBackground.SelectedIndex = 0) - End If - End Sub - - Private Sub B2SLogo_Click(sender As Object, e As EventArgs) Handles B2SLogo.Click - B2SLogoToolTip.SetToolTip(B2SLogo, B2SSettings.SettingFilePath & vbCrLf & B2SSettings.LoadedResFilePath) ' & vbCrLf & B2SSettings.PluginsFilePath) - End Sub - -End Class \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettingsMore.Designer.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettingsMore.Designer.vb deleted file mode 100644 index 03e48fc..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettingsMore.Designer.vb +++ /dev/null @@ -1,325 +0,0 @@ - _ -Partial Class formSettingsMore - Inherits System.Windows.Forms.Form - - 'Form overrides dispose to clean up the component list. - _ - Protected Overrides Sub Dispose(ByVal disposing As Boolean) - Try - If disposing AndAlso components IsNot Nothing Then - components.Dispose() - End If - Finally - MyBase.Dispose(disposing) - End Try - End Sub - - 'Required by the Windows Form Designer - Private components As System.ComponentModel.IContainer - - 'NOTE: The following procedure is required by the Windows Form Designer - 'It can be modified using the Windows Form Designer. - 'Do not modify it using the code editor. - _ - Private Sub InitializeComponent() - Me.grpLogging = New System.Windows.Forms.GroupBox() - Me.chkStatisticBackglass = New System.Windows.Forms.CheckBox() - Me.chkLogLEDs = New System.Windows.Forms.CheckBox() - Me.btnLogPath = New System.Windows.Forms.Button() - Me.chkLogSolenoids = New System.Windows.Forms.CheckBox() - Me.chkLogGIStrings = New System.Windows.Forms.CheckBox() - Me.chkLogLamps = New System.Windows.Forms.CheckBox() - Me.grpPerfTests = New System.Windows.Forms.GroupBox() - Me.chkAllOut = New System.Windows.Forms.CheckBox() - Me.chkAllOff = New System.Windows.Forms.CheckBox() - Me.chkLampsOff = New System.Windows.Forms.CheckBox() - Me.chkSolenoidsOff = New System.Windows.Forms.CheckBox() - Me.chkGIStringsOff = New System.Windows.Forms.CheckBox() - Me.chkLEDsOff = New System.Windows.Forms.CheckBox() - Me.btnCloseSettings = New System.Windows.Forms.Button() - Me.GroupRegistrySettings = New System.Windows.Forms.GroupBox() - Me.ChkB2SDebugLog = New System.Windows.Forms.CheckBox() - Me.ChkB2STableSettingsExtendedPath = New System.Windows.Forms.CheckBox() - Me.lblB2SScreenResFileNameOverride = New System.Windows.Forms.Label() - Me.TxtB2SScreenResFileNameOverride = New System.Windows.Forms.TextBox() - Me.ChkB2SWindowPunchActive = New System.Windows.Forms.CheckBox() - Me.grpLogging.SuspendLayout() - Me.grpPerfTests.SuspendLayout() - Me.GroupRegistrySettings.SuspendLayout() - Me.SuspendLayout() - ' - 'grpLogging - ' - Me.grpLogging.Controls.Add(Me.chkStatisticBackglass) - Me.grpLogging.Controls.Add(Me.chkLogLEDs) - Me.grpLogging.Controls.Add(Me.btnLogPath) - Me.grpLogging.Controls.Add(Me.chkLogSolenoids) - Me.grpLogging.Controls.Add(Me.chkLogGIStrings) - Me.grpLogging.Controls.Add(Me.chkLogLamps) - Me.grpLogging.Location = New System.Drawing.Point(8, 95) - Me.grpLogging.Name = "grpLogging" - Me.grpLogging.Size = New System.Drawing.Size(524, 84) - Me.grpLogging.TabIndex = 10 - Me.grpLogging.TabStop = False - Me.grpLogging.Text = "Logging" - ' - 'chkStatisticBackglass - ' - Me.chkStatisticBackglass.AutoSize = True - Me.chkStatisticBackglass.Location = New System.Drawing.Point(217, 25) - Me.chkStatisticBackglass.Name = "chkStatisticBackglass" - Me.chkStatisticBackglass.Size = New System.Drawing.Size(203, 17) - Me.chkStatisticBackglass.TabIndex = 27 - Me.chkStatisticBackglass.Text = "Show statistics backglass after restart" - Me.chkStatisticBackglass.UseVisualStyleBackColor = True - ' - 'chkLogLEDs - ' - Me.chkLogLEDs.AutoSize = True - Me.chkLogLEDs.Location = New System.Drawing.Point(411, 54) - Me.chkLogLEDs.Name = "chkLogLEDs" - Me.chkLogLEDs.Size = New System.Drawing.Size(73, 17) - Me.chkLogLEDs.TabIndex = 31 - Me.chkLogLEDs.Text = "Log LEDs" - Me.chkLogLEDs.UseVisualStyleBackColor = True - ' - 'btnLogPath - ' - Me.btnLogPath.Location = New System.Drawing.Point(8, 20) - Me.btnLogPath.Name = "btnLogPath" - Me.btnLogPath.Size = New System.Drawing.Size(150, 24) - Me.btnLogPath.TabIndex = 26 - Me.btnLogPath.Text = "Log path" - Me.btnLogPath.UseVisualStyleBackColor = True - ' - 'chkLogSolenoids - ' - Me.chkLogSolenoids.AutoSize = True - Me.chkLogSolenoids.Location = New System.Drawing.Point(131, 54) - Me.chkLogSolenoids.Name = "chkLogSolenoids" - Me.chkLogSolenoids.Size = New System.Drawing.Size(91, 17) - Me.chkLogSolenoids.TabIndex = 29 - Me.chkLogSolenoids.Text = "Log solenoids" - Me.chkLogSolenoids.UseVisualStyleBackColor = True - ' - 'chkLogGIStrings - ' - Me.chkLogGIStrings.AutoSize = True - Me.chkLogGIStrings.Location = New System.Drawing.Point(271, 54) - Me.chkLogGIStrings.Name = "chkLogGIStrings" - Me.chkLogGIStrings.Size = New System.Drawing.Size(91, 17) - Me.chkLogGIStrings.TabIndex = 30 - Me.chkLogGIStrings.Text = "Log GI strings" - Me.chkLogGIStrings.UseVisualStyleBackColor = True - ' - 'chkLogLamps - ' - Me.chkLogLamps.AutoSize = True - Me.chkLogLamps.Location = New System.Drawing.Point(8, 54) - Me.chkLogLamps.Name = "chkLogLamps" - Me.chkLogLamps.Size = New System.Drawing.Size(74, 17) - Me.chkLogLamps.TabIndex = 28 - Me.chkLogLamps.Text = "Log lamps" - Me.chkLogLamps.UseVisualStyleBackColor = True - ' - 'grpPerfTests - ' - Me.grpPerfTests.Controls.Add(Me.chkAllOut) - Me.grpPerfTests.Controls.Add(Me.chkAllOff) - Me.grpPerfTests.Controls.Add(Me.chkLampsOff) - Me.grpPerfTests.Controls.Add(Me.chkSolenoidsOff) - Me.grpPerfTests.Controls.Add(Me.chkGIStringsOff) - Me.grpPerfTests.Controls.Add(Me.chkLEDsOff) - Me.grpPerfTests.Location = New System.Drawing.Point(8, 7) - Me.grpPerfTests.Name = "grpPerfTests" - Me.grpPerfTests.Size = New System.Drawing.Size(524, 85) - Me.grpPerfTests.TabIndex = 9 - Me.grpPerfTests.TabStop = False - Me.grpPerfTests.Text = "Performance tests" - ' - 'chkAllOut - ' - Me.chkAllOut.Appearance = System.Windows.Forms.Appearance.Button - Me.chkAllOut.Location = New System.Drawing.Point(6, 20) - Me.chkAllOut.Name = "chkAllOut" - Me.chkAllOut.Size = New System.Drawing.Size(163, 24) - Me.chkAllOut.TabIndex = 20 - Me.chkAllOut.Text = "All off and &out" - Me.chkAllOut.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.chkAllOut.UseVisualStyleBackColor = True - ' - 'chkAllOff - ' - Me.chkAllOff.Appearance = System.Windows.Forms.Appearance.Button - Me.chkAllOff.Location = New System.Drawing.Point(353, 19) - Me.chkAllOff.Name = "chkAllOff" - Me.chkAllOff.Size = New System.Drawing.Size(163, 24) - Me.chkAllOff.TabIndex = 21 - Me.chkAllOff.Text = "&All off" - Me.chkAllOff.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.chkAllOff.UseVisualStyleBackColor = True - ' - 'chkLampsOff - ' - Me.chkLampsOff.Appearance = System.Windows.Forms.Appearance.Button - Me.chkLampsOff.Location = New System.Drawing.Point(6, 50) - Me.chkLampsOff.Name = "chkLampsOff" - Me.chkLampsOff.Size = New System.Drawing.Size(111, 24) - Me.chkLampsOff.TabIndex = 22 - Me.chkLampsOff.Text = "&Lamps off" - Me.chkLampsOff.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.chkLampsOff.UseVisualStyleBackColor = True - ' - 'chkSolenoidsOff - ' - Me.chkSolenoidsOff.Appearance = System.Windows.Forms.Appearance.Button - Me.chkSolenoidsOff.Location = New System.Drawing.Point(139, 50) - Me.chkSolenoidsOff.Name = "chkSolenoidsOff" - Me.chkSolenoidsOff.Size = New System.Drawing.Size(111, 24) - Me.chkSolenoidsOff.TabIndex = 23 - Me.chkSolenoidsOff.Text = "&Solenoids off" - Me.chkSolenoidsOff.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.chkSolenoidsOff.UseVisualStyleBackColor = True - ' - 'chkGIStringsOff - ' - Me.chkGIStringsOff.Appearance = System.Windows.Forms.Appearance.Button - Me.chkGIStringsOff.Location = New System.Drawing.Point(272, 50) - Me.chkGIStringsOff.Name = "chkGIStringsOff" - Me.chkGIStringsOff.Size = New System.Drawing.Size(111, 24) - Me.chkGIStringsOff.TabIndex = 24 - Me.chkGIStringsOff.Text = "&GI strings off" - Me.chkGIStringsOff.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.chkGIStringsOff.UseVisualStyleBackColor = True - ' - 'chkLEDsOff - ' - Me.chkLEDsOff.Appearance = System.Windows.Forms.Appearance.Button - Me.chkLEDsOff.Location = New System.Drawing.Point(405, 50) - Me.chkLEDsOff.Name = "chkLEDsOff" - Me.chkLEDsOff.Size = New System.Drawing.Size(111, 24) - Me.chkLEDsOff.TabIndex = 25 - Me.chkLEDsOff.Text = "L&EDs off" - Me.chkLEDsOff.TextAlign = System.Drawing.ContentAlignment.MiddleCenter - Me.chkLEDsOff.UseVisualStyleBackColor = True - ' - 'btnCloseSettings - ' - Me.btnCloseSettings.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) - Me.btnCloseSettings.DialogResult = System.Windows.Forms.DialogResult.Cancel - Me.btnCloseSettings.Location = New System.Drawing.Point(440, 299) - Me.btnCloseSettings.Name = "btnCloseSettings" - Me.btnCloseSettings.Size = New System.Drawing.Size(92, 24) - Me.btnCloseSettings.TabIndex = 35 - Me.btnCloseSettings.Text = "Close" - Me.btnCloseSettings.UseVisualStyleBackColor = True - ' - 'GroupRegistrySettings - ' - Me.GroupRegistrySettings.Controls.Add(Me.ChkB2SDebugLog) - Me.GroupRegistrySettings.Controls.Add(Me.ChkB2STableSettingsExtendedPath) - Me.GroupRegistrySettings.Controls.Add(Me.lblB2SScreenResFileNameOverride) - Me.GroupRegistrySettings.Controls.Add(Me.TxtB2SScreenResFileNameOverride) - Me.GroupRegistrySettings.Controls.Add(Me.ChkB2SWindowPunchActive) - Me.GroupRegistrySettings.Location = New System.Drawing.Point(8, 185) - Me.GroupRegistrySettings.Name = "GroupRegistrySettings" - Me.GroupRegistrySettings.Size = New System.Drawing.Size(524, 110) - Me.GroupRegistrySettings.TabIndex = 32 - Me.GroupRegistrySettings.TabStop = False - Me.GroupRegistrySettings.Text = "Registry settings (HKCU\Software\B2S)" - ' - 'ChkB2SDebugLog - ' - Me.ChkB2SDebugLog.AutoSize = True - Me.ChkB2SDebugLog.Location = New System.Drawing.Point(392, 31) - Me.ChkB2SDebugLog.Name = "ChkB2SDebugLog" - Me.ChkB2SDebugLog.Size = New System.Drawing.Size(96, 17) - Me.ChkB2SDebugLog.TabIndex = 36 - Me.ChkB2SDebugLog.Text = "B2SDebugLog" - Me.ChkB2SDebugLog.UseVisualStyleBackColor = True - ' - 'ChkB2STableSettingsExtendedPath - ' - Me.ChkB2STableSettingsExtendedPath.AutoSize = True - Me.ChkB2STableSettingsExtendedPath.Location = New System.Drawing.Point(186, 31) - Me.ChkB2STableSettingsExtendedPath.Name = "ChkB2STableSettingsExtendedPath" - Me.ChkB2STableSettingsExtendedPath.Size = New System.Drawing.Size(178, 17) - Me.ChkB2STableSettingsExtendedPath.TabIndex = 35 - Me.ChkB2STableSettingsExtendedPath.Text = "B2STableSettingsExtendedPath" - Me.ChkB2STableSettingsExtendedPath.UseVisualStyleBackColor = True - ' - 'lblB2SScreenResFileNameOverride - ' - Me.lblB2SScreenResFileNameOverride.AutoSize = True - Me.lblB2SScreenResFileNameOverride.Location = New System.Drawing.Point(8, 63) - Me.lblB2SScreenResFileNameOverride.Name = "lblB2SScreenResFileNameOverride" - Me.lblB2SScreenResFileNameOverride.Size = New System.Drawing.Size(164, 13) - Me.lblB2SScreenResFileNameOverride.TabIndex = 34 - Me.lblB2SScreenResFileNameOverride.Text = "B2SScreenResFileNameOverride" - ' - 'TxtB2SScreenResFileNameOverride - ' - Me.TxtB2SScreenResFileNameOverride.Location = New System.Drawing.Point(187, 60) - Me.TxtB2SScreenResFileNameOverride.Name = "TxtB2SScreenResFileNameOverride" - Me.TxtB2SScreenResFileNameOverride.Size = New System.Drawing.Size(93, 20) - Me.TxtB2SScreenResFileNameOverride.TabIndex = 33 - Me.TxtB2SScreenResFileNameOverride.TabStop = False - Me.TxtB2SScreenResFileNameOverride.WordWrap = False - ' - 'ChkB2SWindowPunchActive - ' - Me.ChkB2SWindowPunchActive.AutoSize = True - Me.ChkB2SWindowPunchActive.Location = New System.Drawing.Point(12, 31) - Me.ChkB2SWindowPunchActive.Name = "ChkB2SWindowPunchActive" - Me.ChkB2SWindowPunchActive.Size = New System.Drawing.Size(146, 17) - Me.ChkB2SWindowPunchActive.TabIndex = 32 - Me.ChkB2SWindowPunchActive.Text = "B2SWindowPunchActive" - Me.ChkB2SWindowPunchActive.UseVisualStyleBackColor = True - ' - 'formSettingsMore - ' - Me.AutoScaleDimensions = New System.Drawing.SizeF(96.0!, 96.0!) - Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi - Me.ClientSize = New System.Drawing.Size(539, 331) - Me.Controls.Add(Me.GroupRegistrySettings) - Me.Controls.Add(Me.btnCloseSettings) - Me.Controls.Add(Me.grpLogging) - Me.Controls.Add(Me.grpPerfTests) - Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedToolWindow - Me.KeyPreview = True - Me.MaximizeBox = False - Me.MinimizeBox = False - Me.Name = "formSettingsMore" - Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen - Me.Text = "More backglass settings ..." - Me.TopMost = True - Me.grpLogging.ResumeLayout(False) - Me.grpLogging.PerformLayout() - Me.grpPerfTests.ResumeLayout(False) - Me.GroupRegistrySettings.ResumeLayout(False) - Me.GroupRegistrySettings.PerformLayout() - Me.ResumeLayout(False) - - End Sub - Friend WithEvents grpLogging As System.Windows.Forms.GroupBox - Friend WithEvents chkStatisticBackglass As System.Windows.Forms.CheckBox - Friend WithEvents chkLogLEDs As System.Windows.Forms.CheckBox - Friend WithEvents btnLogPath As System.Windows.Forms.Button - Friend WithEvents chkLogSolenoids As System.Windows.Forms.CheckBox - Friend WithEvents chkLogGIStrings As System.Windows.Forms.CheckBox - Friend WithEvents chkLogLamps As System.Windows.Forms.CheckBox - Friend WithEvents grpPerfTests As System.Windows.Forms.GroupBox - Friend WithEvents chkAllOut As System.Windows.Forms.CheckBox - Friend WithEvents chkAllOff As System.Windows.Forms.CheckBox - Friend WithEvents chkLampsOff As System.Windows.Forms.CheckBox - Friend WithEvents chkSolenoidsOff As System.Windows.Forms.CheckBox - Friend WithEvents chkGIStringsOff As System.Windows.Forms.CheckBox - Friend WithEvents chkLEDsOff As System.Windows.Forms.CheckBox - Friend WithEvents btnCloseSettings As System.Windows.Forms.Button - Friend WithEvents GroupRegistrySettings As Windows.Forms.GroupBox - Friend WithEvents ChkB2SWindowPunchActive As Windows.Forms.CheckBox - Friend WithEvents TxtB2SScreenResFileNameOverride As Windows.Forms.TextBox - Friend WithEvents lblB2SScreenResFileNameOverride As Windows.Forms.Label - Friend WithEvents ChkB2STableSettingsExtendedPath As Windows.Forms.CheckBox - Friend WithEvents ChkB2SDebugLog As Windows.Forms.CheckBox -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettingsMore.resx b/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettingsMore.resx deleted file mode 100644 index 29dcb1b..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettingsMore.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettingsMore.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettingsMore.vb deleted file mode 100644 index f4b30ce..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Forms/formSettingsMore.vb +++ /dev/null @@ -1,134 +0,0 @@ -Imports System -Imports System.Windows.Forms -Imports Microsoft.Win32 - -Public Class formSettingsMore - - Private formSettings As formSettings = Nothing - Private formBackglass As formBackglass = Nothing - - Public Sub New(ByVal _formSettings As formSettings, ByVal _formbackglass As formBackglass) - - ' This call is required by the designer. - InitializeComponent() - - ' Add any initialization after the InitializeComponent() call. - Me.formSettings = _formSettings - Me.formBackglass = _formbackglass - TxtB2SScreenResFileNameOverride.Text = B2SSettings.SafeReadRegistry("Software\B2S", "B2SScreenResFileNameOverride", B2SSettings.B2SScreenResFileName) - ChkB2STableSettingsExtendedPath.Checked = B2SSettings.B2STableSettingsExtendedPath - ChkB2SWindowPunchActive.Checked = B2SSettings.B2SWindowPunchActive - End Sub - - Public Shadows Function ShowDialog(ByVal owner As IWin32Window, - ByVal _formbackglass As formBackglass) As DialogResult - - Me.formSettings = owner - Me.formBackglass = _formbackglass - - Dim ret As DialogResult = MyBase.ShowDialog(owner) - Return Windows.Forms.DialogResult.OK - - End Function - - Private Sub formSettings_KeyUp(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyUp - If e.KeyCode = Keys.Escape Then - btnCloseSettings.PerformClick() - End If - End Sub - - Private Sub btnCloseSettings_Click(sender As System.Object, e As System.EventArgs) Handles btnCloseSettings.Click - Me.Close() - End Sub - - Private Sub chkAllOut_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkAllOut.CheckedChanged - B2SSettings.AllOut = chkAllOut.Checked - chkAllOff.Checked = chkAllOut.Checked - formBackglass.BackgroundImage = formBackglass.DarkImage - Me.Invalidate() - End Sub - Private Sub chkAllOff_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkAllOff.CheckedChanged - B2SSettings.AllOff = chkAllOff.Checked - chkLampsOff.Checked = chkAllOff.Checked - chkSolenoidsOff.Checked = chkAllOff.Checked - chkGIStringsOff.Checked = chkAllOff.Checked - chkLEDsOff.Checked = chkAllOff.Checked - End Sub - Private Sub chkLampsOff_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkLampsOff.CheckedChanged - B2SSettings.LampsOff = chkLampsOff.Checked - End Sub - Private Sub chkSolenoidsOff_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkSolenoidsOff.CheckedChanged - B2SSettings.SolenoidsOff = chkSolenoidsOff.Checked - End Sub - Private Sub chkGIStringsOff_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkGIStringsOff.CheckedChanged - B2SSettings.GIStringsOff = chkGIStringsOff.Checked - End Sub - Private Sub chkLEDsOff_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkLEDsOff.CheckedChanged - B2SSettings.LEDsOff = chkLEDsOff.Checked - For Each leddisplay As KeyValuePair(Of String, Dream7Display) In B2SData.LEDDisplays - leddisplay.Value.Visible = Not B2SSettings.LEDsOff AndAlso B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Dream7 - Next - For Each leds As KeyValuePair(Of String, B2SLEDBox) In B2SData.LEDs - leds.Value.Visible = Not B2SSettings.LEDsOff AndAlso B2SSettings.UsedLEDType = B2SSettings.eLEDTypes.Rendered - Next - End Sub - - Private Sub btnLogPath_Click(sender As System.Object, e As System.EventArgs) Handles btnLogPath.Click - Using fbd As FolderBrowserDialog = New FolderBrowserDialog() - fbd.SelectedPath = B2SSettings.LogPath - If fbd.ShowDialog(Me) = Windows.Forms.DialogResult.OK Then - formSettings.isSettingsScreenDirty = True - B2SSettings.LogPath = fbd.SelectedPath - btnLogPath.Text = "Log path: " & B2SSettings.LogPath - End If - End Using - End Sub - Private Sub chkLogLamps_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkLogLamps.CheckedChanged - formSettings.isSettingsScreenDirty = True - B2SSettings.IsLampsStateLogOn = chkLogLamps.Checked - End Sub - Private Sub chlLogSolenoids_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkLogSolenoids.CheckedChanged - formSettings.isSettingsScreenDirty = True - B2SSettings.IsSolenoidsStateLogOn = chkLogSolenoids.Checked - End Sub - Private Sub chkLogGIStrings_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkLogGIStrings.CheckedChanged - formSettings.isSettingsScreenDirty = True - B2SSettings.IsGIStringsStateLogOn = chkLogGIStrings.Checked - End Sub - Private Sub chkLogLEDs_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkLogLEDs.CheckedChanged - formSettings.isSettingsScreenDirty = True - B2SSettings.IsLEDsStateLogOn = chkLogLEDs.Checked - End Sub - Private Sub chkStatisticBackglass_CheckedChanged(sender As System.Object, e As System.EventArgs) Handles chkStatisticBackglass.CheckedChanged - formSettings.activateMsgBoxAtSaving = True - formSettings.isSettingsScreenDirty = True - B2SSettings.IsStatisticsBackglassOn = chkStatisticBackglass.Checked - End Sub - - Private Sub TxtB2SScreenResFileNameOverride_TextChanged(sender As Object, e As EventArgs) Handles TxtB2SScreenResFileNameOverride.TextChanged - Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) - regkey.SetValue("B2SScreenResFileNameOverride", TxtB2SScreenResFileNameOverride.Text) - End Using - End Sub - - Private Sub ChkB2STableSettingsExtendedPath_CheckedChanged(sender As Object, e As EventArgs) Handles ChkB2STableSettingsExtendedPath.CheckedChanged - Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) - regkey.SetValue("B2STableSettingsExtendedPath", If(ChkB2STableSettingsExtendedPath.Checked, "1", "0")) - B2SSettings.B2STableSettingsExtendedPath = ChkB2STableSettingsExtendedPath.Checked - End Using - End Sub - - Private Sub chkB2SWindowPunchActive_CheckedChanged(sender As Object, e As EventArgs) Handles ChkB2SWindowPunchActive.CheckedChanged - Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) - regkey.SetValue("B2SWindowPunchActive", If(ChkB2SWindowPunchActive.Checked, "1", "0")) - B2SSettings.B2SWindowPunchActive = ChkB2SWindowPunchActive.Checked - End Using - End Sub - - Private Sub ChkB2SDebugLog_CheckedChanged(sender As Object, e As EventArgs) Handles ChkB2SDebugLog.CheckedChanged - Using regkey As RegistryKey = Registry.CurrentUser.OpenSubKey("Software\B2S", True) - regkey.SetValue("B2SDebugLog", If(ChkB2SDebugLog.Checked, "1", "0")) - B2SSettings.B2SDebugLog = ChkB2SDebugLog.Checked - End Using - End Sub -End Class \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Logging/Log.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Logging/Log.vb deleted file mode 100644 index f65530c..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Logging/Log.vb +++ /dev/null @@ -1,33 +0,0 @@ -Imports System - -Public Class Log - - Private writeLog As Boolean = False - - Private filename As String = String.Empty - - Public Sub New(ByVal _filename As String) - filename = _filename & ".txt" - End Sub - - Public Property IsLogOn() As Boolean - Get - Return writeLog - End Get - Set(value As Boolean) - writeLog = value - End Set - End Property - - Public Sub WriteLogEntry(ByVal text As String) - If writeLog AndAlso Not String.IsNullOrEmpty(B2SSettings.LogPath) Then - ' write to log file - On Error Resume Next - Dim log As IO.StreamWriter = New IO.StreamWriter(IO.Path.Combine(B2SSettings.LogPath, filename), True) - log.WriteLine(text) - log.Flush() - log.Close() - End If - End Sub - -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Logging/Statistics.vb b/b2sbackglassserverexe/b2sbackglassserverexe/Logging/Statistics.vb deleted file mode 100644 index 9f134e0..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/Logging/Statistics.vb +++ /dev/null @@ -1,144 +0,0 @@ -Imports System -Imports System.Text - -Public Class Statistics - - Private Const cMinTicks4CoolDown As Integer = 150 - Private Const cMinTicks4GoodCalculation As Integer = 500 - Private Const cMinTicks4Chillout As Integer = 18 - Private Const cMaxTicks4BadChillout1 As Integer = 12 - Private Const cMaxTicks4BadChillout2 As Integer = 8 - Private Const cMaxTicks4BadChillout3 As Integer = 4 - Private Const cMaxTicks4BadChillout4 As Integer = 2 - - Private log As Log = Nothing - - Private lastTick As Date = Nothing - Private counter As Integer = 0 - Private sum As Integer = 0 - Private average As Single = 0 - Private chiller As Integer = 0 - Private waitonechill As Integer = 0 - - Private sb As StringBuilder = New StringBuilder() - - Public Sub New(ByRef _log As Log) - log = _log - End Sub - - Public Function AddTick(ByVal currentCoolDownCounter As Integer, ByVal info As String) As Integer - - Dim ret As Integer = 0 - - Dim nowTick As Date = DateTime.Now - Dim diff As Integer = (nowTick - lastTick).Milliseconds - lastTick = nowTick - - ' calc average tick duration - If counter < cMinTicks4GoodCalculation Then - counter += 1 - sum += diff - average = sum / counter - End If - - ' calc cool down level - Dim chiller4logfile As Integer = chiller - If counter > cMinTicks4CoolDown Then - If currentCoolDownCounter <= 0 Then chiller += 1 - Dim cooldownfactor As Single = diff / average - If cooldownfactor > 3 Then - ret = 8 - chiller = 0 - ElseIf cooldownfactor >= 2 Then - ret = 6 - chiller = 0 - ElseIf cooldownfactor >= 1.5 Then - ' mode 5 - If chiller <= 12 Then - waitonechill += 1 - If waitonechill > 1 Then - ret = Math.Round((12 - chiller) / 2) + 2 - If ret >= 5 Then ret += 1 - Else - ret = 1 - End If - - ' mode 4 - 'If chiller <= 14 Then - ' waitonechill += 1 - ' If waitonechill > 1 Then - ' ret = Math.Round((14 - chiller) / 2) + 2 - ' If ret >= 6 Then ret += 1 - ' If ret >= 9 Then ret += 1 - ' Else - ' ret = 1 - ' End If - - ' mode 3 - 'If chiller <= 16 Then - 'If currentCoolDownCounter > 0 Then - ' If currentCoolDownCounter < 3 Then - ' ret = currentCoolDownCounter + 6 - ' Else - ' ret = currentCoolDownCounter + 3 - ' End If - 'Else - ' ret = Math.Round((16 - chiller) / 2) + 2 - 'End If - - ' mode 2 - 'If chiller <= 16 Then - 'ret = Math.Round((16 - chiller) / 2) + 1 - - ' mode 1 - 'If chiller < cMaxTicks4BadChillout4 Then - ' ret = 6 - 'ElseIf chiller < cMaxTicks4BadChillout3 Then - ' ret = 5 - 'ElseIf chiller < cMaxTicks4BadChillout2 Then - ' ret = 4 - 'ElseIf chiller < cMaxTicks4BadChillout1 Then - ' ret = 3 - 'ElseIf chiller < cMinTicks4Chillout Then - ' ret = 1 - Else - waitonechill = 0 - ret = 0 - End If - chiller = 0 - End If - If currentCoolDownCounter > ret Then - ret = currentCoolDownCounter - End If - End If - - ' maybe write log entry - If log IsNot Nothing AndAlso log.IsLogOn Then - sb.Length = 0 - sb.Append(nowTick) - sb.Append(": ") - sb.Append(diff) - sb.Append(" , ") - sb.Append(average) - sb.Append(" , ") - If Not String.IsNullOrEmpty(info) Then - sb.Append(info) - End If - If counter > cMinTicks4CoolDown Then - If ret > 0 Then - sb.Append(" , ") - sb.Append("CoolDown: " & ret) - End If - If chiller4logfile > 0 Then - sb.Append(" , ") - sb.Append("Chiller: " & chiller4logfile) - End If - End If - log.WriteLogEntry(sb.ToString()) - End If - - Return ret - - End Function - -End Class diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Application.Designer.vb b/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Application.Designer.vb deleted file mode 100644 index db8b8b3..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Application.Designer.vb +++ /dev/null @@ -1,13 +0,0 @@ -'------------------------------------------------------------------------------ -' -' 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/b2sbackglassserverexe/My Project/Application.myapp b/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Application.myapp deleted file mode 100644 index 0167050..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Application.myapp +++ /dev/null @@ -1,10 +0,0 @@ - - - false - false - 0 - true - 0 - 1 - true - diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/My Project/AssemblyInfo.vb b/b2sbackglassserverexe/b2sbackglassserverexe/My Project/AssemblyInfo.vb deleted file mode 100644 index 6122941..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/My Project/AssemblyInfo.vb +++ /dev/null @@ -1,36 +0,0 @@ -Imports System -Imports System.Reflection -Imports System.Runtime.InteropServices - -' Allgemeine Informationen über eine Assembly werden über die folgenden -' Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, -' die mit einer Assembly verknüpft sind. - -' Die Werte der Assemblyattribute überprüfen - - - - - - - - - - -'Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird - - -' Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: -' -' Hauptversion -' Nebenversion -' Buildnummer -' Revision -' -' Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern -' übernehmen, indem Sie "*" eingeben: -' - - - - diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Resources.Designer.vb b/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Resources.Designer.vb deleted file mode 100644 index 423db2d..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Resources.Designer.vb +++ /dev/null @@ -1,108 +0,0 @@ -'------------------------------------------------------------------------------ -' -' 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 - -Imports System - -Namespace My.Resources - - 'This class was auto-generated by the StronglyTypedResourceBuilder - 'class via a tool like ResGen or Visual Studio. - 'To add or remove a member, edit your .ResX file then rerun ResGen - 'with the /str option, or rebuild your VS project. - ''' - ''' A strongly-typed resource class, for looking up localized strings, etc. - ''' - _ - Friend Module Resources - - Private resourceMan As Global.System.Resources.ResourceManager - - Private resourceCulture As Global.System.Globalization.CultureInfo - - ''' - ''' Returns the cached ResourceManager instance used by this class. - ''' - _ - Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager - Get - If Object.ReferenceEquals(resourceMan, Nothing) Then - Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("B2S.Resources", GetType(Resources).Assembly) - resourceMan = temp - End If - Return resourceMan - End Get - End Property - - ''' - ''' Overrides the current thread's CurrentUICulture property for all - ''' resource lookups using this strongly typed resource class. - ''' - _ - Friend Property Culture() As Global.System.Globalization.CultureInfo - Get - Return resourceCulture - End Get - Set - resourceCulture = value - End Set - End Property - - ''' - ''' Looks up a localized string similar to B2S Backglass Server. - ''' - Friend ReadOnly Property AppTitle() As String - Get - Return ResourceManager.GetString("AppTitle", resourceCulture) - End Get - End Property - - ''' - ''' Looks up a localized resource of type System.IO.UnmanagedMemoryStream similar to System.IO.MemoryStream. - ''' - Friend ReadOnly Property camera1() As System.IO.UnmanagedMemoryStream - Get - Return ResourceManager.GetStream("camera1", resourceCulture) - End Get - End Property - - ''' - ''' Looks up a localized resource of type System.IO.UnmanagedMemoryStream similar to System.IO.MemoryStream. - ''' - Friend ReadOnly Property EMReel() As System.IO.UnmanagedMemoryStream - Get - Return ResourceManager.GetStream("EMReel", resourceCulture) - End Get - End Property - - ''' - ''' Looks up a localized string similar to The changes you made need a restart of the backglass.. - ''' - Friend ReadOnly Property MSG_ChangesNeedARestart() As String - Get - Return ResourceManager.GetString("MSG_ChangesNeedARestart", resourceCulture) - End Get - End Property - - ''' - ''' Looks up a localized string similar to You haven't saved your changes. Do you want to save them now?. - ''' - Friend ReadOnly Property MSG_IsDirty() As String - Get - Return ResourceManager.GetString("MSG_IsDirty", resourceCulture) - End Get - End Property - End Module -End Namespace diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Resources.resx b/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Resources.resx deleted file mode 100644 index 03d1af6..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Resources.resx +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - B2S Backglass Server - - - - ..\Resources\camera1.wav;System.IO.MemoryStream, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\EMReel.wav;System.IO.MemoryStream, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - The changes you made need a restart of the backglass. - - - You haven't saved your changes. Do you want to save them now? - - \ No newline at end of file diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Settings.Designer.vb b/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Settings.Designer.vb deleted file mode 100644 index f8d16aa..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Settings.Designer.vb +++ /dev/null @@ -1,73 +0,0 @@ -'------------------------------------------------------------------------------ -' -' 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.B2S.My.MySettings - Get - Return Global.B2S.My.MySettings.Default - End Get - End Property - End Module -End Namespace diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Settings.settings b/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Settings.settings deleted file mode 100644 index 377f56d..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/My Project/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Resources/EMReel.wav b/b2sbackglassserverexe/b2sbackglassserverexe/Resources/EMReel.wav deleted file mode 100644 index 5b92951..0000000 Binary files a/b2sbackglassserverexe/b2sbackglassserverexe/Resources/EMReel.wav and /dev/null differ diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/Resources/camera1.wav b/b2sbackglassserverexe/b2sbackglassserverexe/Resources/camera1.wav deleted file mode 100644 index 8d1c2bb..0000000 Binary files a/b2sbackglassserverexe/b2sbackglassserverexe/Resources/camera1.wav and /dev/null differ diff --git a/b2sbackglassserverexe/b2sbackglassserverexe/moduleImageExtensions.vb b/b2sbackglassserverexe/b2sbackglassserverexe/moduleImageExtensions.vb deleted file mode 100644 index 86925e8..0000000 --- a/b2sbackglassserverexe/b2sbackglassserverexe/moduleImageExtensions.vb +++ /dev/null @@ -1,59 +0,0 @@ -Imports System -Imports System.Drawing - -Module moduleImageExtensions - - _ - Public Function Resized(image As Image, size As Size, Optional ByVal disposeOriginal As Boolean = False) As Image - If image Is Nothing Then Return Nothing - If size.Width <= 0 OrElse size.Height <= 0 Then Return Nothing - Dim ret As Bitmap = New Bitmap(size.Width, size.Height) - Using gr As Graphics = Graphics.FromImage(ret) - gr.PageUnit = GraphicsUnit.Pixel - 'gr.InterpolationMode = Drawing2D.InterpolationMode.High - gr.SmoothingMode = Drawing2D.SmoothingMode.HighQuality - gr.DrawImage(image, New Rectangle(0, 0, ret.Width, ret.Height)) - End Using - If disposeOriginal Then - image.Dispose() - image = Nothing - End If - Return ret - End Function - - _ - Public Function Rotated(image As Image, angle As Integer) As Image - If image Is Nothing Then Return Nothing - Dim ret As Bitmap = New Bitmap(image.Width, image.Height) - Dim matrix As New System.Drawing.Drawing2D.Matrix - Using gr As Graphics = Graphics.FromImage(ret) - gr.PageUnit = GraphicsUnit.Pixel - 'gr.InterpolationMode = Drawing2D.InterpolationMode.High - gr.SmoothingMode = Drawing2D.SmoothingMode.HighQuality - matrix.RotateAt(angle * -1, New Point(CInt(image.Width / 2), CInt(image.Height / 2))) - gr.Transform = matrix - gr.DrawImage(image, New Rectangle(0, 0, image.Width, image.Height)) - End Using - Return ret - End Function - - _ - Public Function ResizedF(image As Image, sizeF As SizeF, Optional ByVal disposeOriginal As Boolean = False) As Image - If image Is Nothing Then Return Nothing - If sizeF.Width <= 0 OrElse sizeF.Height <= 0 Then Return Nothing - Dim largesize As Size = New Size(CInt(sizeF.Width) + 1, CInt(sizeF.Height) + 1) - Dim ret As Bitmap = New Bitmap(largesize.Width, largesize.Height) - Using gr As Graphics = Graphics.FromImage(ret) - gr.PageUnit = GraphicsUnit.Pixel - 'gr.InterpolationMode = Drawing2D.InterpolationMode.High - gr.SmoothingMode = Drawing2D.SmoothingMode.HighQuality - gr.DrawImage(image, New Rectangle(0, 0, sizeF.Width, sizeF.Height)) - End Using - If disposeOriginal Then - image.Dispose() - image = Nothing - End If - Return ret - End Function - -End Module diff --git a/b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/My Project/AssemblyInfo.vb b/b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/My Project/AssemblyInfo.vb index 69c36b2..67acd5d 100644 --- a/b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/My Project/AssemblyInfo.vb +++ b/b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/My Project/AssemblyInfo.vb @@ -9,8 +9,8 @@ Imports System.Runtime.InteropServices ' Review the values of the assembly attributes - - + + @@ -31,6 +31,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - - + + + diff --git a/b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/formBackglassServerRegApp.vb b/b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/formBackglassServerRegApp.vb index 9c58e34..d2d0ecb 100644 --- a/b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/formBackglassServerRegApp.vb +++ b/b2sbackglassserverregisterapp/b2sbackglassserverregisterapp/formBackglassServerRegApp.vb @@ -25,6 +25,7 @@ Public Class formBackglassServerRegApp If Not CommandSilent Then If CheckB2SServer(False) Then Dim dllURI As String = "file://Unknown" + Dim dllVersion As String = "" Try Using regRoot As RegistryKey = Registry.ClassesRoot Using openKey As RegistryKey = regRoot.OpenSubKey("B2S.Server\CLSID", False) @@ -36,6 +37,12 @@ Public Class formBackglassServerRegApp Using openKey As RegistryKey = regRoot.OpenSubKey(IO.Path.Combine("CLSID", clsID, "InprocServer32"), False) If openKey IsNot Nothing Then dllURI = openKey.GetValue("CodeBase") + Try + '"Assembly"="B2SBackglassServer, Version=3.0.0.0, Culture=neutral, PublicKeyToken=null" + dllVersion = openKey.GetValue("Assembly").Split(",")(1).ToString() + Catch + dllVersion = "(not available)" + End Try End If End Using End If @@ -43,7 +50,7 @@ Public Class formBackglassServerRegApp Catch End Try Dim filepath As String = New Uri(dllURI).LocalPath - dialogResult = MessageBox.Show("The 'B2S Server' is already registered here:" & vbCrLf & vbCrLf & filepath & vbCrLf & vbCrLf & "Do you want to (try to) re-register it?", My.Application.Info.AssemblyName, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) + dialogResult = MessageBox.Show($"The 'B2S Server'{dllVersion} is already registered here:" & vbCrLf & vbCrLf & filepath & vbCrLf & vbCrLf & "Do you want to (try to) re-register it?", My.Application.Info.AssemblyName, MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation) Else dialogResult = MessageBox.Show("The 'B2S Server' is not registered yet." & vbCrLf & vbCrLf & "Do you want to register it?", My.Application.Info.AssemblyName, MessageBoxButtons.YesNo, MessageBoxIcon.Information) End If @@ -85,6 +92,8 @@ Public Class formBackglassServerRegApp Using regRoot As RegistryKey = Registry.ClassesRoot 'Computer\HKEY_CLASSES_ROOT\B2S.Server regRoot.DeleteSubKeyTree("B2S.Server", False) + 'Computer\HKEY_CLASSES_ROOT\CLSID\\InprocServer32 + regRoot.OpenSubKey("CLSID", True).DeleteSubKeyTree($"{clsID}\InprocServer32", False) 'Computer\HKEY_CLASSES_ROOT\CLSID\ regRoot.OpenSubKey("CLSID", True).DeleteSubKeyTree(clsID, False) 'Computer\HKEY_CLASSES_ROOT\WOW6432Node\CLSID\ @@ -93,7 +102,7 @@ Public Class formBackglassServerRegApp End If ' do the register operation ShellAndWait(regasmpath, "B2SBackglassServer.DLL") - If IO.File.Exists("B2SBackglassServer64.DLL") Then + If File.Exists("B2SBackglassServer64.DLL") Then ShellAndWait(regasmpath.Replace("\Framework\", "\Framework64\"), "B2SBackglassServer64.DLL") Else ShellAndWait(regasmpath.Replace("\Framework\", "\Framework64\"), "B2SBackglassServer.DLL")