Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -352,4 +352,4 @@ MigrationBackup/
.idea/

**/protos/*.cs
**/Plugins/**
**/Plugins/**/*.dll
30 changes: 15 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,29 +34,29 @@ actual binaries, `.meta` files of uncompiled platforms are cleaned up by Unity.
In order to not accidentally commit those files, we recommend to ignore them:

```bash
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/linux-x64/PinMame.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/linux-x64/VisualPinball.Engine.PinMAME.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/linux-x64/libpinmame.so.3.5.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/android-arm64-v8a/PinMame.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/android-arm64-v8a/PinMameDotNet.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/android-arm64-v8a/VisualPinball.Engine.PinMAME.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/android-arm64-v8a/libpinmame.3.5.so.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/osx/PinMame.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/osx/VisualPinball.Engine.PinMAME.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/osx/libpinmame.3.5.dylib.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/ios-arm64/PinMame.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/android-arm64-v8a/libpinmame.3.7.0.so.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/ios-arm64/PinMameDotNet.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/ios-arm64/VisualPinball.Engine.PinMAME.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/ios-arm64/libpinmame.3.5.a.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/ios-arm64/libpinmame.3.7.0.a.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/ios-arm64/libz.a.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/linux-x64/PinMameDotNet.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/linux-x64/VisualPinball.Engine.PinMAME.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/linux-x64/libpinmame.so.3.7.0.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/osx/PinMameDotNet.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/osx/VisualPinball.Engine.PinMAME.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/osx/libpinmame.3.7.0.dylib.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/win-x64/PinMameDotNet.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/win-x64/VisualPinball.Engine.PinMAME.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/win-x64/pinmame.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/win-x86/PinMame.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/win-x86/PinMameDotNet.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/win-x86/VisualPinball.Engine.PinMAME.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/win-x86/libpinmame-3.5.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/win-x64/PinMame.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/win-x64/VisualPinball.Engine.PinMAME.dll.meta
git update-index --assume-unchanged VisualPinball.Engine.PinMAME.Unity/Plugins/win-x64/libpinmame-3.5.dll.meta
```

## License

This plugin is licensed under the [MIT license](LICENSE). However
since we link against PinMAME, the [MAME/BSD-3-Clause](https://github.com/vpinball/pinmame/blob/master/LICENSE)
must be honored as well.
must be honored as well.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -742,25 +742,33 @@ public void SendInitialSwitches()
}
}

public void Switch(string id, bool isClosed)
{
if (_switches.ContainsKey(id)) {
if (_mechSwitches.Contains(_switchIdToPinMameIdMappings[_switches[id].Id])) {
// mech switches are triggered internally by pinmame.
return;
}
Logger.Info($"[PinMAME] => sw {id}: {isClosed} | {_switches[id].Description}");
_pinMame.SetSwitch(_switchIdToPinMameIdMappings[_switches[id].Id], isClosed);
} else if (id == "s_spawn_ball") {
if (isClosed) {
_ballManager.CreateBall(new DebugBallCreator(630f, _playfieldComponent.Height / 2f));
}
} else {
Logger.Error($"[PinMAME] Unknown switch \"{id}\".");
}

OnSwitchChanged?.Invoke(this, new SwitchEventArgs2(id, isClosed));
}
public void Switch(string id, bool isClosed)
{
if (_switches.TryGetValue(id, out var sw)) {
if (_switchIdToPinMameIdMappings.TryGetValue(sw.Id, out var pinMameId) && _mechSwitches.Contains(pinMameId)) {
// mech switches are triggered internally by pinmame.
return;
}
if (_pinMame != null && _isRunning) {
if (Logger.IsDebugEnabled) {
Logger.Debug($"[PinMAME] => sw {id}: {isClosed} | {sw.Description}");
}
if (_switchIdToPinMameIdMappings.TryGetValue(sw.Id, out pinMameId)) {
_pinMame.SetSwitch(pinMameId, isClosed);
}
Comment on lines +747 to +758
Copy link

Copilot AI Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In Switch, if a switch exists in _switches but has no entry in _switchIdToPinMameIdMappings, the method silently does nothing (no log, no call to _pinMame.SetSwitch), yet still fires OnSwitchChanged. This can make mapping/config issues hard to diagnose and can desync consumers from the PinMAME state. Consider logging a warning/error when the mapping is missing and aligning SendInitialSwitches() (which still indexes into _switchIdToPinMameIdMappings) to avoid potential KeyNotFoundExceptions for the same condition.

Copilot uses AI. Check for mistakes.
}
} else if (id == "s_spawn_ball") {
if (isClosed) {
_ballManager.CreateBall(new DebugBallCreator(630f, _playfieldComponent.Height / 2f));
}
} else {
if (Logger.IsErrorEnabled) {
Logger.Error($"[PinMAME] Unknown switch \"{id}\".");
}
}

OnSwitchChanged?.Invoke(this, new SwitchEventArgs2(id, isClosed));
}

