Skip to content

High Scores

Related Config File Sections:

MPF includes support for high scores which is where players can enter their names (or initials) when they've achieved a high score. Features include:

  • Set any player variable as a high score option. So in addition to score you could set high score entries for loops, ramps, aliens destroyed, etc.
  • Set how many of each high score type are tracked (Top 5 for high scores, Top 3 for loops, Top 1 for aliens, etc.)
  • Set what each "award name" is called. (The highest score is "GRAND CHAMPION," the second highest score is "HIGH SCORE 1", the highest loop score is "MAJOR LOOPER", etc.)
  • Additional player and machine variables that accompany this achievement. (Character selected, time to complete, etc.)
  • How many characters a player can enter for their name.
  • A list of valid characters the player can choose from
  • The layout of the display for entering their names and show their rewards.
  • Events for high score awards and entry, so you can configure high score entry screens.

Don't have a display to enter initials? See High Scores in EM Machines for how to use the high score mode without entering initials.

This is an example (for machines with display):

##! mode: my_mode
#! variable_player:
#!   score_100:
#!     score: 2000000
##! mode: high_score
# modes/high_score/config/high_score.yaml
mode:
  priority: 500
  start_events: game_ending, start_high_score
  use_wait_queue: true
high_score:
  _overwrite: true
  enter_initials_timeout: 60
  award_slide_display_time: 4s
  # define your high score categories and the awards
  categories: !!omap
    - score:
        - GRAND CHAMPION
        - HIGH SCORE 1
        - HIGH SCORE 2
        - HIGH SCORE 3
        - HIGH SCORE 4
        - HIGH SCORE 5
        - HIGH SCORE 6
        - HIGH SCORE 7
        - HIGH SCORE 8
    - loops:
        - LOOP CHAMP
  # set the defaults
  defaults:
    score:
      - MPF: 1000000
      - BRI: 900000
      - JAN: 800000
      - QUI: 700000
      - MAR: 600000
      - JOH: 500000
      - ELI: 400000
      - MIK: 300000
      - ANT: 200000
    loops:
      - JAN: 42
  vars:
    loops:
      - player: character
# optional: change the slides (you can omit all the following)
slide_player:
  _overwrite: true
  high_score_enter_initials: high_score_enter_initials
  high_score_award_display: high_score_award_display
slides:
  _overwrite: true
  high_score_enter_initials:
    - type: text
      style: big
      font_size: 18
      text: PLAYER (player_num)
      color: ffff00
      x: 105
      y: 90
    - type: text
      style: big
      font_size: 18
      text: (award)
      color: f0f0f0
      x: 105
      y: 70
    - type: text_input
      initial_char: A
      dynamic_x: false
      key: high_score
      style: big
      font_size: 18
      max_chars: 3
      x: 105
      y: 20
      shift_left_event: sw_lower_left_flipper
      shift_right_event: sw_lower_right_flipper
      select_event: sw_start
      color: ff0000
    - type: text
      style: big
      text: '<       >'
      font_size: 18
      x: 105
      y: 20
      color: ff0000
    - type: text
      text: ''
      key: high_score
      font_size: 18
      style: big
      x: 105
      y: 50
      color: ff00ff
      animations:
        show_slide:
          - property: opacity
            value: 1
            duration: 0.3s
            easing: in_out_quint
          - property: opacity
            value: 0
            duration: 0.3s
            repeat: true
            easing: in_out_quint
  high_score_award_display:
    - type: text
      text: (player_name)
      font_size: 18
      style: big
      anchor_y: middle
      anchor_x: middle
      x: middle
      y: middle
      color: 00ff00
      animations:
        show_slide:
          - property: opacity
            value: 1
            duration: 0.05s
          - property: opacity
            value: 0
            duration: 0.05s
            repeat: true
    - type: text
      text: (award)
      font_size: 18
      style: big
      x: 105
      y: 110
      color: 0000ff
    - type: text
      text: (value)
      style: big
      x: 105
      y: 30
      color: 4040FF
      font_size: 20
      number_grouping: true
      min_digits: 2
loops_award_display:
    - type: text
      text: (player_name)
      font_size: 18
      style: big
      anchor_y: middle
      anchor_x: middle
      x: middle
      y: middle
      color: 00ff00
      animations:
        show_slide:
          - property: opacity
            value: 1
            duration: 0.05s
          - property: opacity
            value: 0
            duration: 0.05s
            repeat: true
    - type: text
      text: (award)
      font_size: 18
      style: big
      x: 105
      y: 110
      color: 0000ff
    - type: text
      text: (value)
      style: big
      x: 105
      y: 30
      color: 4040FF
      font_size: 20
      number_grouping: true
      min_digits: 2
    - type: text
      text: (player(player_num)|character)
      style: big
      x: 105
      y: 10
      color: 4040FF
      font_size: 20
