Implement vim-style (j/k) and curses-style (ctrl+n/p) menu controls

pull/1/head
Jake Funke 2017-03-16 20:01:08 +00:00
parent 948adec959
commit b2d1c62323
2 changed files with 32 additions and 24 deletions

View File

@ -36,7 +36,7 @@ from menu_screen import *
# - create rarer species by diff gens
# - if neighbor plant dies, node will be removed from list
#
# build ascii trees
# build ascii plant art
# Make it fun to keep growing after seed level (what is reward for continuing
# instead of starting over?
@ -89,6 +89,13 @@ class Plant(object):
10: 'cannabis',
11: 'pansy',
12: 'iris',
13: 'agave',
14: 'ficus',
15: 'lichen',
16: 'sage',
17: 'snapdragon',
18: 'columbine',
19: 'brugmansia',
}
mutation_dict = {
@ -138,8 +145,8 @@ class Plant(object):
# Constructor
self.plant_id = str(uuid.uuid4())
# TODO: change from debug
self.life_stages = (10, 20, 30, 40, 50)
# self.life_stages = (3600, (3600*24)*3, (3600*24)*10, (3600*24)*20, (3600*24)*30)
# self.life_stages = (10, 20, 30, 40, 50)
self.life_stages = (3600*24, (3600*24)*3, (3600*24)*10, (3600*24)*20, (3600*24)*30)
self.stage = 0
self.mutation = 0
self.species = random.randint(0,len(self.species_dict)-1)
@ -222,7 +229,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 = 3000 # 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!
@ -275,11 +282,6 @@ class Plant(object):
def life(self):
# I've created life :)
# TODO: change out of debug
# TODO: variable stages of life
# day = 3600*24
# life_stages = (1*day, 2*day, 3*day, 4*day, 5*day)
# leave this untouched bc it works for now
while True:
time.sleep(1)
if not self.dead:
@ -291,14 +293,15 @@ class Plant(object):
if self.mutate_check():
1==1
if self.water_check():
# Do something
1==1
if self.dead_check():
# Do something else
1==1
# TODO: event check
class DataManager(object):
# handles user data, puts a .botany dir in user's home dir (OSX/Linux)
# TODO: windows... lol
user_dir = os.path.expanduser("~")
botany_dir = os.path.join(user_dir,'.botany')
game_dir = os.path.dirname(os.path.realpath(__file__))
@ -338,8 +341,7 @@ class DataManager(object):
autosave_thread.start()
def death_check_update(self,this_plant):
# .1 second updates to minimize race condition
# TODO: improve how this is handled to eliminate race condition
# .1 second updates and lock to minimize race condition
while True:
is_dead = this_plant.dead_check()
if is_dead:

View File

@ -1,7 +1,6 @@
import curses, os, traceback, threading, time, datetime, pickle, operator, random
class CursedMenu(object):
#TODO: create a side panel with log of events..?
#TODO: name your plant
'''A class which abstracts the horrors of building a curses-based menu system'''
def __init__(self, this_plant, this_garden_file_path):
@ -65,8 +64,6 @@ 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
# TODO: display refresh is hacky. Could be more precise
self.screen.refresh()
try:
@ -162,15 +159,21 @@ class CursedMenu(object):
user_in = self.screen.getch() # Gets user input
except Exception as e:
self.__exit__()
# DEBUG KEYS
# self.screen.addstr(1, 1, str(user_in), curses.A_NORMAL)
# self.screen.refresh()
# Resize sends curses.KEY_RESIZE, update display
if user_in == curses.KEY_RESIZE:
self.maxy,self.maxx = self.screen.getmaxyx()
self.screen.clear()
self.screen.refresh()
# 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
if user_in >= ord('1') and user_in <= ord(str(min(9,len(self.options)+1))):
@ -178,9 +181,11 @@ class CursedMenu(object):
return
# increment or Decrement
if user_in == curses.KEY_DOWN: # down arrow
down_keys = [curses.KEY_DOWN, 14, 106]
up_keys = [curses.KEY_UP, 16, 107]
if user_in in down_keys: # down arrow
self.selected += 1
if user_in == curses.KEY_UP: # up arrow
if user_in in up_keys: # up arrow
self.selected -=1
self.selected = self.selected % len(self.options)
return
@ -344,16 +349,17 @@ class CursedMenu(object):
# load data
# format data
if self.infotoggle != 1:
# TODO: clear the bar first
# TODO: when garden grows this won't clear everything.
output_string = clear_bar * 8
# for example if there are 9 people in garden it won't clear all
# of them
output_string = clear_bar * (self.maxy - 15)
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.infotoggle = 1
else:
output_string = clear_bar * 4
output_string = clear_bar * 3
self.infotoggle = 0
for y, line in enumerate(output_string.splitlines(), 2):