Main Restorations Software Audio/Jukebox/MP3 Everything Else Buy/Sell/Trade
Project Announcements Monitor/Video GroovyMAME Merit/JVL Touchscreen Meet Up Retail Vendors
Driving & Racing Woodworking Software Support Forums Consoles Project Arcade Reviews
Automated Projects Artwork Frontend Support Forums Pinball Forum Discussion Old Boards
Raspberry Pi & Dev Board controls.dat Linux Miscellaneous Arcade Wiki Discussion Old Archives
Lightguns Arcade1Up Try the site in https mode Site News

Unread posts | New Replies | Recent posts | Rules | Chatroom | Wiki | File Repository | RSS | Submit news

Recent Posts

Pages: [1] 2 3 ... 10

Started by nugarp - Last post by nugarp

Hey guys,

Today I am releasing the first public version of HDRecoil (formerly node-game-outputs for GUN4IR). HDRecoil is a platform that either replaces or sits alongside your existing Mamehooker outputs to truly bring a next-level experience to anyone with Gun4IR guns who have solenoid and/or rumble features. Imagine having different recoil frequencies, different rumble strengths depending on the gun you are using or the events taking place in a game (bullet firing, health damage, reload, etc.). For the best experience, I recommend a good solenoid and rumble motors. I HIGHLY suggest you try out Jurassic Park Arcade (TP) and Time Crisis 5 (via TP) to understand the full power of this software and framework!

The motivation for this software is quite simple - in games, you may get output for hit damage, or gunfire - but just getting a rumble or a recoil shot isn't sufficiently immersive, and it would be very difficult to write rules to get standard outputs in an immersive way. Further, in games with rapidfire, just following fixed-interval updates can lead to slight variations in recoil frequency, which annoyed me quite a bit. And finally, because we're able to read memory addresses with this framework, myself (and hopefully others!!) can develop plugins for games that never had recoil -- such as Point Blank (I have included a beta that only sometimes works in the 32-bit mame...that's why it's a beta). Please note that you will need a reasonably OK processor to run this well - in order to get rapidfire timings within 1-2ms, I had to use a NanoTimer library that will absolutely cycle a core for short intervals. Also, the software is Windows-only.

HDRecoil is written in such a way that, in the best possible scenario, we are not looking at raw outputs. Instead, we are reading memory addresses and determining when EVENTS are detected (gun fire, weapon reload, hit damage) - these events should be ADDITIVE. You can fire a gun at t=1s, get hit at t=1.1s, and both effects should be added - not one replacing the other. The software, using a wrapper called device.js, is able to provide a wrapper for the native Gun4IR serial commands that allow you to abstract out things with methods like (from the device.js file):
Code: [Select]
// The meat of this file -- a serial/gun4ir device
// it exposes many helpful methods for plugins:
// setAutofireTimings(hold = 35, pause = 35)
// startAutofire(length = 70). if length is not specified, pause and hold will be used from setAutofireTimmings
                            // if length is specified, then hold = pause = ~0.5x length
// stopAutofire()
// fireRecoil(pulses = 0);
// startRumblePulsingEffect(effect name, strength = 255, on = 50, off = 50) durations are in ms
// stopRumblePulsingEffect(effect name)
// setRumbleEffect(effect name, strength = 255, duration = 0) duration is in ms, 0 is inf.
// MISC:
// sendAction(string) to send your own custom action over COM.

Further, I wanted it to be easy for myself, and for others, to adapt their needs easily with code that does not need to be compiled - and for this reason, I have written the software (almost) completely in NodeJS (aside from some helper library/exes). Your solenoid doesn't fire rapidly enough for the preset plugins (1 game = 1 plugin)? Just go ahead and adjust the timings in the game's plugin javascript file. You want to also make a REST call to some other service when events occur? Just use the axios library (see webdevice.js for an example wrapper).

The software works in two ways:
1) By reading memory addresses to determine when weapons are fired (and which weapon) & hit damage
2) By reading outputs from mamehooker-compatible software (such as demulshooter) - in fact, I have included two custom plugins you can use for demulshooter-generic and demulshooter-custom outputs that are probably pretty well ready-to-go out of the box!

