diff --git a/botany.py b/botany.py index 6e2b8ee..8a4ebad 100644 --- a/botany.py +++ b/botany.py @@ -221,7 +221,7 @@ class Plant(object): # Create plant mutation # TODO: when out of debug this needs to be set to high number (1000 # even maybe) - CONST_MUTATION_RARITY = 2000 # Increase this # to make mutation rarer (chance 1 out of x) + CONST_MUTATION_RARITY = 1000 # Increase this # to make mutation rarer (chance 1 out of x) mutation_seed = random.randint(1,CONST_MUTATION_RARITY) if mutation_seed == CONST_MUTATION_RARITY: # mutation gained! @@ -369,7 +369,6 @@ class DataManager(object): self.garden_update(this_plant) # TODO: change after debug #time.sleep(60) - # TODO: if plant dies it should force save. time.sleep(5) def load_plant(self): @@ -481,7 +480,6 @@ if __name__ == '__main__': my_plant.start_life() my_data.start_threads(my_plant) botany_menu = CursedMenu(my_plant,my_data.garden_file_path) - botany_menu.show(["water","look","garden","instructions"], title=' botany ', subtitle='options') my_data.save_plant(my_plant) my_data.data_write_json(my_plant) my_data.garden_update(my_plant) diff --git a/menu_screen.py b/menu_screen.py index f2c45f9..d2eb02d 100644 --- a/menu_screen.py +++ b/menu_screen.py @@ -20,7 +20,7 @@ class CursedMenu(object): self.exit = False self.instructiontoggle = False self.gardenmenutoggle = False - self.looktoggle = False + self.infotoggle = 0 self.maxy, self.maxx = self.screen.getmaxyx() # Highlighted and Normal line definitions curses.init_pair(1, curses.COLOR_BLACK, curses.COLOR_WHITE) @@ -31,6 +31,7 @@ class CursedMenu(object): screen_thread.daemon = True screen_thread.start() self.screen.clear() + self.show(["water","look","garden","instructions"], title=' botany ', subtitle='options') def show(self, options, title, subtitle): # Draws a menu with parameters @@ -45,8 +46,6 @@ class CursedMenu(object): def update_options(self): # Makes sure you can get a new plant if it dies if self.plant.dead: - # if "start over" in self.options: - # self.options.remove("start over") if "start over" not in self.options: self.options.insert(-1,"start over") else: @@ -67,7 +66,7 @@ class CursedMenu(object): def draw(self): # Draw the menu and lines # TODO: this needs to either display the default menu screen or the - # garden/leaderboard thing based on self.gardenmenutoggle + # garden/leaderboard thing # TODO: display refresh is hacky. Could be more precise self.screen.refresh() self.screen.border(0) @@ -76,7 +75,9 @@ class CursedMenu(object): self.screen.refresh() except Exception as exception: # Makes sure data is saved in event of a crash due to window resizing + self.screen.clear() self.screen.addstr(0,0,"Enlarge terminal!") + self.screen.refresh() self.__exit__() traceback.print_exc() @@ -92,18 +93,21 @@ class CursedMenu(object): # Also calls __exit__, but adds traceback after except Exception as exception: + self.screen.clear() + self.screen.addstr(0,0,"Enlarge terminal!") + self.screen.refresh() self.__exit__() - traceback.print_exc() + #traceback.print_exc() def draw_default(self): - # Draws default menu + # draws default menu clear_bar = " " * (int(self.maxx*2/3)) self.screen.addstr(2,2, self.title, curses.A_STANDOUT) # Title for this menu self.screen.addstr(4,2, self.subtitle, curses.A_BOLD) #Subtitle for this menu - # Clear menu on screen + # clear menu on screen for index in range(len(self.options)+1): self.screen.addstr(5+index,4, clear_bar, curses.A_NORMAL) - # Display all the menu items, showing the 'pos' item highlighted + # display all the menu items, showing the 'pos' item highlighted for index in range(len(self.options)): textstyle = self.normal if index == self.selected: @@ -113,8 +117,10 @@ class CursedMenu(object): self.screen.addstr(11,2, clear_bar, curses.A_NORMAL) self.screen.addstr(12,2, clear_bar, curses.A_NORMAL) - self.screen.addstr(11,2, self.plant_string, curses.A_NORMAL) - self.screen.addstr(12,2, self.plant_ticks, curses.A_NORMAL) + self.screen.addstr(11,2, "plant: ", curses.A_DIM) + self.screen.addstr(11,9, self.plant_string, curses.A_NORMAL) + self.screen.addstr(12,2, "score: ", curses.A_DIM) + self.screen.addstr(12,9, self.plant_ticks, curses.A_NORMAL) if not self.plant.dead: if int(time.time()) <= self.plant.watered_timestamp + 24*3600: @@ -127,8 +133,8 @@ class CursedMenu(object): self.screen.addstr(5,13, " - you can't water a dead plant :(", curses.A_NORMAL) def update_plant_live(self): - # Updates plant data on menu screen, live! - # Will eventually use this to display ascii art... + # updates plant data on menu screen, live! + # will eventually use this to display ascii art... while not self.exit: self.plant_string = self.plant.parse_plant() self.plant_ticks = str(self.plant.ticks) @@ -138,21 +144,27 @@ class CursedMenu(object): time.sleep(1) def get_user_input(self): - # Gets the user's input and acts appropriately - user_in = self.screen.getch() # Gets user input - - # Enter and exit Keys are special cases + # gets the user's input and acts appropriately + try: + user_in = self.screen.getch() # Gets user input + except Exception as e: + self.__exit__() + # enter and exit Keys are special cases if user_in == 10: return self.options[self.selected] if user_in == 27: return self.options[-1] + if user_in == curses.KEY_RESIZE: + self.maxy,self.maxx = self.screen.getmaxyx() + self.screen.clear() + self.screen.refresh() - # This is a number; check to see if we can set it + # this is a number; check to see if we can set it if user_in >= ord('1') and user_in <= ord(str(min(9,len(self.options)+1))): self.selected = user_in - ord('0') - 1 # convert keypress back to a number, then subtract 1 to get index return - # Increment or Decrement + # increment or Decrement if user_in == curses.KEY_DOWN: # down arrow self.selected += 1 if user_in == curses.KEY_UP: # up arrow @@ -174,25 +186,25 @@ class CursedMenu(object): return plant_table def draw_garden(self): - # Draws neighborhood + # draws neighborhood clear_bar = " " * (self.maxx-2) + "\n" control_keys = [curses.KEY_UP, curses.KEY_DOWN, curses.KEY_LEFT, curses.KEY_RIGHT] # load data with open(self.garden_file_path, 'rb') as f: this_garden = pickle.load(f) # format data - if not self.gardenmenutoggle: + if self.infotoggle != 2: plant_table_formatted = self.format_garden_data(this_garden) - self.gardenmenutoggle = not self.gardenmenutoggle + self.infotoggle = 2 else: plant_table_formatted = clear_bar for plant in this_garden: if not this_garden[plant]["dead"]: plant_table_formatted += clear_bar - self.gardenmenutoggle = not self.gardenmenutoggle + self.infotoggle = 0 for y, line in enumerate(plant_table_formatted.splitlines(), 2): - self.screen.addstr(y+17, 2, line) + self.screen.addstr(y+12, 2, line) self.screen.refresh() def get_plant_description(self, this_plant): @@ -209,14 +221,18 @@ class CursedMenu(object): "You're ready for a new start with this plant.", "You're tired of waiting for your seed to grow.", "You wish your seed could tell you what it needs.", + "You can feel the spirit inside your seed.", ], 1:[ "The seedling fills you with hope.", + "The seedling shakes in the wind.", "You can make out a tiny leaf - or is that a thorn?", "You can feel the seedling looking back at you.", "You kiss your seedling good night.", "You think about all the seedlings who came before it.", "You and your seedling make a great team.", + "Your seedling grows slowly and quietly.", + "You briefly meditate on the paths your life could take.", ], 2:[ "The " + this_species + " makes you feel relaxed.", @@ -224,27 +240,35 @@ class CursedMenu(object): "You quietly sit with your " + this_species + " for a few minutes.", "Your " + this_species + " looks pretty good.", "You play loud techno to your " + this_species + ".", + "You play piano to your " + this_species + ".", + "You play rap music to your " + this_species + ".", + "You whistle a tune to your " + this_species + ".", ], 3:[ "Your " + this_species + " is growing nicely!", "You're proud of the dedication it took to grow your " + this_species + ".", "The " + this_species + " looks good.", - "You think how good this " + this_species + " would look on steroids.", + "You think about how good this " + this_species + " will look.", "The buds of your " + this_species + " are about to bloom.", + "You play your favorite song for your " + this_species + ".", ], 4:[ "The " + this_color + " flowers look nice on your " + this_species +"!", - "The " + this_color + " flowers have bloomed and fill you with desire.", + "The " + this_color + " flowers have bloomed and fill you with positivity.", "The " + this_color + " flowers of your " + this_species + " remind you of your childhood.", + "The " + this_color + " flowers of your " + this_species + " smell amazing.", "The " + this_species + " has grown beautiful " + this_color + " flowers.", - "The " + this_color + " petals remind you of your favorite shirt.", + "The " + this_color + " petals remind you of that favorite shirt you lost.", + "The " + this_color + " flowers remind you of your crush.", ], 5:[ "You fondly remember all of the time you spent caring for your " + this_species + ".", - "Your " + this_species + " looks old and wise.", "Seed pods have grown on your " + this_species + ".", "The " + this_species + " fills you with love.", - "The " + this_species + " reminds you of your first crush.", + "Your " + this_species + " reminds you of your childhood backyard.", + "The " + this_species + " reminds you of your family.", + "The " + this_species + " reminds you of a forgotten memory.", + "You grow nostalgic about the early days with your " + this_species + ".", ], 99:[ "You wish you had taken better care of your plant.", @@ -256,7 +280,6 @@ class CursedMenu(object): } # self.life_stages is tuple containing length of each stage # (seed, seedling, young, mature, flowering) - # if stage == 0 == seed if this_plant.dead: this_stage = 99 @@ -275,11 +298,6 @@ class CursedMenu(object): output_text += this_stage_descriptions[description_num] + "\n" - # issue 1 - referencing anything past 4 on life stages breaks - # issue 2 - 80% using plant ticks doesn't really work since it shifts - # each time. need to use the difference between 2 stages, and then - # plant ticks minus last stage - if this_stage == 1: species_options = [this_plant.species_dict[this_plant.species], this_plant.species_dict[(this_plant.species+3) % len(this_plant.species_dict)], @@ -306,16 +324,20 @@ class CursedMenu(object): def draw_plant_description(self, this_plant): clear_bar = " " * (self.maxx-2) + "\n" - control_keys = [curses.KEY_UP, curses.KEY_DOWN, curses.KEY_LEFT, curses.KEY_RIGHT] # load data # format data - if not self.looktoggle: + if self.infotoggle != 1: + # TODO: clear the bar first + # TODO: when garden grows this won't clear everything. + output_string = clear_bar * 8 + for y, line in enumerate(output_string.splitlines(), 2): + self.screen.addstr(y+12, 2, line) + self.screen.refresh() output_string = self.get_plant_description(this_plant) - self.looktoggle = not self.looktoggle + self.infotoggle = 1 else: - output_string = clear_bar - output_string += clear_bar*3 - self.looktoggle = not self.looktoggle + output_string = clear_bar * 4 + self.infotoggle = 0 for y, line in enumerate(output_string.splitlines(), 2): self.screen.addstr(y+12, 2, line) @@ -347,34 +369,30 @@ available in the readme :) self.screen.refresh() def handle_request(self, request): - '''This is where you do things with the request''' + '''this is where you do things with the request''' if request == None: return if request == "start over": self.plant.start_over() if request == "water": self.plant.water() if request == "look": - # try: - self.draw_plant_description(self.plant) - # except Exception as exception: - # self.screen.addstr(0,0,"Enlarge terminal!") - # self.__exit__() - # traceback.print_exc() + try: + self.draw_plant_description(self.plant) + except Exception as exception: + self.screen.refresh() + # traceback.print_exc() if request == "instructions": try: self.draw_instructions() except Exception as exception: - # Makes sure data is saved in event of a crash due to window resizing - self.screen.addstr(0,0,"Enlarge terminal!") - self.__exit__() - traceback.print_exc() + self.screen.refresh() + # traceback.print_exc() if request == "garden": try: self.draw_garden() except Exception as exception: - self.screen.addstr(0,0,"Enlarge terminal!") - self.__exit__() - traceback.print_exc() + self.screen.refresh() + # traceback.print_exc() def __exit__(self): self.exit = True