From cdfe1b5076bae28b5ba776b2d4754e73b69227a2 Mon Sep 17 00:00:00 2001 From: Jan Kantert Date: Mon, 24 Aug 2020 23:02:14 +0200 Subject: [PATCH] add reset event for earnings --- mpf/config_spec.yaml | 1 + mpf/modes/credits/code/credits.py | 12 ++++++++++++ mpf/tests/test_CreditsMode.py | 10 ++++++++++ 3 files changed, 23 insertions(+) diff --git a/mpf/config_spec.yaml b/mpf/config_spec.yaml index 0c74a303e..e5718bb98 100644 --- a/mpf/config_spec.yaml +++ b/mpf/config_spec.yaml @@ -362,6 +362,7 @@ credits: switches: list|subconfig(credits_switches)|None events: list|subconfig(credits_events)|None pricing_tiers: list|subconfig(credits_pricing_tiers)|None + reset_earnings_events: list|event_handler|earnings_reset,factory_reset credits_switches: switch: single|machine(switches)|None value: single|template_float|0.25 diff --git a/mpf/modes/credits/code/credits.py b/mpf/modes/credits/code/credits.py index 60e0a0b81..ab4406d11 100644 --- a/mpf/modes/credits/code/credits.py +++ b/mpf/modes/credits/code/credits.py @@ -33,6 +33,10 @@ def mode_init(self): self.data_manager = self.machine.create_data_manager('earnings') self.earnings = self.data_manager.get_data() + # prevent crashes because of data corruption + if not isinstance(self.earnings, dict): + self.earnings = {} + self.credit_units_per_game = 0 self.credit_unit = 0 self.pricing_tiers = set() @@ -59,6 +63,8 @@ def mode_start(self, **kwargs): self.toggle_credit_play) self.add_mode_event_handler('slam_tilt', self.clear_all_credits) + for event in self.credits_config['reset_earnings_events']: + self.add_mode_event_handler(event, self._reset_earnings) if self.machine.settings.get_setting_value("free_play"): self.enable_free_play(post_event=False) @@ -67,6 +73,12 @@ def mode_start(self, **kwargs): self._calculate_pricing_tiers() self.enable_credit_play(post_event=False) + def _reset_earnings(self, **kwargs): + """Reset earnings.""" + del kwargs + self.earnings = {} + self.data_manager.save_all(data=self.earnings) + def mode_stop(self, **kwargs): """Stop mode.""" self._set_free_play_string() diff --git a/mpf/tests/test_CreditsMode.py b/mpf/tests/test_CreditsMode.py index c6ec74bfa..213e41f74 100644 --- a/mpf/tests/test_CreditsMode.py +++ b/mpf/tests/test_CreditsMode.py @@ -94,6 +94,7 @@ def testCredits(self): self.machine_run() self.assertEqual("CREDITS 1/2", self.machine.variables.get_machine_var('credits_string')) + self.assertEqual(0.25, self.machine.modes["credits"].earnings["money"]["total_value"]) self.assertMachineVarEqual(0.5, "price_per_game_raw_0") self.assertMachineVarEqual("1 CREDITS $0.5", "price_per_game_string_0") @@ -107,6 +108,7 @@ def testCredits(self): self.machine_run() self.assertEqual("CREDITS 1", self.machine.variables.get_machine_var('credits_string')) + self.assertEqual(0.5, self.machine.modes["credits"].earnings["money"]["total_value"]) # one is enough for a game self.start_game(True) @@ -120,12 +122,20 @@ def testCredits(self): self.hit_and_release_switch("s_right_coin") self.machine_run() self.assertEqual("CREDITS 2", self.machine.variables.get_machine_var('credits_string')) + self.assertEqual(1.5, self.machine.modes["credits"].earnings["money"]["total_value"]) # no more price tier after game self.hit_and_release_switch("s_left_coin") self.hit_and_release_switch("s_left_coin") self.machine_run() self.assertEqual("CREDITS 3", self.machine.variables.get_machine_var('credits_string')) + self.assertEqual(2.0, self.machine.modes["credits"].earnings["money"]["total_value"]) + + self.post_event("earnings_reset") + self.advance_time_and_run(.1) + + self.assertEqual({}, self.machine.modes["credits"].earnings) + self.assertEqual({}, self.machine.modes["credits"].data_manager.written_data) def testReplay(self): # add coins