public bool GetSwitch(string id)
{
Expand Down
48 changes: 32 additions & 16 deletions VisualPinball.Engine.PinMAME/VisualPinball.Engine.PinMAME.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
<AppendRuntimeIdentifierToOutputPath>false</AppendRuntimeIdentifierToOutputPath>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
<LangVersion>9.0</LangVersion>
<PinMameVersion>1.0.0</PinMameVersion>
<PinMameNativeVersion>3.7.0-beta1</PinMameNativeVersion>
</PropertyGroup>
<PropertyGroup Condition="'$(RuntimeIdentifier)' == ''">
<RuntimeIdentifier Condition="$([MSBuild]::IsOSPlatform('Windows')) And '$(PlatformTarget)' != 'x86'">win-x64</RuntimeIdentifier>
Expand All @@ -13,29 +15,43 @@
<RuntimeIdentifier Condition="$([MSBuild]::IsOSPlatform('Linux'))">linux-x64</RuntimeIdentifier>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="PinMame" Version="0.2.0-preview.9" />
<PackageReference Include="PinMame.Native" Version="3.5.0-preview.79" />
<PackageReference Include="PinMame" Version="$(PinMameVersion)" />
<PackageReference Include="PinMame.Native" Version="$(PinMameNativeVersion)" />
<PackageReference Include="VisualPinball.Engine" Version="0.0.1-preview.105" />
<!-- Uncomment when doing local dev -->
<!-- <Reference Include="VisualPinball.Engine">
<HintPath>..\..\VisualPinball.Engine\VisualPinball.Engine\.bin\Release\netstandard2.1\VisualPinball.Engine.dll</HintPath>
</Reference> -->
</ItemGroup>
<Target Name="PluginsDeploy" AfterTargets="AfterBuild">
<ItemGroup Condition="'$(RuntimeIdentifier)' != 'ios-arm64' And '$(RuntimeIdentifier)' != 'android-arm64-v8a'">
<Plugins Include="$(OutDir)PinMame.dll" />
</ItemGroup>
<Target Name="PluginsDeploy" AfterTargets="AfterBuild">
<ItemGroup Condition="'$(RuntimeIdentifier)' != 'ios-arm64' And '$(RuntimeIdentifier)' != 'android-arm64-v8a'">
<Plugins Include="$(OutDir)PinMameDotNet.dll" />
</ItemGroup>
<ItemGroup Condition="'$(RuntimeIdentifier)' == 'ios-arm64'">
<Plugins Include="$(NuGetPackageRoot)\pinmame\0.2.0-preview.9\runtimes\ios\lib\netstandard2.1\PinMame.dll" />
<Plugins Include="$(NuGetPackageRoot)pinmame/$(PinMameVersion)/runtimes/ios/lib/netstandard2.1/PinMameDotNet.dll" />
</ItemGroup>
<ItemGroup Condition="'$(RuntimeIdentifier)' == 'android-arm64-v8a'">
<Plugins Include="$(NuGetPackageRoot)\pinmame\0.2.0-preview.9\runtimes\android\lib\netstandard2.1\PinMame.dll" />
</ItemGroup>
<ItemGroup>
<Plugins Include="$(OutDir)$(AssemblyName).dll" />
<Plugins Include="$(NuGetPackageRoot)\pinmame.native.$(RuntimeIdentifier)\3.5.0-preview.79\runtimes\$(RuntimeIdentifier)\native\*" />
<Plugins Include="$(NuGetPackageRoot)pinmame/$(PinMameVersion)/runtimes/android/lib/netstandard2.1/PinMameDotNet.dll" />
</ItemGroup>
<Message Text="PluginsDeploy: @(Plugins)" />
<Copy SourceFiles="@(Plugins)" DestinationFolder="..\VisualPinball.Engine.PinMAME.Unity\Plugins\$(RuntimeIdentifier)" SkipUnchangedFiles="true" />
</Target>
</Project>
<ItemGroup>
<Plugins Include="$(OutDir)$(AssemblyName).dll" />
<Plugins Condition="'$(RuntimeIdentifier)' != 'win-x64'" Include="$(NuGetPackageRoot)pinmame.native.$(RuntimeIdentifier)/$(PinMameNativeVersion)/runtimes/$(RuntimeIdentifier)/native/*" />
</ItemGroup>

<!-- PinMameDotNet P/Invokes "pinmame" on Windows. The win-x64 native package ships
pinmame64.dll, so copy it as pinmame.dll for Unity to resolve it. -->
<ItemGroup Condition="'$(RuntimeIdentifier)' == 'win-x64'">
<RenamedPlugins Include="$(NuGetPackageRoot)pinmame.native.$(RuntimeIdentifier)/$(PinMameNativeVersion)/runtimes/$(RuntimeIdentifier)/native/pinmame64.dll">
<DestinationFile>..\VisualPinball.Engine.PinMAME.Unity\Plugins\$(RuntimeIdentifier)\pinmame.dll</DestinationFile>
</RenamedPlugins>
</ItemGroup>

<Message Text="PluginsDeploy: @(Plugins)" />
<Copy SourceFiles="@(Plugins)" DestinationFolder="..\VisualPinball.Engine.PinMAME.Unity\Plugins\$(RuntimeIdentifier)" SkipUnchangedFiles="true" />

<Copy Condition="'@(RenamedPlugins)' != ''" SourceFiles="@(RenamedPlugins)" DestinationFiles="@(RenamedPlugins->'%(DestinationFile)')" SkipUnchangedFiles="true" />

<!-- If an older build already dropped pinmame64.dll, remove it so the package only contains pinmame.dll. -->
<Delete Condition="'$(RuntimeIdentifier)' == 'win-x64'" Files="..\VisualPinball.Engine.PinMAME.Unity\Plugins\$(RuntimeIdentifier)\pinmame64.dll" />
</Target>
</Project>
Loading