##! test
#! assert_machine_variable 1000000 score1_value
#! assert_machine_variable MPF score1_name
#! assert_machine_variable "GRAND CHAMPION" score1_label
#! assert_machine_variable 200000 score9_value
#! assert_machine_variable ANT score9_name
#! assert_machine_variable "HIGH SCORE 8" score9_label
#! start_game
#! start_mode my_mode
#! post score_100
#! assert_player_variable 2000000 score
#! drain_all_balls
#! advance_time_and_run 1
#! assert_player_variable 2 ball
#! drain_all_balls
#! advance_time_and_run 1
#! assert_player_variable 3 ball
#! mock_event high_score_enter_initials
#! drain_all_balls
#! advance_time_and_run 1
#! assert_player_variable 3 ball
#! assert_event_called high_score_enter_initials
#! post text_input_high_score_complete text=JAB
#! advance_time_and_run 10
#! assert_mode_not_running game
#! assert_machine_variable 2000000 score1_value
#! assert_machine_variable JAB score1_name
#! assert_machine_variable "GRAND CHAMPION" score1_label
#! assert_machine_variable 1000000 score2_value
#! assert_machine_variable MPF score2_name
#! assert_machine_variable "HIGH SCORE 1" score2_label
#! assert_machine_variable 300000 score9_value
#! assert_machine_variable MIK score9_name
#! assert_machine_variable "HIGH SCORE 8" score9_label

High score mode will also create a few machine variables for you:

In this case this will be score1_value, score1_name and score1_label (till score9_value, score9_name and score9_label). Additionally, there will be loop1_label, loop1_value and loop1_name. You can use those in your attract slides to show previous high scores. This is an example of an attract mode which shows high scores:

# in your machine wide config file
widget_styles:
  attract_mode_high_score_display_label:
    font_size: 30
    anchor_x: right
    anchor_y: top
    x: center-10
    bold: true
  attract_mode_high_score_display_name:
    font_size: 30
    anchor_x: right
    anchor_y: top
    x: center+70
  attract_mode_high_score_display_score:
    font_size: 30
    anchor_x: left
    anchor_y: top
    x: center+90
    number_grouping: true
    min_digits: 1
##! show: attract
# in your attract mode show file
- duration: 20s
  slides:
    show_high_scores:
      widgets:
      - type: Text
        text: HIGH SCORES
        font_size: 60
        bold: true
        anchor_x: center
        anchor_y: center
        x: center
        y: top-100
      - type: Text
        text: (machine|score1_label)
        style: attract_mode_high_score_display_label
        y: top-200
      - type: Text
        text: (machine|score1_name)
        style: attract_mode_high_score_display_name
        y: top-200
      - type: Text
        text: (machine|score1_value)
        style: attract_mode_high_score_display_score
        y: top-200
      - type: Text
        text: (machine|score2_label)
        style: attract_mode_high_score_display_label
        y: top-240
      - type: Text
        text: (machine|score2_name)
        style: attract_mode_high_score_display_name
        y: top-240
      - type: Text
        text: (machine|score2_value)
        style: attract_mode_high_score_display_score
        y: top-240
      - type: Text
        text: (machine|score3_label)
        style: attract_mode_high_score_display_label
        y: top-280
      - type: Text
        text: (machine|score3_name)
        style: attract_mode_high_score_display_name
        y: top-280
      - type: Text
        text: (machine|score3_value)
        style: attract_mode_high_score_display_score
        y: top-280
      - type: Text
        text: LOOP CHAMPION
        font_size: 60
        bold: true
        anchor_x: center
        anchor_y: center
        x: center
        y: top-500
      - type: Text
        text: (machine|loops1_label)
        style: attract_mode_high_score_display_label
        y: top-600
      - type: Text
        text: (machine|loops1_name)
        style: attract_mode_high_score_display_name
        y: top-600
      - type: Text
        text: (machine|loops1_value)
        style: attract_mode_high_score_display_score
        y: top-600
      - type: Text
        text: (machine|loops1_player_character)
        style: attract_mode_high_score_display_score
        y: top-600
##! test
#! assert_mode_running attract

Related How To guides:

Related Events


Something missing or wrong? You can fix it!

This website is edited by people like you! Is something wrong or missing? Is something out of date, or can you explain it better?

Please help us! You can fix it yourself and be an official "open source" contributor!

It's easy! See our Beginner's guide to editing the docs.

Page navigation via the keyboard: < >

You can navigate this site via the keyboard. There are two modes:

General navigation, when search is not focused:

  • F , S , / : open search dialog
  • P , , : go to previous page
  • N , . : go to next page

While using the search function:

  • Down , Up : select next / previous result
  • Esc , Tab : close search
  • Enter : go to highlighted page in the results