From 410631e1a8cb5c2168f1227512b447d8f8f93ccb Mon Sep 17 00:00:00 2001 From: Brandon Rodriguez <brodriguez8774@gmail.com> Date: Sat, 6 Nov 2021 12:53:43 -0400 Subject: [PATCH] Add toggle for roomba "failure" option --- src/entities/gui_entities.py | 30 ++++++++++++++++++-------- src/misc.py | 42 +++++++++++++++++++++++++----------- src/systems.py | 32 +++++++++++++++++++++------ 3 files changed, 75 insertions(+), 29 deletions(-) diff --git a/src/entities/gui_entities.py b/src/entities/gui_entities.py index f1d3417..2ad0cea 100644 --- a/src/entities/gui_entities.py +++ b/src/entities/gui_entities.py @@ -22,6 +22,7 @@ from src.misc import ( set_roomba_vision_range_2, set_roomba_vision_range_full, toggle_roomba_ai, + toggle_roomba_failure, ) @@ -65,13 +66,13 @@ class GuiCore: data_manager, 'Randomizers:', data_manager.gui_data['gui_w_start'] + 10, - data_manager.gui_data['gui_h_start'] + 75, + data_manager.gui_data['gui_h_start'] + 115, ) self.roomba_header_text = GuiText( data_manager, 'Roomba Settings:', data_manager.gui_data['gui_w_start'] + 10, - data_manager.gui_data['gui_h_start'] + 240, + data_manager.gui_data['gui_h_start'] + 280, ) # Initialize "toggle ai" button. @@ -85,11 +86,22 @@ class GuiCore: ) self.elements.append(self.toggle_ai) + # Initialize "toggle failure" button. + self.toggle_failure_button = GuiButton( + data_manager, + 'Toggle Failure', + 70, + name='Toggle Failure', + function_call=toggle_roomba_failure, + function_args=data_manager, + ) + self.elements.append(self.toggle_failure_button) + # Initialize "randomize tile walls" buttons. self.rand_walls = GuiButton( data_manager, 'Randomize Walls (E)', - 100, + 140, name='RandWalls Button (Equal Randomization)', function_call=data_manager.tile_set.randomize_tile_walls_equal, ) @@ -97,7 +109,7 @@ class GuiCore: self.rand_walls = GuiButton( data_manager, 'Randomize Walls (W)', - 140, + 180, name='RandWalls Button (Weighted Randomization)', function_call=data_manager.tile_set.randomize_tile_walls_weighted, ) @@ -107,7 +119,7 @@ class GuiCore: self.rand_trash = GuiButton( data_manager, 'Randomize Trash', - 180, + 220, name='RandTrash Button', function_call=data_manager.tile_set.randomize_trash, ) @@ -117,7 +129,7 @@ class GuiCore: self.vision_0 = GuiButton( data_manager, 'Bump Sensor', - 260, + 300, name='Distance of 0 (Bump Sensor)', function_call=set_roomba_vision_range_0, function_args=data_manager, @@ -128,7 +140,7 @@ class GuiCore: self.vision_1 = GuiButton( data_manager, 'Distance of 1', - 300, + 340, name='Distance of 1', function_call=set_roomba_vision_range_1, function_args=data_manager, @@ -139,7 +151,7 @@ class GuiCore: self.vision_2 = GuiButton( data_manager, 'Distance of 2', - 340, + 380, name='Distance of 2', function_call=set_roomba_vision_range_2, function_args=data_manager, @@ -150,7 +162,7 @@ class GuiCore: self.vision_full = GuiButton( data_manager, 'Full Sight', - 380, + 420, name='Full Sight', function_call=set_roomba_vision_range_full, function_args=data_manager, diff --git a/src/misc.py b/src/misc.py index 90b1eba..8d1a4db 100644 --- a/src/misc.py +++ b/src/misc.py @@ -46,6 +46,7 @@ class DataManager: self.tile_set = None self.roomba = None self.ai_active = False + self.ai_can_fail = False self.roomba_vision = 1 self.ideal_trash_paths = None self.ideal_overall_path = None @@ -176,19 +177,6 @@ def handle_mouse_click(data_manager, button_state, pos_x, pos_y): calc_traveling_salesman(data_manager) -def toggle_roomba_ai(data_manager): - """ - Toggles roomba AI on or off. Program start default is off. - :param data_manager: Data manager data structure. Consolidates useful program data to one location. - """ - logger.debug('toggle_roomba_ai()') - logger.info('Toggling roomba ai.') - if data_manager.ai_active: - data_manager.ai_active = False - else: - data_manager.ai_active = True - - def set_roomba_vision_range_0(data_manager): """ Adjusts roomba AI sight to see 0 tiles out from current location. @@ -229,6 +217,34 @@ def set_roomba_vision_range_full(data_manager): data_manager.roomba_vision = -1 +def toggle_roomba_ai(data_manager): + """ + Toggles roomba AI on or off. Program start default is off. + :param data_manager: Data manager data structure. Consolidates useful program data to one location. + """ + logger.debug('toggle_roomba_ai()') + if data_manager.ai_active: + logger.info('Toggling roomba ai to "off".') + data_manager.ai_active = False + else: + logger.info('Toggling roomba ai to "on".') + data_manager.ai_active = True + + +def toggle_roomba_failure(data_manager): + """ + Toggles roomba "failure chance" on or off. Program start default is off. + :param data_manager: Data manager data structure. Consolidates useful program data to one location. + """ + logger.debug('toggle_roomba_failure()') + if data_manager.ai_can_fail: + logger.info('Toggling roomba failure rate to "off".') + data_manager.ai_can_fail = False + else: + logger.info('Toggling roomba failure rate to "10% failure chance on movement".') + data_manager.ai_can_fail = True + + # endregion GUI Logic Functions diff --git a/src/systems.py b/src/systems.py index 990a063..e3f200b 100644 --- a/src/systems.py +++ b/src/systems.py @@ -70,7 +70,7 @@ class AbstractMovementSystem(ABC): if orig_location != sprite.y: # Call general "movement" logic, for entity having moved in any direction at all. logger.debug('Moved north.') - self._handle_move(sprite) + self._handle_move(sprite, orig_x, orig_y) # Movement successful. return True @@ -109,7 +109,7 @@ class AbstractMovementSystem(ABC): if orig_location != sprite.x: # Call general "movement" logic, for entity having moved in any direction at all. logger.debug('Moved east.') - self._handle_move(sprite) + self._handle_move(sprite, orig_x, orig_y) # Movement successful. return True @@ -148,7 +148,7 @@ class AbstractMovementSystem(ABC): if orig_location != sprite.y: # Call general "movement" logic, for entity having moved in any direction at all. logger.debug('Moved south.') - self._handle_move(sprite) + self._handle_move(sprite, orig_x, orig_y) # Movement successful. return True @@ -182,7 +182,7 @@ class AbstractMovementSystem(ABC): if orig_location != sprite.x: # Call general "movement" logic, for entity having moved in any direction at all. logger.debug('Moved west.') - self._handle_move(sprite) + self._handle_move(sprite, orig_x, orig_y) # Movement successful. return True @@ -190,7 +190,7 @@ class AbstractMovementSystem(ABC): # Movement failed. Some barrier was in the way. return False - def _handle_move(self, sprite): + def _handle_move(self, sprite, orig_x, orig_y): """ Generalized logic that applies upon roomba moving in any direction. :param sprite: Entity sprite data. @@ -207,13 +207,31 @@ class AbstractMovementSystem(ABC): if roomba_location[0] == tile_x and roomba_location[1] == tile_y and curr_tile.trashpile.exists: curr_tile.trashpile.clean() + # Handle if roomba is set to allow "failing". + # Such an instance causes 10% chance of trash pile appearing in square roomba just left. + roomba_failed = False + if self.data_manager.ai_can_fail: + roomba_failed = self._trigger_failure(orig_x, orig_y) + # Recalculate path distances for new roomba location. - calc_trash_distances(self.data_manager, roomba_only=True) - calc_traveling_salesman(self.data_manager, calc_new=False) + calc_trash_distances(self.data_manager, roomba_only=(not roomba_failed)) + calc_traveling_salesman(self.data_manager, calc_new=roomba_failed) # Update for a movement. self.data_manager.gui_data['total_move_counter'] += 1 + def _trigger_failure(self, tile_x, tile_y): + """ + If toggled on, roomba has 10% chance of "failing" upon leaving any square. + Causes roomba to generate a new trash pile in square it was just in. + :return: True if roomba failure occurred | False otherwise. + """ + if random.randint(0, 9) < 1: + # Trigger failure. + self.data_manager.tile_set.tiles[tile_y][tile_x].trashpile.place() + return True + return False + class MovementSystem(sdl2.ext.Applicator, AbstractMovementSystem): """ -- GitLab