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