Skip to content

Commit

Permalink
fix priority bug and allow scoring for other players
Browse files Browse the repository at this point in the history
  • Loading branch information
jabdoa2 committed Apr 8, 2017
1 parent fa6caff commit d5cfd6c
Show file tree
Hide file tree
Showing 5 changed files with 66 additions and 12 deletions.
37 changes: 26 additions & 11 deletions mpf/config_players/score_player.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ def __init__(self, machine):
def play(self, settings, context, calling_context, priority=0, **kwargs):
"""Score variable."""
for var, s in settings.items():
if self._is_blocked(var, context, calling_context):
if self._is_blocked(var, context, calling_context, priority):
continue
if s['block']:
if var not in self.blocks:
Expand All @@ -28,26 +28,41 @@ def play(self, settings, context, calling_context, priority=0, **kwargs):

self._score(var, s, kwargs)

def _is_blocked(self, var, context, calling_context):
def _is_blocked(self, var, context, calling_context, priority):
if var not in self.blocks or not self.blocks[var]:
return False
priority_sorted = sorted(self.blocks[var], reverse=True)
return priority_sorted[0][1] != context + "_" + calling_context
return priority_sorted[0][0] > priority and priority_sorted[0][1] != context + "_" + calling_context

def _score(self, var: str, entry: dict, placeholder_parameters: dict) -> None:
if entry['string']:
self.machine.game.player[var] = entry['string']
elif entry['action'] == "add":
self.machine.game.player[var] += entry['score'].evaluate(placeholder_parameters)
return

# evaluate placeholder
value = entry['score'].evaluate(placeholder_parameters)

if entry['action'] == "add":
if entry['player']:
# specific player
self.machine.game.player_list[entry['player'] - 1][var] += value
else:
# default to current player
self.machine.game.player[var] += value
elif entry['action'] == "set":
self.machine.game.player[var] = entry['score'].evaluate(placeholder_parameters)
if entry['player']:
# specific player
self.machine.game.player_list[entry['player'] - 1][var] = value
else:
# default to current player
self.machine.game.player[var] = value
elif entry['action'] == "add_machine":
value = self.machine.get_machine_var(var)
if value is None:
value = 0
self.machine.create_machine_var(var, value + entry['score'].evaluate(placeholder_parameters))
old_value = self.machine.get_machine_var(var)
if old_value is None:
old_value = 0
self.machine.create_machine_var(var, old_value + value)
elif entry['action'] == "set_machine":
self.machine.create_machine_var(var, entry['score'].evaluate(placeholder_parameters))
self.machine.create_machine_var(var, value)
else:
raise AssertionError("Invalid value: {}".format(entry))

Expand Down
1 change: 1 addition & 0 deletions mpf/core/config_spec.py
Original file line number Diff line number Diff line change
Expand Up @@ -841,6 +841,7 @@
score: single|template_int|0
block: single|bool|False
action: single|enum(add,set,add_machine,set_machine)|add
player: single|int|None
string: single|str|None
scriptlets:
__valid_in__: machine # todo add to validator
Expand Down
3 changes: 2 additions & 1 deletion mpf/tests/machine_files/scoring/config/config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,5 @@ ball_devices:

modes:
- mode1
- mode2
- mode2
- mode3
20 changes: 20 additions & 0 deletions mpf/tests/machine_files/scoring/modes/mode3/config/mode3.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
#config_version=4
mode:
start_events: start_mode3
stop_events: stop_mode3
priority: 400

scoring:
score_player1:
score:
score: 42
player: 1
score_player2:
score:
score: 23
player: 2
reset_player2:
score:
score: 10
player: 2
action: set
17 changes: 17 additions & 0 deletions mpf/tests/test_Scoring.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,23 @@ def test_scoring(self):
self.assertEqual(2, self.machine.game.player.vars['var_a'])
self.assertEqual(2, self.machine.game.player.vars['var_b'])

self.post_event("start_mode3")
self.advance_time_and_run()

self.assertPlayerVarEqual(2200, "score")
self.assertEqual(1000, self.machine.game.player_list[1].score)
self.post_event("score_player2")
self.assertPlayerVarEqual(2200, "score")
self.assertEqual(1023, self.machine.game.player_list[1].score)

self.post_event("score_player1")
self.assertPlayerVarEqual(2242, "score")
self.assertEqual(1023, self.machine.game.player_list[1].score)

self.post_event("reset_player2")
self.assertPlayerVarEqual(2242, "score")
self.assertEqual(10, self.machine.game.player_list[1].score)

# stop game and mode
self.machine.service.start_service()
self.advance_time_and_run()
Expand Down

0 comments on commit d5cfd6c

Please sign in to comment.