def on_game_input(self, keycode): if keycode == solent_keycode('a'): self.rail_snake_game.steer(cardinal='w') elif keycode == solent_keycode('w'): self.rail_snake_game.steer(cardinal='n') elif keycode == solent_keycode('d'): self.rail_snake_game.steer(cardinal='e') elif keycode in (solent_keycode('x'), solent_keycode('s')): self.rail_snake_game.steer(cardinal='s')
def on_keystroke(self, keycode): if self.track_containment_mode.is_focus_on_menu(): if keycode == solent_keycode('tab'): self.b_in_menu = False self.nearcast.game_focus() else: self.nearcast.menu_select(menu_keycode=keycode) else: if keycode == solent_keycode('tab'): self.b_in_menu = True self.nearcast.menu_focus() else: self.nearcast.game_input(keycode=keycode)
def event_loop(self): self._render() while True: # # Defensive if self.game == None: self.b_menu_active = True # # Input if self.b_menu_active: keycode = self.console.block_get_keycode() elif self.game != None and self.game.player_mind.is_blocking(): keycode = self.console.block_get_keycode() else: keycode = self.console.async_get_keycode() b_key = True if keycode == None: b_key = False # # Menu if self.b_menu_active: if b_key: if keycode == solent_keycode('tab') and self.game != None: self.b_menu_active = False keycode = None elif self.menu.has_key(chr(keycode)): fn = self.menu.get_callback(chr(keycode)) fn() keycode = None else: if b_key: if keycode == solent_keycode('tab'): self.b_menu_active = True keycode = None self._render() continue else: self.game.accept_key(key=chr(keycode)) keycode = None # # Update display. if self.b_menu_active: self._render() else: activity = self.game.turn() if activity: time.sleep(0.05) if not activity: time.sleep(0.1)
def eng_turn(self, activity): if self.mode == MODE_NONE: return # keycode = self.console.async_get_keycode() if keycode: activity.mark(l=self, s='received keystroke %s' % keycode) if keycode == solent_keycode('lmousedown'): self.lmousedown_coords = self.console.get_last_lmousedown() elif keycode == solent_keycode('lmouseup'): self.lmouseup_coords = self.console.get_last_lmouseup() elif keycode == solent_keycode('rmousedown'): self.rmousedown_coords = self.console.get_last_rmousedown() elif keycode == solent_keycode('rmouseup'): self.rmouseup_coords = self.console.get_last_rmouseup() self.accept_key(keycode=keycode) # self.refresh_console()
def async_get_keycode(self): for itm in pygame.event.get(): self.event_queue.append(itm) # The reason this is a while loop is to get through event characters # we don't care about. i.e. it's a different reason for a while loop # in the same position in block_get_keycode. (At first glance, it # looks trivial to merge them, but it's not) while True: if not self.event_queue: return None ev = self.event_queue.popleft() if ev.type == pygame.QUIT: raise SolentQuitException() if ev.type == pygame.MOUSEBUTTONDOWN: (xpos, ypos) = ev.pos if ev.button == 1: self.last_lmousedown = self.grid_display.coords_from_mousepos( xpos=xpos, ypos=ypos) return solent_keycode('lmousedown') if ev.button == 3: self.last_rmousedown = self.grid_display.coords_from_mousepos( xpos=xpos, ypos=ypos) return solent_keycode('rmousedown') if ev.type == pygame.MOUSEBUTTONUP: (xpos, ypos) = ev.pos if ev.button == 1: self.last_lmouseup = self.grid_display.coords_from_mousepos( xpos=xpos, ypos=ypos) return solent_keycode('lmouseup') if ev.button == 3: self.last_rmouseup = self.grid_display.coords_from_mousepos( xpos=xpos, ypos=ypos) return solent_keycode('rmouseup') if not ev.type == pygame.KEYDOWN: continue # c = _sanitise_input(u=ev.unicode) return c
def _print(self, keycode, cpair): if keycode == solent_keycode('backspace') and self.rest > 0: self.rest -= 1 self.spin_term.write(drop=self.drop, rest=self.rest, s=' ', cpair=cpair) return if keycode == solent_keycode('newline'): self.rest = 0 self.drop += 1 else: self.spin_term.write(drop=self.drop, rest=self.rest, s=chr(keycode), cpair=cpair) self.rest += 1 if self.rest == CONSOLE_WIDTH: self.rest = 0 self.drop += 1 while self.drop >= CONSOLE_HEIGHT: self.spin_term.scroll() self.drop -= 1
def block_get_keycode(self): while True: if self.event_queue: ev = self.event_queue.popleft() else: ev = pygame.event.wait() # if ev.type == pygame.QUIT: raise SolentQuitException() if ev.type == pygame.MOUSEBUTTONDOWN: (xpos, ypos) = ev.pos self.last_mousedown = self.grid_display.coords_from_mousepos( xpos=xpos, ypos=ypos) return solent_keycode('mousedown') if ev.type == pygame.MOUSEBUTTONUP: (xpos, ypos) = ev.pos self.last_mouseup = self.grid_display.coords_from_mousepos( xpos=xpos, ypos=ypos) return solent_keycode('mouseup') if not ev.type == pygame.KEYDOWN: continue # c = _sanitise_input(u=ev.unicode) return c
def event_loop(console): cgrid = Cgrid( width=console.width, height=console.height) cgrid.put( drop=console.height-3, rest=1, s='(Escape to quit)', cpair=solent_cpair('white')) for (idx, (cpair, name)) in enumerate(solent_cpair_pairs()): cgrid.put( drop=(5+int(idx/4)), rest=(2+int(18*(idx%4))), s='%s %s'%(name, cpair), cpair=cpair) console.screen_update( cgrid=cgrid) # t = 0 while True: keycode = console.async_get_keycode() if keycode != None: if keycode == solent_keycode('esc'): raise SolentQuitException() cgrid.put( drop=3, rest=1, s='key %s (%s) '%(hex(keycode), chr(keycode)), cpair=solent_cpair('red')) else: time.sleep(0.05) cgrid.put( drop=1, rest=1, s='loop counter: %s'%(t), cpair=solent_cpair('green')) console.screen_update( cgrid=cgrid) t += 1
def _received_keycode(self, keycode): if keycode in QUIT_KEYCODES: raise SolentQuitException() # if None == self.rail_line_finder: return # cpair = solent_cpair('orange') # This backspace mechanism is far from perfect. if keycode == solent_keycode('backspace'): self.rail_line_finder.backspace() s = self.rail_line_finder.get() idx = len(s) % CONSOLE_WIDTH s = s[-1 * idx:] self.spin_term.write(drop=self.drop, rest=0, s='%s ' % s, cpair=cpair) self.rest = len(s) else: self.rail_line_finder.accept_bytes([keycode]) self._print(keycode=keycode, cpair=cpair) self.spin_term.refresh_console()
message menu_select field menu_keycode ''' class TrackPrimeConsole: def __init__(self, orb): self.orb = orb def on_prime_console(self, console_type, height, width): self.console_type = console_type self.height = height self.width = width MENU_KEYCODE_NEW_GAME = solent_keycode('n') MENU_KEYCODE_CONTINUE = solent_keycode('c') MENU_KEYCODE_QUIT = solent_keycode('q') def t100(): return time.time() * 100 class TrackContainmentMode: ''' Tracks whether we are in the menu or not. ''' def __init__(self, orb): self.orb = orb #
def accept_key(self, keycode): ''' By making this an exposed command, we can allow the console to be used as a display with input coming from elsewhere. ''' if self.mode == MODE_SELECT: if keycode == solent_keycode('esc'): self.to_mode_standard() elif keycode in (solent_keycode('newline'), solent_keycode('s')): (c, cpair) = self.cgrid.get(drop=self.select_drop, rest=self.select_rest) self._call_selui_lselect(drop=self.select_drop, rest=self.select_rest, c=c, cpair=cpair) self.to_mode_standard() else: # we let the user navigate the cursor using arrow keys, vi # keys, gollop keys. b_moved = False # standard navigation if keycode in (solent_keycode('q'), solent_keycode('a'), solent_keycode('z'), solent_keycode('y'), solent_keycode('h'), solent_keycode('b')): if self.select_rest > 0: self.select_rest -= 1 b_moved = True if keycode in (solent_keycode('e'), solent_keycode('d'), solent_keycode('c'), solent_keycode('u'), solent_keycode('l'), solent_keycode('n')): if self.select_rest < self.width - 1: self.select_rest += 1 b_moved = True if keycode in (solent_keycode('q'), solent_keycode('w'), solent_keycode('e'), solent_keycode('y'), solent_keycode('k'), solent_keycode('u')): if self.select_drop > 0: self.select_drop -= 1 b_moved = True if keycode in (solent_keycode('z'), solent_keycode('x'), solent_keycode('c'), solent_keycode('b'), solent_keycode('j'), solent_keycode('n')): if self.select_drop < self.height - 1: self.select_drop += 1 b_moved = True # shift navigation if keycode in (solent_keycode('Q'), solent_keycode('A'), solent_keycode('Z'), solent_keycode('Y'), solent_keycode('H'), solent_keycode('B')): self.select_rest = 0 b_moved = True if keycode in (solent_keycode('E'), solent_keycode('D'), solent_keycode('C'), solent_keycode('U'), solent_keycode('L'), solent_keycode('N')): self.select_rest = self.width - 1 b_moved = True if keycode in (solent_keycode('Q'), solent_keycode('W'), solent_keycode('E'), solent_keycode('Y'), solent_keycode('K'), solent_keycode('U')): self.select_drop = 0 b_moved = True if keycode in (solent_keycode('Z'), solent_keycode('X'), solent_keycode('C'), solent_keycode('B'), solent_keycode('J'), solent_keycode('N')): self.select_drop = self.height - 1 b_moved = True # if b_moved: self.select_cursor_on = True self.select_cursor_t100 = time.time() * 100 elif self.mode == MODE_STANDARD: if keycode == solent_keycode('esc'): self.to_mode_select() else: if keycode == solent_keycode('lmouseup'): # We check to see that the coords were the same as # when the mouse was depressed. If they weren't, this # usually implies the user has rethought their # decision, and we abort. From memory, this is how FTL # works, and it's super-useful. (ddrop, drest) = self.lmousedown_coords (udrop, urest) = self.lmouseup_coords if (ddrop, drest) == (udrop, urest): (c, cpair) = self.cgrid.get(drop=udrop, rest=urest) self._call_selui_lselect(drop=udrop, rest=urest, c=c, cpair=cpair) elif keycode in MOUSE_EVENTS: pass else: # we pass the keystroke back in a callback self._call_selui_keycode(keycode=keycode)
# from solent import solent_cpair from solent import solent_keycode from solent import uniq from solent.console import Cgrid from solent.console import Console from solent import log import time MODE_NONE = 0 MODE_SELECT = 1 MODE_STANDARD = 2 MOUSE_EVENTS = (solent_keycode('lmousedown'), solent_keycode('lmouseup'), solent_keycode('rmousedown'), solent_keycode('rmouseup')) class CsSeluiKeycode: def __init__(self): self.keycode = None class CsSeluiLselect: def __init__(self): self.drop = None self.rest = None self.c = None self.cpair = None
def on_directive(self, directive_h, description): self.d_directive[directive_h] = description # if directive_h == 'nw': self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_GOLLOP, keycode=solent_keycode('q'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_KEYPAD, keycode=solent_keycode('n7'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_VI, keycode=solent_keycode('y'), directive_h=directive_h) elif directive_h == 'nn': self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_GOLLOP, keycode=solent_keycode('w'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_KEYPAD, keycode=solent_keycode('n8'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_VI, keycode=solent_keycode('k'), directive_h=directive_h) elif directive_h == 'ne': self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_GOLLOP, keycode=solent_keycode('e'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_KEYPAD, keycode=solent_keycode('n9'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_VI, keycode=solent_keycode('u'), directive_h=directive_h) elif directive_h == 'sw': self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_GOLLOP, keycode=solent_keycode('z'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_KEYPAD, keycode=solent_keycode('n1'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_VI, keycode=solent_keycode('b'), directive_h=directive_h) elif directive_h == 'ss': self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_GOLLOP, keycode=solent_keycode('x'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_KEYPAD, keycode=solent_keycode('n2'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_VI, keycode=solent_keycode('j'), directive_h=directive_h) elif directive_h == 'se': self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_GOLLOP, keycode=solent_keycode('c'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_KEYPAD, keycode=solent_keycode('n3'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_VI, keycode=solent_keycode('n'), directive_h=directive_h) elif directive_h == 'ww': self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_GOLLOP, keycode=solent_keycode('a'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_KEYPAD, keycode=solent_keycode('n4'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_VI, keycode=solent_keycode('h'), directive_h=directive_h) elif directive_h == 'ee': self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_GOLLOP, keycode=solent_keycode('d'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_KEYPAD, keycode=solent_keycode('n6'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_VI, keycode=solent_keycode('l'), directive_h=directive_h) elif directive_h == 'a': self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_GOLLOP, keycode=solent_keycode('s'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_KEYPAD, keycode=solent_keycode('n5'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_VI, keycode=solent_keycode('space'), directive_h=directive_h) elif directive_h == 'b': self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_GOLLOP, keycode=solent_keycode('r'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_KEYPAD, keycode=solent_keycode('n0'), directive_h=directive_h) self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_VI, keycode=solent_keycode('slash'), directive_h=directive_h) elif directive_h == 'help': self.nearcast.keycode_to_directive( control_scheme_h=CONTROL_SCHEME_H_VI, keycode=solent_keycode('qmark'), directive_h=directive_h) else: raise Exception('Unhandled directive %s'%(directive.h))
i field h message init field addr field port message net_connect message net_condrop field message message net_recv field bb message net_send field bb ''' QUIT_KEYCODES = (solent_keycode('etx'), solent_keycode('dc1')) #CONSOLE_TYPE = 'pygame' CONSOLE_TYPE = 'curses' CONSOLE_WIDTH = 78 CONSOLE_HEIGHT = 24 if CONSOLE_TYPE == 'curses': from solent.console.curses import curses_async_get_keycode class CogTcpClient: def __init__(self, cog_h, orb, engine): self.cog_h = cog_h self.orb = orb self.engine = engine
def _sanitise_key(k): if k in (127, curses.KEY_BACKSPACE, curses.KEY_DC): k = solent_keycode('backspace') return k