Skip to content

Commit

Permalink
allow float scoring. template improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
jabdoa2 committed Apr 18, 2017
1 parent d3af82f commit 6612053
Show file tree
Hide file tree
Showing 6 changed files with 52 additions and 9 deletions.
4 changes: 2 additions & 2 deletions mpf/config_players/score_player.py
Expand Up @@ -87,12 +87,12 @@ def validate_config_entry(self, settings, name):

def get_express_config(self, value):
"""Parse express config."""
if isinstance(value, int):
if not isinstance(value, str):
block = False
else:
try:
value, block = value.split('|')
except (ValueError, AttributeError):
except ValueError:
block = False
else:
if block != "block":
Expand Down
2 changes: 1 addition & 1 deletion mpf/core/config_spec.py
Expand Up @@ -782,7 +782,7 @@
confirm: single|str|lazy
scoring:
__valid_in__: modes
score: single|template_int|0
score: single|template_float|0
block: single|bool|False
action: single|enum(add,set,add_machine,set_machine)|add
player: single|int|None
Expand Down
13 changes: 7 additions & 6 deletions mpf/core/config_validator.py
Expand Up @@ -367,22 +367,23 @@ def _validate_type_lstr(cls, item, validation_failure_info):
def _validate_type_template_float(self, item, validation_failure_info):
if item is None:
return None
if not isinstance(item, str):
self.validation_error(item, validation_failure_info, "Template has to be string.")
if not isinstance(item, (str, float, int)):
self.validation_error(item, validation_failure_info, "Template has to be string/int/float.")

return self.machine.placeholder_manager.build_float_template(item)

def _validate_type_template_int(self, item, validation_failure_info):
del validation_failure_info
if item is None:
return None
return self.machine.placeholder_manager.build_int_template(str(item))
if not isinstance(item, (str, int)):
self.validation_error(item, validation_failure_info, "Template has to be string/int.")
return self.machine.placeholder_manager.build_int_template(item)

def _validate_type_template_bool(self, item, validation_failure_info):
if item is None:
return None
if not isinstance(item, str):
self.validation_error(item, validation_failure_info, "Template has to be string.")
if not isinstance(item, (str, bool)):
self.validation_error(item, validation_failure_info, "Template has to be string/bool.")

return self.machine.placeholder_manager.build_bool_template(item)

Expand Down
19 changes: 19 additions & 0 deletions mpf/core/placeholder_manager.py
Expand Up @@ -76,6 +76,19 @@ def evaluate(self, parameters, fail_on_missing_params=False):
return int(result)


class NativeTypeTemplate:

def __init__(self, value):
"""Set value."""
self.value = value

def evaluate(self, parameters, fail_on_missing_params=False):
"""Return value."""
del parameters
del fail_on_missing_params
return self.value


class DeviceClassPlaceholder:

"""Wrap a monitorable device."""
Expand Down Expand Up @@ -277,14 +290,20 @@ def _eval(self, node, variables):

def build_float_template(self, template_str, default_value=0.0):
"""Build a float template from a string."""
if isinstance(template_str, (float, int)):
return NativeTypeTemplate(float(template_str))
return FloatTemplate(self._parse_template(template_str), self, default_value)

def build_int_template(self, template_str, default_value=0):
"""Build a int template from a string."""
if isinstance(template_str, (float, int)):
return NativeTypeTemplate(int(template_str))
return IntTemplate(self._parse_template(template_str), self, default_value)

def build_bool_template(self, template_str, default_value=False):
"""Build a bool template from a string."""
if isinstance(template_str, bool):
return NativeTypeTemplate(template_str)
return BoolTemplate(self._parse_template(template_str), self, default_value)

def get_global_parameters(self, name):
Expand Down
11 changes: 11 additions & 0 deletions mpf/tests/machine_files/scoring/modes/mode3/config/mode3.yaml
Expand Up @@ -18,3 +18,14 @@ scoring:
score: 10
player: 2
action: set
score_float1:
score: 2.0
score_float2:
score:
score: 2.0
score_float3:
score: 100 * current_player.multiplier
set_float:
multiplier:
score: 1.5
action: set
12 changes: 12 additions & 0 deletions mpf/tests/test_Scoring.py
Expand Up @@ -149,6 +149,18 @@ def test_scoring(self):
self.assertPlayerVarEqual(2242, "score")
self.assertEqual(10, self.machine.game.player_list[1].score)

self.post_event("score_float1")
self.assertPlayerVarEqual(2244, "score")

self.post_event("score_float2")
self.assertPlayerVarEqual(2246, "score")

self.post_event("set_float")
self.assertPlayerVarEqual(1.5, "multiplier")

self.post_event("score_float3")
self.assertPlayerVarEqual(2396, "score")

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

0 comments on commit 6612053

Please sign in to comment.