# Minus 1 col for last doesn't handle |CR Properly in populated with a character real_width = bbs_io.pyGetTermWidth() - 1 url = 'http://bbs-scene.org/api/onelinerz.php?limit=%s' % str(real_limit) bbs_io.pyPipe2Ansi("|CS|15 Loading Global BBS-Scene OneLiners|CR|CR") req = requests.get(url, auth=(usrname, pssword)) if 200 != req.status_code: print 'error %s' % req.content print 'error %s' % req.status_code exit(1) ansifile = "onelinerz" bbs_io.pyAnsiPrintf(ansifile) # can throw exceptions when xml is invalid, as a thread, nobody needs # to catch it. theres some things that should be CDATA wrapped .. these # break even viewing it in firefox, but upstream doesn't seem to # notice, probably upstream does print('<xml_node>' + var + # '</xml_node>'), i've found more than a few nasty escape flaws, # we're breaking the shit out of encoding here, but most other bbs's # are US-ASCII (cp437)-only, and bbs-api doesn't care buf = ''.join((byte for byte in req.content if (ord(byte) >= 0x20 or ord(byte) in (0x09, 0x0a, 0x0d, 0x7f)) and ord(byte) not in (0x9f, ))) # Remove any unicode characters from string before transforamtion. buf = "".join((c if ord(c) < 128 else '?' for c in buf))
# Minus 1 col for last doesn't handle |CR Properly in populated with a character real_width = bbs_io.pyGetTermWidth() - 1 url = 'http://bbs-scene.org/api/onelinerz.php?limit=%s' % str(real_limit) bbs_io.pyPipe2Ansi("|CS|15 Loading Global BBS-Scene OneLiners|CR|CR") req = requests.get(url, auth=(usrname, pssword)) if 200 != req.status_code: print 'error %s' % req.content print 'error %s' % req.status_code exit(1) ansifile = "onelinerz" bbs_io.pyAnsiPrintf(ansifile) # can throw exceptions when xml is invalid, as a thread, nobody needs # to catch it. theres some things that should be CDATA wrapped .. these # break even viewing it in firefox, but upstream doesn't seem to # notice, probably upstream does print('<xml_node>' + var + # '</xml_node>'), i've found more than a few nasty escape flaws, # we're breaking the shit out of encoding here, but most other bbs's # are US-ASCII (cp437)-only, and bbs-api doesn't care buf = ''.join((byte for byte in req.content if (ord(byte) >= 0x20 or ord(byte) in (0x09, 0x0a, 0x0d, 0x7f)) and ord(byte) not in (0x9f,))) # Remove any unicode characters from string before transforamtion.
def start_up(): # Main Startup bbs_io.pyAnsiPrintf(ansifile) get_wall() bbs_io.pyPipe2Ansi("|CR|07Post a line to the wall? |15(|12y|04/|12n|07)|08: ")
def main_module(): # Clear Screen, Default color 15 = White Text, Background = |18 Dark Green bbs_io.pyPipe2Ansi("|CS|15|18") # Put Raw Line of Text, No String Parsing bbs_io.pyPutLine("This is just a test!, test.py in the src/scripts folder! :) ") # Reset Text color to 15 = White, Background |16 = Black with 2 carriage returns bbs_io.pyPipe2Ansi("|15|16|CR|CR") # Run Pause Prompt bbs_io.pyStartPause() # Put String with MCI Codes |09 = Light Blue, with |IP Ip address, |DE = Wait 1 second... CR = Carriage Return bbs_io.pyPipe2Ansi("|CR|09This is a Test with MCI Codes: |07{ |15IP ADDRESS |07} |13|IP, |DE|05Wait Over! |CR|03Did you like the test?|CR") #Put String with MCI Codes bbs_io.pyPipe2Ansi("|CR|CR|09This is a simple get HotKey Test, hit any key! |CR"); #Get Hotkey Input into ch, will Contain All Chars, Minus Escape Sequences.. If ch = 27, then ESC Sequence, Arrow Key, etc.. # Testing the pyGetKey Functions bbs_io.pyPipe2Ansi('|15Hotkey Input: |11') # ch = the int key code returned from key press. ch = bbs_io.pyGetKey() # Write out the key that was pressed first. # Convery from a String with Number, to Int Number, Then to Character Value. print chr(int(ch)) # Test Key Input, and Extended Esc Sequences # if input Ch == 27, & Extended is not blank, Then Escape # Other Extended Sequence capture Arrow, Home Insert, F1 keys etc.. # Then it could be arror keys, Home, Insert etc... myStr = "|CR|03Char (Int): |11" + ch bbs_io.pyPipe2Ansi(myStr) # Check input character. if ch == '27': if bbs_io.pyGetKeyExtended() <> "": # Means we got an Arror Key, Home, Insert Etc.. myStr = "|CR|03GetKeyExtended (ESC Sequence): |11" + bbs_io.pyGetKeyExtended() bbs_io.pyPipe2Ansi(myStr) else: # Means we got just the ESC Key bbs_io.pyPipe2Ansi("|CR|03GetKeyExtended (ESC Sequence) Empty (ESC Hit!)") else: # Normal Key/Letter Input bbs_io.pyPipe2Ansi("|CR|03Normal Input") # Reset Text color to 15 = White, Background |16 = Black with 2 carriage returns bbs_io.pyPipe2Ansi("|15|16|CR|CR") # Set Length of Input to Return to 15 chars. bbs_io.pyPipe2Ansi("|15Get Line Input |08(|15Hit ENTER when done.|08) |07: ") len = 15 getstr = bbs_io.pyGetLine(len); bbs_io.pyPipe2Ansi("|03|CR|CRPrinting Line Input: |07") print getstr # Test Fancy Input, input field, |IN Limits the input field (overide), |FB sets forground and bg colors. text = "|CRInput Field Testing.. : " # Set default length of input field to 10 len = 10 # Append input field to text string text = bbs_io.pyInputField(text,len); # Write out input field bbs_io.pyPipe2Ansi(text) # Now getline after inputfield!! :) Fancy. getstr = bbs_io.pyGetLine(len); bbs_io.pyPipe2Ansi("|03|CR|CRPrinting Inputfield Line Input: |07") print getstr bbs_io.pyPipe2Ansi("|15|CR|CRDisplaying an ansi file, hit any key to continue|CR|CR") bbs_io.pyStartPause() # Will printf out ansi.ans in ansi folder leave off extension .ans ansifile = "file" bbs_io.pyAnsiPrintf(ansifile) # Run Pause Prompt bbs_io.pyStartPause() # Clear Screen, Move down two lones, then go back to Home |xy coords . Top left of screen! bbs_io.pyPipe2Ansi("|CS|CR|CR|XY0101|13Testing XY top left coner of screen") # Print Done. bbs_io.pyPipe2Ansi("|CR|05done.") # Run Pause Prompt bbs_io.pyStartPause()
def start_up(): # Main Startup bbs_io.pyAnsiPrintf(ansifile) get_wall() bbs_io.pyPipe2Ansi( "|CR|07Post a line to the wall? |15(|12y|04/|12n|07)|08: ")
def bootup_sequence(): # Startup Message bbs_io.pyPipe2Ansi("|CS|07|16Starting Bootup Sequence... |DE|DE|CS") ansifile = "osload" bbs_io.pyAnsiPrintf(ansifile) bbs_io.pyPipe2Ansi("|CR|CR |15Enthral OS |07v|151.0 |07Alpha") bbs_io.pyPipe2Ansi("|CR|CR '-[ ]-'") bootup_done = False # Loop Bootup Bar barLen = 20 percent = 0 progress = "" color = 3 # Setup Bootup Percentage Bar (ESC) Will abort. for i in range(barLen): # Listen for ESC Key, if Hit Abort Mem Test while stdin in select([stdin], [], [], 0)[0]: ch = bbs_io.pyGetKey() if ch == '27': escsequence = bbs_io.pyGetKeyExtended() if not escsequence: # we jsut just ESC no arror keys # We got Escape, exit loop. bootup_done = True # Display full pencentage bar # Repeat string to max length after abort output = format("\r\x1b[31G|%02d" % (color)) bbs_io.pyPipe2Ansi(output) color = 11 progress = chr(177) bbs_io.pyPipe2Ansi(repstr(progress,19)) break else: # Test if loop is done. if bootup_done is True: break if i < int(barLen * percent): progress += chr(177) # Format Output with color Pipe Codes. output = format("\r\x1b[31G|%02d" % (color)) bbs_io.pyPipe2Ansi(output) # Slide Fade the update on progress bar. for o in range(len(progress)): bbs_io.pyPipe2Ansi(progress[o]) sleep(0.02) # Delay between drawing redrawing bar sleep(0.15) percent += 1 # Alternate high/low colors. if color == 3: color = 11 else: color = 3 bbs_io.pyPipe2Ansi("|CR|CR |07OS Loaded|08.") bbs_io.pyPipe2Ansi("|DE|DE") bbs_io.pyPipe2Ansi("|CS|07")
def main_module(): # Clear Screen, Default color 15 = White Text, Background = |18 Dark Green bbs_io.pyPipe2Ansi("|CS|15|18") # Put Raw Line of Text, No String Parsing bbs_io.pyPutLine( "This is just a test!, test.py in the src/scripts folder! :) ") # Reset Text color to 15 = White, Background |16 = Black with 2 carriage returns bbs_io.pyPipe2Ansi("|15|16|CR|CR") # Run Pause Prompt bbs_io.pyStartPause() # Put String with MCI Codes |09 = Light Blue, with |IP Ip address, |DE = Wait 1 second... CR = Carriage Return bbs_io.pyPipe2Ansi( "|CR|09This is a Test with MCI Codes: |07{ |15IP ADDRESS |07} |13|IP, |DE|05Wait Over! |CR|03Did you like the test?|CR" ) #Put String with MCI Codes bbs_io.pyPipe2Ansi( "|CR|CR|09This is a simple get HotKey Test, hit any key! |CR") #Get Hotkey Input into ch, will Contain All Chars, Minus Escape Sequences.. If ch = 27, then ESC Sequence, Arrow Key, etc.. # Testing the pyGetKey Functions bbs_io.pyPipe2Ansi('|15Hotkey Input: |11') # ch = the int key code returned from key press. ch = bbs_io.pyGetKey() # Write out the key that was pressed first. # Convery from a String with Number, to Int Number, Then to Character Value. print chr(int(ch)) # Test Key Input, and Extended Esc Sequences # if input Ch == 27, & Extended is not blank, Then Escape # Other Extended Sequence capture Arrow, Home Insert, F1 keys etc.. # Then it could be arror keys, Home, Insert etc... myStr = "|CR|03Char (Int): |11" + ch bbs_io.pyPipe2Ansi(myStr) # Check input character. if ch == '27': if bbs_io.pyGetKeyExtended() <> "": # Means we got an Arror Key, Home, Insert Etc.. myStr = "|CR|03GetKeyExtended (ESC Sequence): |11" + bbs_io.pyGetKeyExtended( ) bbs_io.pyPipe2Ansi(myStr) else: # Means we got just the ESC Key bbs_io.pyPipe2Ansi( "|CR|03GetKeyExtended (ESC Sequence) Empty (ESC Hit!)") else: # Normal Key/Letter Input bbs_io.pyPipe2Ansi("|CR|03Normal Input") # Reset Text color to 15 = White, Background |16 = Black with 2 carriage returns bbs_io.pyPipe2Ansi("|15|16|CR|CR") # Set Length of Input to Return to 15 chars. bbs_io.pyPipe2Ansi( "|15Get Line Input |08(|15Hit ENTER when done.|08) |07: ") len = 15 getstr = bbs_io.pyGetLine(len) bbs_io.pyPipe2Ansi("|03|CR|CRPrinting Line Input: |07") print getstr # Test Fancy Input, input field, |IN Limits the input field (overide), |FB sets forground and bg colors. text = "|CRInput Field Testing.. : " # Set default length of input field to 10 len = 10 # Append input field to text string text = bbs_io.pyInputField(text, len) # Write out input field bbs_io.pyPipe2Ansi(text) # Now getline after inputfield!! :) Fancy. getstr = bbs_io.pyGetLine(len) bbs_io.pyPipe2Ansi("|03|CR|CRPrinting Inputfield Line Input: |07") print getstr bbs_io.pyPipe2Ansi( "|15|CR|CRDisplaying an ansi file, hit any key to continue|CR|CR") bbs_io.pyStartPause() # Will printf out ansi.ans in ansi folder leave off extension .ans ansifile = "file" bbs_io.pyAnsiPrintf(ansifile) # Run Pause Prompt bbs_io.pyStartPause() # Clear Screen, Move down two lones, then go back to Home |xy coords . Top left of screen! bbs_io.pyPipe2Ansi( "|CS|CR|CR|XY0101|13Testing XY top left coner of screen") # Print Done. bbs_io.pyPipe2Ansi("|CR|05done.") # Run Pause Prompt bbs_io.pyStartPause()
def play(): import time from random import randint import os field = [] global charcache charcache = "" field_width = 10 field_height = 20 # Access scheme looks like this: # layout[p][r][ypox][xpos] # layoutcolor = [ 7,2,3,4,4,6,7 ] layout = [ # ## # ## [[[1, 1], [1, 1]]], # # # # # # # # [ [[0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0], [0, 1, 0, 0]], [[0, 0, 0, 0], [1, 1, 1, 1], [0, 0, 0, 0], [0, 0, 0, 0]], ], # ### # # [ [[0, 0, 0], [1, 1, 1], [0, 1, 0]], [[0, 1, 0], [0, 1, 1], [0, 1, 0]], [[0, 1, 0], [1, 1, 1], [0, 0, 0]], [[0, 1, 0], [1, 1, 0], [0, 1, 0]], ], # # # # # ## [ [[0, 1, 0], [0, 1, 0], [0, 1, 1]], [[0, 0, 1], [1, 1, 1], [0, 0, 0]], [[1, 1, 0], [0, 1, 0], [0, 1, 0]], [[0, 0, 0], [1, 1, 1], [1, 0, 0]], ], # # # # # ## [ [[0, 1, 0], [0, 1, 0], [1, 1, 0]], [[0, 0, 0], [1, 1, 1], [0, 0, 1]], [[0, 1, 1], [0, 1, 0], [0, 1, 0]], [[1, 0, 0], [1, 1, 1], [0, 0, 0]], ], # ## # ## [[[0, 1, 0], [1, 1, 0], [1, 0, 0]], [[0, 0, 0], [1, 1, 0], [0, 1, 1]]], # ## # ## [[[0, 1, 0], [0, 1, 1], [0, 0, 1]], [[0, 0, 0], [0, 1, 1], [1, 1, 0]]], ] fieldx1 = 32 fieldy1 = 10 scorex1 = 11 scorey1 = 11 class RectRedraw: x1 = None y1 = None x2 = None y2 = None def max(r, val, valmax): if val > valmax: return valmax return val def min(r, val, valmin): if val < valmin: return valmin return val def merge(r, x1, y1, x2, y2): if r.x1 is None or r.x1 > x1: r.x1 = r.min(x1, 0) if r.y1 is None or r.y1 > y1: r.y1 = r.min(y1, 0) if r.x2 is None or r.x2 < x2: r.x2 = r.max(x2, field_width) if r.y2 is None or r.y2 < y2: r.y2 = r.max(y2, field_height) # print r.x1,r.y1,r.x2,r.y2 def clean(r): r.x1 = None r.y1 = None r.x2 = None r.y2 = None rr = RectRedraw() for _ in range(field_height): field.append([0] * field_width) def echo(s): global charcache charcache += s # Turn off the Cursor bbs_io.pyPipe2Ansi("\x1b[?25l") # Display Welcome Message bbs_io.pyPipe2Ansi("|CS|CR|CR|09REAdY YOUR tERMiNAl! |CR|CR|03PRESS ANY kEY") # get key from user, wait for input. bbs_io.pyGetKey() # Clear the Screen First bbs_io.pyPipe2Ansi("|CS") # Display ANSI screen .ans extension is assumed. bbs_io.pyAnsiPrintf("tetris") def gotoxy(x, y): echo("|XY%02d%02d" % (x + 1, y + 1)) def plotblock(color, lastcolor): if color: # c = u'\u2588\u2588' # '\xDB\xDB' c = chr(219) + chr(219) else: # both empty c = " " color = 0 # Output optimization if color % 8 == 0: color = color / 8 if color == lastcolor: echo(c) else: if color: fg = str(30 + color % 8) else: fg = "37" if color >= 8: bg = ";%d" % (40 + color / 8) else: bg = "" echo("\x1b[0;" + fg + bg + "m") echo(c) lastcolor = color return lastcolor def drawfield(): lastcolor = "" for y in range(0, field_height, 2): gotoxy(fieldx1 + 2, fieldy1 + 1 + y / 2) # Which block to show, full, half-up, half-down or empty. for x in range(field_width): color = field[y][x] + field[y + 1][x] * 8 if field[y][x] and field[y + 1][x]: # c = u'\u2588' # '\xDB' c = chr(219) if field[y][x] == field[y + 1][x]: color = color % 8 else: # c = u'\u2580' # '\xDF' c = chr(223) elif field[y][x] and not field[y + 1][x]: # c = u'\u2580' # '\xDF' c = chr(223) elif not field[y][x] and field[y + 1][x]: # c = u'\u2584' # '\xDC' c = chr(220) else: # both empty c = " " # Output optimization if color % 8 == 0: color = color / 8 if color == lastcolor: echo(c) else: if color: fg = str(30 + color % 8) else: fg = "37" if color >= 8: bg = ";%d" % (40 + color / 8) else: bg = "" echo("\x1b[0;" + fg + bg + "m") echo(c) lastcolor = color # echo(term.normal) echo("|07|16") # reset background color layoutcolor = [7, 2, 7, 6, 3, 6, 3] # p = -1 # Current piece type nextpiece = randint(0, len(layout) - 1) p = randint(0, len(layout) - 1) p = 1 r = 0 # Current rotation xpos = 4 # X position # ypos = -2 # Y position ypos = -len(layout[p][0]) level = 1 score = 0 lines = 0 def flush(): global charcache bbs_io.pyPipe2Ansi(charcache) charcache = "" def fillpiece(x, y, p, r, value): row = 0 for line in layout[p][r]: col = 0 for c in line: if c and (y + row) >= 0: field[y + row][x + col] = value col += 1 row += 1 def showpiece(x, y, p, r): fillpiece(x, y, p, r, layoutcolor[p]) def hidepiece(): fillpiece(xpos, ypos, p, r, 0) def testpiece(x, y, newr): hidepiece() # Space at the new location? row = 0 for line in layout[p][newr]: col = 0 for c in line: try: if c: if (y + row) >= 0 and field[y + row][x + col] or (x + col) < 0 or (x + col) > 9: return 0 except IndexError: return 0 col += 1 row += 1 # Movement possible return 1 def movepiece(x, y, newr): if testpiece(x, y, newr): # Build redraw rectangle rr.merge(xpos, ypos, xpos + len(layout[p][0][0]), ypos + len(layout[p][0])) rr.merge(x, y, x + len(layout[p][0][0]), y + len(layout[p][0])) showpiece(x, y, p, newr) return (x, y, newr, 1) else: showpiece(xpos, ypos, p, r) return (xpos, ypos, r, 0) def shownext(p): r = 0 for y in range(4): gotoxy(26, 18 + y) echo(" " * 4) bbs_io.pyPipe2Ansi("|%02d" % (layoutcolor[p])) yoffset = int(len(layout[p][r][0]) < 4) xoffset = int(len(layout[p][r]) < 3) for y in range(len(layout[p][r])): for x in range(len(layout[p][r][y])): val = layout[p][r][y][x] if val: gotoxy(26 + x + xoffset, 18 + y + yoffset) # echo(u'\u2588\u2588') echo(chr(219) + chr(219)) def drawstats(): bbs_io.pyPipe2Ansi("|XY%02d%02d%d" % (scorex1, scorey1 + 1, level)) bbs_io.pyPipe2Ansi("|XY%02d%02d%d" % (scorex1, scorey1 + 3, lines)) bbs_io.pyPipe2Ansi("|XY%02d%02d%d" % (scorex1, scorey1 + 4, score)) drawstats() ticksize = 0.4 nexttick = time.time() + ticksize showpiece(xpos, ypos, p, r) gotoxy(26, 17) # echo(term.blue_reverse('next')) echo("|09|17n|00|17ext|07|16") shownext(nextpiece) # Full redraw first frame rr.merge(0, 0, field_width, field_height) buf = "" key = "" while True: drawfield() slice = nexttick - time.time() if slice < 0: slice = 0 echo(buf) buf = "" flush() # Get User Key presses for block movement {Non-Blocking) if stdin in select([stdin], [], [], slice + 0.01)[0]: key = bbs_io.pyGetKey() if key != "": # if we got an escape sequence, then reassign the key if key == "27": # Get Extended ESC Sequence key = bbs_io.pyGetKeyExtended() else: # Translate int to char value. key = chr(int(key)) else: key = "" now = time.time() # hidepiece() if key is not None: if key in ("q", "Q"): return (0, 0, 0) elif key in ("[D", "h"): xpos, ypos, r, m = movepiece(xpos - 1, ypos, r) elif key in ("[C", "l"): xpos, ypos, r, m = movepiece(xpos + 1, ypos, r) elif key in ("[A", "k"): xpos, ypos, r, m = movepiece(xpos, ypos, (r + 1) % len(layout[p])) elif key in ("[B", "j"): xpos, ypos, r, m = movepiece(xpos, ypos + 1, r) elif key in (" ",): m = True c = 0 while m: xpos, ypos, r, m = movepiece(xpos, ypos + 1, r) if m: c += 1 if c: nexttick = time.time() + ticksize # New tick? if now > nexttick: nexttick += ticksize # Move down piece xpos, ypos, r, moved = movepiece(xpos, ypos + 1, r) # Piece has touched down? if not moved: # Is the player dead? if ypos <= -len(layout[p][0]): # End of Game Message bbs_io.pyPipe2Ansi("|XY3324|12!! |04gAME OVeR |12!!|07") bbs_io.pyGetKey() # death_win = AnsiWindow(height=6, width=40, # yloc=fieldy1 + 10 / 2, xloc=fieldx1 - 11) # death_win.colors['border'] = term.bold_black # echo_unbuffered(death_win.clear() + death_win.border()) # echo_unbuffered( # term.move(fieldy1 + 10 / 2 + 1, fieldx1 - 11)) # echo_unbuffered(( # u'!! gAME OVeR!! Score was: %i' % (score,)).center(40)) # echo_unbuffered( # term.move(fieldy1 + 10 / 2 + 3, fieldx1 - 11)) # echo_unbuffered(u'press RETURN'.center(40)) # while True: # inp = getch() # if inp in (u'\r', term.KEY_ENTER): # break return (score, level, lines) # Any complete rows to remove? complete = [] for y in range(field_height): x = 0 while x < field_width: if field[y][x] == 0: break x += 1 if x == field_width: complete.append(y) if len(complete) > 0: # Add score lines += len(complete) score += len(complete) * len(complete) * 100 # Shrink field for line in complete: del field[line] field.insert(0, [0] * field_width) if lines >= level * 10: level += 1 ticksize = 0.4 - level * 0.02 drawstats() # Redraw complete field rr.merge(0, 0, field_width, field_height) # Time for a new piece p = nextpiece nextpiece = randint(0, len(layout) - 1) r = 0 xpos = 4 ypos = -len(layout[p][0]) showpiece(xpos, ypos, p, r) shownext(nextpiece)