Multiple Playfields Scoop Pain

49 views
Skip to first unread message

Cameron Drummond

unread,
Sep 11, 2026, 5:58:09 PMSep 11
to MPF Users
Hoping for some help.
I am working on setting up 2 playfields. "main" the default playfield, and "lower" of a lower playfield.   in the lower playfield is a captive ball that lives in a scoop behind the flippers and it gets fired out when active, when it drains the lower playfield is then inactive

When the ball goes into the main scoop, it should hold that main playfield ball, and activate the lower playfield and shoot out that lower ball.  After some play, when the ball drains back into its lower scoop, the lower playfield should go inactive, and the main scoop should fire back out the original captured ball.

My issue is with the ball tracking. 
When the main scoop is triggered, the tracking panics thinking the ball is lost and will instantly auto fire it back out the scoop assuming it accidentally went in.
If i try turn this off then the logic of what playfield has what balls is then broken as its no longer smart.

Similarly when i shoot out the held ball from the lower playfield, i dont think the flippers etc are activating correctly due to the system not "seeing" a ball down there and so not turning things on.  However if i try assign the ball back to its scoop, once again it panics and autofires it out.

I have spent all day trying things, and am at my wits end with AI suggestions leading into circles of errors.  (some unnecesary code lines may still be in the below from trying to clean it back up after the failed attempts)

So if anyone is able to help would greatly appreciate it, as i know this is not a new concept idea and its common on other machines.

config and mode file snippets below
playfields:
  playfield:   #playfield_main but called this as a default in most things
    default_source_device: bd_plunger
    tags: default    #later this would be something to specify when each playfield is active
    enable_ball_search: true          # <-- Enables the ball search system
    ball_search_timeout: 20s          # <-- Time to wait before searching
    ball_search_interval: 250ms       # <-- Delay between firing individual coils

  playfield_lower:  
    default_source_device: bd_scoop_lower_playfield
    tags: lower
    ball_search_timeout: 20s          # <-- Time to wait before searching
    ball_search_interval: 250ms       # <-- Delay between firing individual coils

flippers:
  f_left_main:
    main_coil: c_flipper_left
    activation_switch: s_flipper_left
    playfield: playfield
  f_right_main:
    main_coil: c_flipper_right
    activation_switch: s_flipper_right
    playfield: playfield
  f_left_lower:
    main_coil: c_flipper_left_lower
    activation_switch: s_flipper_left
    playfield: playfield_lower
    enable_events: mode_lower_playfield_started
    disable_events: mode_lower_playfield_stopped
ball_devices:

    bd_scoop_reactor_entrance:
        ball_switches: s_scoop_reactor
        eject_coil: c_scoop_reactor
        eject_targets: playfield_lower        # <-- Automatic transfer to the basement!
        captures_from: playfield
        target_on_unexpected_ball: playfield  
        tags: lock

    bd_scoop_lower_playfield:
        ball_switches: s_scoop_lower    # Holds the lower ball at rest
        eject_coil: c_scoop_lower
        eject_targets: playfield_lower
        target_on_unexpected_ball: playfield_lower
        tags: home
mode:
  start_events:
    - start_mode_lower_playfield    # <-- Event that turns the flippers ON
    - playfield_lower_start      
  stop_events:
    - stop_mode_lower_playfield       # <-- Event that turns the flippers OFF
    - playfield_lower_stop      
  priority: 2000                                 # High priority to override default controls

shots:
  shot_lower_test:
    switch: s_lower_deck_test
    playfield: playfield_lower

variable_player:  #as its something a player would do to cause it
    shot_lower_test_hit:   #bumpers as refer to the group and all in it, otherwise can also specify a specific shot_groups
        score: 10_000  #use underscores to make easier to read instead of commas

# The native ball hold system safely locks the upstairs ball while you play down below
multiball_locks:
  reactor_portal_lock:
    lock_devices: bd_scoop_reactor_entrance    # <-- Valid configuration parameter name
    balls_to_lock: 1
    enable_events: mode_lower_playfield_started    

   
event_player:
  # The instant this mode boots up, kick the captive ball out of the basement scoop
  mode_lower_playfield_started:
    - bd_scoop_lower_playfield_eject_one_ball
  # When the lower ball drains back home, stop the mode and trigger the main release sequence
  balldevice_bd_scoop_lower_playfield_ball_enter:
    - stop_mode_lower_playfield
    - fire_reactor_release_coil
  # Spits the original playfield ball back out onto the main deck to resume normal play
  fire_reactor_release_coil: c_scoop_reactor_pulse

Ben Tripoli

unread,
Sep 13, 2026, 11:16:24 PM (13 days ago) Sep 13
to MPF Users
Hi Cameron

There's alot going on there.

As a starting point make a copy of everything. I would remove anything for the lower playfield and setup a ball_hold or use your multi_lock to get the main playfield reacting correctly first. 
For example. Get the ball to hold on main playfield and trigger a timer to run, make sure the ball holds correctly, no ball searches are activated. When the timer has completed, get it to kick out and resume play on the main pf and check correct ball drain etc. rinse/repeat. This sort of simulates you going to the lower playfield with the timer without actually playing there. hope this makes sense.

There is a number of things that dont look right but could be just how its posted.  Could you drop your yaml files for these modes.

Cameron Drummond

unread,
Sep 14, 2026, 11:09:04 AM (12 days ago) Sep 14
to MPF Users
Hi Ben,

Thanks for the advice.  Managed to get the main playfield scoop working to hold and release after 10 seconds, with not unexpected ball panic switching. (included that yaml aswell for context.)

Sadly when then trying to transfer to be conditional on the lower playfield, and removing the timer led to it not releasing the lower ball as desired.

I've included the following:
ball_devices config
reactor scoop yaml (this is the main playfield scoop)
lower playfield yaml (this is the lower playfield scoop)
timer_reactor_context (from when did the main playfield reactor scoop on a timer which worked to show im not insane :D  not properly saved as yaml format fyi as was just a quick dirty copy paste save)

Also worth mentioning that in the main config is the below to initalise the trough and the lower playfield as already having a ball 
virtual_platform_start_active_switches: #for rigging virtual machine to pretend balls inside it etc on start
  - s_trough_1
  - s_trough_2
  - s_trough_3
  - s_scoop_lower  #need start full as its the contained lower playfield ball

Hope this helps and thanks for the assistance.

- Cameron
timer_reactor_context
reactor_scoop.yaml
lower_playfield.yaml
config_ball_devices.yaml

Philip Dixon

unread,
Sep 25, 2026, 6:02:57 PM (18 hours ago) Sep 25
to MPF Users
i did this with ball locks. I don't know if it would work here as you'd have to figure out how it would be set at initialisation.
Reply all
Reply to author
Forward
0 new messages