Warning

This is the dev documentation for an unreleased version of MPF!

This is the documentation for MPF 0.56, which is the “dev” (next) release of MPF that is a work-in-progress. Unless you’re specifically looking for this version, you probably want to use the version of documentation called “latest” which is for the latest released version of MPF. That documentation is at docs.missionpinball.org/en/latest.

Skill Shot

Related Config File Sections
mode:
shots:
shot_groups:
timers:
state_machines:

Types of skill shots:

  • Time based
  • Hit some target before another target
  • Super skill shot
  • How to create a lane-change skill shot

A simple skill shot mode:

##! mode: skill_shot
mode:
  start_events: ball_started
  stop_events:
    - skill_success
    - skill_failed
  priority: 500
shots:
  skill_l:
    switch: s_lane_l
    profile: skill_shot_profile
    advance_events: mode_skill_shot_started        # replace "skill_shot" with your mode name
    show_tokens:
      light: l_lane_l
  skill_m:
    switch: s_lane_m
    profile: skill_shot_profile
    show_tokens:
      light: l_lane_m
  skill_r:
    switch: s_lane_r
    profile: skill_shot_profile
    show_tokens:
      light: l_lane_r
shot_groups:
  skill_shot:
    shots: skill_l, skill_m, skill_r
    rotate_left_events: s_left_flipper_active
    rotate_right_events: s_right_flipper_active
shot_profiles:
  skill_shot_profile:
    states:
      - name: unlit
        show: off
      - name: flashing
        show: flash_color
        show_tokens:
          color: red
        speed: 4
      - name: lit
        show: on
    loop: true
variable_player:
  skill_success:
    score: 42
timers:
  skill_shot_timeout:
    start_value: 0
    end_value: 5     # set the timeout of your skill shot here
    direction: up
    tick_interval: 1s
    start_running: false
    control_events:
      - action: start
        event: balldevice_plunger_lane_ball_eject_success  # replace "plunger_lane" with the name of your plunger device
state_machines:
  skill_shot_success:
    debug: true
    states:
      start:
        label: Skill shot ready
      success:
        label: Skill successful
        events_when_started: skill_success
      failed:
        label: Skill failed
        events_when_started: skill_failed
    transitions:
      - source: start
        target: success
        events: skill_shot_flashing_hit
      - source: start
        target: failed
        events: skill_shot_unlit_hit, timer_skill_shot_timeout_complete
This example is tested to be valid MPF config. Additionally, our integration test passed. Click to show the test and full config.
switches:
  s_lane_l:
    number:
  s_lane_m:
    number:
  s_lane_r:
    number:
lights:
  l_lane_l:
    number:
  l_lane_m:
    number:
  l_lane_r:
    number:
##! mode: skill_shot
mode:
  start_events: ball_started
  stop_events:
    - skill_success
    - skill_failed
  priority: 500
shots:
  skill_l:
    switch: s_lane_l
    profile: skill_shot_profile
    advance_events: mode_skill_shot_started        # replace "skill_shot" with your mode name
    show_tokens:
      light: l_lane_l
  skill_m:
    switch: s_lane_m
    profile: skill_shot_profile
    show_tokens:
      light: l_lane_m
  skill_r:
    switch: s_lane_r
    profile: skill_shot_profile
    show_tokens:
      light: l_lane_r
shot_groups:
  skill_shot:
    shots: skill_l, skill_m, skill_r
    rotate_left_events: s_left_flipper_active
    rotate_right_events: s_right_flipper_active
shot_profiles:
  skill_shot_profile:
    states:
      - name: unlit
        show: off
      - name: flashing
        show: flash_color
        show_tokens:
          color: red
        speed: 4
      - name: lit
        show: on
    loop: true
variable_player:
  skill_success:
    score: 42
timers:
  skill_shot_timeout:
    start_value: 0
    end_value: 5     # set the timeout of your skill shot here
    direction: up
    tick_interval: 1s
    start_running: false
    control_events:
      - action: start
        event: balldevice_plunger_lane_ball_eject_success  # replace "plunger_lane" with the name of your plunger device
state_machines:
  skill_shot_success:
    debug: true
    states:
      start:
        label: Skill shot ready
      success:
        label: Skill successful
        events_when_started: skill_success
      failed:
        label: Skill failed
        events_when_started: skill_failed
    transitions:
      - source: start
        target: success
        events: skill_shot_flashing_hit
      - source: start
        target: failed
        events: skill_shot_unlit_hit, timer_skill_shot_timeout_complete
##! test
# failure
start_game
assert_mode_running skill_shot
hit_and_release_switch s_lane_l
assert_mode_not_running skill_shot
assert_player_variable 42 score
stop_game
# success
start_game
assert_mode_running skill_shot
hit_and_release_switch s_lane_m
assert_mode_not_running skill_shot
assert_player_variable 0 score
stop_game
# move + success
start_game
assert_mode_running skill_shot
post s_right_flipper_active
hit_and_release_switch s_lane_m
assert_mode_not_running skill_shot
assert_player_variable 42 score
stop_game
# test race between success and failed -> success first
start_game
mock_event skill_success
mock_event skill_failed
assert_mode_running skill_shot
hit_and_release_switches_simultaneously s_lane_l s_lane_m
assert_mode_not_running skill_shot
assert_event_called skill_success
assert_event_not_called skill_failed
stop_game
# test race between success and failed -> failed first
start_game
mock_event skill_success
mock_event skill_failed
assert_mode_running skill_shot
hit_and_release_switches_simultaneously s_lane_m s_lane_l
assert_mode_not_running skill_shot
assert_event_called skill_failed
assert_event_not_called skill_success
stop_game
# test timeout
start_game
mock_event skill_success
mock_event skill_failed
assert_mode_running skill_shot
advance_time_and_run 10
assert_mode_running skill_shot
post balldevice_plunger_lane_ball_eject_success
advance_time_and_run 10
assert_mode_not_running skill_shot
assert_event_called skill_failed
assert_event_not_called skill_success
stop_game

This works the following way: The three shots skill_l, skill_m and skill_r represent the three lanes. skill_l starts lit. The group skill_shot can be rotated using the flippers. When a lit shot it hit the group posts skill_shot_lit_hit and skill_shot_unlit_hit when a unlit shot is hit. To prevent races between the two events we use a state_machine called skill_shot_success which has three states:

../../_images/skill_shot_state_machine.png

When the mode started it starts at start. Then when either skill_shot_lit_hit or skill_shot_unlit_hit are posted in transitions to success or failed. Those states will post either skill_success or skill_failed. Additionally, there is a timer skill_shot_timeout which will fail the skill shot 5s after the ball left the plunger.

Usually, you want to create a modes which starts on skill_success and another mode which starts on skill_failed to play some shows.

Related How To guides
How to design a game in MPF using Modes