To start off, I have included the following plugins with the v0.2.0b download:
Code: [Select]
- 5 that directly read game memory
-- House of the Dead 4 (tested with TP, outputs don't need to be enabled)
-- Jurassic Park Arcade (TP)
-- Terminator Salvation (TP)
-- Time Crisis 5 (recommend running with TP, outputs don't need to be enabled though, see notes in js file) ** You may need to enable the prelaunch option **
-- The Lost World (model 3 - the game has no outputs so we create them ourselves!)

- 2 WIP/beta plugins (that read game memory)
-- Point Blank for MAME (it may take some time for it to be able to find the addresses for firing, but once it is hooked, it will work)
-- Deadstorm Pirates (Arcade) for RPCS357/Project Omed (rpcs3-gun.exe, needs further testing)

- 6 that use MAMEHooker outputs
-- LA Machineguns uses model 3's native outputs engine (run supermodel.exe with -outputs=win)
-- Transformers Human Alliance uses DemulShooter's outputs (if you don't want DS for inputs, run DS with -noinput)
-- Operation GHOST uses TP/Output Blaster's outputs
-- Let's Go Island 3D uses TP/Output Blaster's outputs
-- Rabbids Hollywood Arcade uses DemulShooter's custom outputs (game has no native recoil)
-- As above, you can use either of 2 "Generic" Mamehooker output handlers via Demulshooter's outputs to run (run DemulShooter with -noinput if you don't need DS's inputs):
--- Confidential Mission (although demulshooter has the wrong output address for p2 ammo)
--- House of the Dead
--- House of the Dead 2
--- House of the Dead SD (untested)
--- Sega Golden Gun
--- Virtua Cop 2
--- Virtua Cop 3 (In theory, but I couldn't get this to work)
--- Gunblade NY
--- (you can add more that use the generic demulshooter plugin by adding the romname to config/config.json)
---- For using DS's custom outputs, use demulshooter-custom.js, for generic outputs, use demulshooter-generic.js
---- To leverage Demulshooter's outputs, all you literally have to do is pick which outputs file you want and
---- add an entry to the config.json file so this software can recognize which plugin to use and detect when the game is
---- launched.

- 1 plugin for testing your setup
-- Open Notepad and see if your gun(s) rumble.

Code: [Select]
- NodeJS - any version - versions v14.17.0 and later tested. When installing NodeJS, you will need to check the box that says to install visual studio build tools!
- after installing node, run install.bat (this will pull dependencies from npm and also build the nodejs<->mem reader library)
- after running install.bat, run start.bat. start.bat will run both the interop and the actual node-game-outputs plugin software.
- You will need to edit the config\config.json file to specify hooks to use, and which COM ports you have your guns assigned to. Please see the readme for more detailed instructions.


Download NodeJS here

To test that everything is working, run start.bat and then open a new notepad window. Your guns should rumble for 200ms once the process is detected.

Please note that you are also able to use this platform to send commands per-game using an "overrides" framework. This may be helpful for you to override Gun4IR settings to be 4:3 or 16:9 on connect or disconnect depending on the game, or for whatever other use you can think of:
Code: [Select]
How to override behavior on a per-game COM connection/disconnect:
- In the /overrides/connected/ or /overrides/disconnecting/ folders, you can place a file with a game's key (see "key" param in config.json)
- The js file will execute at the appropriate time. You will have access to two variables: player and data.
- player is an object you can manipulate to communicate with your device:
- To send a COM command, just write: player.sendAction("MySerialCommand");
- data contains pertinent information such as Player # (1-indexed), COM port, connected state, and key

For the tinkerers, you can add new games by editing the config\config.json file so the software knows which processes to hook and with which plugin. You may look at examples of plugins that extend Plugin if you want to read memory addresses, or HookPlugin if you want to use existing outputs. If you want to use existing outputs, you likely just want to point to demulshooter-generic.js or demulshooter-custom.js for the game you want to add to the config.json file.

I started developing this software in 2022 but due to some library dependencies, did not want to do a public release without having said dependencies properly updated. I noted this week that they had been updated. Thanks to argonlefou's DemulShooter software for enabling many more games to run with this software (and also argonlefou's research for many of the memory addresses used - he may be thanked in a bunch of the plugin files), HowardCasto for all of his work with MAMEHooker, and as well HeadKaze/Ben Baker for the MAME Interop SDK, which I used (socket-interop/MAMEOutputsSocketIoInterOp.exe is my tool to forward MAMEHooker outputs to HDRecoil), and thanks to all of the folks on my development discord for helping test and spread the good word.

Enjoy. :cheers:

Started by argonlefou - Last post by Tiberius

Hi Argonlefou,

You recently added support for Bug Busters, unfortunately the rom name clashes with a Mame game called Beast Busters, both are seen by MameHooker as bbusters.

Would it be possible to change the Bug Busters one, like you did for Jurassic Park recently.

As always a huge thank you for everything you do.

Kind regards

Started by argonlefou - Last post by argonlefou

Hey Argon,

I'm using the latest demulshooter. I just got my 2 aliens extermination guns (the ones from Aliexpress that you mount) today and they are awesome. I'm currently trying to dabble in teknoparrot, but running into some trouble. The guns (which are basically recognized as analog joysticks) came with inverted axis (up is down, right is left, etc.). Some people just re-solder the wires and switch them up to fix. I really don't want to have to do that. I checked the invert axis boxes in the demul GUI and the game hooks when I launch it .. i.e. turns green (i..e terminator, Jurassic Park, Sega Golden Gun, etc.), but nothing. The guns are still inverted when they load. Not sure what i'm doing wrong. I even went back a few versions to test and still no go. I also did the calibration (analog devices) option in the GUI. Any advice is greatly appreciated. Thank you
If you can get me a debug file :

Don't forget to log a few movements of your guns before quitting
So that I can compare with my gamepads

Started by ThatOneSeong - Last post by argonlefou

I've updated DemulShooter with Network outputs supports. No official release yet, as I still have to clean some things before. but I'm attaching a version for you to test.
Just go in DemulShooter_GUI and enable Network outputs in the outputs tab

It should behave similar than MAME (at least it's what a network sniffer shows)

I encountered some bugs with your app though: if I run it when DemulShooter is already running and already has hooked the game, QMamehook mix all arriving string into the rom name.
Looks like OK if QMameHook connects before DemulShooter hooks the game

Started by jeremymtc - Last post by jeremymtc

Might be easy enough to hack into the laptop's 12v rail.

If you put in some small discrete holes at the top/back to let the warm air out, convection currents might even be sufficient.

I like to cover holes with some scrap nylon mosquito meshing to keep pests out.

I was just now thinking - I've got one of those laptop cooler bases that plugs into USB. Two big slow fans that go underneath. It came free with a laptop but I never use it, even in a tropical climate. It could be perfect for this kind of bartop.

Excellent points, all! Thanks.

I had realized after posting that wiring to the PC power supply would be a non-starter since a fan would be 'always on', so sourcing 12V somewhere on the mobo might be a better path forward. Likewise had thought the same about just positioning vents above and below the motherboard carrier might allow for some additional convective cooling without a fan.

I think that anything I do is basically "insurance", as there was no active or passive cooling aside from the heatspreader in the original PC product... and tangentially that might explain why the usb port headers were flaking out, and why my having reflowed them brought them back to life.

A USB laptop cooling pad is a great idea!

Started by argonlefou - Last post by Tiberius

I'm trying to get Jurassic Park up and going.  I can get the game up and running fine, but I cannot get DS to hook, hopefully someone can help me.

This is part of my AHK script:

Run, C:\Games and Emulators\DemulShooter_v11.7\DemulShooter.exe -target=rawthrill -rom=jpark
Run, TeknoParrotUi.exe --profile=JurassicPark.xml

I can get Aliens: Armageddon to run fine, but this doesn't pull up DS.

Any help would be greatly appreciated!

You are using the wrong rom name- should be jp

Info from last release notes

Changed "Jurassic Park" rom parameter from "-rom=jpark" to "-rom=jp" in order to avoid conflicts with the jpark MAME rom in MameHooker config.

Started by jeremymtc - Last post by Zebidee

Might be easy enough to hack into the laptop's 12v rail.

If you put in some small discrete holes at the top/back to let the warm air out, convection currents might even be sufficient.

I like to cover holes with some scrap nylon mosquito meshing to keep pests out.

I was just now thinking - I've got one of those laptop cooler bases that plugs into USB. Two big slow fans that go underneath. It came free with a laptop but I never use it, even in a tropical climate. It could be perfect for this kind of bartop.

Started by thatpurplestuff - Last post by thatpurplestuff

Also, just wanted to thank arzoo for being so awesome.  My machine uses LEDBlinky and I reached out recently regarding some animation issues I had (I was hoping to be able to call separate animations for the rings/ramp/ball return and he went out of his way to add the functionality even though I'm a very edge-case scenario).  He's great and his software is fantastic!

Started by thatpurplestuff - Last post by thatpurplestuff

So if you've read any of the early pages of this thread, I've made some absolutely terrible rings along the way and struggled to come up with rings I was happy with.  I ended up using a solution of coiled vinyl baseboard which looks fine from a distance, but the overlapping look has always bugged me a bit and I always felt like I was missing something obvious in making the rings.

I've spent the last few months toying with an idea to make the rings more substantial and able to maintain their shape on their own... the original plan was to use 1 inner layer vinyl baseboard, a middle layer of rubber (I've always wanted some contrast on the edges of the rings), and then an outer layer of vinyl baseboard all held together with metal brackets and Chicago screws rather than rivets like I had done previously.

Skeeball ring sandwich

Sandwich ring next to coiled ring

Chicago style screws added

I honestly love this look and sorta settled on making all my rings using this method but decided to stare at it for a while before I went ahead and did all of them (this wasn't cheap, the rolls of rubber were $150 total before the vinyl and hardware was factored in).  I literally just plopped this ring on to my work desk just so I'd be forced to look at it a few times a day.  I'm planning a complete rebuild of the scoring area with hopefully brighter LEDs, and at some point I think I went insane and thought that LEDs INSIDE the rings themselves was a good idea.  I posted a question about "neon" LED strings on the main forum, and forum member lilshawn was kind enough to offer helpful feedback.  After a week of playing with the idea I scrapped it, mainly because the neon LEDs I could find had way too large of gaps where you could cut them so using them in rings would potentially have large gaps (plus I was nervous about the idea of solder points being whacked by Skeeballs).

Fast forward a month and I couldn't get the LED idea out of my head, so I did some digging and found some random online LED shop in China that sold the empty silicone "neon" LED diffuser and LEDs that have cut lines every inch rather than every 3".... this makes the concept much more feasible so I convinced the wife to let me drop another $200 on parts that may very well end up getting wasted on a terrible idea haha.

I decided to trim the inner rubber by the exact height of the silicone diffuser so I could just slip it in the top.  It seems to work great, and once I get this all dialed in the vinyl baseboard actually has adhesive on the back that I can peel the paper off of and make everything really attached nicely... between the adhesive and the brackets these things should be very sturdy.

Neon ring next to black rubber ring

Neon ring with LEDs installed and wired up




Fired them up with LEDBlinky and I'll be damned if it doesn't look awesome.  This ring is still a pretty rough prototype, I'm going to adjust the spacing of the brackets to more closely match the original rubber one since there are some spacing issues that I want to fix as best I can.  Overall I'm ecstatic about the look of this, now I just need to start making the final rings and then get everything installed on the machine.  This could still be a complete disaster, as I have no idea what the longevity of these LED strips will be once they are on the receiving end of Skeeballs, but I'm optimistic since I did recess them just a bit and the vinyl/silicone diffuser offers sort of a double barrier for the LED strip.

Once I determine if these are a realistic option for Skeeball machines, I will detail the parts and process I went through to make them... it's deceptively harder than I thought it would be to get everything to fit nicely with each other but so far I'm thrilled.  I will mention that this is not for the faint of heart, as I'm at least $500 into this after RGB amplifiers, power supplies, rubber, vinyl, LEDs, silicone diffuser, metal braces, and the Chicago style screws are factored in.  I'll be absolutely gutted if this doesn't work haha

Will update as more rings get finished!

10   Project Announcements / Re: Project BlueShifton Today at 12:50:37 am

Started by Lexiq - Last post by Lexiq


Some areas of the cabinet can't easily be laminated. These areas are either too narrow, such as the inner faces of the side panels where the other panels are inset by 12mm, or curved, such as the sides of the control box.


Masking is important to protect the areas that don't need to be painted. For this, I used painter's masking tape, and newspaper to fill the larger gaps in between. Masking can take almost as long as painting, but it's worth taking some time to do it well if you care about the appearance of the interior of the cabinet.

Paint Selection

After a lot of research, I chose Rust-Oleum 2X matt black enamel paint, as well as a good etching primer for the few metal surfaces that I would need to paint. The matt black finish is almost an exact match for the matt black laminate. I tested a satin black finish as well as I'd seen a lot of people recommend it as a good balance between gloss and matt, but it was too glossy when matched with my laminate.

Control Box

This was the most challenging to paint because it has the most surface area, and is the most visible, so the finish needs to be good. The general consensus is that surface preparation is very important for achieving a good result, so I spent a long time on this step. Because I used finger joints for the corners, without a jig, I had some small gaps that needed to be filled. I used a fast drying spackle in and around these gaps, as well as anywhere else where the surface had minor voids. Sanding once dry resulted in a smooth, even finish. I used a relatively fine grit sandpaper, but left enough roughness that the paint would adhere well to the surface, then removed the dust with a tack cloth. I repeated this a couple of times until I was happy with the result.

The other prevailing advice for achieving a good finish is that many light coats are required, with sanding in between. This is good advice, and even though the process is time consuming, it's well worth it, and the down time between coats, waiting for the paint to dry can be used to work on other areas. I think I ended up with at least 5 or 6 iterations before I was satisfied with the result.

Monitor Bezel

This could potentially have been laminated, but I didn't want the edge of the laminate to be visible on the inside of the cutout area. The bezel is fairly thin, so it was relatively easy to paint and sand smooth, using the same process as for the control box.

Inner Surfaces

These are the 12mm inset areas around the edge of the inner surfaces of the cabinet sides, the underside of the control panel where it extends beyond the sides of the control box, and the underside of the control box where it extends beyond the sides of the cabinet. These areas are less visible, so I didn't spend as much time on surface preparation or use as many coats. When masking the extents of these areas, I made sure to leave enough overlap so there would be no visible bare wood, but not so much that paint would be visible inside the cabinet.

Metallic Surfaces

I had a few metal components that needed painting. These were the aluminium marquee retainers, the steel mesh vent grilles, and any bolts that would be visible from outside the cabinet. For painting metal, it's a good idea to roughen the surface slightly with sandpaper, and then apply an etching primer to ensure the paint doesn't peel. For these pieces of trim, I decided to use a gloss black to provide a bit of contrast to the matt finish everywhere else.


For the edges of panels that would sometimes be visible, such as the drawer and cupboard door, I decided to use a spray on varnish. This is a nicer finish than bare wood, and also highlights the end-grain, which can be considered a feature of cabinet grade plywood. It also helps to seal in any splinters that might be present. I also varnished the inner surface of the drawer front panel as it's quite prominent when the drawer is open.

Marker Pen

For even smaller areas where bare wood may be visible, such as the edges of the cupboard door, that can just be seen through the panel gaps, a permanent marker pen can be used along the outer edge. While it may not seem significant, doing this will improve the overall appearance of the cabinet and help to hide the panel gaps.

Pages: [1] 2 3 ... 10