SNK Positional Gun Arcade Assembly Retrofit
by baritonomarchetto in Circuits > Arduino
1230 Views, 4 Favorites, 0 Comments
SNK Positional Gun Arcade Assembly Retrofit
Gun shooter games deserve a soft spot in any '80s - '90s kid's heart. Not only arcade games like Taito's Operation Wolf or it's successor contributed to this, but also game consoles like the Nintendo NES and his seminal Zapper's light gun games (Duck Hunt, Wild Gunman, Hogan's Alley) and the Playstation one's GunCon/G-Con by Namco or Konami's Justifier/Hyperblaster, just to cite a few.
Years have passed and monitors technology has radically changed with CRTs passing away to leave the floor to LEDs. This, unfortunately, made playing shooter games with appropriate hardware more difficult.
Althought commonly referred to as "light gun" games, not all the games adopting "guns" were optical in nature. Optical technology (or rather "technologies") was accompanied by another which was based on two simple potentiometers, one for each picture axis. These were called "positional guns" and, at a basic level, could be considered equivalent to a gamepad with a single analog thumbstick.
Positional guns were easier to implement and, most important for us, their working principle was independent on the monitor technology!
In this instructables:
- I will show you how I managed to retrofit a couple of SNK arcade positional guns to have them working in a conventional emulators setup, without cutting a single cable.
- I will describe how to test a gun assembly and restore it's electronic parts.
- I will describe my sketches, all open source and freely available.
- I will give you hints to set up emulators and softwares needed to play some shooter gem with kickers effects.
- I will share with you Gerber files to have the PCB I layed down manufactured.
All this for free and for everybody.
Supplies
Here follows the list of components neede for this project:
1x Arduino Nano 3.0 or compatible devices
1x Arduino pro micro
2x IRLZ44Z N-Channel Power MOSFET
2x LED, 3mm
2x 10K ohm resistors
2x 220 ohm resistors
2x 2K ohm resistors
2x PCB mount fuse (3A)
4x B3F-4050 momentary switch (OMRON)
1x TACT micro switch
4x dual screw clamps (or 2x quad)
2x 6 pin generic header, 0.1 inch spaced
2x 13 pin generic header, 0.1 inch spaced
SNK Gun Assembly Technologies
Arcade cabinet manufacturers adopted two main technologies for their shooters hardwares: optical guns and positional guns.
SNK actually adopted both hardwares technologies for the two shooters released in 1989. Mechanized Attack adopted actual light guns, with a photodiode being the, literally, pulsating hearth of the device; Beast Busters adopted positional guns, instead, which means two potentiometers, one for horizontal and one for vertical tracking of the Uzi's actual pointing direction
The uzi-lke shell is the same for both guns versions, which could confuse at first.
By reading MAME's mechatt driver notes we can see that Mechanized Attack was an earlier PCB design with respect to Beast Busters, with only one sprite chip, no EEPROM, twice the size tilemaps. It is possible that SNK followed TAITO's path, adopting light gun technolgy first (early Operation Wolf cabinets and previous games, such as N.Y, Captor), then abandoning it in favour of positional guns (from Operation Thunderbolt onwards).
One thing these two versions of the same gun share is the kicker (or recoil): a piston placed on the back of the uzi moving forward and back when shooting. The piston is electromagnetically activated via a coil, energized at a certan frequency.
It is worth to mention at this point that arcade hardware manufacturers adopted another kicker technology, also. This is purely mechanical in nature, with a weighted piston actuated by a DC motor through a crank rod mechanism (this info will come handy later on).
SNK Gun Assembly - Restoration
I received these two positional guns from a friend of mine.
Apart from some dust and a missing bottom cover, both were in good overall conditions: plastics had no missing or broken parts; switches, coils, potentiometers were all there.
A very good starting point, to be honest.
Steps I followed to "restore" my guns have been:
- Removal of assembly bottom cover and Uzi's external plastics
- Plastics cleaning (soap and wather)
- Internal metal parts cleaning (soft, with only a brush and a little bit of degreaser solution)
- Electronic components check (potentiometers, switches, coils, diodes)
- Broken components replacement (none, actually).
Removing the assembly bottom metallic cover exposes all the mechanical parts and gives direct access to the two axis potentiometers. Very straightforward operation.
External plastics come loose by removing both the 6 screws on the gun body and 4 screws (2 on one side, 2 on the other side) on the grip.
Having the guns only (no cabinet) I succeded in having them stand on a table by using four M6 screws each to elevate the bottom mechanisms approx 3 cm, and four plastic feets for friction on the supporting surface.
Electronic components testing
This gun has three switches: start button, trigger and "bomb/grenade" button). These can be tested easily with a digital multimeter in diode test mode.
Coils are actually a more or less long wire spiral. Their main cause of failure is going open circuit. You can test them by measuring the resistance between the two pins. A reading around 20 - 30 Ohms (or lower) for these small coils is typical.
The coils SNK used work best @20V, but could also be powered @12V if a weaker recoil is ok for you (or your kids).
A special mention here deserves the so called freewheel diode (or flyback diode). The freewheel diode is used to protect the driver circuit from getting damaged by the excessive reverse voltage created by the coil any time it is de-energized. Being the diode placed in parallel with the coil, you cannot test it in-circuit. You have to desolder at least one leg and then test it the usual way. It's a general pourpouse 1N4005 diode on these SNK guns, but a 1N4004 would also work (it did in Midway's Terminator 2: Judgment day on a similar coil).
Potentiometers are variable resistors. To test them you can put your digital multimeter in resistance measure mode with one lead to one of the external pins and the other to the middle pin (the so called "wiper"). SNK positional gun assembly mounts two, 5K Ohm linear (B) potentiometers, one for each picture axis/direction. Badly working potentiometers can often be fixed by using some electronics cleaner spray, especially if they were left unused for a long time.
Mechanical testing
You want to see if the piston moves freely inside the coil. Excessive friction would cause the coil absorb more current, and possibly damage itself and the driver circuit.
If you have a pinball maintenance background you already know, but in case remember that no grease or lubricants of any sort have to be used between the piston and the guide inside the coil. If the piston does not move freely, with only little friction, you want to remove the coil and clean both the piston and guide inside the coil.
There are two screws acting as stoppers to the Y movement of the gun. You can increase the range of movement on that axis simply unscrewing it up to a satisfying level.
Everything sorted out, it was time to bench test everything (I already had a clear idea of cricuits and softwares I was in the need for), then design a dedicated PCB (see dedicated Step for details).
PCB Circuits
This project consists of three main tasks:
- HID controller emulation, in order to fool the PC thinking that we are playing with a joystick
- Intercept game outputs to have kickers and eventually lamps follow games situations
- Have the recoil actually moving without damageing microcontrollers (drive the recoil assembly)
Being that:
- gun shooter games are much more enjoyable with a friend
- I have vivid memories of me and my dad playing Operation Thunderbolt in an Arcade
- I want my daughter to develop vivid memories of me and her playing that same game
- I already had two guns by hand
- Arduino has enought pins to handle more than one gun ...
... the PCB I layed down is capable of hosting and drive two SNK positional guns.
As we have already seen >>HERE<< and >>THERE<< all the requested tasks can be performed with the use of two arduino's and an adeguate driver board.
HID Controller Emulation
As you already know, there's a very special Arduino family of microcontroller boards based on ATMega 32u4 that makes child's play emulating a joystick (being it direct input or Xinput), a mouse (being it relative or absolute) or a keyboard.
We are adopting one of those microcontroller boards here: and arduino Pro-Micro (more details about the firmware in the dedicated Step).
For convenience of use, four additional buttons for coins, test and service are on-board.
Gun Kicker Triggering
MAME and most modern emulators (Teknoparrot, Flycast, Supermodel, Model 2, etc. etc.) store games lamps, motors and coils states into memory. This means that, with the help of some additional software, we could extrapolate such state and, in examples, activate solenoids kicks accordingly during gameplay.
The second arduino (NANO) is there for this very delicate task: listens to it's COM port for messages from the game and delivers them (adeguately manipulated) to arduino Pro-Micro, in case of recoil states, or to screw terminals (raw), in case of lamps. Pro-Micro receives kicker states and, in turn, drives the gun recoil though the driver circuit.
I preferred the Pro Micro to trigger the kickers instead of the NANO because I also wanted to code a simple "trigger pulled -> pulsating recoil" routine (more on this later).
Gun Kicker Driver Circuit
Microcontroller boards are only capable of outputting small currents, in the 5 - 20 mA range (or even lower).
Even small coils like those adopted in light/positional guns sink way higher than that amount of current. This means that an adeguate driver circuit is in the need to avoid magic smoke.
My testing showed a current consumption for SNK gun coil of about 1.0A @20V and 0.70A @12V. My bench power supply is not fast enough to measure the current sink during the very first coil energizing phase, which we can assume it's 3 times higher than that.
A simple circuit I already adopted in a project of mine capable of handling such currents makes use of a MOSFET transistor and some resistors. It is based on a robust logic level MOSFET transistor (IRL540 or IRLZ44) acting as a switch, with minimal extra circuitry. The peculiar characteristic of these two ICs is to be able to accept logic type signals at their gate and therefore be saturated with a microcontroller GPIOs 5V signal instead of a determined current.
The freewheel diode is already mounted close to the gun coil, so I avoided placing one on the PCB too.
Two 3A fast blow mini fuses prevents damages to the MOSFET, power supply and eventually microcontrollers in case of freewheel diode shorting.
Firmwares and Features
I always end impressed by how adopting Arduino microcontroller boards for our projects simplify things.
Recently it made it possible to write a small series of simple codes to interface a whole lot of genuine arcade cabinets and now we are here toying with positional guns. No special coding skill needed!
In the following the feature I coded for each arduino's.
Arduino Pro-Micro Sketch
Arduino Pro Micro emulates a 10 switches and four axis gamepad by using Mattew Heironimus's seminal joystick library.
It is also in charge to actually activate kickers as a function of arduino NANO's messages.
The sketch includes a very handy X and Y range auto-calibration routine to set minimum and maximum potentiometer readings and rescale the joy axis ranges accordingly. It's authomatic, so there are no actions on your side needeed, apart from moving the guns up to their phisical limits at least once.
But not only this!
When toying with more recent shooters, I noticed that the picture format was detracting the game experience. This is because an elongated format (in example 16:9) causes sensible misalignment between the SNK positional gun pointing and crosshair position (I am not sure this is also an issue with more modern positional guns, maybe it's not). After some attempt to modify the game aspect ratio (which would have not given optimal results, anyway) I coded a simple routine to reduce the actual X span range.
By default the crosshair span range is full, but by pressing SERVICE button while keeping COIN 2 pressed on the PCB it is step by step reduced.
You will also find useful the possibility to offset players crosshairs positions (this, again, comes handy with modern 16:9 games). Press TEST button while keeping pressed COIN 2 to activate the offsetting.
Arduino NANO Sketch
Arduino NANO here assolves a very important task: receives game output states from a special software called MAMEHooker and makes them usable.
"Usable" means that you can send them straight out to kickers, but especially means that you can manipulate them at your will.
In example, configuring games one could notice that there are three main kicker states behaviours: (a) HIGH/LOW toggling at various frequencies and approximately 50% duty cycle, (b) HIGH/LOW toggling with a very high or very low duty cycle (in other words, very small HIGH or LOW state duration), (c) fixed HIGH state. This is something we can manage at software level if we want.
Case (a) and (b) are typical of electromagnetic kickers (e.g. Beast Busters, Mechanized Attack, Terminator 2: Judgment day); case (c) is what mechanical kickers (e.g. Operation Wolf, Operation Thunderbolt) need to work correctly. We obviously want to convert all these different behaviours to something our SNK gun assembly electromagnetic kicker can handle. This can be done in two different ways: get game outputs as-they-are and define a more or less complex per-game MAMEHooker configuration file, or code a dedicated function directly in the firmware.
I went both ways because I like options :)
The sketch supports both options through a flag (FILT_COILS, arduino NANO sketch). By default it's active and makes the dirt job for you: translates all three kind of aforementioned messages in something your SNK gun assembly coil can respond to. You can anyway comment the flag definition and send raw output data to your Pro Micro (which in turn carbon-copy them to coils): calls for more work on your side configuring MAMEHooker, but could allow for a better per-game result.
For those games whose outputs are not yet mapped (e.g. Steel Gunner) I coded a routine to trigger coils every time the gun trigger is pulled. Simple and effective way to have (more) fun with these old gems. This could be also useful if you don't want to mess with MAMEHooker at all.
You can choose between internal or external (MAMEHooker) coil triggering on the fly through the slider switch named "Recoil Mode".
Recoils states are not the only outputs shooters actually use. A special mention deserves Terminator 2: Judgment Day, with his 4 flasher lamps effects and gun LEDs. This is why I placed six additional points (screw terminals) where to get flasher states from.
Be warned: those six outputs are not high current protected, nor capable to directly drive a load! They are connected to six NANO' pins set to output, nothing more. If you want to use them you MUST adopt an adeguate driver board.
I developed some driver board in the past, described their circuits and shared their PCBs: take a look at >>THIS<< instructable of mine, if you are interested.
Does It Work? (video)
Yes it Does :)
Softwares Configuration
I spent some addicting time figuring out how to configure and hook my favourite emulators to these SNK positional guns. I am sure my notes will save you a whole lot of time to be spent in shooting things ;)
Most of the following informations apply directly to this project, obviously, but could also be of interest for any other similar project.
MAMEHooker (for Dummies)
This software is the link between emulator's game output states and Arduino NANO, in this specific case.
The first thing you want to check is that your arduino NANO is assigned to COM port 4 and that any potentially interferring with serial communication software is closed (Arduino IDE serial monitor in example).
After assigning a new COM port to your arduino, always restart your PC.
The first time you run MAMEHooker use administrator privileges or missing files errors will pop-up. After the first launch there's no need for admin privileges anymore.
Now, tell MAMEHooker where your MAME.exe is (Options->Set MAME path for Driver/Parent detection). MAMEHooker is now configured for listening to MAME outputs.
Configure MAME as per next paragraph and come back here.
Run a MAME game (i.e. Operation Thunderbolt) with MAMEHooker running in background, insert a coin and trigger some shot in-game. You will hear a "bing" every time MAMEHooker detects an output.
Exit MAME and you will find a new romname.ini file in MAMEHooker's ini folder, with "romname" the actual rom name of the game you were playing.
If you adopt the recoil "filter" function I wrote (default), and assigned your NANO to COM port 4, you only need to modify romname.ini files to something like this:
[General]
MameStart=cmo 4 baud=9600_parity=N_data=8_stop=1
MameStop=cmc 4
StateChange=
OnRotate=
OnPause=
[KeyStates]
RefreshTime=
[Output]
Player1_Recoil_Piston=cmw 4 1.,cmw 4 %s%,cmw 4 x
Player2_Recoil_Piston=cmw 4 2.,cmw 4 %s%,cmw 4 x
You are here telling MAMEHooker to open and close COM port 4 at MAME's start and stop and send serial messages on that same port.
Player1_Recoil_Piston is the name of the kicker for that particular game (Operation Thunderbolt, if I remember correctly). It could be named differently for different games.
Every time a recoil piston state change is detected in MAME, MAMEHooker will trigger the serial message after the "=" which is made of three bytes on COM port 4. Arduino NANO will receive that message and send it to Pro Micro which, in turn, will drive the uzi recoil.
First byte carries the ID output number. Player one coil is assigned to ID 1 while Player two coil is assigned to ID 2. Second byte carries the actual state of the particular game output (Player1_Recoil_Piston, in example). Third byte is a "end of the message" byte.
You should now repeat the procedure for every game you want outputs to be activated. If you want to save some time, feel free to copy my MAMEHooker default.ini file (download it >>HERE<<) in folder MAMEHooker5.1/ini/MAME/ : gun kickers for most MAME games should now be set up and running!
The file default.ini applies to all MAME games, as long as a different romname.ini is not defined.
If you instead prefer to complicate your life with scripting (welcome to the party!) take a look at the informations I collected here and there in the internet and by direct experience: they will save you a lot of time. See paragraph "MAMEHooker for Wizards".
MAME
MAME not only is one of the most advanced arcade emulator out there, but also supports most of the great shooters from the 2D era (and some from the 3D, too). In order to have it adeguately configured, follow these instructions.
First, we want to get rid of default limitations developer placed to make MAME more "joystick" friendly out of the box. Open MAME configuration file (mame.ini) and modify the following variables:
#
# CORE INPUT OPTIONS
#
joystick_deadzone 0.0
joystick_saturation 1.00
Now, activate outputs:
#
# OSD OUTPUT OPTIONS
#
output windows
Last but not least, be sure MAME will accept emulated HID inputs from our Arduino Pro Micro:
#
# OSD INPUT OPTIONS
#
keyboardprovider dinput
joystickprovider dinput
To have games asking for an offscreen reload working, you also want to set:
#
# CORE INPUT OPTIONS
#
offscreen_reload 1
Flycast
In order to play shooters in Flycast you first want to activate crosshairs. Click Settings button in the upper right of Flycast's GUI, set Device A to Light Gun and check Crosshair to activate it. Next to the check box there's the crosshair icon: you can change it's color by clicking on it and messing with the color palette.
In this project we are using a single emulated gamepad to control two guns. This is something Flycast can handle, actually. Under Settings, set two devices, A and B, and define both as Light Gun. Then assign your Arduino Leonardo Physical Device to "All" ports. Now, press Map button.
In the upper left side of the Map menu you are now able to select both A or B device and freely assign their axis and buttons individually to the two thumbsticks of a single dummy "gamepad".
You really want to calibrate your guns with these games. Not only your gun positions will make more "sense", but also hacks like the offscreen recoil will actually work after that. >>HERE<< is a nice video on how to calibrate guns in Flycast.
Activate Flycast digital outputs (Settings -> Advanced -> Broadcast Digital Outputs). Flycast cannot speak directly to MAMEHooker, but with a nice piece of software called DemulShooter we are golden.
It is made of a GUI (DemulShooter_GUI) where your settings can be done, and two executables one for x86 emulators (Model 2, in example) and one for x64 emulators (Flycast, in example).
Run DemulShooter_GUI.exe (with admin privileges!) and enable outputs in the corresponding options page. Now, run MAMEHooker, then DemulshooterX64.exe as described below.
DemulShooter assolves various tasks, but we are only interested in outputs hooking in this case. Run for every game a .cmd file like this, with the correct rom name for the specific game:
@echo off
cd C:\Users\PC\Desktop\DemulShooter
DemulShooterX64.exe -target=flycast -rom=lupinsho -noinput
(Launch DemulshooterX64.exe with NO admin privileges!)
You can now run Flycast.
More info about DemulShooter >>HERE<<.
Supermodel
Supermodel is another modern emulator, actively developed. This makes it incredibly easy to configurate.
One thing you want is to enable crosshairs. In Config ->supermodel.ini file just add:
Crosshairs = 1
You can add this both globally (under [ Global ] header), or specifically per game.
This emulator has a gun shooters specific input section: run the configuration routine the usual way. They are close to the bottom so: don't give up :)
A nice video guide for gun calibration >HERE<<.
MAMEHooker supports Supermodel natively, so there's no need for extra softwares. Outputs names are more criptic then MAME, but hey...
Model 2
Model 2 emulator is closed source and long abandoned. This makes it more difficult to deal with. It supports some very nice shooter (House Of The Dead, Virtua Cop 1 and 2, etc.) so we want to configure it anyway.
Model 2 emulator has not one but two main drawbacks for gun games: the crosshair is only mouse controllable (you cannot natively set a joystick to move it, like we did previously) and it doesn't comunicate directly with MAMEHooker.
Again, luckily for us there exist DemulShooter. This program solves both problems by makeing Model 2 emulator ver 1.1a MAMEHooker compatible and our positional guns usable.
Run DemulShooter_GUI with admin privileges, as stated in the program wiki, and set pages:
- P1 Configuration (set the device named "Arduino LLC Arduino Leonardo")
- Calibration (Analog Devices)
- m2Emulator
- Outputs
Then save your configuration.
In Calibration (Analog Devices) check Override P1 Axis and Override P1 Axis to enable the joy to mouse convertion. Press Start, move your positional gun to it's axis limits and save.
Unfortunately, at the time of this writing it is not possible to assign two different players to the same device in Demulshooter, so we are limited to play alone with Model 2 games. Oh, well ...
There's no need to change any Model 2 emulator configuration, nor assign game-specific controls: DemulShooter takes control directly.
Run DemulShooter.exe without admin privileges or it will NOT comunicate to MAMEHooker.
For outputs detection, you want MAMEHooker running before the emulator (this is true for any emulator).
Do yourself a favor and calibrate games with their in-game calibration screen!
Teknoparrot
Teknoparrot is a very user-friendly game launcher, with some interesting titles such as Alien: Extermination, Rambo, House of the Dead 4 etc. etc.
In Game Settings set your game executable path and in General - Input API select DirectInput. Now your Uzi can be configured under Controller Setup.
To have Teknoparrot send outputs to MAMEHooker you want to use Demulshooter in a similar way we did for Flycast.
>>HERE<< the link to a DemulShooter wiki page describing how to use it with Lindberg games (Rambo, House of The Dead 4, etc). Remember to use the option -noinput or there will be input interferences between Teknoparrot and DemulShooter.
In general, DemulShooter wiki will give you lots of information on various Teknoparrot supported systems.
To add crosshairs in games that natively have not, check the box in Game Settings and paste two crosshairs .png files of your choice named P1 and P2 in the folder where the game .exe (or .elf, or whatever) is located. In example, for House Of The Dead 4 paste those two files in ..\House of the Dead 4\elf. In House Of The Dead 4 Special you want those two files in ..The House of the Dead 4 Special\disk0\hod4-sp\elf.
>>HERE<< a nice collection of crosshairs.
To calibrate guns (often not needed) you must access test mode. Test mode must be activated from Teknoparrot GUI.
MAMEHooker for Wizards
If you are adopting SNK Positional Gun Adapter there's not really the neeed to go deep with MAMEHooker. I myself prefer the use of the filters I coded in arduino. The following informations could be anyway useful if you are using one of those Alien Extermination positional guns they sell on Aliexpress.
If you are using my SNK Positional Gun Adapter and want to gain full control over MAMEHooker scripting possibilities, remember to comment the definition FILT_COILS in the sketch to deactivate my kicker filter routines!
Ok, it's time to configure MAMEHooker per-game configuration files with some challenging routine. There are special functions that you want to master. Follows a brief list.
Wait command (wat). Holds a state value for a fixed time. In the following example, the state will be held for 50 milliseconds.
Left_Gun_Recoil=cmw 4 1., cmw 4 %s%, cmw 4 x, wat 50
Key states. MAMEHooker can check if a keyboard key is pressed and trigger outputs accordingly. It works with keyboard keys only, not joystick, mouse or whatever. I have seen people using VJoy or similar Joy-to-Key softwares to convert joystick button presses to keyboard key press events, but we have adopted arduino here which makes super simple to emulate keyboard keys directly, eventually.
This could be used, i.e., in games with no outputs to recoil every time the trigger switch is pressed.
RefreshTime entry set how often (in milliseconds) mamehooker checks the state of the keyboard.
[KeyStates]
RefreshTime=25
a=cmw 4 1., cmw 4 %s%, cmw 4 x, wat 50, cmw 4 1., cmw 4 0, cmw 4 x
This script will send a message on COM port 4 every time key "a" is pressed.
Case per state: state break flag. The command %s% is used to get whatever output state the game outputs. This is good when you want to perform the same function for all possible output states, but what if you want a different function for any state? Use the "|" separator, AKA state break flag. If we consider an output with only two states possible (0 or 1), on the left of the separator we will write the function to be performed for "0" (LOW) state, on the right for "1" (HIGH). If we have more than two states, we will use more state break flags on the same line.
One use for this is, in example, inverting the behavious of states, like in the following example.
Left_Gun_Recoil=cmw 4 1., cmw 4 1, cmw 4 x|cmw 4 1., cmw 4 0, cmw 4 x
Here you are sending to Arduino a "1" state when the game output is "0" and viceversa.
Null command (nul ). This can be used in conjunction with the state break flag command to have a defined output state do nothing. Note that you MUST have a space after nll for it to work.
Scripts. MAMEHooker scripts have .mhs extension and must be stored in the "scripts" subfolder. Their format is the same as internal script entries, except commas are replaced by a new line, and bars are replaced with a line with "BREAK" on it.
The following script (let's call it othunder.mhs) writes a three bytes serial command accordingly to the actual game state (HIGH or LOW), waits 30 milliseconds and then sends a serial command to force it off.
cmw 4 1.
cmw 4 %s%
cmw 4 x
wat 30
cmw 4 1.
cmw 4 0
cmw 4 x
To have a othunder.mhs script file run only once (single shot) we can call it in MAMEHooker's romname.ini this way:
Player1_Recoil_Piston=rfs othunder 20 %s%
If instead we want it run in a loop with a "20" ms delay between loops to give coil the time to de-energize, use the function "lfs" (loop function script) instead of "rfs" (run function script).
Player1_Recoil_Piston=lfs othunder 20 %s%
More MAMEHooker functions/commands are documented in mamehooker5.1\docs\readme.txt file.
A great piece of software, if you ask me ;)
Acknowledgments
Many thanks to those nice girls and guys at JLCPCB for sponsoring the manufacturing of this project's FR-4 PCB.
JLCPCB is a high-tech manufacturer specialized in the production of high-reliable and cost-effective PCBs. They offer a flexible PCB assembly service with a huge library of more than 350.000 components in stock.
3D printing is part of their portfolio of services so one could create a full finished product, all in one place!
By registering at JLCPCB site via THIS LINK (affiliated link) you will receive a series of coupons for your orders. Registering costs nothing, so it could be the right opportunity to give their service a due try ;)
All Gerber files, sketches and utilities I realized for this project are stored >>HERE<< (Github). I always upload the most recent file's versions, so it could be the case that some PCB looks a little different from those published in this instructable.
My projects are free and for everybody. You are anyway welcome if you want to donate some change to help me cover components costs and push the development of new projects.
>>HERE<< is my paypal donation page, just in case ;)