GvRng_4.4/0000755000175000017500000000000011326063744011202 5ustar stasstasGvRng_4.4/gvrparser.py0000644000175000017500000003462011326063737013576 0ustar stasstas# -*- coding: utf-8 -*- # Copyright (c) 2008 Stas Zykiewicz # # gvrparser.py # This program is free software; you can redistribute it and/or # modify it under the terms of version 3 of the GNU General Public License # as published by the Free Software Foundation. A copy of this license should # be included in the file GPL-3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """ /* * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ """ import re, string, gettext,locale,__builtin__, os, sys,pprint,logging from utils import LOCALEDIR module_logger = logging.getLogger("gvr.gvrparser") global FUNCS #list of user defined functions FUNCS=[] def isIterator(token): try: x = int(token['statement']) if x < 0: raise BadIterator, token else: return 1 except: raise BadIterator, token def isColon(token): if token['statement'] != ':': raise NoColon, token def isName(token): if re.match("[a-zA-Z_]+[0-9]*", token['statement']): return 1 else: raise BadName, token # IMPORTANT # This is a change from the original code which worked for 4 years but now # it seems that gettext works somehow differently, python 2.5??? Don't know # This should be properly tested with non-english languages on various systems. try: #print "current _", _ # keep old gettext function, we restore it later old_ = _ except Exception,info: module_logger.error("in gvrparser locale switch:%s" % info) # Here we override the gettext _ function because we want the original strings first _ = lambda x:x TESTS = ( _('any_beepers_in_beeper_bag'), _('facing_north'), _('facing_east'), _('facing_south'), _('facing_west'), _('front_is_blocked'), _('front_is_clear'), _('no_beepers_in_beeper_bag'), _('next_to_a_beeper'), _('not_next_to_a_beeper'), _('not_facing_north'), _('not_facing_east'), _('not_facing_south'), _('not_facing_west'), _('left_is_blocked'), _('left_is_clear'), _('right_is_blocked'), _('right_is_clear'), ) COMMANDS = ( _('move'), _('pickbeeper'), _('putbeeper'), _('turnleft'), _('turnoff'), _('cheat'), ) # The tuple DIV contains names/words used in the GvR langauge, but are # hardcoded somewhere else in this module. We list them here to be able # to get them with gettext and to put it in the lookup table. # That's the only usage for this tuple, There are no changes to the way # the parser works. DIV = ( _('define'), _('end'), _('if'), _('elif'), _('else'), _('while'), _('do'), _('end'), ) ####################### Start I18N part ##################################### # We have replaced the gettext _ with a lambda function that returns the original # strings. # So we first get a list with the untranslated strings trans_commands, org_commands = [],[] words = COMMANDS + TESTS + DIV # Now we restore the gettext function again. # Remember that words now holds the english words. _ = old_ for i in words: trans_commands.append(_(i))# this is the translated string org_commands.append(i) # and this is the english one # With this we build a look-up dictionary that is used in the Program class. # The look-up dict: {'beweeg':'move','rechtsaf':turnright',....} # the keys are the gettext strings and the vals are the original names. lookup_dict = {} for k,v in map(None,trans_commands,org_commands): lookup_dict[k] = v module_logger.debug("lookup_dict: %s" % lookup_dict) ################################## End of I18N ############################ def parseStatement(token): statement = token['statement'] global FUNCS if statement not in COMMANDS and statement not in FUNCS: raise BadStatement, token return Statement(token) def parseCheat(token): return Cheat(token) def parseBlock(remainingTokens): statements = [] while len(remainingTokens): token = remainingTokens[0] curStatement = token['statement'] parseMethods = { 'if': parseIfStatement, 'while': parseWhileLoop, 'do': parseDoLoop} if curStatement in parseMethods: method = parseMethods[curStatement] parsedObject, remainingTokens = method(remainingTokens) statements.append(parsedObject) else: cmd = token if cmd['statement'] == 'cheat': remainingTokens = remainingTokens[1:] cheat = remainingTokens[0] statements.append(parseCheat(cheat)) else: statements.append(parseStatement(cmd)) remainingTokens = remainingTokens[1:] # When there's only a define statement without any toplevel code we just do # nothing. This is much like the Python behaviour. try: defaultIndent = statements[0].indent except: pass for statement in statements: if statement.indent != defaultIndent: raise IndentError, statement return Block(statements) def eatLine(tokens, startIndex): currentLine = tokens[:startIndex] if currentLine[-1]['line'] != currentLine[0]['line']: raise LineTooShort, tokens[0] if currentLine[-1]['statement'] != ':': raise NoColon, tokens[0] return currentLine def eatBlock(tokens, startIndex): currentLine = eatLine(tokens, startIndex) indent = tokens[0]['indent'] end = startIndex while end < len(tokens) and tokens[end]['indent'] > indent: end += 1 if end == startIndex: # Report the error as being on the line # where you expected the indented command. # You can safely assume that there will always # be at least one token on the current line, # or this would have never been called. raise ExpectedBlock , currentLine[0]['line']+1 block = tokens[startIndex:end] restOfCode = tokens[end:] return currentLine, block, restOfCode def parseTestCondition(token): statement = token['statement'] line = token['line'] if statement not in TESTS: raise BadTest, token return TestCondition(statement, line) def parseConditionAndBlock(currentLine, block): condition = parseTestCondition(currentLine[1]) blockObj = parseBlock(block) return (currentLine[0]['indent'], condition, blockObj) def parseIfStatement(tokens): currentLine, block, tokens = eatBlock(tokens, 3) ifStatement = IfStatement(*parseConditionAndBlock(currentLine, block)) while len(tokens): if tokens[0]['statement'] != 'elif': break elifObj, tokens = parseElifStatement(tokens) ifStatement.elifs.append(elifObj) if len(tokens) and tokens[0]['statement'] == 'else': ifStatement.elseObj, tokens = parseElseStatement(tokens) return ifStatement, tokens def parseElseStatement(tokens): currentLine, block, remainingTokens = eatBlock(tokens, 2) blockObj = parseBlock(block) return blockObj, remainingTokens def parseElifStatement(tokens): currentLine, block, remainingTokens = eatBlock(tokens, 3) return ElifStatement(*parseConditionAndBlock(currentLine, block)), remainingTokens def parseWhileLoop(tokens): currentLine, block, remainingTokens = eatBlock(tokens, 3) condition = parseTestCondition(currentLine[1]) blockObj = parseBlock(block) return WhileLoop(currentLine[0]['indent'], condition, blockObj), remainingTokens def parseDoLoop(tokens): currentLine, block, remainingTokens = eatBlock(tokens, 3) iterator = currentLine[1]['statement'] isIterator(currentLine[1]) blockObj = parseBlock(block) try: int(iterator) except ValueError, info: print info raise BadCommand, (currentLine[1], _('Argument for "%s" must be an integer, not %s' % (_('do'), iterator))) if int(iterator) < 1: raise BadCommand, (currentLine[1], _('Argument for "%s" must be greater than zero' % _('do'))) return DoLoop(currentLine[0]['indent'], iterator, blockObj), remainingTokens def parseDefine(tokens): currentLine, block, tokens = eatBlock(tokens, 3) name = currentLine[1] isName(name) global FUNCS if name['statement'] in FUNCS: raise DoubleDefinition, name FUNCS.append(name['statement']) blockObj = parseBlock(block) return Define(name['statement'], blockObj), tokens def parseProgram(tokens, ignore=None): for dict in tokens: if lookup_dict.has_key(dict['statement']): dict['statement'] = lookup_dict[dict['statement']] global FUNCS FUNCS = [] functions = [] while len(tokens): token = tokens[0] if token['statement'] == "define": blockObj, tokens = parseDefine(tokens) functions.append(blockObj) else: break block = parseBlock(tokens) return Program(functions, block) class Statement: def __init__(self, token): self.indent = token['indent'] self.statement = token['statement'] self.line = token['line'] class Cheat(Statement): def __init__(self, token): self.indent = token['indent'] self.statement = token['statement'] self.line = token['line'] class Block: def __init__(self, statements): self.statements = statements class TestCondition: def __init__(self, statement, line): self.statement = statement self.line = line class IfStatement: def __init__(self, indent, condition, block): self.indent = indent self.condition = condition self.block = block self.elifs = [] self.elseObj = None class ElifStatement(IfStatement): pass class WhileLoop: def __init__(self, indent, condition, block): self.indent = indent self.condition = condition self.block = block class DoLoop: def __init__(self, indent, iterator, block): self.indent = indent self.iterator = iterator self.block = block class Define: def __init__(self, name, block): self.name = name self.block = block class Program: def __init__(self, functions, block): self.functions = functions self.block = block #-- exception handling #import exceptions class ParseError(Exception): def __init__(self): raise 'abstract' def __str__(self): return self.__str__() class ParseEmptyFileException(ParseError): def __init__(self): pass def __str__(self): return _('Your program must have commands.') class BadCommand(ParseError): def __init__(self, token, msg=''): self.command = token['statement'] self.line = token['line'] self.msg = msg def __str__(self): return _("Line %i:\n%s") % (self.line+1, self.msg) class BadIterator(BadCommand): def __init__(self, token): self.command = token['statement'] self.line = token['line'] def __str__(self): return _("Line %i:\n%s") % (self.line+1, self.error()) def error(self): return _("Expected positive integer\nGot: %s") % self.command class IndentError(BadCommand): def __init__(self, token): self.command = token['statement'] self.line = token['line'] def __str__(self): return _("Line %i:\n%s") % (self.line+1, self.error()) def error(self): return _("Indentation error") class ExpectedBlock(BadCommand): def __init__(self, line): self.line = line def __str__(self): return _("Line %i:\n%s") % (self.line+1, self.error()) def error(self): return _("Expected code to be indented here") class LineTooShort(BadCommand): def __init__(self, token): self.command = token['statement'] self.line = token['line'] def __str__(self): return _("Line %i:\n%s") % (self.line+1, self.error()) def error(self): return _("'%s' statement is incomplete") % self.command class NoColon(BadCommand): def __init__(self, token): self.command = token['statement'] self.line = token['line'] def __str__(self): return _("Line %i:\n%s") % (self.line+1, self.error()) def error(self): return _("Expected '%s' statement to end in ':'") % self.command class BadStatement(BadCommand): def __init__(self, token): self.command = token['statement'] self.line = token['line'] def __str__(self): return _("Line %i:\n%s") % (self.line+1, self.error()) def error(self): return _('"%s" not defined') % (self.command) class BadTest(BadCommand): def __init__(self, token): self.command = token['statement'] self.line = token['line'] def __str__(self): return _("Line %i:\n%s") % (self.line+1, self.error()) def error(self): return _('"%s" is not a valid test') % (self.command) class BadName(BadCommand): def __init__(self, token): self.command = token['statement'] self.line = token['line'] def __str__(self): return _("Line %i:\n%s") % (self.line+1, self.error()) def error(self): return _('"%s" is not a valid name') % (self.command) class DoubleDefinition(BadCommand): def __init__(self, token): self.command = token['statement'] self.line = token['line'] def __str__(self): return _("Line %i:\n%s") % (self.line+1, self.error()) def error(self): return _('"%s" has already been defined') % (self.command) GvRng_4.4/activity/0000755000175000017500000000000011326063743013035 5ustar stasstasGvRng_4.4/activity/activity.info0000644000175000017500000000024611326063743015550 0ustar stasstas[Activity] name = Guido van Robot activity_version = 1 service_name = org.gvr.olpc.GvRng icon = activity-gvr class = start_activity.GvRngActivity show_launcher = yes GvRng_4.4/activity/activity-gvr.svg0000644000175000017500000000465011326063743016213 0ustar stasstas ]> image/svg+xml G GvRng_4.4/bitmaps/0000755000175000017500000000000011326063743012640 5ustar stasstasGvRng_4.4/bitmaps/robot.svg0000644000175000017500000000474011326063742014512 0ustar stasstas image/svg+xml G GvRng_4.4/bitmaps/gvrIcon-big.png0000644000175000017500000001245111326063742015516 0ustar stasstasPNG  IHDR9;"sRGBbKGD pHYs  ZtIME +AttEXtCommentCreated with The GIMPd%nIDATh՛Yp\י߹w @ ( SYV$[F$5Ը<~HRɛR!Tf*~TglOdDj Dkca{{ϗnR- 'UUe>!xM9ٹ[l UԫW8tQ9 P6q7iHgȬ Uc  67i Twl8a`(GsS &4;ۯۛ?<~Vϟ֪ۯ51T@@477xA +S2.+S2T}0C~!r}~{uK4Ed MamOBsǯ>o 2 lϾ~tY6sKK*fg l<^Tj5Bk8L hɼsaݼ߅/,833#o$R)}Fh,gsz/]($`oGْJ5Z&O_`y/=/*8ӿ},! bZ ډ+#B9&6A=Ɨʦ"3K#~ n BzN*Bl0=pS:uZi)Kc|}⩽-bx;@DH:H{$"ӟR_zY̿'N YXA:ҽtvw54>`{F!,K ش?s,N6V!w?^~^y꙽@; j 8$K5PhΎZ.!WVVJV%Yb |Lԝab/wJOr.66"~>n95A.iC k] N zg+L=Ր"vqd۷)EMx(D@Śu2h54E_e[Dc̼7I9_\?p_u}#~p*"+UWUqKoep@j[ɥeƧL|֤+:@ڬ+Qn=3Nr~Z3cl֫o5Ŧi3s{VkG);}L&D!HҖ;6XOJQ'W#O"@tGimO  {V Y^Is(:p{$_\+! `s]}?Mī\8qUpwM>ɧ*b­mѐ0Qaa)+\Z* Vq*.FYʶmtt顴T֎_''"Ȫ/?r~3aojswFA0}hJ!dAzhM1KOZJy^ƔlZmأ_Ou=;-}C.X 8~}sw /Gq#D"G18xїqYSO}{C" Ddp.PtkщrVr…-T^Jy^БݮZ]jt`ؘVMU%˳┭DJ,Dsc W]fz|PT p0gŗ^kv-q јJY3ceeU"B1?]9~kU_ZI*G-7Hj‰$*uD!P^Q:iTre.V# *TBɰ>8'v g`#m .Oe>ךs/lļcǹU\JwD(7B 7dUE-cwGJp]6*?gB^λo]`7vKD_<#Q`7sX^#\zjq~46,8/KIJ$eLíTI)/$;۳ t?@^SJ A4 H Æ]74L[=_@8"^>Җ3ݣ[cTױit%):=HDT%õ@96$? -yYX^x +h"aEhCt&z4cup'T:7~h"\`iz +':X|u<#.>}3<+E\YP@<$cHcղ`NQhCNT(R E\jP*5YT|vȻ;-f ks p N¹s]"[zqu盭Qǟh۾JWƄq0$YDbunnety"B@l3.a|0 R\PZXrwj+RIK8ûW~Zj =}b3,^)Wn:ofwڑWфAL9c=R['I'Pw eT]cxdkIj6UGruY[H^X2;{?m91lOɉS3 e>fDI[+wd%rj6A㇍c ƌFY,բ(يRHPį92M-Fsk+r b@ >]w9fJDK14&Q h9n4Z-Dff(kx6*57~./H-3P7^ttWO|(YFE{ %kkJqzƭNMQ2Ť-ҔIVMXTQUpT+n(D8"r"6ユγR~&ß<*kcc[̔IiI/UmĤkGQToTz& 7> sys.stderr, "in gvrparser locale switch:\n",info _ = gettext.gettext KEYWORDS = ( _('ROBOT'), _('WALL'), _('BEEPERS'), _('SIZE')) DIRECTIONS = (NORTH,SOUTH,EAST,WEST) ####################### Start I18N part ##################################### # Now we install a gettext file in the builtin namespace # If this fails the bogus '_()' function is used and we end up with a english - english # look-up table :-( # A possible solution would be to test for locales but i think it won't matter much in speed. _ = old_ #print _ # get a list with the translated strings trans_commands, org_commands = [],[] words = KEYWORDS for i in words: trans_commands.append(_(i)) org_commands.append(i) # this is the english one # With this we build a look-up dictionary that is used in the Program class. # The look-up dict: {'beweeg':'move','rechtsaf':turnright',....} # the keys are the gettext strings and the vals are the original names. lookup_dict = {} for k,v in map(None,trans_commands,org_commands): lookup_dict[k] = v lookup_dir_dict = {_('N'):'N',_('S'):'S',_('E'):'E',_('W'):'W'}# class WorldMapException(Exception): def __init__(self, line, str): self.line = line self.str = str def __str__(self): return self.str def checkDirection(line, dir): if dir not in lookup_dir_dict.values(): raise WorldMapException(line, _("In line %d:\n%s is not a valid direction -- use N, S, E, or W") % (line, dir)) def removeComment(line): foundComment = False for i in range(len(line)): if line[i] == "#": foundComment = True break if foundComment: return line[:i] else: return line def readWorld(lines, world): definedRobot = 0 useGuido = False linenumber = 0 worldSize = None for line in lines: linenumber += 1 try: if re.search("\S", line) and not re.match("\s*#", line): line = removeComment(line) tokens = line.split() tokens = [x.upper() for x in tokens] keyword = tokens[0] if lookup_dict.has_key(keyword): keyword = lookup_dict[keyword] if keyword == _('ROBOT') or keyword == 'ROBOT': if len(tokens) < 4: raise WorldMapException(linenumber,_('Robot direction argument missing')) dir = tokens[3] if lookup_dir_dict.has_key(dir): dir = lookup_dir_dict[dir] tokens[3] = dir else: print lookup_dir_dict.has_key(dir), lookup_dir_dict, dir raise WorldMapException(linenumber, _('No valid direction given for the robot')) if keyword ==_('WALL') or keyword == 'WALL': tokens[0] = keyword #print "wall",tokens checkDirection(linenumber, dir) #print "tokens",tokens if len(tokens) < 3: raise WorldMapException(linenumber,_('Too little %s arguments' % _('WALL'))) else: if len(tokens) == 5: try: int(tokens[4]) except ValueError: raise WorldMapException(linenumber, _('%s length argument must be an integer' % _('WALL'))) else: if int(tokens[4]) < 1: raise WorldMapException(linenumber,_('%s length argument must be greater than zero' % _('WALL'))) world.setWall(*tokens[1:]) elif keyword == _('ROBOT') or keyword == 'ROBOT': if definedRobot: raise WorldMapException(linenumber, _('You may only have one robot definition.')) definedRobot = 1 tokens = [x.upper() for x in tokens] if len(tokens) == 5: x, y, dir, numBeepers = tokens[1:] else: x, y, dir = tokens[1:] numBeepers = 0 robotX, robotY = int(x), int(y) world.positionRobot(robotX, robotY, dir) if numBeepers == "unlimited": world.unlimitedBeepers = True numBeepers = 0 world.setRobotBeepers(int(numBeepers)) elif keyword == _('BEEPERS') or keyword == 'BEEPERS': x, y, numBeepers = tokens[1:] world.setBeepers(int(x), int(y), int(numBeepers)) elif keyword == 'BDFL': useGuido = True elif keyword == _('SIZE') or keyword == 'SIZE': if worldSize: raise WorldMapException(linenumber, _('You may only have one size statement')) try: avenues, streets = [int(coord) for coord in tokens[1:]] except ValueError: raise WorldMapException(linenumber, _('Size statement should have 2 integers')) if avenues < 7 or streets < 7: raise WorldMapException(linenumber, _('Size coordinates must be at least 7')) worldSize = (avenues, streets) else: raise WorldMapException(linenumber,_("Cannot understand: %s") % line) except (WorldMapException, Exception),e: #trace_error() info = _("Error: %s\n in line %s: %s\nCheck your world file for syntax errors") % (e, linenumber,line) raise WorldMapException(linenumber, info) if not definedRobot: raise WorldMapException(linenumber, _("The world map seems to be missing information.")) world.useGuido = useGuido return worldSize GvRng_4.4/utils.py0000644000175000017500000002634311326063737012726 0ustar stasstas# -*- coding: utf-8 -*- # Copyright (c) 2007 Stas Zykiewicz # # utils.py # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # set this for XO or linux #platform = 'XO' platform = 'linux' import logging, imp module_logger = logging.getLogger("gvr.utils") module_logger.debug("platform is %s" % platform) import os,sys,traceback,gettext,locale,__builtin__,shutil,types,ConfigParser,atexit def get_rootdir(): """Returns the CWD of GvR""" if platform == 'XO': return os.getcwd() else: if (hasattr(sys, "frozen") or # new py2exe hasattr(sys, "importers") or # old py2exe imp.is_frozen("__main__")): # tools/freeze print os.path.dirname(sys.path[0]) print os.path.abspath(sys.path[0]) print sys.path[0] return os.path.dirname(sys.path[0]) else: return sys.path[0] if platform == 'XO': RCFILE = os.path.join(os.environ['SUGAR_ACTIVITY_ROOT'],'data','gvrngrc') PROGRAMSDIR = os.path.join(os.environ['SUGAR_ACTIVITY_ROOT'],'data','GvR') GTKSOURCEVIEWPATH = os.path.join(os.environ['SUGAR_ACTIVITY_ROOT'],'data','.gnome2/gtksourceview-1.0/language-specs') else: RCFILE = os.path.expanduser('~/.gvrngrc') PROGRAMSDIR = os.path.join(os.path.expanduser('~'),'GvR') GTKSOURCEVIEWPATH = os.path.join(os.path.expanduser('~'),'.gnome2/gtksourceview-1.0/language-specs') # Basic world description used as a fallback in case of an exception when loading # a world file from the editor window. NULL_WORLD = 'Robot 1 1 N 0' # will hold the locale set by set_locale() LANG_TRANS = '' LANG = '' # will be set by calling parseRcFile() RCDICT = {} # path to the frontend(s) etc # Intended to make packaging easier FRONTENDDIR = os.path.join(get_rootdir(),'gui-gtk') PIXMAPSDIR = os.path.join(get_rootdir(),'gui-gtk','pixmaps') LOCALEDIR = os.path.join(get_rootdir(),'locale') module_logger.debug("Constant paths:") module_logger.debug("RCFILE %s" % RCFILE) module_logger.debug("LOCALEDIR %s" % LOCALEDIR) module_logger.debug("FRONTENDDIR %s" % FRONTENDDIR) module_logger.debug("PIXMAPSDIR %s" % PIXMAPSDIR) module_logger.debug("PROGRAMSDIR %s" % PROGRAMSDIR) module_logger.debug("GTKSOURCEVIEWPATH %s" % GTKSOURCEVIEWPATH) gvrrcHeader = """ # Configuration file for GvRng, Guido van Robot Next Generation. # You can set the language GvRng will use. # # Possible languages are: # system > Use the systems default language, this defaults to English when the # systems language is not supported. # # The language is specified by given the locale for that language, so for # Dutch one should do: lang=nl_NL@euro # You can only give valid locales. A valid locale is a locmodule_logger.debug("Start setUpUnixRC")ale you have # configured properly on your system. # For example; you do this, lang=nl_NL@euro, but your system only has a locale # nl_NL. In this case you will see a error message (stderr) and the GUI would # be mostly be in English. # # These are examples of locales, the languages are the ones that are currently # supported by gvrng # # nl_NL@euro > Dutch # ca_Es@euro > Catalan # fr_FR@euro > French # ro_RO.utf8 > Romanian # nb_NO > Norwegian bokmal # de_DE@euro > German # es_ES@euro > Spanish """ GVRREDIRECT = 1# redirect stderr and stdout to files (see out.py) # This redirecting of streams is only used on the non-linux platforms # to capture messages from the app when running in a console-less way. # (mainly .exe) if os.name == 'nt' and GVRREDIRECT: try: import out except ImportError,info: print >> sys.stderr,info else: print >> sys.stderr,"Redirect sys.stderr" print "Redirect sys.stdout" def get_locale(): """Get the systems locale. This can be different from the locale used by gvr.(see set_locale())""" if LANG: # we use the language set by set_locale return LANG try: lang = '' # FIX locale.py LANGUAGE parsing bug, the fix was added on the # upstream CVS on the 1.28.4.2 revision of 'locale.py', It # should be included on Python 2.4.2. if os.environ.has_key('LANGUAGE'): lang = os.environ['LANGUAGE'].split(':')[0] # This makes sure that we never return a value of None. # This is a fix for systems that set LANGUAGE to ''. if lang == '': lang = locale.getdefaultlocale()[0] except Exception,info: if 'en' in lang: pass else: module_logger.exception("Error in setting the locale, switching to English") lang = 'en' return lang def set_locale(lang=None): """Set the locale to be used by gvr. It will first check th rc file and then the systems locale. It uses English (en) as the fallback locale. It will also set a global constant holding the locale used called LANG_TRANS.""" module_logger.debug("set_locale called with %s" % lang) global LANG_TRANS,LANG,LOC lang_trans = 'en' txt = "" try: # "system" is/can be used to signal that the sysytem locale should be used # from a config file, see also gvrrc if not lang or lang == '' or lang == 'system': lang = get_locale() if lang == 'en': __builtin__.__dict__['_'] = lambda x:x return ("","en") languages = [ lang ] if os.environ.has_key('LANGUAGE'): languages += os.environ['LANGUAGE'].split(':') module_logger.debug("languages found are %s" % languages) lang_trans = gettext.translation('gvrng',\ localedir=LOCALEDIR,\ languages=languages) __builtin__.__dict__['_'] = lang_trans.ugettext # seems this is the only way to get glade to use the locale setting module_logger.debug("Set env var LANGUAGE to %s" % lang) os.environ['LANGUAGE'] = lang except Exception,info: txt="" if lang and lang.split('@')[0].split('.')[0].split('_')[0] != 'en': module_logger.exception("Cannot set language to '%s' \n switching to English" % lang) __builtin__.__dict__['_'] = lambda x:x return (txt,"en") LANG_TRANS = lang_trans LANG = lang return ("",lang) def trace_error(file=sys.stderr): """ Print a stack trace useful for debugging""" print >> file, '*'*60 info = sys.exc_info() traceback.print_exception(info[0],info[1],info[2],file) print >> file,' Please send a bug report with this stuff to,\n stas.zytkiewicz@gmail.com' print >> file,'*'*60 def isOsX(): if os.name == 'posix' and os.uname()[0] == 'Darwin': return 1 return 0 def setUpUnixRC(): module_logger.debug("Start setUpUnixRC") if not os.path.exists(RCFILE): src = os.path.join(get_rootdir(),'gvrngrc') try: shutil.copy(src,RCFILE) except Exception,info: module_logger.exception("Error in setting user files") if not os.path.exists(PROGRAMSDIR): shutil.copytree(os.path.join(get_rootdir(),'gvr_progs'),PROGRAMSDIR) # gtksourceview2 is now available on the XO, hooray :-) dest = GTKSOURCEVIEWPATH if not os.path.exists(dest): os.makedirs(dest) if not os.path.exists(os.path.join(dest,'gvr_en.lang')): # we assume that the other language files also don't exists import glob src = os.path.join(get_rootdir(),'po') files = glob.glob(src+'/*.lang') module_logger.debug("found language files: %s" % files) for file in files: langdest = os.path.join(dest,os.path.basename(file)) module_logger.debug("copy %s to %s" % (file,langdest)) shutil.copy(file,langdest) def load_file(path): """Loads a file and returns the contents as a list of strings. Returns a empty list on faillure.""" try: f = open(path,'r') txt = f.readlines() f.close() except IOError: module_logger.exception("Failed to load file") return [] else: return txt def save_file(path,content): """Saves the content to the given path. Return None on success and en error text on faillure. @content must be a list of strings.""" try: f = open(path,'w') f.write('\n'.join(content)) f.close() except Exception,info: trace_error() return (_("Failed to save the file.\n")+str(info)) else: return None def setRcEntry(option,value): try: cp = ConfigParser.ConfigParser() cp.read(RCFILE) cp.set("default", option,value) rcfile = open(RCFILE,'w') rcfile.write(gvrrcHeader) cp.write(rcfile) rcfile.close() except Exception,info: txt = "Failed to write the configuration to disk.\n" print >> sys.stderr,txt,info return txt else: txt = _("Written the new configuration to disk\nYou have to restart GvRng to see the effect") print txt return txt def parseRcFile(): """parse and return rcfile entries in a dict""" global RCDICT rc_d,rc_p = {},{} try: cp = ConfigParser.SafeConfigParser() cp.read(RCFILE) for k,v in cp.items("default"): rc_d[k] = v for k,v in cp.items("printer_options"): rc_p[k] = v except Exception,info: print >> sys.stderr,info,"Setting language and printer to defaults." print "=========================================================" print "The configuration file used by GnRng is changed." print "You should remove %s and restart GvRng." % os.path.expanduser('~/.gvrngrc') print "A new configuration will be installed in your home directory" print "=========================================================" rc_d['lang'] = 'system' rc_d['printer'] = 'lp' rc_d['intro'] = 'yes' # we also set them as globals. objects can do utils.PRINTERCMD to get them. RCDICT = {'default':rc_d,'printer_options':rc_p} return RCDICT def send_to_printer(path): """This will send file @path to a printer by using the command and options from the gvrngrc file.""" print 'RCDICT',RCDICT opts = [] try: cmd = RCDICT['default']['printercmd'] if 'lp' in cmd: for k,v in RCDICT['printer_options'].items(): opts.append(' -o %s=%s' % (k,v)) cmd = cmd + ''.join(opts)+' '+path except Exception,info: print info return module_logger.debug("printer cmd %s" % cmd) try: os.system(cmd) except Exception,info: print info GvRng_4.4/cheat.py0000644000175000017500000000054611326063737012647 0ustar stasstasclass Cheat: def __call__(self, command, robot): if command == 'makebeeper': robot.world.robotBeepers += 1 elif command == 'breakpoint': robot.gui.breakpoint() elif command in robot.gui.SleepDict.keys(): robot.gui.setSpeed(command) else: print 'unrecognized cheat', command GvRng_4.4/stepper.py0000644000175000017500000001170611326063737013245 0ustar stasstas''' Stepper.step steps through one instruction of a GvR program at a time, and then it calls back into your world object to actually do MOVE(), TURNLEFT(), etc. Read TESTstepper.py to grok this. ''' import translate,sys class OutOfInstructionsException(Exception): def __str__(self): return 'Out of instructions' class InfiniteLoopException(Exception): pass class StackFrame: def __init__(self, block): self.whichStatement = -1 self.block = block def nextLineOfCode(self, world): self.whichStatement += 1 if self.whichStatement < len(self.block.statements): return self.block.statements[self.whichStatement] def currLine(obj): curr = obj.block.statements[obj.whichStatement] if getBlockFrame(curr): return '' else: lnum = str(curr.line+1).rjust(3) stat = str(curr.statement) return ' '+lnum+' '+stat+'\n' def atEndOfBlock(obj): return obj.whichStatement >= len(obj.block.statements) def atNewBlock(obj): return obj.whichStatement == 0 def checkCondition(obj, world): methodInWorldClass = getattr(world, obj.condition.statement) return methodInWorldClass() def getBlockFrame(block): blockFrames = { 'DoLoop': DoLoop, 'WhileLoop': WhileLoop, 'IfStatement': IfStatement } return blockFrames.get(block.__class__.__name__,None) class DoLoop: def __init__(self, doLoop): self.whichLoop = 0 self.whichStatement = -1 self.block = doLoop.block self.iterations = int(doLoop.iterator) def nextLineOfCode(self, world): self.whichStatement += 1 if atEndOfBlock(self): self.whichStatement = 0 self.whichLoop += 1 if self.whichLoop < self.iterations: return self.block.statements[self.whichStatement] class WhileLoop: def __init__(self, whileLoop): self.whichStatement = -1 self.block = whileLoop.block self.whileLoop = whileLoop def nextLineOfCode(self, world): self.whichStatement += 1 if atEndOfBlock(self): self.whichStatement = 0 if atNewBlock(self): if not checkCondition(self.whileLoop, world): return return self.block.statements[self.whichStatement] class IfStatement: def __init__(self, ifStatement): self.whichStatement = -1 self.ifStatement = ifStatement self.conditionalBlocks = [ifStatement] + ifStatement.elifs self.block = None def nextLineOfCode(self, world): self.whichStatement += 1 if atNewBlock(self): for conditionalBlock in self.conditionalBlocks: if checkCondition(conditionalBlock, world): self.block = conditionalBlock.block break if not self.block: if self.ifStatement.elseObj: self.block = self.ifStatement.elseObj else: return if atEndOfBlock(self): return return self.block.statements[self.whichStatement] class Stepper: def __init__(self, gvr, world, debugger=None): tree = translate.gvrToSyntaxTree(gvr) self.world = world self.stack = [StackFrame(tree.block)] self.funcs = {} for func in tree.functions: self.funcs[func.name] = func self.debugger = debugger self.infinite_count = 0 def step(self): self.infinite_count +=1 if self.infinite_count > 9586: v = self.infinite_count self.infinite_count = 0 raise InfiniteLoopException,v lineOfCode = self.nextLineOfCode() blockFrame = getBlockFrame(lineOfCode) if blockFrame: self.enterBlock(blockFrame(lineOfCode)) return command = lineOfCode.statement if self.funcs.has_key(command): self.enterUserDefinedMethod(command) return if self.debugger: self.debugger.setLine(lineOfCode.line) if lineOfCode.__class__.__name__ == 'Cheat': self.world.cheat(lineOfCode.statement) else: self.doPrimitive(command) def doPrimitive(self, command): methodInWorldClass = getattr(self.world, command.upper()) methodInWorldClass() def enterBlock(self, stackFrame): self.stack.append(stackFrame) self.step() def enterUserDefinedMethod(self, command): self.enterBlock(StackFrame(self.funcs[command].block)) def stackTrace(self): trace = 'Line Statement\n' for frame in self.stack: trace += currLine(frame) return trace def nextLineOfCode(self): if len(self.stack): lineOfCode = self.stack[-1].nextLineOfCode(self.world) if lineOfCode: return lineOfCode else: self.stack.pop() return self.nextLineOfCode() else: raise OutOfInstructionsException GvRng_4.4/GPL-20000644000175000017500000004363411326063737011722 0ustar stasstas GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License. GvRng_4.4/start_activity.py0000644000175000017500000000273311326063737014634 0ustar stasstas# -*- coding: utf-8 -*- # Copyright (c) 2007 Stas Zykiewicz # # start_activity.py # This program is free software; you can redistribute it and/or # modify it under the terms of version 2 of the GNU General Public License # as published by the Free Software Foundation. A copy of this license should # be included in the file GPL-2. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import logging logging.getLogger('').setLevel(logging.DEBUG) from sugar.activity import activity import gtk try: import gvrng except: logging.getLogger('start_activity').exception("Error importing gvrng") class GvRngActivity(activity.Activity): """Start gvrng from Sugar""" def __init__(self, handle): activity.Activity.__init__(self,handle) self.logger = logging.getLogger("GvRngActivity") self.logger.debug("Start gvrng") # Start SP try: gvrng.main(handle=handle,parent=self) except: self.logger.exception("Error starting gvrng") self.close() GvRng_4.4/Changelog0000644000175000017500000001402211326063737013015 0ustar stasstasgvr-xo (4.4) * Bugfix release. * Fixed the issue that an extra line is inserted when a beeper is placed in wbuilder. gvr_xo (4.3) * Bugfix release. * Fixed bug that prevented the beepers to be drawn correctly when moving the robot. * Added a check to save the editor content when openening a new editor. gvr_xo (4.2) * Fixed bug #2517392 No auto indent. * Fixed a bug in the worldbuilder where manual alterations in the world editor made the worldbuilder lost sync. * Removed in the GUI, 'set language' from the 'set' menu. * Fixed GUI resize bug which prevented the 'world' screen to resize. * Added proper extension to saved files when the user doesn't add an extension to the name. * Fixed bug that allowed the number of beepers set to negative in worldbuilder. * Added the possibility to remove a beeper by giving a zero as beeper value in the beeper dialog. * Set the entry widget in the beepers dialog to grab the focus. * Updated the help text for the worldbuilder. * Added syntax check for missing robot direction argument. * Added better syntax error reporting. * Greatly improved the error reporting to the user. * Added check for wall length argument. * Added a warning dialog when the user gives a value less than zero in the beeper dialog. * Fixed a bug which prevented the statusbar to be updated on beeper actions. * Fixed bug in the wbuilder that caused manually deleted worldfile items to reappear on a reload action. gvr_xo (4.1) * Fixed: 2456178 Gvr don't return to "main map" from "open worldbuilder" gvr_xo (4.0) * New release. * Redesigned the layout of the editors. They are now placed in a notebook widget to get more space for the code editor. Also the editors can now be resized independently * Fixed the bug which prevented a new code editor window to be opened. gvr_xo (3.5) * Bugfix release. * Changed the dimensions of the code editor to get more space. gvr_xo (3.4) * Bugfix release. * Fixed language support bug in the gvr language: Changed the way the translations tables are constructed as it seems that later Python version (2.5?) has an gettext that behaves a bit differently. The fix was tested on Python 2.4 and 2.5. * Fixed a crash on XO 767. This was caused by yet another gtksourceview API change in the olpc gtksourceview module. gvr_xo (3.3.2) * Fixed some i18n issues. * Minor bugfixes. gvr_xo (3.3) * Fixed problem that no new editor was created when using menu > new (Only on XO). * Fixed problem that prevented loading of files from disk (Only on XO) * Fixed localization problems in worldbuilder. * Fixed the drawing routines in the worldbuilder so that the drawing is almost instant. * Added Dutch introduction text gvr_xo (3.2) * Fixed bug in the worldbuilder which prevented the builder to start on XO. * Fixed caps problem in Dutch localization which prevented syntax highlighting in the worldbuilder. gvr_xo (3.1) * Fixed bug in the GTK version which leads to a crash. gvr_xo (3.0) * Set intro tab as current page when gvr is started the first time. * Applied patch from Sergio: Loading default lessons. * Fixed localization bug which prevented the GUI from being localized * Updated Dutch translation. * Added Czech localization. * Fixed HTML syntax errors in the English lessons. * Fixed syntax highlighting in gtksourceview version 1 and 2. * Fixed GUI layout. * Added support for gtksourceview 1 and 2 and the version that's on the XO gvr_xo(2.9) * Fixed multiple bugs in the way the various parts are drawn in the "world" canvas. * Make the drawing of the robot and beepers "pixel perfect". * Make the statusbar update properly. * Moved the world image to the left to get a slithly larger world. * Many bug fixes in the worldbuilder which is now useable. * Changed the color combinations used in worldbuilder to make it differ from the normal world. * Added a introduction tab with a short text. * Set the reference and intro tab to non-editable. gvr_xo (2.8) * forcing an expose event so that the canvas is updated when beepers are drawn. * Fixed multiple bugs in the worldbuilder. * Fixed bugs in the logic when users cancel save operations. gvr_xo (2.7.2) * Bugfix release. * Fixed wrong activity.close call in the exception catch gvr_xo (2.7.1) * Fixed paths related to the lessons. * Added a catch all exception catch which will close the activity to prevent a stale application. * Set logging level to debug. gvr_xo (2.7) * Added window icon. * Redesigned the way gettext po files are created to make it easier for translators to translated all the strings in the python files and the Glade file. * Removed gtksourceview editor as XO doesn't seems to include it. gvr_xo (2.6) * Fixed some small bugs * Embed hulahop.webview as the lessons viewer. * Added simple navigating toolbar to the webview tab. * Added the lessons. * Removed the language reference menu option as we now use notebook tabs. * Non_XO: Removed lessons notebook tab. gvr_xo (2.5) * Removing print and other debugging stuff and replacing it with Python logging module. * Using gtksourceview iso our own editors. * Intergrate into Sugar with toolbox etc. * Using a notebook layout for the world, reference and lessons. (Lessons not yet available) gvr-xo (2.4) *Updating to latest Sugar. gvr-xo (2.3) * Fixed localization bug in the gtk parts. * Cleanedup some error messages. gvr-xo (2.2) * Name change. GvRng-XO (2.1) * Fixed bug: 'utils.set_locale' is called twice. * Fixed bug: When editing file from scratch the buttons aren't activated. * Fixed bug: When reload button is hit the world isn't redrawn until next expose event. GvRng-XO (2.0) * Initial release. GvRng_4.4/translate.py0000644000175000017500000000131211326063737013550 0ustar stasstas# see INFO for license import build import gvrparser import re def stripComments(program): return [line.split("#")[0].replace(':', ' : ') for line in program.splitlines()] def getTokens(lines): return [ { 'statement' : word, 'line' : idx, 'indent': len(lines[idx])-len(lines[idx].lstrip()) } for idx in range(len(lines)) for word in lines[idx].split() ] def gvrToSyntaxTree(gvr): if not re.search('\S', gvr): raise gvrparser.ParseEmptyFileException() return gvrparser.parseProgram(getTokens(stripComments(gvr))) def gvrToPython(gvr): return build.buildProgram(gvrToSyntaxTree(gvr)) GvRng_4.4/GvrController.py0000644000175000017500000001505011326063737014361 0ustar stasstas# -*- coding: utf-8 -*- # Copyright (c) 2007 Stas Zykiewicz # # GvrController.py # This program is free software; you can redistribute it and/or # modify it under the terms of version 3 of the GNU General Public License # as published by the Free Software Foundation. A copy of this license should # be included in the file GPL-3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """ This is a controller from a MVC pattern and 'talks' to GvrModel and a view. """ import sys,time from utils import trace_error import logging class Controller: """This is the controller (mvc). It controls GvrModel.py and a view, the view can be any module which provides the methods marked 'View' in the file describing this controller. This file is called 'Guidelines_for_View.txt'. You should look at this file if you are planning a different view. Also be sure to check the 'Guidelines_for_main.txt' on how to start these modules.(yet to be written) """ def __init__(self,model,view): """Get a reference to the model and view objects. The controller uses these to call their methods. All controller methods return False on faillure, anything else means success.""" self.logger = logging.getLogger("gvr.GvrController.Controller") self.View = view self.Model = model def start_view(self,*args): """This ask the view to build/start it's GUI. The view must start an eventloop of some sort otherwise the controller stops here.""" self.logger.debug("start view") self.View.start(args) return True def quit(self): """Stops the view and the model by calling their 'stop' methods. Then wait for one second to let every procces stop and return to the 'main' from where were started.""" try: self.logger.debug("Stopping Guido van Robot...") self.View.stop() except: trace_error() pass try: self.Model.stop() time.sleep(1) self.logger.debug("Done") except: self.logger.exception("Failed to quit properly") pass return True ### View callbacks def on_button_execute(self): """Called by the view when the execute button is pressed. This will call model.on_code_execute(). The model looks for world and program code by calling c.get_*win_text. The model also calls c.give_error in case of an error.""" #self.View.statusbar.set_mesg("Button 'Execute' pressed")# for testing only self.logger.debug("button execute") self.Model.on_code_execute() return True def on_button_reload(self,worldcode): """Called by the view when the reload button is pressed. This will call model.on_world_reload(). The model will notify the controller.world_state_changed method or call c.give_error on any error.""" self.logger.debug("button reload") self.Model.on_world_reload(worldcode) return True def on_button_step(self): """Called by the view when the step button is pressed. This will call model.on_button_step().""" self.logger.debug("button step") self.Model.wakeUp() return True def on_button_abort(self): """Called by the view when the abort button is pressed. This will call model.on_abort().""" self.logger.debug("button abort") self.Model.stopRobot() return True def get_robot_position(self): """Called by the view Return the position of the robot in the logic world as a tuple or None""" #self.logger.debug("get_robot_position") return self.Model.get_position() def get_robot_beepers(self): """Called by the view. Returns the number of beepers the robot is carrying as integer or None.""" #self.logger.debug("get_robot_beepers") return self.Model.get_beepers() ## Model callbacks def get_worldwin_text(self):# XXX not sure we need this """Called by the model and controller. This will call View.worldwin_gettext().""" txt = self.View.worldwin_gettext() if txt: return txt else: return '' def get_codewin_text(self): """Called by the model. This will call View.codewin_gettext().""" txt = self.View.codewin_gettext() if txt: return txt else: return '' def setLine(self,line): """Called by the stepper as the model passes this object""" self.View.highlight_line_code_editor(line) def get_timer(self): return self.View.get_timer() def get_timer_interval(self): return self.View.get_timer_interval() def give_warning(self,txt): """Called by the model. This will call View.show_warning(txt).""" self.View.show_warning(txt) return True def give_error(self,txt): """Called by the model. This will call View.show_error(txt).""" self.View.show_error(txt) return True def give_info(self,txt): """Called by the model. This will call View.show_info(txt).""" self.View.show_info(txt) return True def world_state_changed(self,obj): """Called by the model. This will inform the view that the state of the world is changed. (robot is moved) This will call View.update_world(obj) @obj is a gvr logical world object""" #self.logger.debug("world_state_changed called") self.View.update_world(obj) return True def world_robot_state_changed(self,obj,oldcoords=None): """Called by the model from updateWorldBitmapAfterMove when stepper stepped""" #self.logger.debug("world_robot_state_changed called") self.View.update_robot_world(obj,oldcoords) return True def world_beepers_state_changed(self,obj): """Idem as world_robot_state_changed""" #self.logger.debug("world_beepers_state_changed called") self.View.update_beepers_world(obj) return True GvRng_4.4/gvrngrc0000644000175000017500000000341411326063737012601 0ustar stasstas # Configuration file for GvRng, Guido van Robot Next Generation. # You can set the language and the printer GvRng will use. # # Possible languages are: # system > Use the systems default language, this defaults to English when the # systems language is not supported. # # The language is specified by given the locale for that language, so for # Dutch one should do: lang=nl_NL@euro # You can only give valid locales. A valid locale is a locale you have # configured properly on your system. # For example; you do this, lang=nl_NL@euro, but your system only has a locale # nl_NL. In this case you will see a error message (stderr) and the GUI would # be mostly be in English. # # These are examples of locales, the languages are the ones that are currently # supported by gvrng # # nl_NL@euro > Dutch # ca_Es@euro > Catalan # fr_FR@euro > French # ro_RO.utf8 > Romanian # nb_NO > Norwegian bokmal # de_DE@euro > German # es_ES@euro > Spanish # Printer commands you can use as the value for the 'printercmd' option. # For example, you have a Cups printer locally called Epson-Stylus. # The command should be: lp -d Epson-Stylus # For a remote Cups printer : lp -h myprinters.com -d Epson-Stylus # A local default Cups printer: lp # # Expert information # The printer command is called like this 'printercmd filename' # So besides a printer command you can use a2ps, enscript etc. [default] # locale to use lang = system # printer command to use printercmd = lp # show intro text? intro = yes [printer_options] # The next values are used to format the page in cups. # They only used when printer=lp # See also the cups manual # chars per inch cpi=12 # lines per inch lpi=6 # margins used in points. 50 is 50/72 inch or 1,75 cm page-left=50 page-top=30 page-bottom=50 page-right=50 GvRng_4.4/docs/0000755000175000017500000000000011326063743012131 5ustar stasstasGvRng_4.4/docs/Summary-en.txt0000644000175000017500000000474111326063740014732 0ustar stasstasGuido van Robot Programming Summary The Five Primitive Guido van Robot Instructions: 1. move 2. turnleft 3. pickbeeper 4. putbeeper 5. turnoff Block Structuring Each Guido van Robot instruction must be on a separate line. A sequence of Guido van Robot instructions can be treated as a single instruction by indenting the same number of spaces. refers to any of the five primitive instructions above, the conditional branching or iteration instructions below, or a user defined instruction. ... Conditionals GvR has eighteen built-in tests that are divided into three groups: the first six are wall tests, the next four are beeper tests, and the last eight are compass tests: 1. front_is_clear 2. front_is_blocked 3. left_is_clear 4. left_is_blocked 5. right_is_clear 6. right_is_blocked 7. next_to_a_beeper 8. not_next_to_a_beeper 9. any_beepers_in_beeper_bag 10. no_beepers_in_beeper_bag 11. facing_north 12. not_facing_north 13. facing_south 14. not_facing_south 15. facing_east 16. not_facing_east 17. facing_west 18. not_facing_west Conditional Branching Conditional branching refers to the ability of a program to alter it's flow of execution based on the result of the evaluation of a conditional. The three types of conditional branching instructions in Guido van Robot are if and if/else and if/elif/else. refers to one of the eighteen conditionals above. if : if : else: if : elif : ... elif : else: Iteration Iteration refers to the ability of a program to repeate an instruction (or block of instructions) over and over until some condition is met. The two types of iteration instructions are the do and while instructions. must be an integer greater than 0. do : while : Defining a New Instruction: New instructions can be created for Guido van Robot using the define statement. can be any sequence of letters or digits as long as it begins with a letter and is not already used as an instruction. Letters for Guido van Robot are A..Z, a..z, and the underscore (_) character. Guido van Robot is case sensitive, so TurnRight, turnright, and turnRight are all different names. define : GvRng_4.4/docs/lessons/0000755000175000017500000000000011326063743013617 5ustar stasstasGvRng_4.4/docs/lessons/en/0000755000175000017500000000000011326063743014221 5ustar stasstasGvRng_4.4/docs/lessons/en/html/0000755000175000017500000000000011326063743015165 5ustar stasstasGvRng_4.4/docs/lessons/en/html/16.html0000644000175000017500000000510011326063740016272 0ustar stasstas Lunchbox

Lunchbox

Project

Congratulations! If you are here, you are probably ahead of most of your classmates, and have done an excellent job programming Guido. Your classmates need a little more time to catch up, and you are ready for an extra challenge.

As you begin this project, you may want to go back and re-read the Overview from Step 15, about planning your work on paper before coding it. I'll help you out with the algorithm, but I suggest that you pseudocode it and walk through it in your head before writing your program.

Assignment

Guido has lost his lunchbox. He was playing in a maze and set it down and then wandered around. Now he is hungry. Luckily he left a beeper in his lunchbox. His situation looks like this:

Step 16 image

Write a program to help Guido find his lunchbox. The secret is to have Guido follow along the right edge of the maze, turning right if he can, or straight ahead if he can't, or turning left as a last resort. Write a program using an if..elif..else statement so Guido can eat his lunch.

By the way, if you think you've solved this problem before, you are right ;-)

Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/07_files/0000755000175000017500000000000011326063743016575 5ustar stasstasGvRng_4.4/docs/lessons/en/html/07_files/send-banner.gif0000644000175000017500000000010011326063740021444 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/07_files/sflogo.png0000644000175000017500000000546511326063740020603 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/07_files/step07b.png0000644000175000017500000002253711326063740020575 0ustar stasstasPNG  IHDRp2 zgAMA a8tEXtSoftwareXV Version 3.10a Rev: 12/29/94 (PNG patch 1.2).I IDATx_lw?$57) @ o \$4Pd_z U~TtnԻsU%ҋܛR[ZBvE IlivmMlDZ= yvG(ZgyϾ3XʥQ?wX<ҭԶF?C PJ,RJ9jcc+WR|IA/_,L׀JHA-=R)x<Ʀ-pDD'''?,#p{`U?Q_Gyij7ͧ~_d+E/oڴ+u">;,}gr^3uR[o?Xꫯ*~ /^㓓er->l7FQW׿vWTTz뭏>h$y˲rOxjjj~~~Ν~s}>[s[)~鮗ģ2uNCOO\v)=󟧧_~M7=۷owco[ZZzG޴5n۶M)}SN-,,cnlڴ)JW?wА(Cej|!#[;Jjg>t)WWWR.ɓ'ݻw꫋mwO?~Z]]ݳg;]?;ö>讻ZYYپ}޽{_k :C̅X,k׮x<|%Sׯ_?ym;w\3gF"gϾO}ĉ{۷o>{+Wfff뮆vvveeoqXYYo?Cϴ?vcLee]vgYƍJ)˲nԝ eB|Lyo+7Tԁ^{5ƒ]ٳbuuUL$R?Ag>ORUUUίVWWoquuUO?Գu˲v9:::>>~o?>z7|U7lP]]ZQQvoww}իzQd6lPQQQ]]ZZZ%Rͺx^Ϟ=;22v͖;#{4۶3f[jTJ8x`Ӝu8pO YtSN677777+ׯ_w %jee|UUM6)IO>wỹ>hv<}<_d[$ijj>w܉'5m{qqQ)O~M@9fW_0_ik8p uyz'_u`]=SSSsssHreeYz~~رcϟw/wGۺuٳg{wywxaTKKKֿ/mڴ?hnnvތWUU(Ο?|%?c.\b[lɞʥKk}5555 dr6lȴ 5ee? 'TJn7(^|E;3=̲Bmm'nmm&''O>}̙M6mݺUnmmm~>:~xUUg{mMLL\|{x^o}ɕ={dx…H${nM7455u̙ 6y睓W^ݵk{'Np2qY\\+++oG}&m2Ǐ_^^|wZQQ%ꉉ_;w [TVV^x1ʻwnhhҘlWfJ}M>7LK}:}pʕ[nO@ t+rW5N47ҒiA z+VRNRmOMM4%L788yĉW:%€ *h u4rhi9ܖgdYɬkQ2Z{rr2DžEPf# N8Jٮ~ d^gy7OsMݮ_v3%(ߨ[Y5GYޣf,O@65sV)#Akng} ݜ"_гgUaֺv.].y1i.P*ScR i|*)_%4qs9GG.>S*PK> Z3bN*\kn8Pݗ-KB;&^l"v>]Z용f4TP Uڹ*)LW 4g!GwњX@9ȵ%89'B?|@C@ 4TPf3g0K/TӞ%?[d ua`:ebO>yܹscʅ ]oJZ]]ZZZ*={`˖-IQY%pEh;>j;\-NOS%pEPʍ㭭Jmx"p/D"gL&cغK>aLwz̙7|wxxx```xx7#M.=5Lx{{{WWs۶m;;;=-9o===;߿gϞCٳÉDhphhhbbD" ڤadr޽"|jmm=r~vرvOi'LGG\\CF333%?x1G3BM&H$tvv"R*bOq.u"PX2|cXCCdnnn[ZZ^\\tӏΜ99111>>~%dzzڽΥK{L[NRP{zz:::bX2LN2dWW>}~b<+겗i'Fp^EVo744 555mz[߿```llccc333555sssO>~VWWF_y7|s||\oeiiiϞ={~{O-bRJ7BΞh4\j՗];::޽{u;-$Gn}-V)eYeY(']{Ŏ9F {;)8=R慨nwgS۔.b#YgFRss^uG>cǎd2sΚCn:;;{;v:tHvzzډgϞ}YWWwX,}FssP$ٱcO<׿T#ԞTSSSggg{<ׯǎQ7ή&n'!wwwmmmm۶mgm۶&+[[LgtJN:;Iȑ#S FΌ$=ϲ,2͍^F.^X__Bݷo_"pG)Um"=M`jHD6"pJvH$2MJWz?o52B+uiiɹr9<\uo,*/QҧSwH4Uf~@^tihh(7% 7<<&xD"l޼Y7!=ݷo{711100?c=z4ӛ7ov}stQ'Bl}-|L&{zzttY^~DOD"tuu髆^Yݛil1nǎSJ9s=(e=mYݭpzu===x 3 43gP倏̷ Y> 3 43gP倆 ͸/ܯniީY>.UC 2@3C }VU>j1MvJ[)BJJP }2Se!%UC 2@3C }VUh202sY>Ї =&% *| >P"3TPG "E(BԆ Qh sMfBP" ,_/ &E(BgP0 4T]C|5|wE5Fff%JUI@AD5.ff%JUI@Y]rެe_Lff%JUI@q#To!Cmv`V3dfff%ɪ$B_`!5Tw,+L=5q7'f03+AfhfV,J"k~c>3ff%JUI@YP y 55𲼙Y 2@3dfdU/$Gc 4Rff%JUI@qL1X&Rff%JUI@Y4\y 3 43+AfHV%1) 4TPk9P"E(:B|1i"E(B6TBC@ Amk~6P"?Tg ~i0E(BP>Cu Qh @eY%R̬YY 2@*(H* Sׄ욙 3 43+AfHV%eI )y`}1 3 43+AfHV%q u !eYF΃Xff%JUIBka nj13dfff%ɪ$B_,85w ff%JUI@Y2|ЏVH-}ݶӼS+q3dfff%ɪ$B_`! 4픶Rff%JUI@qPsz`pH 3 43+AfHV%ePseadfV,̬Y YD ; *| >P"3TPG/cL"E(BԆ Qh sMfBP" ,_/ &E(BgP0 4TH^Cu>[*e=J 3 $}eYNu?{p]3dfff%ɪ$B_,S!nyf}1 3 43+AfHV% lF Ssu)l$ 3 43+AfHV% AxRm۶mbY91Y 2@3dfdU/PXC ̓ff%JUI@YP 6)}4L5𲼙Y 2@3dfdU/$Gc 4Rff%JUI@qL1X&Rff%JUI@Y4\y 3 43+AfHV%1) 4TPk9P"E(:B|1i"E(B6TBC@ Amk~6P"?Tg ~i0E(BP>Cu Qh @j(o00FY> 3 43gP'P-rq8Sׄ fP,PBUCS!nyf}1 fP,PBUC k!:e}v9Jx` fP,PBUCn @$jo }(Afhf(A*ʁXC q7UNl*Y>Ї*| Ѥ_}ݶӼSJ7}\0ЇdffB|H~lM* Ni+!%UC 2@3C }VU&|bJ=L8 }(Afhf(A* 5WfFf>03 3 43gPǤ$P@C@@ ~JP"E(:B8#E(BPEԆ Qh sMfBP" ,_o &E(BgP0 `:˲|8h`0 7TKsmc۪ؤ$3 N;Olw@:e)j?6(+V\ 2) nUIVi }V8 K0TTKϗ%=J?% 3V,2%꾡IDATg3SuSBuێ 7/,Ps\XPn&P AQMBDiڶm]ahha/Сd/甯8?d ԇhRA`>q璆OAjYGq361)fRhfflbR;˳d5TAH8:?laʳ??B5*cX)R10 Cu鐺a*S}C 2CH0T҆/`s-oH<"pAER<4+BDG킅 C5_}vԧg(M[&d6T`dݴ'WsG9*0J ՑTmxΔQyg2mOO]S\jqFJkU}>P9*a03t&SY=ygy prjzOHr.3nt <}tz^23=mo2-HݛZ3m ;K816/楶>'YXIsȫɋ~>{ή4]ׅiׯĺ 닍'dZ5?~im7FVһw !ݻA;wk!e@y$W^,sN}SKQ2(Ѿ~C2\.Qziccc+++6 )i_cǎY7~%{Ɂ7xc/Ra3,~'y^Hy%B[WZ,⽆zKϧ<0>>DFFF4M+++{_|$裏6m-˧gffԾש{73EEE[n=~M̌i7xtttfff޽v C>yOo}ɼBwĢ8vmmmFsέM1]]][n=s͛.Oo2/mΝK|.!N3WMsY6F?xO>^zС[sssGsԩ+W{+++6ݿ~裏~ڵ{lyyvqqŋFsvv6߿+|+_IūW꺾wU3;;;88zSN%Zmܸ^شi cj?t]O|mmm˒Rl⏡>nƮo>??/)++u}ff)ϋ*kׄO?tYYٺun!׾cǎ tww?WUUݽ{wbb|''''7n811a챸[VYY٧~*q_s'NX1gΜyf7m$4}3@((`Ja@B9sŋgϞeaqqqQQʊ<FYM!ø[>xjeeE.ܸqʊ̡[i޽{{{{Ƿo^YYg333=yׯ/--]YY)**nȄ;{|0==-'%o닊JKK 4>_ ,===q׬yGWu=чjbCPo={6qNΜ9?cӅ4Mx<7oO|>_uuuuu 5"/,,̔,..7oBȱIK{;11SOD&''_zVˍ,=6zgllƍ\1 !T֏k(Di*򗿜ngq3g.OBgywޑjѣGGGG^oqqfiiLgg͛7v588ѱ$?/_|#G555{җy>cdbbBqMҗTRM.?qĭ[Ν;7fyyĵsM fggvر~D3aiu*RYN=3BI6_'xWd2 eeeeeeUUU###ׯ_߼y]䥖֭|O=ʕ+%%%rmۆܹsqKJJ_zuyyÉ&ݺu8p@e˖ׯ_~߾}###7ﱻhYOOܜ\^\\e˖Ǐoذ!nc\{Ν}|$/--׿w 6kAF9\|$B$5}ro~󛉖s&.ܽ{SP\%wNI;flF&P.QBQR,NЄʟۿoI8]{{/,ӳEnk * (@ i#1J}6l}Yޟ$k1i4o1i=22~xG̭XۭIdA6 Q:Y5v-MJ;`I"s,^H춉>P۰U,bzϱ,b_BY;=9r!+?Г'*I7+N9mEJጻ(Ej\~0o7$o6e唯PԿ1wS9GjG*}ʁ>6 +סjr;*{XuGydjE5@1YmeE'(\XMMt5Tk߇P[^HC +R=hD-KT>_;r*Bl T5nWfTp)_ PP@@T3o'Pxܷp_=Mh%Cmii~cwwҔ} ʭ[cKƍcH];%ܹ3gpXYY)))YXX(,Y=roop15'\ ./_3Te؎;,ˇ'&&ƿEED"hԼ|7 imJ{TP4M ă3M8 Dz6P( 755ɁXc|<44$חp(b844$ki3T>ZWWdضm[MMM8vtt \tV۷_pAfjWWWKKKiii[[[oo_Wc^{O{O! pccc0Ư" ʡzGTkkkSS9; 7"S䒲Ykhh@<___/l4kP(ix55k׮@ p…{6gd71F"L͛7Ń֦&9j TQ__/7P(zB!Hkll461P ܔj|ֆgŴB!ǣkb3@eee4yzI%%%Gyjjj&''kjjmf>[YYilsɭdZOLL~%cwJX}}G]cXXdi^AaK~W[-E'۷ѨLSc={~+ㅅp8򞞞qcRP 2AY2 ͓ X$ț(i- A.c c}}ﯭ B*~cqgƺZ9`0͘>د+%doӴeǎ漜~zOOB.}͖a9k.~ ˑ׾;voii볙6{.5y^9nAPs&_W%I5H$244D<&kʧV TфZ2::2>d r9KǞГ뛟쮰nݒ}떖{+wjj\̣喞ncccyEEE7n0ށtf@f04.G6OB5n˶\9PmP([[[dmll'*S? lz/@jooezvww>}:ρ(Z߇j'P@boK& ~=roop15'=Tpdסkiip}8 E ֭[lݸq#M3H]@=|48ҒvjLJ@}یiu]WUS+kS=PP@q=0`y4E@t$@ *)`C@T PP@@e6{ﴱ9R(E)C|C/(E)JQ~)*B n T˘fJQRr,_(E)JQf)PpTP9j\ @4Qc AVNB8P5MsD\Je3B2P9 (X\6* (lP\< K)TPTi T"@{ (dj48ewJ2OG"_FM4 &%@{ (@PP@@T PP@ٍr|+ S)E)JQRYʭ=T8JQRrk(* (@ m(E)JQ~)Ux`JQRlrkG!PP@@cƵ|%*( TMӌ5?(;K fY_PhOJu]u;  ^)C@eCLJ|Q@/ (@ * (o.o%as1(E)JQR6Kj14QR(e[G!PP@@eLh3(E)JQRKx[SR(e[{8 * C KYjf1@)_Pԏ= ŁJ @%MKYBu(P~FYB)_ PP@@TPyL)JR(E)C5)E)JQRq)*B n T˘fJQRr,_w(E)JQf)Pp)CU) p Ł0U( TMTT+( T]וϧ p ǍvIq*1 pgj$+ɜB]׵rO}V.f]/_{jJS!>itR@LM8@͸_8`:gr,ϯ=BxL|-SKT*%%e|T:s*E@N2. p7ߴ, 92זPP@@T PP@@G7.U_,cs~56KYGQ5*%be׌jԾ$S/e tf2.w+65ﭲ@M32饰Qf)n&clB2TZYTZώ U{cR[*ms*6N<뺪P=6j_.s=,cKeV?Q)RUJdtjy9MRjK)_"c 8==a"OD+Mp>qا ܒѾig36LT~[mN;̜36LLS8_:dd6f?~iԞr,46pp@5ѡj(9VRS ܗR /0RX*cqKeV_ 487Pj(H *d\3{LP%MJa*JRDy eᅩj5> @n(@ * (@ * (@ * (@@C};p5z(*e;p'qO& T!+pT PP@@/Zuw7O~'ڋ½ J"DQsYYYFFFǏurr2Zz朰<0$Q$'z6H3{=pd7v03wf viI{~UL~\`qbٜ?|U_R TCSc9SjnH')ۦ*is8 PsӋMw/#&"twji;\*y9ba&Z3>es&hrJx=&I)P-r*3nV=&+%y*ƯZ$%D)@T8s @@ݹsg% W^yett4MzJΪky~SQSSc6DEEE'''}>_-z{{Zh4󃗋`CCCVFjWK+++4M;yd 8udeee߽{w- $NNNMt]Oh&hmmM*++CB!wb]$c$TTCh8IDATcJ5[ztIME-IENDB`GvRng_4.4/docs/lessons/en/html/01_files/0000755000175000017500000000000011326063743016567 5ustar stasstasGvRng_4.4/docs/lessons/en/html/01_files/step01.png0000644000175000017500000002740611326063740020417 0ustar stasstasPNG  IHDR^ bgAMA a8tEXtSoftwareXV Version 3.10a Rev: 12/29/94 (PNG patch 1.2).I IDATxyxSם7s%Yw01؆` ,&,e 5f!K2I[۝yt}'dy:K(dpJ'v&i'` K`xhǑ%ٖ+[~6ovT͋ ڶ͞{ #fwKyRP΢DM7Y ٩8$`7ƁAi2"#go6jVDٽ}F{3.nnw6um ]ZG%qCz6($-\9H}]^1@ڥV4foGuU-}m{rUJ]l:њ^ivj ߼QUet{jsE6omLWC^^MWlmem}mGƭN{l=7+쏶Uڽ=Uw;t6[*w;'r6D3Zi^Q)f`7ϖ8>/2Ҿ 6Gϊ1 !fyn8q&?o7D"ᄙ%Ɇ2bR(g1BBB K}s! }3fB?xgE}̊YM}_ҵ&-$-n3~0j.KY+^Ȫ5CV*e]m.S'~v}uўjv}ꦡjڸEY76mdVõ-[wݩRGvd~ڲtDX[MɮȬ˻~WY ,W:2ϔ!m6U|~k^p ~mhpx:twZ<;;ٳgG_\"G?"[˝8qr^|8~t񫯾qܯkd89?<)*"LaztzMkߏKl ,`XX-I]}o{Q<#"r,BHd|fdp݃WB=11{ꊝ-̬9seV>fVイm]ZEYK,7&V[mc既km\ru}3?Xzmm23Ba2Y֧V 3kJstXI]o6mvƞY ׷f 2/3tg#Ȭ/8r|(f#Ot@GfѧswU) UfrPpxYq E}qYǽN3W_}wqZ)y>EyN:Y~.?ʬ_dB.͒-y>z%!XY`hhhW%RYtAGf:N"!X-&BqgVtPf tΎ 3+^ ȬޖyƇ,3aѢ%|fu-Y n|tI /U3I'x/`ak1n|xU2ڜ]YWӷ 2 eVmΌ}72Jƞ32_yJg'};Dsu#gJo?6﨨[l+Vq5r]xYc.~ĉ1'4Vp&\ĉOf}JlĝDB٬]KOwT~"tVph]8ltO߾;zfW> 9ѽ87$rն Cs& nn_Whuw̙3k[J.]/=iW7~n岅 [ŗ?`7v PW2>!WVD.Y]~tφ!wd[Dw>(zPgzZE>Pޟbqyb%>9U[o'D 7=rҍj[[W Moo6}[ڵϬꒌ=[{Lo}ѡzaّg1TSVkvLo{BãMs8+FYz.(ܱ >~Sf?^]'6-H&[4*$".*va2R238".Z+wphza5Y=tЮbQC.4~Ϭ/2쟰)yBȩSN:uӧO9sٳk]\":uxY| ŖT*J2L*>}A~~A& IqAriXѭ3srê9VY"&$,d#$Ui_{j,XoM^Qt]㸑/|hg:ՉN0Μ948nw5rUb-VT;+BP]6;_$8㈣HLa&'bfB/33ڳh]!$.&rP4݀v8uN6y5U͏mmoꎉ 'X,=f9$/_n!sKN,ό3CI;3Ճ ڙ1Al*!a!JCw\l$֦{{[g$Пj#aam6on4IO^KMmu|c瞻=ݭ7;edSM_wvUme#*͚C2p49{نf7۫K:ڶ+W7&?%煅nwӞ}ݻw;mNSnhD04㮯/8n;YR.)dJ,H*~Tb/ ! H9BH̐hRG8b7Z!Q3”}zGO;{D&O 'k-lXqr28앣)gd~O~?Ѿd3٧$RiHH0Y?K}f\ZqvOMXeշigB3fQب0BH[gsg ƶ[67ӟ#D)t6jh7ښ -iVmRdo+7>6+6oi7?Qgovݺ=ACQcמz{:m7w9T^;֛{ ]{򟠾*%e]W6dP‘_62rMiqMn+]uqE}Pݕ=w(Ň\&$>(L/{XIzsߟH;ޕˤN.BUJ!ۻ(>셃 !\$W1FFXl^h,'J!Ӗc!=?7Kͥ={=3eR~O*5='۲$):ڙ(_A;#+Lm\pҜ'/$|R|S$>KZ 읗I-}Do~B}խzuGV ҦauM~MzMK?mukSR5͎fOͣT `whsjC --^govVm^UK7=@nVlڼ{jV^eˤ f $tSrGJ &ﺸrhs}_ZnGz xG۹bW'm_y׆5+ol]=k!֤ǟ?1fVSB*#V&͗Q0B_06,8}~yErb7Zh\hYnD^ \}kLyAs_;^7g6?wܾAKVWz]yikQۥޙS_=gCI !!~q`4_*xfE-ܻ5YE/7RIy?{}@B}m.nuK-7{[&'w;+AmSU怶qŪ-ff{a՚u|~Gi.ezM|Tz4+Y5PH!fCTTdJiꩧ}u1MiqB+2RٳgΝ srBt:hi7J3%{<+T?2M! ""r#Bk+勗$WܿcmϐJeEKTnڴj׿6/^V]]a0ClچT'<4oC6YT,&RynymmUttGV+;:53R֦~韔JM!/_2{0GMа/ m߱۠iujHHXJʚjAT͙|y^o&|!(Ύ[tŢW񠡾Vo+qsq#=lo 3u3 0{fE9V3굳fvVLoD `wLL\o0@wLPS?={vA$]qqszzcJ:)4h@ͦp!7%&Zڵk6m!appp%8{8Sr;",Bl65%CM"CMD"iJiHÛ29HdsP88dIѴCBC ơ&=}88>Rl(ش"bPȕ&˰@|+/}&kWnڴih'`01f5#FGvwt 85D27m6dԦTb) ZVlm3lj  u4ePK3$6hNO_)M~r'¹-z3@q .xϘ1rK5OXf.**ڹsERTTt1Qnp Alc[0GlutCjno{rvlrzFytf\/:odc?E;'d(Ν+SD!N_8Dy]zv`(a+uGD4g4<$ex=hjjr]vjno۱1L\Fsh̷¯Ŗ0&lU2dW8zB>E^UDrk\S& qMd◝D"jPȓ*_x2ۇp]ߏۚ_cv`"q~nB/-t$O0 ;׎9ͣ/1 ..٘]:/p5C80ӝđf:;ٓ )/&-}LdOilMv%n}K>Alc[0qMbuuCnbߞ~7|svUUUN?n+?? P=;w؈8𷻻''uhGϙ3g\R*ˍF4l6;X LzL~x5Iϑ woSXtccV]hѤDӯ=.hJKKǵ'_G[yyy999ǥD% *++\3`0BZ8*++S999=o޼BOVN絼>>==:.??_JMM+CjjjffffffIIIjjZ.++sق; %֨ 液TUnn*)}(L=Ćmh`Kli4PVk4Bhrrrju^^SBWtYY9NMWtWœ_= JKKSRR Ebb^>h":mmmNyW\\|ƍbNquFGp0\YYG5$''G>k~Na~-P&-쬬\:AOok4|vEFhj8G 233U*/{DDDDGG'''666>r~DFgT*՚5kbbbΞ=Kƍ ⣏>*//g/^ #\% KKKOlͦjٳg>D444Lzͥ3bNrrrh`BS.,,LLL$$$$kɓ'E_u0ň[YYY7”Φ+v*~#\iKaaaBBXf}L>HVWVVFFF644lJIIG[4ryJJoۛ-w:p]fVUTm%ﵬ,:~?C?t5pqzNp/2~YzwLU~It=ydCCm//dTz]͗jZ699unGRiZ{\  8~ @COHHˣ-n SZZR<XVV񁉉 baK ._\T\uEё7:Ν;J%"NOp[C^o 4T*FTVܹ/k0 C-^AA)_C/_.9,2z=5T*Se|-M6|!M_*R 鱅@'OLKK|egg !BwVPTNuf SIWWW߹sBF:OVwmoo3bw-..jT*U~~ݻw}L.W%!|dSvv6333t'SRa=pk]YYF)++KHHК1qƟ(??yNZ¯;ܪtVR ۚ[ZZ81??[&2qN  g"##ÝFmqǧJ$Z:'`~LjϤ ;- T;BJUPPKOp8x `-qfs .&fqS9 [b)p5<6`h"o2xm1-` b  1~)㗘(R(P)VG[NGr+JJUi AlcX-I;_Q PR (@JCXm 1bm40D-\p &v18<0;$c[0S\D` b  1-` 'eWD)B)/J:ښWD)B)/J[0m!1-` 55RR(R^b)pJB)-[0FK`8g7or,I090h ƈ[C 0FP &F[0Alc[O<RR(R^bu55RR(R^b5`Blc[Vckj\P (7S*(R(E)VG[0m!1-`s[Ab8W ggN"2 G$Ic=6 K`cp0<i;0Alc[O<RR(R^bu55RR(R^b5`Blc[Vckj\P (7S*(R(E)VG[0m!1-`I6q-&D`-K&o뼊U@;b˗Vx-` . q[$c[0Alc>)J%JJyQԸJ%JJyQi AlcXqJB)$NTJXm 1 ~%rl!Č-\g &1b^p C-2 &hG 'b?Ė0YWƈ[j_aAlc[0aS*(R(E)VG[S*(R(E)Vc -0a5U*Q PʋR 8RR(R^bubk*GAlMYH./|1JĚSNLC!FtI D-ƅ]x I8 \"rla'XGÇt.~Ĝfٸpb#08`5qj;ҊB9.O[)-l~#C-J Aω9BZ51Paqı6o#<4rJ.T\cBlMf00.0ax5RR(R^bu55RR(R^b5`Blc[Vckj\P (7S*(R(E)VG[0m!1-`s[8M LbKx}wƈ?WFf_[,b^mcr7b^ZRN"0Alc[02OTJXmMTJX-[0ؚWD)B)/J1MJ%JJyQL[-` b #%0-D˻U `b^'8 -` b  1-` b #rl71-` b  1-`$Kg;݁0fG[8y;0 1-` b  1t8]}&b).O)V)+QJ~d^t{JW@mq'bDXSR|Aߋ*}N?X]W>rZzWsR+JyXdblxX϶*[KI 'k)TJ^Ux>}~$K]΀u PK>pzŊOw>cA#VY(=ڻg^~l~JG(`;&aNnO-V3qs["qE|/;7?”_h+Ј[G .MS?.H" ?`^7Dy}EgD)/*x]^p J.+KAAlc[0Alc[0Alc[0Alcܜoy!1#WDs;W_[D` b  1|/IQ:, DB^TwyMMMs II&: nD=.{ֲeIQٍqU,N@w ;3is@s6^z!᝴,?S#F<y~~./j4nN7-y,>ң0B™177HG/ˉOϟ𚧱%83q}]hx|q 0x[QviK"R >;^q[3"UF0;m MU5u=~'oUa_Żd:iBH32l6m"O[ Liwɸ消4>l/StIME B IENDB`GvRng_4.4/docs/lessons/en/html/langref_files/0000755000175000017500000000000011326063743017765 5ustar stasstasGvRng_4.4/docs/lessons/en/html/langref_files/send-banner.gif0000644000175000017500000000010011326063740022634 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/langref_files/sflogo.png0000644000175000017500000000546511326063740021773 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/langref_files/rightWall.png0000644000175000017500000001307311326063740022431 0ustar stasstasPNG  IHDR5WLANbKGD pHYs  ~tIME u_IDATxAhgcA.D"DZCCTrKɭ\lTzx9$CA9C@*HmP+@sl<~43;;;~0fgV癙G*"(Vo/J77oLI{7;899yN)38 &6J)\hz9 &4`FͅwśL(epu>(V׿{W<|Yu@9Ai'! -^(TJ{dGAsἓ~DlߦRGz! Gm~z?u9ګgvNϔRss7JW:NQ"ތ|zsջ\i6Rmͅ5GZ|AԱikly) í϶³W[W[iϝݝtnww/Lq0/ړSF}C)՜o5 Ԛ9n>zuO%=c~ૃiojZK)z͟5 cmwڝ,yI?tɻ_zy)awvs3Vpfuz郳,1<9\ymev~Vav}vr67;j [K;~v9y:v|skWE}u,M[˚/9Dn[Yc۶Rjn~.gM~D䠥n{d|{NdPKJgxڳL1¢/f7sTQG)rv݉S)]E:޿zGi!--z8%;s7Ws6ovaV)ݮصP؜o˽kմ%8jͅfptvڠ\.axFKNh]kEs6/PΥP7=j>R70QӨӁCG9:?P?Nzw ̓բۭ:77cO}뽃o_Z> '=W[WRs.]ݧB3aF\~p{u53yI6j C7j\YiѻRbyko|{y9@)՜o\|iV^^Qgs==-Nt幕_ rxmnG _l{3^V#leon?[ymehnNzЍzWny3~*W\=xBp4(/lb 0gfR7 < ?7 d4y?}fWgaC{}29ƌqPi?y1z3\_n*#P@mn>zե6`PqXV5wFY;ڑ~p䲃Som6Dߞ\o$Ţ/EkG~#;$N`w<7/WpH&({jEɞgR/H'6Īd~M+fg@XF^:gԇvGjNMzh.ݞ1tE!b4&xEac]A5.n8vhS]6n/o>'f ۡM1[jwr?T砱1hJl ȕ1F]܁춹|2\|- "\+PTb,F1vHOh4sq{MKNlo9{~hڎ^Mo>' &vp6<|%d?w~gR-O>${Չ9]gsZ};(Th-g/U`ڠ)39M:9";ncLwz5wmuM.+ӢҢgtڪͧ9Vw,Ȥd7/:׶XgmLAˊ_yX#l0dPj3Gbflܝl\w;.AGE/;Ai&-{bvX _C]yB(S; Quhd7Ϭv| ުO 6O”#Id]ѠJd^s"U+:uX KyHO,+Z4K̫2m=GyWW~:9rlfvXe7/ϋ=LzԪ3(P<;[V }=-J]*nܽwFmnyí?cg{ȏRtgJbw.[y~[;g2^=0X'*c7JL}4OY 2ȳEٯrO@. }JuN}lo9w56Bdi4kSc3|bt&ޱ\{3&C\v(pmunn@,ǟl|rO@. ?-.Ėr4/J)JI.^>[[x)E)'0=' {Lm>r/֖e#L)JUQʽ|*SRUrٍ)z)9 E>ZkX2 `-l<-}~0? W' O:kO uo' "\Ο svcJ^J*'OSRUr/2(^>A>˧y)E*JO%raJQR^_91\/e S5G>' o.(`b| _6?_la| e'M \O O@.Ʒ\|rO@.WO91\/ iy)E*JN[-;qW[@)K߯ʗr˽"[&jPj?e#L)JUQʽ|*SRUru|[))E)|rYΧ̓ԀlpvY'jq em~M:O: $@E}A b!"䲜O:O"O@. E>' 'xJbJQJs80(UE):/(UR˽|ʜGR{T"(槦4r"\֎?t,@Uy}%U~篰pwR!C-K:Ʒ\|rO@.WO`~jJMC)'OSRUrL[YJ;p-,Wb?)^i][&\,%C62(^>y)E*J:60QbAj|rO@.b~j@.|I Xd3Z> '` '`?_T,6:Lo' "\Ο maJգ.(UN(^>S'jYʽ|Ӄ|rOSRUr/J<”T\"svcJ^bAjVl4%/[*RڰyiSQ~^Q YRx AJQ槶s:~GUj\Qr?T-RpE7`ܦ/v~ Rj\QKY(1fJ mf~DEVis'+S !Ox%:0=%pm۹-Y8NgdLԃ|H&D\>#ZdfD>&1unC3O@FA E>' "\Kh>M۰5!R` &[j*+R0v$xП/9RH [_ %7SopP ̙̈,$bW̻n|S?`kG8õK~?_>-sm VY]nn'=y> $aQlKwi0=k?}bQ4vGb 4Mʣ4{[G/r~[ #t|kek٪Va"ZeT" t]@Ew 'E>' "\|rO@. E>' "\|rſd"D ȕ>߷tO؇_s_iCoWT__=0"\|rϚx7˖Y0H>' 8Cz>\g"\w뫍x>|`"4>|cyrtosƣwڋ}sF)ͅl0i0TQ>ONN0qz^ 5W!N7 Ccuĺid"%O E"BX'c;yQY'R2RV]m~y ٲ2$i'P.J/ޗJ!neuIAguQd2oiZcz;KW4ME}Ѩ)y=D䇿xS }J{NsnǪT1*vlSfm.v[~~\ Ԗdž_ud4Mcҷ,)epq_:qO?MRf04olJD=s:FȲ$MxXW}c 8y1K<&,kÖ-˒O2cq^MUxoǽ8ޡoOmYA&/7²OOO_=Ol矝? !DG,~]"Y,o;!ϟ;/xY"}L~ur:"^DQ$k$>?d$nW_|nubSϽ=Fe-{xxRNǶ|u|y\><<$IϽs\AlieY"y?ŀ^7iYV-t׮|>u?!ٟJ|.ش$6?7BټV?0}L7 v3MSu5 H`W*5[ 7BX!D)|;g 'x{*f  Cl0 0[ Cl0+b{-˖nhv۰lYsy՝*{w^ [4d_EoUGZh$.rݭmە"l~wӃhhT)=xnZ| {b'zk]cŧ{x]l#`g/e-]Wciy+w*|pOkoiZ>]2:JYv^Z$ƏG e8no.lHo+?# |cmXa-M_9鸖m~߱ qLGCe&:vhak[ 6ׯV?D!`b a-Y'17Z[?~};Vw,Dž%ۺm)uuu%xxb7;xT:M=d_SNێwggh׫\J˲<Ų@ 'qȎ Blmuo 0AS'e> !}L7vayH4uVߩ\a&YΩn͓E6)ӞPK5Gޖﯭ58x_ 홖,l>[ͬݸmsg0 =_wݤ̆# WZUh4pntwS˼1*ГKa;`0籆<֒\5.uՋupx9 u= mc3t6MmF*}Z2%MRwN&^:{Kz[KO47j$E>&wBr7~LkV_ӓn}Da_*5T)!],ðoYV+W9=ޖ"Y$cZȻ0( P/O(czpma؆Vya??P ~]<1jl:hFb+_DEm/bPiۓLI6vd/,uWeYjhtn~pdeSg<g':}`uxK},{^]}I}bK)-^QaW?X(-BW_Y%Rw~_1LLR.۟nG# z{3/0 ]U3\ٯFGX|5+,!h4RnΔv;+gkh44Sfx9F#^*ŲWU|6c|7uUF2.x۶,~EQz[@eeY~߿{o{I{}'vBm؎2MSum%_h4r]!D#^!*c U50 mp $Gq&Y$*>E.*+TP@*Թ_̺~c#AxGH~qH(;Z߻ (dzYjFL=W2y<{mզ^>CCԹ~?}~p }_Ug*{թY,^ij ;<!Rf>O$IvpҒ쥜_^@Uo%I$zަi*:M~:囉ln>?;f۶}bzm"Kw8g൯ُqꓻXR#;5̾e6 ,u>NVYͬewQ~ؘ8i{{Oeavqqjjw_,E:V 'f9|[=GvL@lmvKau#Wو@;-33Z[ծiu,@/mIҧ=XPPίR{[j[N 52|<42an a-!`b anRALmns+(E)J[0Ø[I:Ӂ*eD_(eP)S{[04v@[lq1 a8<0H` Cl0 0L0 w` Cl0 0[ cI**2uW(Uh[ Cl0uW(U{**2h[ Cl0K`[:v\m @`ͱEW @m0 0:c"0:c0[ Cl0 0RI)JQB)S{[/-)%6H)Js)ScK/Ǜq4b a-15**2xO@mk(ՒR-b a-9$Ɖ4GU I$x+ȥ$4K`0 @0 0Oi1ZVvA"[ Cl0 0|RflO '(D)Scp!U[uκcu,ZU#tR%j>K?OhʇQL0آQ`b a-!2kd`{Je8)E&JZ$(E#)ejl8Z5xnCN4Ø[qJJQRJY@cJӴB|謽z#'o*eMwTajo3m-/j!W7^iog5,84ԔVw;ڴ晆 2kNao=2SVy$5rnzde{]57Pͫ{[yِG|X mZdy~R_ԛ*s&^TlcڕLB8{v۹NI`5!ت/[ mO8;k1rP1S'_UBJ=\ௌ^5ȥ:VEi[leє,R$?VHKxj't5)%;#\JVBz#JNWm/zY ؗBL? :1tIME%IENDB`GvRng_4.4/docs/lessons/en/html/04_files/step04b.png0000644000175000017500000001602411326063740020561 0ustar stasstasPNG  IHDR^ bgAMA a8tEXtSoftwareXV Version 3.10a Rev: 12/29/94 (PNG patch 1.2).ItIDATxݿkZs5b XEYCxp1,fB,aqqpB-R<p")PHq )\.RB,)̃Yb.*R%\yd4Gֱ/Qe#Yx hBL[*Bb9V/;ajY"^ϱ4Mձ%P0vo=R)ej YXTZe[;fVR=Dnۍ?:V3?- oooӧt`;?ľ 7ֿKVȯD:nnmUHK._9>p):_͋:<+rZ7NsΆMi+-IH)]׭@I|+x_*Uûʖ%E6(ͺ+V,DmW4-\64=rGBiŝRƳmIL'Wcye]HfH5o^rzlUWtV=*TK, !Loot[γ,Q>?>FB8mײi<=ci紣Z7S*ub>_eMٞ/ @v^ŝ/8ްs(mmm(}mpm'qerp^Ƒʈx~)͗/Ol!v%NMg$I7mc:uԱ&Ȃc~$IL՚/%D^թ,qN :o;;8R4u.p6Uئdf)F]Oj!z?ԯoQynWg%NGt6U')}{{Azn7yL:?9Vkϣ( G2IuUkG;-fV:==O?uc_Q'yRJjٶ=Ϳ[\3?^,cs;v޲d<NOO b@/,+nZ+Wt:?ob6OC%l6B[O;!tV>:;~æy:$+|a-iq;!\Hubi=ɧ2j0=??0[ Cl0 0ü"ܶ[-/"_mww^a̫tO}'q/NlQ}ju?BC'qGtU7nk*nB-o{PmށrI|+cG<]W-[{qRKp~W>ǢыOETG^mͳW 2YY) o\"XƶV:r;e_Or" k7(Ӧ+Ydxi.e~?_܁]Y>PnxG{'l)3Xa-u_1wuy-;Pj!m0^N⺑> HqU)z>vneck/tWzz*L|q<$0 0[ Cl0̊#q|7(777JII~WseC~˯,T  pn-mQN~^_]O'n> U QmXSat}VI)vesM{a紣ZR#x{?C5MSG֖BdmBr+L~6PI]'@dG+LѓUơr`e+[?¸̿ +TimYi2OTfeSsR0 y4JJ5QSjR-Q1?<-oaeKQZCU5ԑl; dė:;Fw#unD:T7n} ^U' !40aRI)JQjRwRK;sg)R-b a-9FG&:n^>QtId1bl a4M-u0-zv-Zv[ Cl0 0|QfSK :J 6g(uTL-SK:S9Y>W$jƩk@Lmm5\f%LqHhm0uTRRڢfNYRZEl0 0:Ƕc\x @}tJWgPZ:d'qnH=r!I.a !F !-ztS I`b a-!`/)K5RR+[z'R-T>5])ez);$'S[["7q"*۫<@` nm8NaRI)JQjRw`JKi,H2h5"=[  $|mW%N.HxxQ:B-ĉ,dt*^K޲LsiyXE-T,!L^ IBXjkhZLSz܋Ք]`7='jmY ky[_ZנN Д"Ԕr[w)lֈv`JK 6g(uTL-ӻ:֗һWM+g䠔2f5sCbjkKhHU{d])F38[1K%(E-JIl攥K5m(E2h[ Cl09Zi-2 @tV$ƶFc4쀞"쌶艭|HYjŐ<-ZjEk a-!`b a (s3,X(ejkky>HJQRGRp-!:Y*)E)JmQ#LJ)Jg)S[[0N[ZYZq]fI$ 4~V<$/R.d/UfI`mE n`mC!-GD I`b a-!`/q2uTRRڢh[ Cl0uTRRڢGޕR:R-b a-azWazWazW?ES @4n:c:w%m0L-m ,Yu $0 0[ Cl0efzWJQ8K:Y*)E)JmQp $jDDk aLØR $,(ejk "`S`-:wU 69+8m0 0[ Cl0 0cs ԍ[ Cl0 0[ ks%`82,,0[ Cl0 0t]իi,X0=jWZJ-ɶKֽ7,/qTX*+RRGV|m+>W>j+^*֭kYgxUnՖIs͡e\jJi+]V7U]Fv]BjC}EliWu4V쏮Y]`Ew]5?4?Oi5vt'~nM{ݟ&mi{@^~4zu]:z_[\52ҜWƽ6onliy>lM{ڢ5Wn Zviz`px-!`b a-!`b a-!`b a-!f$~@IfMon@\m(_.D!`b aJŖv^\}\[Ew`gZB0 QF˲Vv?6˲}_زm۶maY:L-/]~M|queBe6Rsh,ámiE|謼|#'+aunKS>ti^ry;Y~M2 Z7jڕ͖we;Z晚8*ec+sWB+3BwkH֛/@'Z-mEV^6WxUqsyuk+/o[]uklt6jc[eܰ *[X᭻r2/v^]@PgI`!}=`_-!fӑDqvPغ%&hbl9m'_UBJo8.WFmpBZ-+zȮn4M=+teєB$V2OKx.i !Tk8 !6%"\H:VBz=JNWm/kl=WlS #vtIME"IENDB`GvRng_4.4/docs/lessons/en/html/04_files/guido_grid.txt0000644000175000017500000000661011326063740021447 0ustar stasstasThis grid may be helpful in placing walls. Print this page out, draw the walls you want along the dotted lines, then read the three numbers either above or to the right of the wall to put in your GvR world file. 1 9 N 2 9 N 3 9 N 4 9 N 5 9 N 6 9 N 7 9 N 8 9 N 9 9 N ----- ----- ----- ----- ----- ----- ----- ----- ----- | | | | | | | | | |1 9 E |2 9 E |3 9 E |4 9 E |5 9 E |6 9 E |7 9 E |8 9 E |9 9 E | | | | | | | | | 1 8 N 2 8 N 3 8 N 4 8 N 5 8 N 6 8 N 7 8 N 8 8 N 9 8 N ----- ----- ----- ----- ----- ----- ----- ----- ----- | | | | | | | | | |1 8 E |2 8 E |3 8 E |4 8 E |5 8 E |6 8 E |7 8 E |8 8 E |9 8 E | | | | | | | | | 1 7 N 2 7 N 3 7 N 4 7 N 5 7 N 6 7 N 7 7 N 8 7 N 9 7 N ----- ----- ----- ----- ----- ----- ----- ----- ----- | | | | | | | | | |1 7 E |2 7 E |3 7 E |4 7 E |5 7 E |6 7 E |7 7 E |8 7 E |9 7 E | | | | | | | | | 1 6 N 2 6 N 3 6 N 4 6 N 5 6 N 6 6 N 7 6 N 8 6 N 9 6 N ----- ----- ----- ----- ----- ----- ----- ----- ----- | | | | | | | | | |1 6 E |2 6 E |3 6 E |4 6 E |5 6 E |6 6 E |7 6 E |8 6 E |9 6 E | | | | | | | | | 1 5 N 2 5 N 3 5 N 4 5 N 5 5 N 6 5 N 7 5 N 8 5 N 9 5 N ----- ----- ----- ----- ----- ----- ----- ----- ----- | | | | | | | | | |1 5 E |2 5 E |3 5 E |4 5 E |5 5 E |6 5 E |7 5 E |8 5 E |9 5 E | | | | | | | | | 1 4 N 2 4 N 3 4 N 4 4 N 5 4 N 6 4 N 7 4 N 8 4 1 9,4,1 ----- ----- ----- ----- ----- ----- ----- ----- ----- | | | | | | | | | |1 4 E |2 4 E |3 4 E |4 4 E |5 4 E |6 4 E |7 4 E |8 4 E |9 4 E | | | | | | | | | 1 3 N 2 3 N 3 3 N 4 3 N 5 3 N 6 3 N 7 3 N 8 3 N 9 3 N ----- ----- ----- ----- ----- ----- ----- ----- ----- | | | | | | | | | |1 3 E |2 3 E |3 3 E |4 3 E |5 3 E |6 3 E |7 3 E |8 3 E |9 3 E | | | | | | | | | 1 2 N 2 2 N 3 2 N 4 2 N 5 2 N 6 2 N 7 2 N 8 2 N 9 2 N ----- ----- ----- ----- ----- ----- ----- ----- ----- | | | | | | | | | |1 2 E |2 2 E |3 2 E |4 2 E |5 2 E |6 2 E |7 2 E |8 2 E |9 2 E | | | | | | | | | 1 1 N 2 1 N 3 1 N 4 1 N 5 1 N 6 1 N 7 1 N 8 1 N 9 1 N ----- ----- ----- ----- ----- ----- ----- ----- ----- | | | | | | | | | |1 1 E |2 1 E |3 1 E |4 1 E |5 1 E |6 1 E |7 1 E |8 1 E |9 1 E | | | | | | | | | GvRng_4.4/docs/lessons/en/html/12_files/0000755000175000017500000000000011326063743016571 5ustar stasstasGvRng_4.4/docs/lessons/en/html/12_files/send-banner.gif0000644000175000017500000000010011326063740021440 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/12_files/sflogo.png0000644000175000017500000000546511326063740020577 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/12_files/step12.png0000644000175000017500000001767311326063740020430 0ustar stasstasPNG  IHDR`ObKGD pHYs  ~tIME  5a]-HIDATxMLS͗ ܘ5'_F$H 5{].׻(ECYrgȇbɫ遉͇g tűkOwdYMQ꧟sc)l   ÈbiZʑ d^:~|l e=on~~{/!aVVo>}:竫zcdJWVV9r$/޹s+ݽ{w޽O%-,,;whjeeɓeiJaFSSSmmmi<==}֭ .dչs]ޞJ|Gy睬7ݺu+ .\Haߦb%MӔM,))(5v766>|ĉO?=xŋ?}Ea8{CmlGq[[[3l*NvKRoKzUQŬJf={*jjjR/^X[[ Gؘ{|b$>䲝髯VWW󹹹򦦦d߸qCӿo rϑVB__Ȕ`Xl'ۑ?݁5??/8unhh~rǏ߽{7};YYYy\aaaΝ;;;;MMM{/A=*הq䒉H$r'N9rdnn\ٳguuuht||SFBJ!Dyyy EOxYYY X]]ul=={looWwޭp UTT24촚7ߌ| ^=ڵ(q1xIkW^[ŭN111SVVvܹ b2Mŋ~!/^ث!k\ _~֖|<11__x?5arGhƬ]A4V.Vs$,5N<ㅅ>*XO߿onnZݱcںФaaa_ױcwvv7H0 :W}=z1;;;nݪD"X,aDѹ9Zhʑ7j 1bw}CL _|޽{ZgΜ;z1uˑ#GN>=999==][[#G9rܹɊ'O:$0TMM엝:uj||ѣG@ĉy1?xtyy/O>&[W_}ER?=r:9-e߿ӂG'&1Dža}i&,k}Uzbhh(1,ǵWNZ=T66L3qD,ޱΎbs{{{cc;ș kkk/KI4E,ceX,f] sX r@Sp׆cX5r +uX5$,pa%:rݻ׾ęhUUU-//;]B a 6HXAtV @ {\N-X3y'<%݉T֭,w]zUd..a¯4 %+?]$+S'| B}P(~?2Nf`&uXyߵL { FyH7& sYOy 7W2kS]g\K7aٱ(OsMa [~pצf1TFZV,} 3D_]#-J+a͙G$?]B a 6HXA YB߿w,I߿&yș3gΜ9#w^qf{Oq"?M΄%?0/ɯW !bݜV|Ύ kllG}رP(ΆݝZggg:O dtvuuAE]OOOK%Y`gggxxxeežҥKp8ht`` Vss<;:::::FFF;;;vvpp0uuu)YF؄YI6tҵk+/%FTXd,{4/P(D_B!H$ B<66f_c<1I=̳͛7ϟ?_RRظjɓ'e877thZrX,677'7ozJؘ|SAc?ī_|k:J}²W2w @\>D"r}y\ZA#,4 C򷃃---̳@UUUeeٳgo޼_a ?|듓V&GN>o2gMLL ݻڵk}G}׿ՃjPhttzBPkkjVG`__=7AnDYIY~y|D"kKvCKbrͮP(?22b VB ###a$_Yds=8ff&b1ׯ7WXÿ~Sn߾-X]]ݷo'|_bӧOonn^~B?W\ڊF/_z’eXss5$533#^ uɑ/]]]rC.Bz!D0lnnB֑kmb}ɡIX]]]c{~u\eOVc?vey#P( jڵ˗/g޾}Vu%|>?SN={ٳVjk_~XliikcX]]]볟oy;"P6U766fm+ۡ 8FX{{{gggprduL>p?RuuٳgKKKǰ%mmmKKKeee1FkIV `P$^} .t^ ב˃` SEB`3::b~ll,+k3755۷|'d8KF/^ך.--]t>e.oVXBye*{xq>Ⱦ~0WH-M?+++2[Yˏ;&Zzn޼ye|||ɓ'ֶ;;;%%%UXA2OO[*kؘ^AV---(H%,y~ZN3K ;jiiimm B*AugoooGGGkk·\ww証^l=^ɎD"2BKK#;@]]=̌VX\\c[r˗/k_600 ﵐ K\*uww˷^kZo5egeeucccHdll, s,2ծW@;4My/Z: cmii/_eպ:y?F%KѨQhG~RnnwSZZ:55577$uww[OKUc['_YP(288'X{{{eՕ~':v`d} 3ayJ|*ae ˃ $ z#a% z0M* pH|vsUVVf1MMM1y(8A΄u9Xwz3gd:~x>\@[$,jvbcH+ɚHU1or^PQQ&a2a&yY4M0Z0 +)VҕLjHэ+Зn2~ wY~ 1, a 6HX_*<)I(BJPZVX˾2P"Fw[{d=*vP eUAPrJpEBPJhhCUAPrJ% b>HBP.BzYA2 ;H e8h@&Ƚd;Z3NQ%d/mLXW 6HX,amTX,aQ^6*, a 6HXGu2j;HҲ* E(B_* E(B_Pt*x_UAPrJ% b>HBP.B%}>HB) $T6BiYa(N$, aІ1,f~J%껄d+Yx^B=g1M K66HX}CYQlK@$, a 6tA V㡴 `>HBP.B闰 c>tBqK*BTUm@<m藰 c>HBP.B闰DAI(BE(]/k}>\d U0'mhCټ7l~A6UX@)z!.!mIXLO hThh.!mh@$,~@O$T~CiYa|"\/a|"\/a(Z$,/a|"\/aP"P^֠| `BiYa(N$,bwgw%DA+,`UUir3x l;n S9/F˷o>|./2E@ ;{P]\m@4_t"p^RQ^kt V:²҂LU.7)HXK[[mkV~2 G3g&Y啦V[$e V|'p"gHB*,x K Vo(-0$E(KX1$E(KX 6KX1$E(KX $"5>d.*PZVX 6HXr/>v(xj/˜"7 ÙFM cdm5P`OUOʶJ9wJ堻z(6% EHDJ0y-NˢIX+><ٖbdw6ey*9VjP*+  Kcd(.k m%}>zU J $"~ַXw9>K2 n9[P^{ PZVX"PJ H8wT}}y6*˜P"P%,QAPrJ.fZ{E e8h@L @L @L @ǰ(dʄEU @)Hl ۸ 6_%8i ;$@6HXA m}Q1'PZVX0$E(KXyFM!a?g"P%,EK13 c>HBP.B闰DAI(BE(]I(BE(-+,ʼn@$,P< hl"U%q erQmh@$, a 6T&,lUTXA mh@$,=ݹ 4mlVX\Y ln mh@$, aF>.MaJeMy4rL*ZAJIūᄏC"R)s Kᜬ&×Ia(+Hld wоmw0Ꮈ,'gRj_%[W+UPLUU%)!Ca]dJU(x_sV6`zC4MSyOxa_ Ko=ZTyɼp /^cنb}mIy0Sύa)eR{*@kEm$~w"ʕ+YnA mhcxݮ+ Lth'3iMn=H- l) ;Ҝ}McTVs4ȾP<ͭ5;NqU1N6~i>Tfȥ#>~2(o:S$[Vƪ7a,Ola[fxY0EW.{+{cUPS WK:Ta?KZnVG^Yw|f>l/D`i;3x#',ǧMr:̻vv}`|LnL9A 쀼 a 6%l*qºr 4M0Lwc {1,0LB1==-x$xihhH+))ya!]M{{eie%,I-o|>_II IENDB`GvRng_4.4/docs/lessons/en/html/12_files/step12.wld0000644000175000017500000000017611326063740020420 0ustar stasstasRobot 6 4 W 0 Beepers 5 3 4 Wall 2 2 E Wall 2 2 S Wall 2 2 W Wall 5 2 N 3 Wall 8 3 W 6 Wall 5 8 N 3 Wall 5 3 W 3 Wall 5 7 W 2 GvRng_4.4/docs/lessons/en/html/10.html0000644000175000017500000000473511326063740016301 0ustar stasstas Let's Dance

Let's Dance

Overview

Here is a project that combines the do statement with a user-defined instruction that uses another user-defined instruction. The user-defined instruction is one to turn around. It is called by another user-defined instruction that does one sequence of dance steps described below. The sequence is repeated (or iterated) four times.

Assignment

Guido lives in Colorado, where country music is popular. He would like you to teach him how to line dance. Line dancing is a series of steps, up and back, with turns and rotations, with each sequence ending facing in a different direction. If the line dancing pattern is repeated, eventually the dancer will end up at the starting place.

The line dance Guido wants to learn is like this. From the starting position, take two steps forward, turn around, then three steps back. Then three times: turn right, step. This puts Guido back at his starting spot, but facing in a different direction. Repeat this basic step pattern four times to let Guido dance and have some fun.

Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/13.html0000644000175000017500000000634411326063740016302 0ustar stasstas World Traveler

World Traveler

Overview

Guido wants to explore his world again. Last time, he picked up the beepers at the corners of his rectangular, bounded world. He also new how many steps it would take him to complete the journey. This time he will need to rely on detecting the walls around him to make the decision as to which way to turn.

Since he won't know the the size of his world in advance, he will not know how many steps it will take to get home. To solve this problem, he will drop a beeper at his starting point. Knowing there are no other beepers in the world, he will continue his journey until he is home. He knows he's home when he finds his beeper again.

Assignment

Guido starts facing East in the lower left corner of a rectangular, bounded world with one beeper in his beeper-bag. The world is of unknown size - your choice. He starts on his journey and continues until he is home. Use a while statement (looking for his home beeper) and an if...else to have him complete his adventure. Note: Guido cannot use a do statement at all, since he has no idea of the dimensions of the world.

Extra for Experts

Guido's world has become a lot more interesting. No longer a simple rectangle, Guido now finds himself inside a polygon. If you haven't finished Geometry yet, a polygon is a closed geometric figure made up of line segments joining end to end. A polygon world for Guido might look something like this:

Step 13 image

Your mission is get Guido to circumnavigate his new polygonal world. He should once again drop a beeper at his starting position and continue walking along the boarder of his world until he finds the beeper again. This time staying along the wall this time wil be trickier, but that's the challenge.

Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/01.html0000644000175000017500000000644111326063740016275 0ustar stasstas Guido's First Steps

Guido's First Steps

Tutorial

Guido van Robot can face in one of four directions, north, east, south, and west. He turns only 90 degrees at a time, so he can't face northeast, for instance. In Guido's world, streets run east-west, and are numbered starting at 1. There are no zero or negative street numbers. Avenues run north-south, and are also numbered starting at 1, with no zero or negative avenue numbers. At the intersection of a street and avenue is a corner. Guido moves from one corner to to the next in a single movement. Because he can only face in one of four directions, when he moves he changes his location by one avenue, or by one street, but not both! In this step we will create our first world, place Guido van Robot, and have the little guy take his first few steps.

Create a file step01.wld with this line:

Robot 4 3 N 0

This creates a world with Guido at 4th Avenue and 3rd Street, facing North. It should look like this:

GvR Step 1

There are many intersections where Guido can be in this world, since there are no walls other than those at the edge of the world. Remember, in Guido's world, an "avenue" runs north and south and a "street" run east and west.

Now create your first GvR program, calling it step01.gvr

move
move
move
move
turnoff

The instructions to Guido will be to move four spaces and then to turn off. Four small steps for a robot, one giant leap... never mind. Note that each command is on its own line.

Now load the world (.wld file) and the program (.gvr file) into GvR and test the code provided.

Your Turn

Make a world that has Guido start facing East in the lower left corner. Have him take three steps and turn off.

Hint: you may have to experiment with the numbers and letter after the word Robot in the world definition file to place him and face him facing the specified direction.


Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/GvrLessonsOnePage.html0000644000175000017500000013444011326063741021423 0ustar stasstas GvR Lessons

GvR Lessons



Table of Contents



The Roger Frank Lessons Introduction to Computer Science: GvR Unit Guido's First Steps What's That Sound? Turn, Turn, Turn Just Another Brick in the Wall Do The Right Thing Robotics Times Birthday Message Decisions You Missed Some Let's Dance Apple Pie or Cookies? Take Out the Trash World Traveler It's Going to Rain A Job to Do Lunchbox Community Service Revisited Where to Go from Here... Guido van Robot Language Reference

The Roger Frank Lessons
Introduction to Computer Science: GvR Unit

Programming with GvR

Programming a computer in a language like Python requires a precise sequencing of steps written in a language where details of syntax can be overwhelming for a beginner. Everything must be exactly right, and errors in just getting the program to run are frustrating. Often the output of beginning computer programs are text-based and uninteresting, at least to humans.

To get acquainted with the concepts of computing without getting bogged down in the syntax of a higher-level language such as Python, we begin by programming Guido van Robot. GvR is a teaching tool that presents the concepts in a visual way using a robot-language that is simple, yet powerful and extensible.

We program Guido, a simple robot that lives in a simple world. Because Guido and his world are a visual simulation, we can watch the effects of our programming statements. This activity is presented in a series of steps -- tutorials with accompanying mini-labs.

Step 1Guido's First Stepscreating .wld and .gvr files
Step 2What's That Sound?beepers
Step 3Turn, Turn, Turnsequential instructions
Step 4Just Another Brick in the Wallworld file: walls
Step 5Do The Right Thinguser-generated instruction
Step 6Robotics TimesProject
Step 7Birthday MessageProject
Step 8Decisionsif statement
Step 9You Missed Somedo statement
Step 10Let's Dancenested user instructions
Step 11Apple Pie or Cookies?if..elif..else statement
Step 12Take Out the TrashConditional Looping
Step 13World TravelerProject
Step 14It's Going to RainProject
Step 15A Job to DoProject
Step 16LunchboxProject
Step 17Community Service RevistedProject
Step 18Where to Go from Here...Conclusion

Acknowledgements

This series of Guido van Robot exercises was written by Roger Frank. Comments and suggestions about these lessons should be sent to Jeffrey Elkner, who converted them from Roger's Karel the Robot originals and who currently maintains them.

The Guido van Robot programming language is descended from two parent languages: Karel the Robot and Python. Karel the Robot was introduced by Richard Pattis in his book Karel the Robot: A Gentle Introduction to the Art of Programming with Pascal, John Wiley & Sons, Inc., 1981. Python is the creation of Guido van Rossum and members of the Python community. Information on Python can be found at: http://www.python.org

GvR was developed by high school computer science students at Yorktown High School in Arlington, VA, under guidance of mentor Steve Howell.

Guido's First Steps

Tutorial

Guido van Robot can face in one of four directions, north, east, south, and west. He turns only 90 degrees at a time, so he can't face northeast, for instance. In Guido's world, streets run east-west, and are numbered starting at 1. There are no zero or negative street numbers. Avenues run north-south, and are also numbered starting at 1, with no zero or negative avenue numbers. At the intersection of a street and avenue is a corner. Guido moves from one corner to to the next in a single movement. Because he can only face in one of four directions, when he moves he changes his location by one avenue, or by one street, but not both! In this step we will create our first world, place Guido van Robot, and have the little guy take his first few steps.

Create a file step01.wld with this line:

Robot 4 3 N 0

This creates a world with Guido at 4th Avenue and 3rd Street, facing North. It should look like this:

GvR Step 1

There are many intersections where Guido can be in this world, since there are no walls other than those at the edge of the world. Remember, in Guido's world, an "avenue" runs north and south and a "street" run east and west.

Now create your first GvR program, calling it step01.gvr

move
move
move
move
turnoff

The instructions to Guido will be to move four spaces and then to turn off. Four small steps for a robot, one giant leap... never mind. Note that each command is on its own line.

Now load the world (.wld file) and the program (.gvr file) into GvR and test the code provided.

Your Turn

Make a world that has Guido start facing East in the lower left corner. Have him take three steps and turn off.

Hint: you may have to experiment with the numbers and letter after the word Robot in the world definition file to place him and face him facing the specified direction.

What's That Sound?

Tutorial

You discovered that the initial robot placement was of the form:

Robot 1 2 N 0

where the numbers are:

row
column
initial direction (N, W, S, or E)
number of beepers.

Beepers? What are they? A robot can carry beepers, which are little sound devices Guido can hear. Guido can pick them up or put them down, all at your command. A beeper is a device that Guido can hear only when it's located on the same corner he's on. Guido has a beeper-bag he can use to carry beepers he picks up. He can also take beepers out of the bag and place them on the corner he occupies. You specify the initial number of beepers in your world file.

The commands to work with beepers are included in the basic robot commands you will explore. The complete list is:

move
turnleft
pickbeeper
putbeeper
turnoff

Your Turn

Put a robot with four beepers at the corner of 1st Avenue and 5th Street facing east. He should go two blocks east, drop one beeper, and then continue going one block and dropping a beeper at each intersection until he is out of beepers. Then he should take one more step and then turn off. When he has finished, the display should look like this:

Step 2 image

Turn, Turn, Turn

Tutorial

If Guido could only move straight ahead, he would be sad since he could never go home. The robot designers were caught in a budget crunch right when they were making the steering mechanism. They only gave him the ability to turn left. Staying at the same intersection, Guido can rotate counter-clockwise, turning left to face a different direction. The command for this is, not surprisingly, turnleft.

Your Turn

To see how this works, start Guido at the lower left corner facing East. Have him take three steps, turn left, three more, turn left, and so on until he is back at the starting point, facing East once again.

Just Another Brick in the Wall

Tutorial

You can now program Guido to move around, pick up beepers, and drop them off anywhere in his world. To make his world more interesting, we will add walls to the world file that Guido will have to avoid. If Guido is about to run into a wall, he does an error shut-off and your program stops. This behavior is built-in to the robot. If he is asked to do anything he cannot do, he shuts down. For example, if you tell him to pick up a beeper that isn't there, he shuts off. The same goes for put_beeper -- he shuts off if he doesn't have any in his beeper-bag. So be careful and don't ask the robot to go into a wall!

Here is an example of a world file with walls:

Robot 1 5 E 1
Wall 2 4 N
Wall 2 4 E
Wall 3 4 E
Wall 4 4 N 2
Wall 2 5 N
Wall 2 6 E
Wall 3 6 E
Wall 4 5 N 2

The format of a Wall descriptor is:

1st number: avenue
2nd number: street 
3rd number: intersection blocked to (N)orth, (S)outh, (E)ast, or (W)est
4th number: (optional) wall length (extending East or North)

Using this world file, GVR's graphical display starts like this:

Step 4a image

Your Turn

Modify the world file to change Guido's world such that his path is completely enclosed as shown in this diagram.

Step 4b image

The default length of a wall section is one block, but you can use an optional 4th number to make the wall section as long as you wish. Lengths always extend in either the North or East direction. That means there are two ways to describe a given section of wall. The longest section of wall in the example above could be written as either Wall 3 7 N 4 or Wall 3 8 S 4.

You will find it much easier if you use a piece of grid paper to sketch the world and then mark the intersections and walls' positions.

Put a robot with one beeper at the corner of 1st Avenue and 5th Street facing east as shown in the example world. In your program, he should go two blocks east, drop the beeper, and continue three blocks ahead. Facing a wall, he should turn left, go two blocks north, then three blocks west, then two south back to where he dropped the beeper. Then he picks it up and carries it three blocks south, drops it again, goes one more block and turns off.

Do The Right Thing

Tutorial

To keep manufacturing costs down, the factory only built gears in Guido to move forward and to turn left. I read in the instruction manual that Guido has the ability to learn to do other things. For example, if Guido turns left three times, he will be facing right. But you as the robot programmer need to tell Guido how to do this.

We do this by defining a new instruction turnright as a series of other instructions, specifically three turnleft instructions. The definition looks like this:

define turnright:
    turnleft
    turnleft
    turnleft

This is an example of a compound statement, which means it is made up of two parts. The first part consists of define followed by the name of the instruction you are defining, followed by a colon (:). The second part consists of one or more instructions indented the same number of spaces. See if you can figure out what this complete program does.

define turnright:
    turnleft
    turnleft
    turnleft
   
move
turnright
move
turnright
move
turnright
move
turnright
turnoff

The three turnleft instructions make up what is called a block of code, several instructions acting together as one. All GvR programs end with a turnoff instruction.

You should be able to "hand trace" the operation of this program to discover that Guido will walk in a small square, returning to his starting position.

Your Turn

Once you have defined a new instruction, you can use that instruction as if it were built-in to GvR. Define an instruction backup that makes Guido back up one block, leaving him facing in the same direction. Then use backup in a a complete program that has Guido start at the corner of Second Street and Third avenue, move three blocks north, backup one block, turnright, and then move two blocks east.

Robotics Times

Project

Every day, Guido is awakened by the sound of the Robotics Times newspaper hitting the front porch. Guido wants to stay current on news about robotics, so he goes out and gets the paper each morning. Here is a picture showing Guido asleep when the newspaper, represented by a beeper, hits the porch. Write a program including your turnright instruction and a new instruction, turnaround, to have him go and get the newspaper and return to bed, where he likes to read.

You also need to place the beeper, as shown, in the world. The second line in the step06.wld file, Beepers 4 4 1, is used to place a beeper. The first two numbers are the location and the last is how many beepers are placed at that intersection.

step 06 image

Have Guido start in the position shown facing West. Make him get the beeper and then return to the same place, facing the same direction as he started.

Birthday Message

Project

Guido has just turned 18 and wants to let everyone in the universe to know it. Since he cannot talk, he can only write the number eighteen using beepers. Guido is a robot and only knows binary, so 18 in decimal is represented as 10010.

Define these new instructions:

  • drawone to draw a numeral 1 in beepers
  • drawzero to draw a numeral 0 in beepers

Use those instructions in a GvR program to create his birthday message. Each instruction should properly position and orient Guido for the next digit. The main program should use the drawone and drawzero and instructions to make a binary 18.

When the program starts, the display should look exactly like this:

Birthday start image

When he is done, the display should look exactly like this:

Birthday finish image

Decisions

Tutorial

When Guido was a teenager, he was a bit rebellious. His parents had always told him every little thing to do: every turn to make and every step to take. He finally proclaimed "I can make my own decisions!" and went on to explain to his parents how to talk to him to have that capability.

He explained about boolean expressions, which could be only true or false. Guido would do different things depending on if some condition were true or false. Here was an example he gave:

if next_to_a_beeper:
    pickbeeper

Guido has the ability to sense his world and to act accordingly. "Golly, you're growing up fast!" proclaimed his parents. They asked what things Guido could sense, and he provided this list:

front_is_clearTrue if there is no wall directly in front of Guido. False if there is.
front_is_blockedTrue if there is a wall directly in front of Guido. False otherwise.
left_is_clearTrue if there is no wall immediately to Guido's left. False if there is.
left_is_blockedTrue if there is a wall immediately to Guido's left. False otherwise.
right_is_clearTrue if there is no wall immediately to Guido's right. False if there is.
right_is_blockedTrue if there is a wall immediately to Guido's right. False otherwise.
next_to_a_beeperTrue if Guido is standing at an intersection that has a beeper. False otherwise.
not_next_to_a_beeperTrue if there is not beeper at the current intersection. False if there is a beeper at the current intersection.
any_beepers_in_beeper_bagTrue if there is at least one beeper in Guido's beeper bag. False if the beeper bag is empty.
no_beepers_in_beeper_bagTrue if Karel's beeper bag is empty. False if there is at least one beeper in the beeper bag.
facing_northTrue if Guido is facing north. False otherwise.
not_facing_northTrue if Guido is not facing north. False if he is facing north.
facing_southTrue if Guido is facing south. False otherwise.
not_facing_southTrue if Guido is not facing south. False if he is facing south.
facing_eastTrue if Guido is facing east. False otherwise.
not_facing_eastTrue if Guido is not facing east. False if he is facing east.
facing_westTrue if Guido is facing west. False otherwise.
not_facing_westTrue if Guido is not facing west. False if he is facing west.

Your Turn

Guido has not completed his community service to graduate from high school, so he is assigned to pick up trash along 2nd Street. Construct a world that has beepers spreadout along 2nd Street between 1st Avenue and the wall on the East corner of 12th Avenue. There can only be one beeper at any given corner, but a corner may or may not have a beeper on it. Guido should start at 1st Avenue and 2nd Street facing East.

A starting world would look something like this:

Step 8 Starting Position

Have Guido go down 2nd Street, picking up all beepers he finds. Remember if there isn't a beeper at an intersection and you ask Guido to pick one up, he will complain and shutdown. Use one of the tests from the table above to make a decision whether there is a beeper available to pick up. After he gets to 12th Street, he should take all the beepers with him back to his starting position, face East again, and turnoff.

With the starting position above things should end up like this:

Step 8 Finishing Position

You Missed Some

Tutorial

Recently, you wrote a program to have Guido go down 2nd Street and pick up trash. You probably wrote code that used an if statement ("if trash is here, pick it up") followed by a move statement. Then you copied and pasted that code until you had enough copies of it so Guido would go all the way down 2nd Street, picking up all the trash.

There is a better way to do a group of statements over and over again: the do instruction. The do instruction allows you to repeat a set of actions a given number of times. For instance,

do 5:
    move

moves Guido 5 intersections forward. If you want to repeat multiple actions, group them together by indenting the instructions the same number of spaces:

do 5:
    putbeeper
    move

Using the same number of spaces to indent is mandatory if you want to repeat multiple actions. If you mistakenly write

do 5:
    putbeeper
move

This code would put 5 beepers at one place and then move forward just one intersection. That's probably not what you wanted to happen. Be careful to keep indentation the same to keep groups of instructions together as one block.

Your Turn

Guido is smarter now and knows about the iterate statement. He is assigned once again to pick up trash along Second Street. Rewrite your solution to the previous assignment using Guido's new found power.

Let's Dance

Overview

Here is a project that combines the do statement with a user-defined instruction that uses another user-defined instruction. The user-defined instruction is one to turn around. It is called by another user-defined instruction that does one sequence of dance steps described below. The sequence is repeated (or iterated) four times.

Assignment

Guido lives in Colorado, where country music is popular. He would like you to teach him how to line dance. Line dancing is a series of steps, up and back, with turns and rotations, with each sequence ending facing in a different direction. If the line dancing pattern is repeated, eventually the dancer will end up at the starting place.

The line dance Guido wants to learn is like this. From the starting position, take two steps forward, turn around, then three steps back. Then three times: turn right, step. This puts Guido back at his starting spot, but facing in a different direction. Repeat this basic step pattern four times to let Guido dance and have some fun.

Apple Pie or Cookies?

Tutorial

You already know about the if statement. You use it to make a decision, as in if next to a beeper, pick it up. Sometimes you have a more complicated decision to make. Guido likes apple pie, but his Mom doesn't always have it available. She does have cookies all the time, though. He wants to make a statement like this: "Mom, I'd like some apple pie, but if you don't have it, then I'd like a cookie." You can use the if...else... statement to allow this two-way kind of decision.

It's like the if statement, but we add the optional else part, providing a different course of action if the if condition is not met.

The form of the conditional instruction with an else clause is:

if test-condition:
    instruction
else:
    other-instruction

where instruction can be either a simple instruction (like "move") or an instruction block. Code to pick up a beeper or else just move on could be written as

if next-to-a-beeper:
    pickbeeper
    move
else:
    move

Remember the else part is optional. Use it if it makes sense.

Your Turn

In this project, Guido is going to circumnavigate a bounded world. He does not know the dimensions of the world (but you do, since you will create it). What he does know is that there is a beeper marking every corner of the world except the one where he starts.

Guido starts facing East in the lower left corner. If he's not next to a beeper, he moves forward, otherwise he picks up the beeper, turns left and moves. Create a world where it will take exactly 32 moves to circumnavigate. You can choose the dimensions, but don't tell Guido! Put beepers in three of the corners (southeast, northeast, northwest). Then use a do statement (32 times) and an if...else statement to go around the world.

Your starting world should look somthing like this, though the dimensions may differ:

step 11 image

Take Out the Trash

Tutorial

The do instruction lets Guido do an action more than once, but it has a limitation: you must know in advance how many times the action should be executed. If you are at an intersection and you need to pick up several beepers there but you don't know how many there are, you cannot use a do statement. The while statement can work in this situation.

The general format of the while instruction is

while test-condition-is-true:
    action

where test-condition-is-true is some conditional that evaluates to either true or false, and action is either a single command (like move;) or a sequence of commands in a block. As long as the tested condition is true, the action will be performed. Thus while is similar to do except that where do specifies a number of times to execute an instruction, while specifies a test condition. As long as the test condition is true, the instructions will be executed over and over.

For example, to pick up a stack of beepers you could write

while next-to-a-beeper:
    pickbeeper

This says that as long as there are beepers at this intersection, pick one up and check again. The result will be that there won't be any beepers at the current intersection. They will all be in Guido's beeper bag.

Writing a while loop is tricky; there are many details to get right. The general steps are

  1. Identify the condition that must be true when Guido is finished with the loop.
  2. Set up your while loop with the test being the opposite condition than the one that should finish it:
        while opposite condition:
            ...statements here...
      
  3. Make sure any setup code is complete before starting the loop so you start in a known condition. If conditions are specified, they are called preconditions.
  4. Make sure each pass through the loop makes progress towards completing the loop.
  5. Make sure the test for the loop eventually becomes false so you can get out.
  6. Write code for any cleanup work that needs to be done after executing the loop. When exiting the loop, of postconditions are specified, they will have been met if the preconditions were met when the loop was entered.

Watch out for infinite loops, that is, loops that never terminate.

Your Turn

It's Monday morning, again. Before he goes to school, Guido has to take out the trash. He's not sure how many bags of trash there are (represented by beeper bags), but he knows they are in the corner of the room as shown in this world view:

Step 12 image

He needs to pick up all the trash and put it in the dumpster in one trip. Use one or more while statements to instruct Guido to take out the trash. After depositing the trash, have Guido step back to see that the trash is properly in the dumpster.

World Traveler

Overview

Guido wants to explore his world again. Last time, he picked up the beepers at the corners of his rectangular, bounded world. He also new how many steps it would take him to complete the journey. This time he will need to rely on detecting the walls around him to make the decision as to which way to turn.

Since he won't know the the size of his world in advance, he will not know how many steps it will take to get home. To solve this problem, he will drop a beeper at his starting point. Knowing there are no other beepers in the world, he will continue his journey until he is home. He knows he's home when he finds his beeper again.

Assignment

Guido starts facing East in the lower left corner of a rectangular, bounded world with one beeper in his beeper-bag. The world is of unknown size - your choice. He starts on his journey and continues until he is home. Use a while statement (looking for his home beeper) and an if...else to have him complete his adventure. Note: Guido cannot use a do statement at all, since he has no idea of the dimensions of the world.

Extra for Experts

Guido's world has become a lot more interesting. No longer a simple rectangle, Guido now finds himself inside a polygon. If you haven't finished Geometry yet, a polygon is a closed geometric figure made up of line segments joining end to end. A polygon world for Guido might look something like this:

Step 13 image

Your mission is get Guido to circumnavigate his new polygonal world. He should once again drop a beeper at his starting position and continue walking along the boarder of his world until he finds the beeper again. This time staying along the wall this time wil be trickier, but that's the challenge.

It's Going to Rain

Project

Guido is capable of doing more complex tasks, even when the world he lives in is not well understood. Guido must be able to achieve a goal by testing his environment and, based on those tests, doing some action. The steps Guido would take to solve a problem are called an algorithm.

Before writing a GvR program, the programmer needs to understand the algorithm. Then it can be coded, combined with an appropriate world, and tested. Think of the simple but powerful equation Algorithms + Data Structures = Programs.

In this lesson, the data structure is a world describing Guido's house. Guido is standing by the only door looking out. He sees a storm coming and decides to close all the windows in the house. First he closes the door by depositing a beeper where he stands. Then he will close the windows by depositing a beeper in each window (represented by wall openings). He loves storms, so after closing the windows, he will step outside to watch. Here is the initial world for this scenario.

Step 14a image

You need to figure out the algorithm for this and code it, as well as generate the world. Guido hasn't lived in this house very long, so he is not sure exactly where the windows are. You cannot hard code a number of steps to get to a window -- instead, Guido must check for an open window as he walks around the inside perimeter of his house. As for any algorithm, you must also be sure the task will complete. For example, how does Guido know he is back at the door?

The final world in this scenario should look like this:

Step 14b image

A Job to Do

Overview

You have learned a lot about programming Guido. Congratulations! What you may not realize is that you have learned a lot about programming in any language. Most programs are a sequence of steps, interspersed with conditional decisions and groups of instructions that repeat. All of the projects have been successively more complex.

Implementing the solutions to the assignments so far has required a little more thought at each step. You understand the question and the desired result, but it's not immediately clear sometimes how to get it done. You should have realized that the way you would do it if you were Guido is often the way Guido would do it, using the instructions available.

Often, then, it's best to figure out how you would accomplish a task. Write the steps down in your own words with pencil and paper. This is sometimes called pseudocode because it isn't really instructions that Guido could use. But it helps you understand what needs to happen. Then you code it -- write the real instructions -- to create a GvR program.

Be sure to think this assignment through before you start coding. First figure out the algorithm, or sequence of steps, required. Then, looking at the sample world, simulate in your mind the execution of the program you are going to write. If it does what you expect, then and only then should you start coding.

Project

Guido's Dad is a farmer. When Guido is not doing his homework, he helps in the field. Today he has to harvest the crop. The field always has 6 rows and 6 columns, but the crop did not grow in all the locations, as shown. Create a world with a mostly populated 6x6 field in the middle as shown.

Step 15 image

Harvest the crop using a nested iterate statement - one or more iterate statements within an iterate statement - to perform the harvesting operation. In pseudocode, this would be something like:

iterate six times 
    go across, harvesting beepers
    go back to left edge
    go up one
stop

but the "go across, harvesting beepers" is an iteration itself:

iterate six times 
    iterate six times
        go one to the right
        harvest if possible
        go back to left edge
        go up one
stop

Note that pseudocode is not GvR code but a description of the algorithm in code-like structure. In this form, curly braces indicate a block of code that should be done together. Once the pseudocode is written, turn it into Karel code, compile it, and execute it to complete this assignment.

Here is a sample world file for this project, to save you some typing:

Robot 2 2 E 0

Beepers 3 2 1
Beepers 4 2 1
Beepers 5 2 1
Beepers 6 2 1
Beepers 7 2 1
Beepers 8 2 1

Beepers 4 3 1
Beepers 5 3 1
Beepers 6 3 1
Beepers 7 3 1
Beepers 8 3 1

Beepers 3 4 1
Beepers 4 4 1
Beepers 5 4 1
Beepers 6 4 1
Beepers 7 4 1
Beepers 8 4 1

Beepers 3 5 1
Beepers 4 5 1
Beepers 5 5 1
Beepers 8 5 1

Beepers 3 6 1
Beepers 5 6 1
Beepers 6 6 1
Beepers 7 6 1
Beepers 8 6 1

Beepers 3 7 1
Beepers 4 7 1
Beepers 5 7 1
Beepers 6 7 1
Beepers 7 7 1
Beepers 8 7 1

Lunchbox

Project

Congratulations! If you are here, you are probably ahead of most of your classmates, and have done an excellent job programming Guido. Your classmates need a little more time to catch up, and you are ready for an extra challenge.

As you begin this project, you may want to go back and re-read the Overview from Step 15, about planning your work on paper before coding it. I'll help you out with the algorithm, but I suggest that you pseudocode it and walk through it in your head before writing your program.

Assignment

Guido has lost his lunchbox. He was playing in a maze and set it down and then wandered around. Now he is hungry. Luckily he left a beeper in his lunchbox. His situation looks like this:

Step 16 image

Write a program to help Guido find his lunchbox. The secret is to have Guido follow along the right edge of the maze, turning right if he can, or straight ahead if he can't, or turning left as a last resort. Write a program using an if..elif..else statement so Guido can eat his lunch.

By the way, if you think you've solved this problem before, you are right ;-)

Community Service Revisited

Project

Guido learned a lot from the community service project he did back in step 8 . Motivated to give even more to his community, he has volunteered to pick up all the trash in Central Park.

Assignment

The park is represented by a bounded rectangular area of unknown dimensions. Guido starts out in a random place in the park. Trash (represented by beepers) is spread throughout the park. Neither the amount nor the location of the trash is known at the start of the cleanup. Several pieces of trash can be at the same location. Guido's job is to pick up all the trash in the park and deposit it at the north-east corner of the park. He should then go to the south-west corner of the park facing north and turn himself off for some well deserved rest under a tree while he waits for his ride home.

A sample world for this problem might look something like this:

Step 17 Image

Where to Go from Here...

Conclusion

Guido is starting to realize that there are some things he cannot do. In the projects where Guido traveled, he had no memory of how big the world was. He has no way to keep track of a count. He tried to tell his parents about the journey but when they asked How far did you go? he didn't know. In the rain project where Guido had to close the windows, he had no way to remember where he started, at the door. He had to leave a beeper there to know when he had gone all around the house.

What Guido would like is a way to remember things. He read in a computer programming book about a part of a program called a variable that could be used to store numbers or letters or even words. Variables can hold a number value and that value can be changed. If he had a variable, he could increase the value in his variable by one for each step and know how many steps he had taken. If he had a two variables, he could store the street and the avenue where he stood at the door in the rain project and wouldn't have needed to drop a beeper there.

Alas, Guido does not have variables. Sadly, he knows he never will. He has heard rumors about other programming languages, such as Python, which have all of his capabilities and much more, including variables and the ability to listen and speak (input and output instructions) and even the ability to create whole new types of robots (object oriented programming and inheritance).

Its time to say goodbye to Guido and his world. He will wait patiently for the next class of students while you move on and learn more about programming as you continue your journey in Computer Science.

Guido van Robot Language Reference

The Five Primitive Guido van Robot Instructions:

    move
    turnleft
    pickbeeper
    putbeeper
    turnoff


Block Structuring

Each Guido van Robot instruction must be on a separate line. A sequence of one or more Guido van Robot instructions that are all indented the same number of spaces compose a block of code.   <instruction> refers to any of the five primitive instructions above, the conditional branching or iteration instructions below, or a user defined instruction.

    <instruction>
    <instruction>
      ...
    <instruction>


Conditional Branching

Conditional branching refers to the ability of a program to alter it's flow of execution based on the result of the evaluation of a conditional. The three types of conditional branching instructions in Guido van Robot are if and if/else and if/elif/else.   <test> refers to one of the eighteen conditionals above.

    if <test>:
        <block>

    if <test>:
        <block>
    else:
        <block>

    if <test>:
        <block>
    elif <test>:
        <block>
    ...
    elif <test>:
        <block>
    else:
        <block>


Conditionals

GvR has eighteen built-in tests that are divided into three groups: the first six are wall tests, the next four are beeper tests, and the last eight are compass tests:

    front_is_clear
    front_is_blocked
    left_is_clear
    left_is_blocked
    right_is_clear
    right_is_blocked

    next_to_a_beeper
    not_next_to_a_beeper
    any_beepers_in_beeper_bag
    no_beepers_in_beeper_bag

    facing_north
    not_facing_north
    facing_south
    not_facing_south
    facing_east
    not_facing_east
    facing_west
    not_facing_west


Iteration

Iteration refers to the ability of a program to repeate an instruction (or block of instructions) over and over until some condition is met. The two types of iteration instructions are the do and while instructions.   <positive_number> must be an integer greater than 0.

    do <positive_number>:
        <block>

    while <test>:
        <block>


Defining a New Instruction:

New instructions can be created for Guido van Robot using the define statement.   <new_name> can be any sequence of letters or digits as long as it begins with a letter and is not already used as an instruction. Letters for Guido van Robot are A..Z, a..z, and the underscore (_) character. Guido van Robot is case sensitive, so TurnRight, turnright, and turnRight are all different names.

    define <new_name>:
        <block>


Simplest GvR Program

Execution of a GvR program ends with the turnoff instruction. Any program which reaches the end of its instruction sequence without encountering turnoff is considered in error. Thus the simplest GvR program is:

    turnoff


An Example Program

Given the following world:

rightWall world

The following program will make Guido follow the right wall until he encouters a beeper:

    define turnright:
        do 3:
            turnleft

    define follow_right_wall:
        if right_is_clear:
            turnright
            move
        elif front_is_clear:
            move
        else:
            turnleft

    while not_next_to_a_beeper:
        follow_right_wall

    turnoff

Copyright © 2004 Jeffrey Elkner

GvRng_4.4/docs/lessons/en/html/02_files/0000755000175000017500000000000011326063743016570 5ustar stasstasGvRng_4.4/docs/lessons/en/html/02_files/step02.png0000644000175000017500000001703211326063741020414 0ustar stasstasPNG  IHDR^ bgAMA a8tEXtSoftwareXV Version 3.10a Rev: 12/29/94 (PNG patch 1.2).IzIDATx]pWblj_e#4qI]Ɣ0I`i)pAL(c+.;Ìn:P.K褘SKSH:uL8DyvũEeY:z9sWɻ?=5FGGMuu|bWHV׿O2YkU]]}]!Ľ{R(zEqm9$0 )sN +;U2>m6b묮_]]MOkii'~%Kɂ^{;NđCg$+猝"عs?O0"{x7=\~ Phttt~~0z^H?p^7j:yo5p8vyI۝%a$౱كV j7Ľ %SE^fK(إvvvZΟ?힘X^^~p8$~?V[o)sϭܸqʕ+ _|m߾HJ67M- /wN eeV-tǏ?nMsؾ}̼+QWVV}k׮-..ZK1M>裏+**=zQypo;wN@(x򗿌/--رɓ555O:}qqĉ?x~!DMM<77Lcz{{{zzvyB?w[UUϯ/Q#Kֳ>kϟzIԯpX裏&ZS+W=zȑ#oi~?6Mڵk8rȩS6l<{͛7̿}v!a>` (|8AcKq .DMwޙ}gffKܲeKiii9w?33#7f˖-TLsu&jM;g]]?i뭺 ![ouܹ;ژQgg={lb+ri?lbi=CWtB.-----Bi4r(ʡC2>lf(o}K.8 !nw}}ś7o%nUj~~^!wȴ5mBP0,q3KpBlAwl駟~>u񱱱it:WVV9KKKggg{zzn޼ino߾e9tҥK{{{uuuKP^^g9Zs-KJJ&''7o޴Nb]zԩSn {Mܘ۷o]]9`[E"={|2'̛ ~i!̜/@+$Zgnn,nYYYMM'OMzFGG<җe!˗KJJ䱼]vܹs޽+WVVV;ށ[n#G!v166v-[:thtttff%Y-ӝN;GGGON~qjᲢ>sf1Zh6?( e\K>h WMު_(`'1Wt=%˕buP۰ ,bzˍľ6(2t -{dmUM'S dس2͏H'rwBR0W\Sr&rǀF2(}WۻBU#>]E>!$&\@RDr#YHJ.\T%={LNN<GZ_cP(ۧnǓ#H0KiOccjښ hhhihhhhhPҾRCCCѱi |>_ss߿?$B/emmm>/EC;VSSSKK|бrh^R3v*ɂ۷oۧ۷ӃןnooW\i~\G |P(k;::l]SS^Mƶ~*jmmPe%211q^=p8vKeo"؊D".|H$b=_#Hsskkk DK$%XY KKKnZۚʻik۷?qك J^( k innEbm0v XFbՒ "#,V9@fM#_`*bD 3 CَFכNrv ###/^zɑ/{رݻw2z{{KKK;;;^͚W_-c_%@0lii^G  rrn+jO(>ȗD"P);&גH$b lkzMMMb-ᰜ谂Oar!CJ!Rdl@1??//XQQxر/?رcBz9==o>'?IDP(x5$yXkmm#bQe` ! _9n!x<@ZZZZX_u(0b:lOF/W8k)fUVپٔ@ rT}ͦ>opp*lz[OTRRR__ꫯMMMڵ˾VUUeg899zmŞ%&nmm5DDprN / YOؿP25r/) wBSN 9sfrrjrrN-vl˚z''' Èr֔Wؖr\nO(bŮ r9rޖU. ^ՙ=nw(J@rTaN LMM=[n-))ٽ{wII׾Zٓ:8==/ϊz3T'''O>m/+?{[By<,cۇ,^\s|>5d)Laq|>xON^PZZQo!s:+c~ ~pbaYSB<^e,U*ؒG퀴dk`SSmhhB0uhKKKcccCCbAy"XBny; ^7BjRά={Si~~B9]GFF׾}>O088800011!Gc?4M>00fr2/ g.~766n9i){Vw5r/;\Z "H(r\)\Bi]}ll, -VeD95]z]9mll֭[~=өtEEDmGǪ***zm? ðR/ƍ'u>쇒I-rNy9xXw(B)]{[؂2C}޵t_Aq+ o@2I18v ᅬ`'qc ꒘ftRBBBQ(Uג6ikL ;Z*9m{L e[%0Q!ڊ!yAvps+Rq&KْPVa o T\*B!z[Pϲ̂uְt{)]Jf}cmtpXjTȥ{?4D6ŞĔXإ,dΟR؂2؂ hFVܥRT tm]*)E)JPJP-!hF*TRRJG .R(ko @"hUWgsci*c0  7  k%o'dز EW @Fb f-!h/\w(B)]{[qJJQR)5-b f-5 .R(K%(EJP-!hFؖu9*%oe9v)١HCi?U@bIeE @veC!-d#,`'f-!hb f4(sܥRT tm]*)E)JPJP-!hF*TRRJG .R(ko @"hn @3f+ͨۢ  T Tޕ@39oKp`@ƨ+R;4Cl @3[4E .R(ko0RI)JQ*REl @3VaܥRT 4>Xw(B)]{[@3ͨڂE]UTޕ ƶhb f-!hű92[4Cl @3[4ksIz㍨ h&-G)Qm @3[4Cl @39:4 a(zu),eLT)UU+V))'Kfܿ~jDF[ &|mfҬU0"bߧRT$JT2V*e=dcl)S«pdOw2]-cKVR [Hi};$v36E_*]j_;_I*kUPBE,j^~l~J.o=sےL˷Lm{qlK!X~ق_ o<|kyؤv/ز纪Y7'5(>cKgVg˷H*\3 S>@IVLǶb f-!hb f-!hb f-!hb f-sDo fֽ~l?/r)b'f-!hb fBP(eee9m2+|>ʺ59n ĨtnCXmMMMU,ƶhb f-!hb f-!hb f]K~޽Yk$iz嗹a"<[nT9uP>l]/uuuQ1L4 Deee<O-P^h >4;_~+l\s !dK^6vi(b]4M!wa!dxmJ{PUU-v CU@.2:DtIME 'IENDB`GvRng_4.4/docs/lessons/en/html/08.html0000644000175000017500000001301311326063741016276 0ustar stasstas Decisions

Decisions

Tutorial

When Guido was a teenager, he was a bit rebellious. His parents had always told him every little thing to do: every turn to make and every step to take. He finally proclaimed "I can make my own decisions!" and went on to explain to his parents how to talk to him to have that capability.

He explained about boolean expressions, which could be only true or false. Guido would do different things depending on if some condition were true or false. Here was an example he gave:

if next_to_a_beeper:
    pickbeeper

Guido has the ability to sense his world and to act accordingly. "Golly, you're growing up fast!" proclaimed his parents. They asked what things Guido could sense, and he provided this list:

front_is_clear True if there is no wall directly in front of Guido. False if there is.
front_is_blocked True if there is a wall directly in front of Guido. False otherwise.
left_is_clear True if there is no wall immediately to Guido's left. False if there is.
left_is_blocked True if there is a wall immediately to Guido's left. False otherwise.
right_is_clear True if there is no wall immediately to Guido's right. False if there is.
right_is_blocked True if there is a wall immediately to Guido's right. False otherwise.
next_to_a_beeper True if Guido is standing at an intersection that has a beeper. False otherwise.
not_next_to_a_beeper True if there is not beeper at the current intersection. False if there is a beeper at the current intersection.
any_beepers_in_beeper_bag True if there is at least one beeper in Guido's beeper bag. False if the beeper bag is empty.
no_beepers_in_beeper_bag True if Karel's beeper bag is empty. False if there is at least one beeper in the beeper bag.
facing_north True if Guido is facing north. False otherwise.
not_facing_north True if Guido is not facing north. False if he is facing north.
facing_south True if Guido is facing south. False otherwise.
not_facing_south True if Guido is not facing south. False if he is facing south.
facing_east True if Guido is facing east. False otherwise.
not_facing_east True if Guido is not facing east. False if he is facing east.
facing_west True if Guido is facing west. False otherwise.
not_facing_west True if Guido is not facing west. False if he is facing west.

Your Turn

Guido has not completed his community service to graduate from high school, so he is assigned to pick up trash along 2nd Street. Construct a world that has beepers spreadout along 2nd Street between 1st Avenue and the wall on the East corner of 12th Avenue. There can only be one beeper at any given corner, but a corner may or may not have a beeper on it. Guido should start at 1st Avenue and 2nd Street facing East.

A starting world would look something like this:

Step 8 Starting Position

Have Guido go down 2nd Street, picking up all beepers he finds. Remember if there isn't a beeper at an intersection and you ask Guido to pick one up, he will complain and shutdown. Use one of the tests from the table above to make a decision whether there is a beeper available to pick up. After he gets to 12th Street, he should take all the beepers with him back to his starting position, face East again, and turnoff.

With the starting position above things should end up like this:

Step 8 Finishing Position


Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/06_files/0000755000175000017500000000000011326063743016574 5ustar stasstasGvRng_4.4/docs/lessons/en/html/06_files/send-banner.gif0000644000175000017500000000010011326063741021444 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/06_files/sflogo.png0000644000175000017500000000546511326063741020603 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/06_files/step06.wld0000644000175000017500000000013411326063741020421 0ustar stasstasRobot 6 4 W 0 Beepers 4 4 1 Wall 4 3 E 3 Wall 4 7 E 2 Wall 5 8 N 3 Wall 7 3 E 6 Wall 5 2 N 3GvRng_4.4/docs/lessons/en/html/06_files/step06.png0000644000175000017500000001772611326063741020436 0ustar stasstasPNG  IHDR^ bgAMA a8tEXtSoftwareXV Version 3.10a Rev: 12/29/94 (PNG patch 1.2).I6IDATx]P2c/ǒi v1ME'nIS4hҋv2m/zt76Cof8M3N4&C`\RۍX#iL꧳g׻Q!ʊ0K}dW͗MBifj|nM=j[ Kt!xaD/w֭[B۷oQ͛J N@ß]p4Y1EhAT8p`W͗Kd+×ݻ3?%.^CiS.o+++;rHwwd-9km޼n$=>+猟"ضmۇ~OD7BO+**… SO%oܸߴiåp?ۘi̙3N9R|Xm=3ӟ.3S}aaAS^^n7ST˗/ !xu齽B}k[l9r`oo?n_{UUUYY[&''~|jjjyyyƍKJJo駲W8pرUSRRrɅk׮ӦMB07PN0qi+łcKqɷ~;fS3񬬬Ƚh4*?.Ν;BR멕9qƍ+++~ΝQ]]}ҥ;vTVV~g}733c_VVV<OwCȩS?9ܞ1ׯx!LD|ߖGk?yBWWW/}ڵkcB]?'%,!D___|xllgzz󕔔,//[svww_v>^mCCC]]]KKKKKKr>zܹs!jkkl޼>x<555(--B\v:!~^cǮ_wڕ17nܐr,,6l޹sw {R|ӛyMO?-buBW^y%EO~2sss1u˫FGG\yݻwS֭[7:::55޽կ~UqRy,o###7o|&&&<;v(--s…C%;7??uw!֭[Ʈ\~}߿߾^%v}}}rzII֭[FGG=aÆ9ҥKn޼o>xR4lddwuu XGdbb"L]wrB!Fo~3{71 nݺ3 g޺u͌]1 h$|~-%D?9>ؘF^K/Ɍ=q'M!hb f-!hf `kz%>v: [u]1O9sИ54oU%cttzSx v~E;q(Y| HUL8m1^Ϙ&{Q `@rH1::lj6l6`zEUߊb9۔&'S) k G'Y[NDTm%T;|!1$ EL89,)v^\$UpLݞC kƪ+H&+-pROjbѬU$[}x>JVmjZv \o˥{p@{Nwtd;ɀT6֛EJ}G.[4rR̫eRAŃD!hb f-Ip$ʕ+o8 ^{ܷpn>7883%y[oK⋂ww.tS_)ׯ[o߾ǖիWlpTgڵ+gpOJiib\ZZyBIL%9~GT#9p$[e. a|||Ν1GFF&''kjjVO'H$FS|>wp8^"NР#V[[[ssa{땴/d`|futt,,,!"H0lnn655ٳ' 9Y) _ڂUC;VcccKK|qOwwU%xr-{# B`pxxz* Y777 P( Y_ёH>O̯䮊/2ςp8\WWWVVxLuuutuuMOO[oܸG-..\eee8vCo˹H$"@lߊĽ} "Ė%D>GX(jjjjlllmmdtxxxX/p8l~h`0 g;::@&ɕylٲepxdd$588xK.Y=29:cǎ_]&WOOO{{{YYٙ3g.]ݚW__ޖoP(455O# $[TGGGkk= & #mmmr+aFq/ˢѨ% uww[e^oGG|B^0 RB,"c5A Sʕ+[lY\\gϞ~TTT~GBy_|ŊC-,,={ӇB[MMMiNOO޽; ?O3mex$"Oz~(kFYl566ZG)$78k)fmUVپYP(zU}fgΜ hTfS]]:~̦ҺW_}vjjv}Jkg}V.%3qrr2(ۊ?K>m#j?>#1[L7DprN /X'y(TYImiiF1r4T;iW$N8199YYY999Y[[+?eM aČU|>kJR.z^W %}t|Q!-A#{޶6ے3з*Y9ڿ?p :D"^3 3IGydÆ ;v(--׿^SS#{R1GY@~#bu%@2~}bX-' ZKd ~r淦3 a'?'Vs(7Ѩ,k޽{<(Mp8  kم2z[S֑_Ck ˚D (s|f(TƖ<-l%렞 666P($-Y狶444~+暚<_ !|><=<<,+ I;wiO+W !tojooc^wAy@ĄڹsU4@{{{ɕ }Is9$ >OwZzkp^fE"H$zYS>2Б!0MӺ^Ggggggg{{X.Zbmrl5f r~S붱ׯ~b{{۷KJJb2Ycѱʊ^[q0Kzuhkk0555Y%˓Zr̲O( mmmU󵴴NwccFkK/Ɍ=qDcUcIlb˅c פ|߀#V*yϑ 8BlKu^ZZx<3` %-_bMqb;%-;;J[0 4ZMia80 ]*)t&Ip(-{m1 {2[4Cl @3dca?S,Ã4*klŜݚ?vs){zu/4e+mK^$koxX_CS\FzmЌ%p (E)Ji@‚@JR)]{[@3ͨ2r@Ylq1N"p-ya'fIb f-aHf+Ͱ@3[4Cl @3_R鼠{Z TKۊ$(E")kl(Z[4kl]*)E)JQJ#pʜRJP-!hF-0r-YLΗ$r1Y(-Z[42ChFelhb f-!hF2]*tOx{)]{[qJJQRi5-w Z@3VaܥRT4I,Ty))R-b f-Q9e$ƅdʻR[iՙdOVv,٣>$X;Irn@3@3(;>"Qy)i Ib f-!h/\w,Ri_JVaܥrRuI(E5g [4ClЌUw(F)$]*sVHB*ko @"hIʵd vhFeok v$Ќ-4y[4N"[4Cl @3h|QKi/Ry/ko0RI)JQ*REl @3VaܥRT4>XwYA^ -E* pwmI}lqUŤ ߭+>_pű*Èͩ)y%j~*ǶgʞPV›fl+/74MӨ?m+ 72MSl9- :*o8FWK;|2.flr +e}u30{R:JE? &L>?0eT_pN79n :\="6LJ.2 .>j`%Kۊ|HVş| ~V? RH~2 nCo f4m]*tOx{)]{[qJJQRi5-b f-5 .(Ke )UHtm(Z[4rl[ee w=v).  qILÑDQy{WU z[4lH>ŐO ??okjj*Zz4hlœ=^(Rnjg Z2~^v:45&&GƊMt%Kmزع˞.{c2X%D mY9o+7=גªݮ 5]^FP9v:bdG9_fE؊|tdzݱUg2T=)J2 , C!hJz@[4ClL#vY;/sD.[>_S9uPo]ωژKO? ٟزeÊSSS~y K.i~+h0%It~h4ZUUF(r]Ox<Czpmmm4]S rCS0zIc\x<d[W뗗Mx<֭WCQtIME,8IENDB`GvRng_4.4/docs/lessons/en/html/18.html0000644000175000017500000000603211326063741016302 0ustar stasstas Where to Go from Here...

Where to Go from Here...

Conclusion

Guido is starting to realize that there are some things he cannot do. In the projects where Guido traveled, he had no memory of how big the world was. He has no way to keep track of a count. He tried to tell his parents about the journey but when they asked How far did you go? he didn't know. In the rain project where Guido had to close the windows, he had no way to remember where he started, at the door. He had to leave a beeper there to know when he had gone all around the house.

What Guido would like is a way to remember things. He read in a computer programming book about a part of a program called a variable that could be used to store numbers or letters or even words. Variables can hold a number value and that value can be changed. If he had a variable, he could increase the value in his variable by one for each step and know how many steps he had taken. If he had a two variables, he could store the street and the avenue where he stood at the door in the rain project and wouldn't have needed to drop a beeper there.

Alas, Guido does not have variables. Sadly, he knows he never will. He has heard rumors about other programming languages, such as Python, which have all of his capabilities and much more, including variables and the ability to listen and speak (input and output instructions) and even the ability to create whole new types of robots (object oriented programming and inheritance).

Its time to say goodbye to Guido and his world. He will wait patiently for the next class of students while you move on and learn more about programming as you continue your journey in Computer Science.

Previous | Index

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/06.html0000644000175000017500000000457711326063741016313 0ustar stasstas Robotics Times

Robotics Times

Project

Every day, Guido is awakened by the sound of the Robotics Times newspaper hitting the front porch. Guido wants to stay current on news about robotics, so he goes out and gets the paper each morning. Here is a picture showing Guido asleep when the newspaper, represented by a beeper, hits the porch. Write a program including your turnright instruction and a new instruction, turnaround, to have him go and get the newspaper and return to bed, where he likes to read.

You also need to place the beeper, as shown, in the world. The second line in the step06.wld file, Beepers 4 4 1, is used to place a beeper. The first two numbers are the location and the last is how many beepers are placed at that intersection.

step 06 image

Have Guido start in the position shown facing West. Make him get the beeper and then return to the same place, facing the same direction as he started.


Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/18_files/0000755000175000017500000000000011326063743016577 5ustar stasstasGvRng_4.4/docs/lessons/en/html/18_files/send-banner.gif0000644000175000017500000000010011326063741021447 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/18_files/sflogo.png0000644000175000017500000000546511326063741020606 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/08_files/0000755000175000017500000000000011326063743016576 5ustar stasstasGvRng_4.4/docs/lessons/en/html/08_files/send-banner.gif0000644000175000017500000000010011326063741021446 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/08_files/sflogo.png0000644000175000017500000000546511326063741020605 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/08_files/step08.wld0000644000175000017500000000017511326063741020432 0ustar stasstasRobot 1 2 E 0 Beepers 3 2 1 Beepers 4 2 1 Beepers 6 2 1 Beepers 8 2 1 Beepers 9 2 1 Beepers 10 2 1 Beepers 12 2 1 Wall 12 2 EGvRng_4.4/docs/lessons/en/html/08_files/step08n2.png0000644000175000017500000001732011326063741020670 0ustar stasstasPNG  IHDR`ObKGD pHYs  ~tIME   fM_]IDATx]L3-vBB , 1tmd7ݍU(moy"ڛUػJ!U^`VAjE4nBV$]ICsq6LƯ0|dńaP#U_@r\*mmme``TxVfT}7Ϟ=K]WTT亹rdqqquu5=;vlttTTiJۿeee*ht}}}qq… dӧOg~0Jm+!auuubX,233sΝK.Yr… 7n0 #A+VWWWVV?~o洭Ν;WtR 6ů,a2r+EQV%%%四H$m 677ʎ9rԩO>9t˗m?{?yΎa<Çm$s֭ʶ,h%7IXzTQo%Sk߾ԟ(d˗?}>ѣG777CU777pd]!2}.]$k,s5V,VW4AZ_|zCC;#:yQ0{뭷k賓ļwvv6 |wZ__hll>y޽{h;/ y$inn޷oߗ_~9==m+rq#LNNBC:uѣϟ?ب+Bԍyϛb؃"ؿ~]p]ǃ֑,Wekk͑3 !.^X]]?r`ѣGB{o[=zlݶlii ,7xc{{ӧr}dM38p2n5ҥKoߞ{WB2Q2[II Z*^***666|>@|jpXQUU%(//|%'󭭭ٶx<ǏRMM;}vvv{UTT***d74}6%kkkqٙ3g&&&?~N:/^dS7СC333 Z?_a1aXaZ__Oxu"1׻~{`=l$b , h  6, h#1(aqOSĿ?)܃I];`t"U!y+˴ @7gmG0r %+?]$x-y(Rgvʐgḗ!gdm< Kfބ&("=ۉ&&Rtvdowq;e;PJMgqǀ. EO&PȤaraŅMuXyOۀ?if}ငFyH6& Oy 7W2ɮVݳeXiv+SL7La3?$L\4&+U@._sh#V} g2Eic/[(Q`.'JmM  h  6, h~)`zmKI.rܹs !߿_]]]o !Cz{{{xu_܄B>+5@OOOwww3ǡPH/˱1c(e]]]a}Tvhh5>Ο?ȣGn޼955eW{{ٳg;Gܿ̚7>Ss? {XźKVOoPohh03HQCCCl$ YIYB!sKTkkkwwxbsssr@ 0000::jCCCf !?Q0d< !W|XG|h4z^z_ȯ~+{̙w !8zhٳ[[[7o8{õk׶p]]իW?7anxKKؘ9$5;;+^ uˑ/^UBn+!oii gnb~ɡ n5_:;;{zzf2vZ];~,?7nܸzj09ݻw/^h\"S\x?lkhh󿱱|S[[x~ ~{ߓ'Yp8<11q`0ntyyʕ+֑/s%W6/Qu(dFy=^Ȱ FNZ~MWWWKKKKKGxv>Ⱥz0XWHX-C?3332'Nhood_|Fo߾}U|bbӧ涑HDihhH&yVW$ı2ˋjmmUFA*ia9,'ī-ȫS<敟}}}mmmr 1y1|^!DCC< dV[g`}}5fgg'&&JKKrW\ZZc[uuurWk‚^>88(ﵐ|TΆ9iA(k~뷗96/;Y^7>> ~<"k_1XlkkK^ in-bօrԶ\¶w_9_i+++^~XMMMJz. ^W¦&s: VSSzm=̼syu ǼzX^"הgmۚ{rE CCCYOv3?H4;_ ,W"V6U,7I* #{~M{l_Sl\YFjL^:Yp!{`;wN:_~9U'O,£#G>V %^Vl[J2'RE5TTT8bX,1dÌ&yY>,3 #U CgQ6Haa%])PDn\VǃcXcX#a@mXnUxRR.aY/0JQR/_R^ ,E +~X(E)JX JQRuR.a(NmXl 554_=hCB6, hAw`"U6, h ]8|ҲUARRrPJ* )E)J9(_`(ZmX1$(E) ,QARRrPJtRRZ' 6,P6 G q|uCB;aІ{ a@AF 6+F 6, h ]8|ҲUARRrPJ* )E)J9(_`(ZmX1$(E) ,QARRrPJtRRZ' 6,P6:}HHfNqd9#%dzx֜X,Ff& .k  6\`@(pk@mXGuRRZ `>HJQRJX1$(E) ,E 0惤(堔~% b>HJQRJzYARRrPJD`@%Ƚ7  hCY{5eP匪J&@L @\@@mXGuRRZ `>HJQRJX1$(E) ,E 0惤(堔~% b>HJQRJzYARRrPJD`@{%EZ)e^r1,P6+ H+{C͕;ڐ_rAA`Y㉴; І{ wa@mXGuRRZ `>HJQRJX1$(E) ,E 0惤(堔~% b>HJQRJzYARRrPJD`@ư^ )S%@9$$5ȣB @tbX, p6MU@ 6 [t#SrCB h  6tARRrPJVI)JQA)0惤U* ʰ~1ݯ$hC* )E)J9(_`RR^֠|T^J),DJ0  ,+&Rŭ$䢉T-h"URBْ $ŗ58^"8*ݕ"BBU PX" Zc+~]9& :cXn+^;\#)9 )B$ᢻ5URsE`U2D ?*`9|T^J]*&R(U ,RI)JQ*w ,EK1,~zX1$(E) ,QARRrPJCBwRI)JQ*a(NmXx F=ݕMMcXA`@mXA`І9E 6, h  6,=ݹ mnZ@{RemXA`@mX G3`k&f_Ma)`lAVRR*Of¿]"RS,ϐKᜬַ&˷Ia)H\g/кm/=/Ydv՞=kRilM_pNVw@U{3UUqO=OVJaT]=Pu bʏċGAX e&JڣYA1"*mpB l.ۇ6ʙ 3=J`ڙIT@yA`@Iz޽l8]ƈbab|7x=o%!;V/?a!nܸEGGBh~ _-(3<0nUIENDB`GvRng_4.4/docs/lessons/en/html/08_files/step08.png0000644000175000017500000001763311326063741020437 0ustar stasstasPNG  IHDR`ObKGD pHYs  ~tIME  *o(IDATx]L3/aI ېh$iQTE7]Hzw۽CJth, [Kv!$ l晌_s3=̙aDžaP%-U?@rļW޵P%UZQ_?{,}WWWW^^vsdaaaee%+++;+?~|ddDTIB?p@EEE*Xlmmmaaŋd3gd|8+Jl+!aMMMx<<==}˗/Y\uś7oTu+++ˏ?nhhx7]m+o{n._fŤM'a=JXLվ}666vvv2V@F[[[px~~~ccѣO>tPU>Ç_rvgϞ?w mooqС .9r$*H*o߮hmmͱ;f'*U*fdj_^SS,|Z 8vܓ'O}4#@`/ۙzycuuӧ}CU766T]!6}._,j,s45V}رcsssϟ?___F+###ByR-,8p]]֑,ΉWess͑gz>B\t˗G?9o޾}ѣGMMMukjjJKK }7>}:33.߿KKaO>][[KդY9"&Ucw岲;wȭ+qÇ !JJJ( L-gm/V四@ g>h4*Bɒ;b^ZZVWWm|'N<|puuuqqz_~mhXRnSzddd||iL (++3|F`JOr0{mQVWW')--xbMMuc/_L\ !?'|2Z__A!_|%oOLL|WW\lF9`|"h4}cSA,%%|Jҷ+$8s̓'O>㪪h4b~>~'|iv=N<9??3 ~W& ׿N<АzUUD"a_E|qO0oݻwkjj"ly,KahtnnNUㆉҍaFo .eee>?????N8QQQa;vܹڝ9tر/NNNNNN9s6% jjj~ٳg?~N>/^_SQQq鲲wyG|L/R?r6ͥs߭xuX0H666&p8,/2Wb3CCCv ò{ٱhqʍLX>b;fZXNfoooollrR{&I`mmm/ٷXlLX,f 3,p: p8)xJyx @1g'ch4ZUUM䖗m.!mXA`@mdXJX%2O%1zPHUa^2{ _F +Kk9^Ǖ7.iRuv^ki{TOJ4<:.zXY,2 uSU3OzCm2Y$7鳳I|. e|)\}t]ÿgؤSn®b1֔%R ;"R\ǰ*]ľI^,NzЅ]Bf*,OxI@F XLߞă5#Ròs Wf/3"Zd,,cSSޣeXwv 7La˳%T7}t kmdJ5җp6On+Ԯz<(md,{yiM~ݸqCŖO:g}| <>U[{MX,vԩe|7)<=qﱰ-//j444|X,V$?|׾5%L) ?zX)=Ag_o 3:)ʂ:KKKgΜ{NaZ﩯onnrH$2::UiOGGjW{zz hmm|UUHI G%Շ~ㅜR鑿vwwo~Ύ577IO333PW__Q%+w9 !`sss(2^sKDM`uuuǏ-75senOfǺٕP( U}ykpuu ݻw%uUJ>ҥKٳg?~…Jvuu/~ _^^~СX,1.om f]]`SF\3וgEXPFX{{{gggmp*]NrKKKKKK.\.))I2ikk[ZZ*--I566$1`0 n&eu? \TPh0~g􌎎]wٟO<~ll,3ss755^ɎD"BKK3j``ΚG333%%%~WX\\c[rk׮s600 |ToqGGG}}4zsZeNՍE"`0(ȚOπv !D<ܔBڃKN9zj_¶$v?9eƍ:y=F%=?ѨQh[G~snn;?LMM9IxT<:l[ݓUȯN(jiiuՕN *joog`yJb`r @`y-HJyO=ȌJ) ?z$?k{{*--Ŧ՘uA:t,«߸q2N:U{ISSSUUUG-m ߭@JIKX'R-dN*~7Ok(//wR0xmȅM5}xHJQRJi* )E)J9(_`|/- 6 ˜RR( )E)J9(i I)JQA)-{X@m(Rx>$lg3V2%$DS=g͉d0 mpZmX\Qr %  6, hC+>$(E)a|/ c>HJQRJX@VaI)JQA)K|烤(堔=,ʼn  6Khkcp v hCYkpI(rFU%e]BPXLO` &R  v h  6,I)JQA)-{X0$(E) ˜RRE`І~UARRrPJ1$(E)t=A )E)J9(e @q"h ŁŵGe`V\,  e|ѽ6EZjt]цe' {t ŁE {a@mXGuRRZ `>HJQRJX1$(E) ,E 0惤(堔~% b>HJQRJzZARRrPJD`@ưI)S\%KP^!%*x<_ І4aІAw\(!9m@mXGuRRZ `>HJQRJX1$(R{Ъ,KXlI 6 ˜RR( )E)J9(i I)J奔‚L ? -yb"UY-KsiR |YJ!oJ9M2 ۟xޗR[R yUnDF0*8%W~Yx9 mK)Tf)*(>qʨm7DRXJo7K)VG堻B_BW3 䗲rVHr5r‡f|YJ!o &Ruo-; ֛o7K)V3aU$m*4/ AWWc)s2TXJo7K)VGϹV0pjq)(,Pʛf\⡫5x-L8nR |YJ!o ,FQۼ^𯕗y" w?*Y`9|T^J=*&R(U ,RI)JQʽRt/izX1$(E) ,St>HJQRJKY*)E)JZJD`@'PX lMl"U.ma@mXA`@*3mXA`@mXks-YذF 6řves=, h  6, h#'f0 %W2'L̽RfK٦TU [T[fw&j>4gspNVKˤY$ ;8ԮڳgRU*R-3ɪ j/t!CfXYTJU)h{H\s=,7ԇP펪מ`<W'^< r/R=/(7QUe y}GUhf_嵽ʳ SŚ}mۼ)lưR2= ^?xp7ayڝ8S`;˚F@+lO#5(ޣQ+ü)堂IWt|&%]W̥TcX @mXA`@mXA`@mXA`@mدFH֩@ɯ8nVowR^".v]B h  62Vu.O``d5y;X&k#h0l4O%s%審$s,zly6KZ8 8n{;>̲a[:l/RRm;siV+}h.0sƝsϾiJ9xD 56, `  6,Hye; uu&(5F<7 #onn1P{{?aЃ!Vn|chhH0 !͛7:hooBȴB~v@뿅oPue7%IENDB`GvRng_4.4/docs/lessons/en/html/12.html0000644000175000017500000001107111326063741016273 0ustar stasstas Take Out the Trash

Take Out the Trash

Tutorial

The do instruction lets Guido do an action more than once, but it has a limitation: you must know in advance how many times the action should be executed. If you are at an intersection and you need to pick up several beepers there but you don't know how many there are, you cannot use a do statement. The while statement can work in this situation.

The general format of the while instruction is

while test-condition-is-true:
    action

where test-condition-is-true is some conditional that evaluates to either true or false, and action is either a single command (like move;) or a sequence of commands in a block. As long as the tested condition is true, the action will be performed. Thus while is similar to do except that where do specifies a number of times to execute an instruction, while specifies a test condition. As long as the test condition is true, the instructions will be executed over and over.

For example, to pick up a stack of beepers you could write

while next-to-a-beeper:
    pickbeeper

This says that as long as there are beepers at this intersection, pick one up and check again. The result will be that there won't be any beepers at the current intersection. They will all be in Guido's beeper bag.

Writing a while loop is tricky; there are many details to get right. The general steps are

  1. Identify the condition that must be true when Guido is finished with the loop.
  2. Set up your while loop with the test being the opposite condition than the one that should finish it:
        while opposite condition:
            ...statements here...
      
  3. Make sure any setup code is complete before starting the loop so you start in a known condition. If conditions are specified, they are called preconditions.
  4. Make sure each pass through the loop makes progress towards completing the loop.
  5. Make sure the test for the loop eventually becomes false so you can get out.
  6. Write code for any cleanup work that needs to be done after executing the loop. When exiting the loop, of postconditions are specified, they will have been met if the preconditions were met when the loop was entered.

Watch out for infinite loops, that is, loops that never terminate.

Your Turn

It's Monday morning, again. Before he goes to school, Guido has to take out the trash. He's not sure how many bags of trash there are (represented by beeper bags), but he knows they are in the corner of the room as shown in this world view:

Step 12 image

He needs to pick up all the trash and put it in the dumpster in one trip. Use one or more while statements to instruct Guido to take out the trash. After depositing the trash, have Guido step back to see that the trash is properly in the dumpster.

Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/15_files/0000755000175000017500000000000011326063743016574 5ustar stasstasGvRng_4.4/docs/lessons/en/html/15_files/send-banner.gif0000644000175000017500000000010011326063741021444 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/15_files/step15.png0000644000175000017500000002056011326063741020424 0ustar stasstasPNG  IHDR`ObKGD pHYs  ~tIME "} IDATx_LW3_B anj ndқJSjJP_mV>m%oHXT)H͖snVMU]0>zÇ_ (s$ էT_)2,-UWKU3y?7|}]zǏ#[o{OEEE*H$_WW,--moo_|pa:::Ξ=WVVٵCknn>qg}VQQq̙wy7HñԍQU믿^^^.--mlllhhH;w!ϟ?αBjV&ՊJZ 4MUո|@ZYY!\r|[obG>}UUmnn|2 LJߏ㍍'No !.\ l4=}˗ϝ;.ŋX,6==mLNNBS7˗/^hhh4mfffuu5~rɟ5oE%=$|U^?ԏdx^\.=̡|mm-?S{!իUUU_FFFg_}!?3g|;w<~QnMMMIIoM 뭨}7={C?qD Pٳgɚ:u̙3$kLQQQGGGiii]]"ݺ˟>}R\\9d޷&+Xjl{*++x<.b!RZZx^|Ibt/))x<[[[u].ׅ =zV]]}ĉeeeA2 ,.N5IZ5M&''].Wx-P pH@a`0P@(X YB۽aKSnk~~~ff&_MrBÇ jWUU;n}-׭[!nll\t`~~Ç.,2azxxGlRUҥKn$Jwѣ666_m׻\.UU p%L vCJ vC8)^`yyzSSuW+/--|~?գԱVɤ=\!\W=xWlĥ D"Ǐէ~ǝP8p0]x1 eb___04<ˆ`&/ bj3FLNNz^NK?G%*777^~=dņtcݓ~? 뎌d^^=5p\"6%s&+++ׯ_5.,,4448eFr7B3F- h4~ طh?  BP(bpX[3z`{jWW544lmmD{X[[[kkkˆJ7>>>;;;>>󛛛SUuyyڪ'&&\8 "rtgN``PV {Ek}/^Pwpph4J aFQ:X E(Hwww Ȧfe_*++[[['&&=Ǐ߾}{nnWgggss?ZfggO<9:::77_%?oaя& Bv:z}>At&=U(j%G4eXpmR@U%dooo__@(d^wdd,--a?55ņP 2痢KWP(!^B! U؇ȄOenjlmO߯vi9P(zy}fD"ꅅ{]z_Nz|ʕ/^VVVj֯k]VVVQQzggưz{{iwppP [k 'iiKp8֥WE?@J #KKKՆSCzi9-?WZ__^__omm]XX(..6ag:;;KJJ cR Zz^}|:ϼ%e^whhhhhOz^gfT `]wڟ7_p6W|>ZlSN\'?'YX,6==}ڵH$٩t}}/k9EW6/\?=/A6aH#'C_ ~菍7󃃃A!ft/0-CͅZ/^h_=VUubb>?==3n</**Ō ?ɫ?q̰*L83j =?Mt)vŽm|@= ѫ)v@www{{;gojj^LOu !>ɎF4!\hkkkqqqzz>OJkkktl.CiD"+++tk~~~||N%Agg0ׂ=,R__www|>:lJ588bcŶp8FXh&Q+`@8 !DӴ='z/hf~ȶ¼3ұ.; V+%,2,T$)+HH+)+HHiRW _uxxXh\UUu~~ޮ6d,X---tб֭Z.]TGIUUUgϞ-mV@R 9'R-&R% 3/k(++(d&zY>id3 t @"7 S2=1,@a0P@(X ,$(Qa/0D! QEWo QBXQ,(X(X yX(+X D! QEzY]D%J=,(L(X ,1,rO4_8$a 0pH@a`00D 0P@(X ,w}>HD! QaI0$( Q,9De!J  !^c>HD! Q+XD (DYDe!J&, $o7Zll9p({u(] |H(_bM3~#ʱQ avEyyeKHg{Vz?eKH+=FDVp<&մ=Ŏ([@2zXv ʖ( zXw˻ li`eęcɈB ,(D!B=, De!J%|B,DW``0+Xr(D!BxH1$( Q^ |B,D „@apx9>'[%}ȁϬNwd}p'9> Pj>38J( y %6f*@2g4M΁I(sf*@!=gbg:ݙQ ,CW2jѓcâx:DR6[%}DԻ5yqnñUG4P2]ř#Ό9`P (DY%|B,DWQB( ,,xK (DY`)De!JDQB(!{XPP@(X n꿕Xs(g qqtH1Y3I70 őrr& Xí%=݌By2Όr& Xm Ψ%@q< qf3I>Kyr{ҿA=,&RMEsI7a"4J83ʙ`wk'cyqf3I8s\X7DžAw CCBDe!JA" Q%^c>HD! Q+XPP@,9De!JEQB(Q/k}>HD! Qa@aBa`08a: ʖ(ς%|'9DvH(qߊ-VQΌ` +E7'U؃<% $m/)W( ՊG:lipaQDơwQD48%wmD_9)`q>K(_*i)k ly籼 ʖ( VF9((4pP (DY%|B,DWQB( ,,xK (DY`)De!JDQB(!{XPP@(X ncXӗ[ 32toJ((@| Q2X!51 dzv9hfPM;^Q AwM4Mo/p%+QPM%Gze=,Aw9ϨQ n=,@$<+omD&Q (~hyD |s水Q  0P@>$( QB$QB( A" Q%^`1$( Q,"|B,DzYA" Q%d TKQJ@bR, e @VMJ_,^xDrs"Ue|8wC-Q 9'RUʉRN)PD9rrPDAa|YWJ9^gb OL(71 AwU+B(7!yqq+XNVzN199(qHQ*klixVyR%Dm3a[OA׎!cJs䠈mg.9\)Bײ&<-emA-Q Q֐͗XNE-Q VCșcɈB#[";>*X(Ur`>$( QB^%|B,DWQB( ,,xK (DY`ߒA" Q%e (D!B=,(L(X ,I(8pHK@ &Rŝ 0@a`0P@(X ,ς+ a`0P@(X , Î{^4]wa0•p,{{a`0P@(X , Î G3( k O2L+MVq2,g&[$r*o0r\8'W寉c 2E m:/XLuU(ҝ㜬f9.s,QEql(bi{0/V.=tN@ioP4GC^sp<6^,1/ߐT968iG%NkcƋے\sfƱ=㯉*Xw<@^=s,56pp%/XZk9=V :$ 7{,.b0GDYHpE˗piRul)ǰ@2(X ,  @a`0P@(X ,  @aliZ =,F;s;?"͛9n@a`0,. '\23O`/yD;;;LF `DV3?~" eN$6Y)IzŬ??I[lIGzJ֋~Nbd? _fQҏӲͫrۙVo ˮj&<" %{2ՙp0š\!FeәJ V~zaٿJꄴ],W z|l ;$y(QP=IDAT3b8˰wvڄ g2̜+l3og( o    Hzvi%.X7o4W~qCQMiBۍuuuuWK4iŚ( *W!]]]iŪ\+@tuuB7MӔt!~ 8rFXQhu4d__IENDB`GvRng_4.4/docs/lessons/en/html/15_files/sflogo.png0000644000175000017500000000546511326063741020603 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/index.html0000644000175000017500000001253211326063741017163 0ustar stasstas GvR Lessons

The Roger Frank Lessons
Introduction to Computer Science: GvR Unit

Programming with GvR

Programming a computer in a language like Python requires a precise sequencing of steps written in a language where details of syntax can be overwhelming for a beginner. Everything must be exactly right, and errors in just getting the program to run are frustrating. Often the output of beginning computer programs are text-based and uninteresting, at least to humans.

To get acquainted with the concepts of computing without getting bogged down in the syntax of a higher-level language such as Python, we begin by programming Guido van Robot. GvR is a teaching tool that presents the concepts in a visual way using a robot-language that is simple, yet powerful and extensible.

We program Guido, a simple robot that lives in a simple world. Because Guido and his world are a visual simulation, we can watch the effects of our programming statements. This activity is presented in a series of steps -- tutorials with accompanying mini-labs.

Step 1 Guido's First Steps creating .wld and .gvr files
Step 2 What's That Sound? beepers
Step 3 Turn, Turn, Turn sequential instructions
Step 4 Just Another Brick in the Wall world file: walls
Step 5 Do The Right Thing user-generated instruction
Step 6 Robotics Times Project
Step 7 Birthday Message Project
Step 8 Decisions if statement
Step 9 You Missed Some do statement
Step 10 Let's Dance nested user instructions
Step 11 Apple Pie or Cookies? if..elif..else statement
Step 12 Take Out the Trash Conditional Looping
Step 13 World Traveler Project
Step 14 It's Going to Rain Project
Step 15 A Job to Do Project
Step 16 Lunchbox Project
Step 17 Community Service Revisted Project
Step 18 Where to Go from Here... Conclusion
Language reference Short description of the GvR langauge. Appendix

Acknowledgements

This series of Guido van Robot exercises was written by Roger Frank. Comments and suggestions about these lessons should be sent to Jeffrey Elkner, who converted them from Roger's Karel the Robot originals and who currently maintains them.

The Guido van Robot programming language is descended from two parent languages: Karel the Robot and Python. Karel the Robot was introduced by Richard Pattis in his book Karel the Robot: A Gentle Introduction to the Art of Programming with Pascal, John Wiley & Sons, Inc., 1981. Python is the creation of Guido van Rossum and members of the Python community. Information on Python can be found at: http://www.python.org

GvR was developed by high school computer science students at Yorktown High School in Arlington, VA, under guidance of mentor Steve Howell.


Next

Copyright 2003 Jeffrey Elkner.

GvRng_4.4/docs/lessons/en/html/03_files/0000755000175000017500000000000011326063743016571 5ustar stasstasGvRng_4.4/docs/lessons/en/html/03_files/send-banner.gif0000644000175000017500000000010011326063741021441 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/03_files/sflogo.png0000644000175000017500000000546511326063741020600 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/index_files/0000755000175000017500000000000011326063743017456 5ustar stasstasGvRng_4.4/docs/lessons/en/html/index_files/send-banner.gif0000644000175000017500000000010011326063741022326 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/index_files/sflogo.png0000644000175000017500000000546511326063741021465 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/05.html0000644000175000017500000000655311326063741016306 0ustar stasstas Do The Right Thing

Do The Right Thing

Tutorial

To keep manufacturing costs down, the factory only built gears in Guido to move forward and to turn left. I read in the instruction manual that Guido has the ability to learn to do other things. For example, if Guido turns left three times, he will be facing right. But you as the robot programmer need to tell Guido how to do this.

We do this by defining a new instruction turnright as a series of other instructions, specifically three turnleft instructions. The definition looks like this:

define turnright:
    turnleft
    turnleft
    turnleft

This is an example of a compound statement, which means it is made up of two parts. The first part consists of define followed by the name of the instruction you are defining, followed by a colon (:). The second part consists of one or more instructions indented the same number of spaces. See if you can figure out what this complete program does.

define turnright:
    turnleft
    turnleft
    turnleft
   
move
turnright
move
turnright
move
turnright
move
turnright
turnoff

The three turnleft instructions make up what is called a block of code, several instructions acting together as one. All GvR programs end with a turnoff instruction.

You should be able to "hand trace" the operation of this program to discover that Guido will walk in a small square, returning to his starting position.

Your Turn

Once you have defined a new instruction, you can use that instruction as if it were built-in to GvR. Define an instruction backup that makes Guido back up one block, leaving him facing in the same direction. Then use backup in a a complete program that has Guido start at the corner of Second Street and Third avenue, move three blocks north, backup one block, turnright, and then move two blocks east.


Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/05_files/0000755000175000017500000000000011326063743016573 5ustar stasstasGvRng_4.4/docs/lessons/en/html/05_files/send-banner.gif0000644000175000017500000000010011326063741021443 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/05_files/sflogo.png0000644000175000017500000000546511326063741020602 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/17.html0000644000175000017500000000461511326063741016306 0ustar stasstas Community Service Revisted

Community Service Revisited

Project

Guido learned a lot from the community service project he did back in step 8. Motivated to give even more to his community, he has volunteered to pick up all the trash in Central Park.

Assignment

The park is represented by a bounded rectangular area of unknown dimensions. Guido starts out in a random place in the park. Trash (represented by beepers) is spread throughout the park. Neither the amount nor the location of the trash is known at the start of the cleanup. Several pieces of trash can be at the same location. Guido's job is to pick up all the trash in the park and deposit it at the north-east corner of the park. He should then go to the south-west corner of the park facing north and turn himself off for some well deserved rest under a tree while he waits for his ride home.

A sample world for this problem might look something like this:

Step 17 Image

Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/09.html0000644000175000017500000000560011326063741016302 0ustar stasstas You Missed Some

You Missed Some

Tutorial

Recently, you wrote a program to have Guido go down 2nd Street and pick up trash. You probably wrote code that used an if statement ("if trash is here, pick it up") followed by a move statement. Then you copied and pasted that code until you had enough copies of it so Guido would go all the way down 2nd Street, picking up all the trash.

There is a better way to do a group of statements over and over again: the do instruction. The do instruction allows you to repeat a set of actions a given number of times. For instance,

do 5:
    move

moves Guido 5 intersections forward. If you want to repeat multiple actions, group them together by indenting the instructions the same number of spaces:

do 5:
    putbeeper
    move

Using the same number of spaces to indent is mandatory if you want to repeat multiple actions. If you mistakenly write

do 5:
    putbeeper
move

This code would put 5 beepers at one place and then move forward just one intersection. That's probably not what you wanted to happen. Be careful to keep indentation the same to keep groups of instructions together as one block.

Your Turn

Guido is smarter now and knows about the iterate statement. He is assigned once again to pick up trash along Second Street. Rewrite your solution to the previous assignment using Guido's new found power.

Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/16_files/0000755000175000017500000000000011326063743016575 5ustar stasstasGvRng_4.4/docs/lessons/en/html/16_files/send-banner.gif0000644000175000017500000000010011326063741021445 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/16_files/sflogo.png0000644000175000017500000000546511326063741020604 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/16_files/step16.png0000644000175000017500000002005611326063741020426 0ustar stasstasPNG  IHDR`ObKGD pHYs  ~tIME %G:IDATx_Lٽ3_섄@XbBmHf즻@.{S)m_*U*h_ַ Va*TEJ+?jvV녭HOv!$ $sg|lϱE=|ƌ3;HDaa_M p7OKa!B&/ph:)ʥsJ<6677d*gϞ%r+**\YUUUGǎmkk{4v{߿2Qp8xrӧOy'J+!auuuG"H$233sΝK.dՅ nܸŠ+Ǐz뭬3ݹs' .]Jaܟ&cXH$e*))( B)# m߿YVVvȑSNhD;ȭ[*++2l*NvѢ$$Ez]QJf}*jkk/_X__x}zǪonn2 J!4\tIԚČ"ql*qR{=yɣG~om-@SII\Y1;;_|Y__oMMMWTT466:uD/.]tȑ?OUUUKKK;;;;{}>쳃>|xnnw}7х 䃝 _||yyysssSSSoݺ%x7IVBWȔ% áp8$݁ 8snll~o'Çr'Oܻw/?X]]}\aqq/ Bo?~\)%@СCN:zW_}%F}}}0HԶ/_B477'ő/?DzH>|޺u֣G֖---;2ayރսO>ؐ۷0O'jܜ&QcJJJ.]T^^^__YytŮ!!Dii)!JJ%L̬%Ūbkkkcc\.9d' UUUBr#,2dz:~Ç֖jjj۷޻w"jBF?e5|o5񔗗{!(eQ\cv ]v-QV__/ Beee.\ +H$nBq˗/Ր|{{{ccC.z||<99w]|?9earG`lll]A{<4V6Vs$,5N>ɓ?: O۽_lmmՉ'zμФqqq_׉'BPcccn;!S*:pǏ3H$1PΝ;@@<'Z0`08??/[ MEe c%Ê!,]B?ïzaaaaaa9|~ܹǏWVVcꦣG={vjjjff. ѥG^pajjjjjQXa^wzzVΜ9311csԩx"ÿOޘC̔{c|͙o?3Ektr!Ӝgߩ|}Z0H俛~ 8ٗf2Wa+ 4'y5u듃faEhv nj677].wvBf B";;;[Q"@IX_JJ\Cf e 2y<.4UUU~64cX !aFzܫ nKV0a E6HXA mh#݄a.z5Z\.}E;`Jw"U!y+˔ s _㱶*)e%fuؗۀDaǶE%׵vJ$:`*4Y+ U!jDqmX6/u]}Q([WlC²~svLM%)a͒EJa%I ΔV\EޕM⸏] E'>T&ҩ G,X$ ^ eZLޞؓkF/K}e6E@1YmXx^:ws%ca)j:`[ +egǺy @^{,l+++ލFik =|@j$Aro 5 TKKK˧O{RUaY444y &鴧SI48DF߫au֦}y$ GfO?4 9!O)ǻz{{Ӟ'N|t6Jy tuuKFiwww__|0UԼz{{t\*Phddduuպʕ+~?`ppp VKK<ZZZ:;;;;;GGG[ZZSn;44aUUjp\d#l\Y$,,,\rƍLSSC*XG4/7|>i |><>>n]'i,1I=̳۷/^XRRԴfӧe4??FFF&''GFF|uuݻpx~~^Vm555ovBqO 2^Q$^b#,TC>&//q rll b> r0 yʟ uvvf2UUUϟ}Rl522ѣ7oNMMUjoo?{c>&''ƍ?\?_ K~X 766j|69z$~knǃ$ Tkkkwwx===}}}>o```tt z̔'>za$_Ud=8vva}՛7o7VX###n3g޽+X[[;p~_vgnmmݼyٳB?׮]uuuW^O~:’exKKؘ9$4;;+^uˑ(2U !^GZ__%B&auww班Gjq)yU՚ƍW^555333ϟ{ŋ ʕ+2+\/~gΜy竪8;;;555V/nwEEr{{ưeo=#QGk օ25ͯqs[yUI}G jonnz:Ե]nCT-Ͽ\SS|1,sI{{rYYYԘTSS$v+ay^+$^ {:/H^w`````@VXr"Qkkmm5KwY^0>>ɕ~ ^Wյ|7668rjkk].O~z:K '&&._ۭך.//_r:e}-gVXBye*{x?|u!a, 7ZlWWWgffd28q]㓵8߾}իrӧOmCPIIFihhHf(L@֓&s\2>>./gcUkkkTdyyǼ򳯯M gllL^L/hii1_W d5*=`}}5NLLV\ZZc[uuurWk~‚^>88(ﵐ K\*_qgggCC4 5TEyԍq+ϱȘG)v !D$ڒ?{!"Al](GOQ؂_oJ[YYqׯ_jjjRR? nMMMuvGUjϗJKKmցrYhwwwI43_LX~X$@rME{~HX =|@j =PaQ_Sl\Y|5&/,8Pt:wt,»_~ܹs2UHBP6BiYa|"l/a|"l/a(Z$,/a|"l/aP"P^֠|"lҲPHXA ePXro,٠쎣 Dw @0@* m(KXdm(KXW 6HXA mzQ$e#VI(BF(VaI(BF(E VaI(BF(( E(Be I(BF(-+,ʼn@$,P6:}Kf^D}l KK<G9H K66HX}CYQlK@$, a 6tAPJ $e#T>*0: gxB"ټO / EҲPQae[4+zQ0 c>HBP6B闰DAI(BF(]/k}>\RЙ;H e8h@%>X]BPVaqOw٦l ?Іr 6H6 6 6HXA ]8| etTE( `>HBP6BWaecG_Bn)K#~J(Be3sfү3+ZUX1$E(KX $e#]‚gTy@ e#D m(NX=* @V)KX  e|Q^6 l 7\uGlPl {t @Pa 6HXA ]8ZJi8 {(-+P"P%Om_ #2a1kE(+^@u K|DQ c>HBP6B闰DAI(BF(NTy@rZ{Ul'+,-/ a则JIҀ%,(QdOD7Gf+3OrVAuB*g͑ R0 gc?[3ԋW)4 TX\lXw:3(PE֫ gf%:kO~ W@T^P]B%d2*w cX,aj*3!DB;>ep`o=^aQCW HW;FY‚Yݧ=WHomư lle`Ŏae r剅 A<W$ [6%tfB 4=VI(BF(*O"ѢP+SKPVX~|S3/ Wa|"l/aP"Pv _Ǥ$3[0Cb e8h@L @^wGjd(9x @LXd+Y,adE\@4f~VK@$, a 6t3g?uf}NBJ $e#T>*g2*惌XوDQEeX\dU>*zΟ9Y,ѯ* E(B_1$E(t)Ki-D m(Ba4l"U%q erQmh@$, a 6T&,lUTXA mh@$,r"լPتA g67Ϩh#Wؓ-3*, a 6HXA m4Z愉GS a UE+V) +3o!V$丄pNV[ۤ0$R6g;h6to0؋(ԞړV Gt dUxT7SUU?fsJHP{XƆ?Q(RJ:bw\ j;:m#x(þyGaDI{T5# yGUha_ iʱ SŚےlsa=RHۤTy؂> r8r9ICa_ ˚U8W*v!1(ޡ Kɻ-V s>F1nh2%M$TcX 6HXA mh@$, a 6HXA mh@ yirvUTXs~Kxk׮e=7t h@$, aF-ip5~Myk/dc7(ri%,OOZ͓rۙd+ak:uȲB)Km޺Irս6F^ I1w=M$ps6t7;8bweIfFa{&Jts|7l`OR'OWԇ6 3||`|LnL9A 쀼 a 6%tݹl?a]v 8M驖5 #lmmi  ;::NeF\P(0!ıc*xexxX_-kFaa4MMMB7n仅JGG. !"kH$RVVVRR%n?,L IENDB`GvRng_4.4/docs/lessons/en/html/16_files/step16.wld0000644000175000017500000000027711326063741020433 0ustar stasstasRobot 4 3 S 0 Wall 1 5 N 5 Wall 5 1 E 5 Wall 4 2 E 3 Wall 4 1 N Wall 3 1 E Wall 2 1 E 2 Wall 2 2 N 2 Wall 1 1 N Wall 5 5 E Wall 3 3 E Wall 1 3 E Wall 3 3 N Wall 2 4 E Wall 3 4 N Beepers 3 3 1GvRng_4.4/docs/lessons/en/html/09_files/0000755000175000017500000000000011326063743016577 5ustar stasstasGvRng_4.4/docs/lessons/en/html/09_files/send-banner.gif0000644000175000017500000000010011326063741021447 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/09_files/sflogo.png0000644000175000017500000000546511326063741020606 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/14.html0000644000175000017500000000607111326063741016301 0ustar stasstas It's Going to Rain

It's Going to Rain

Project

Guido is capable of doing more complex tasks, even when the world he lives in is not well understood. Guido must be able to achieve a goal by testing his environment and, based on those tests, doing some action. The steps Guido would take to solve a problem are called an algorithm.

Before writing a GvR program, the programmer needs to understand the algorithm. Then it can be coded, combined with an appropriate world, and tested. Think of the simple but powerful equation Algorithms + Data Structures = Programs.

In this lesson, the data structure is a world describing Guido's house. Guido is standing by the only door looking out. He sees a storm coming and decides to close all the windows in the house. First he closes the door by depositing a beeper where he stands. Then he will close the windows by depositing a beeper in each window (represented by wall openings). He loves storms, so after closing the windows, he will step outside to watch. Here is the initial world for this scenario.

Step 14a image

You need to figure out the algorithm for this and code it, as well as generate the world. Guido hasn't lived in this house very long, so he is not sure exactly where the windows are. You cannot hard code a number of steps to get to a window -- instead, Guido must check for an open window as he walks around the inside perimeter of his house. As for any algorithm, you must also be sure the task will complete. For example, how does Guido know he is back at the door?

The final world in this scenario should look like this:

Step 14b image

Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/10_files/0000755000175000017500000000000011326063743016567 5ustar stasstasGvRng_4.4/docs/lessons/en/html/10_files/send-banner.gif0000644000175000017500000000010011326063741021437 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/10_files/sflogo.png0000644000175000017500000000546511326063741020576 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/03.html0000644000175000017500000000403311326063741016273 0ustar stasstas Turn, Turn, Turn

Turn, Turn, Turn

Tutorial

If Guido could only move straight ahead, he would be sad since he could never go home. The robot designers were caught in a budget crunch right when they were making the steering mechanism. They only gave him the ability to turn left. Staying at the same intersection, Guido can rotate counter-clockwise, turning left to face a different direction. The command for this is, not surprisingly, turnleft.

Your Turn

To see how this works, start Guido at the lower left corner facing East. Have him take three steps, turn left, three more, turn left, and so on until he is back at the starting point, facing East once again.


Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/11_files/0000755000175000017500000000000011326063743016570 5ustar stasstasGvRng_4.4/docs/lessons/en/html/11_files/send-banner.gif0000644000175000017500000000010011326063741021440 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/11_files/sflogo.png0000644000175000017500000000546511326063741020577 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/11_files/step11.png0000644000175000017500000001725511326063741020423 0ustar stasstasPNG  IHDR:C'gAMA a8tEXtSoftwareXV Version 3.10a Rev: 12/29/94 (PNG patch 1.2).I IDATx]P |Ak8qX۽$ N4EӋh'"Uz&ӦzS4ӆ84F Op0.`@|{qnvY<7XgV=+4Øg&v,t[|rD7`=).Ofgg#T<4СC/b~߲|yyyeeEN~;qr>|y]ד-[###.]{$~lllZ]]M1}}}njj*++===_<O˗w;==/__ɓ'zׯ;沵###?l͛7y䑭ƍ+Wquu5G"/}K;vccƍaTWWژq]}ݧzj| ԇCT&wSSY%k=_Bsg}s<[277(o޼{'KJJx|``1կ~ܹsOWciò޳N^0^$2G1o^t)]9]SSMMM fie}GaG?ڷoOMrqv3VVV6666662ҒaKKK1~Nhq)OlmmaHdqq-~rh_ 2t]ohh8111001T<gCTαoᝲL`*fr劽 Kxj3ϼ[Fu%]n֖gqqJ__ĄyZeexoo&_c]vڵk :ڿ/}.ƸV722RTTck9^pp577n߿uu5;vyOHga%yW^y%{@MM wZRRb[RRRUU:555:::66VVVVYY/->SSS>ozzzcc_2cEEE|lȑ#wyggg}=ZTTƍ[[[; ۷o~iwԩZDK8_v<822255u'l777ܹs)r4xrrO>޿/3]v&ӧ=O1ƒ'NK)o~1FGG3 kw:;W]S1 !]=ĕVA}GE\PQ݌/nO-aLOO{zzIc===wy6~iWB\@\@\@\@\C\-70WKx;mخl$Bcln(H.s5YLMM0 r$z!s,?dHp·{)7K؀ N%w'%Q( k4wMWI?vjbyrk緯7ᳳ?vҳw|wI$U.bOo 0GdlᴻGDTA]*({ b'JxHp`Izo6w}=f"><" `g` 9ǯ-|dM!y{Ce5c;GzWb/Hscm\9Mskx,FUNg2rz3M䗯%ոf?ms2@q `dxll,]%kv(?y/&|cK/1ll%1 )rmqݻ9lIܺuK>dj:~xڡ޹]TT^ onnZ`d8'z{.dr, pj + 333ǎ,\XXyJ.WFoߑH$R|x, {zH*innRM566klllllҾܒQ{VTH5Vc0|>_ssssss__ HdvuueY::w Ukoow,^xJ9F+һcQ^H\cc B@ _B!c,kmm  P( H$bG;~Hʛzrg 744Ϳk<伷wiiI,{gffxx k"铿@bimm5ExHsܵB`0Or~;W%"X,Oijnn$6 TTT9r.ONN{ѫW GQvuu3?z޾>Mx8cmǵ=퓢 @ pjsgq_zW^|1oA0*++믿ӟ45Ñawqh4|p8,N#&&&Sv~kʃkiir(u1z}>_({Z[[xx"Fjnn|CWWlM嶶_9= B^Wj{www xFx>k}r{W~K5_a/ZH$ں{^YW3}=zk_ZgggMM 9-#KKK7baaŋ3^]cZn#SP|efuĉUSrD|>Wg1@cc;Z(ϪX~Iuy?)n@ ΊǮ].O1g7_,9XDU{V~r4|D91Ho 5q1'>D`8b|>^Ƙ|> ~R!=igرc4񱱱A_I~N[YYUY~;<<{1. &6Ýs4os~2 Kܬ:/84joo7w).bH$z"5?Z,|yJ|=~W}tzzݻn[Jra]Ř񔗗[zi333u{:::'`P\~7_=cŁ.?A||< ~WWWGGG{{;#*ZZZR?< IFN{\ 5(W|.'z{.dr, @\y~лY뮊[.poJ1*9 $f uAkfF* Ne}IӲF|a2W2W2$5ҎL.d d d d dRDJ)^ڻj0gQ /%P+@B\@\ȠWˉ{&(R KX2J8+@B\@\ȐW_̋PS@@L6"QFaH#@     6 C\1Dj$R  Ax5oF)r*}fQ ,* P'dwmxY(UTzW2UQ (%Vsf^JbAL PW2W2dVeX_)`WYku;ڗU~Wj x/4 )Y•7BqT>ێ- ȧJyF5p̡&kEypB~W  sدGNs580RsE~ȹk(%o+徑c['MAA_)WFs;`RndvkԜ2TUT{W(RZJWA5jNߌR(D)ȰJR bZp…rӂNp0 @Bs5@r8 d d d` $p0 @ @ @ @ @_ԜT2TUT{W5oF)r@5q q j\՜PʉRa5'F)$Ĵ q q CjWd&!nKX?Ƭ+㊮9]@\ȐW 8 +2㊮Q]@\@\@\@\ ePd #0++++'QsRi^\PVQ]՜PʉRո   qUsfB)'J G՜TXӂ.  L @ ӂ!]+C$Yp̸"9-8 (\w Ñ 9R@\@\@\@\ wM{ (X|{w1ӂg^h5%9-xʙVXa-@&;aX[)t!G+gƒ6zZAdU0KhReɜUƘĴrL6zZU*ZCA^ȏG$(!CT]m>wEVW~#{*H U>$1r$ g 1,C_*02]Tpܕ.J\TpZYĕ!Q"*@*T]!d`8>`-h ]zQ%tw q q q q q C ' :yUem(hJVlR, _仄q8g D +pNwd͏i &|"ܩԮT`Xl/IBYQArwK{Tػ:ARCt՞a@(J|:*YeEYGrd~N}jcLنbN~n[]% `bGb$5 U5r_SSI{q5?|y% OPIW)O^zQ* iL d d d d d d d d d d d d d d$tB @ƎI׿f;@~ 7//c=0++++nX$F璒>SRR"]+**qBu]׻Vp @ @ @ @ @ @ @ @ @ @ @F?vv/ bJk@ު_,OE]]rakڡA/***RRo@E$h 0é5VUU+/c_Wu]N cbØg`B1xh$#gBxtO!>Y;$q!K<J"'ptIMECQ}IENDB`GvRng_4.4/docs/lessons/en/html/15.html0000644000175000017500000001067011326063741016302 0ustar stasstas A Job to Do

A Job to Do

Overview

You have learned a lot about programming Guido. Congratulations! What you may not realize is that you have learned a lot about programming in any language. Most programs are a sequence of steps, interspersed with conditional decisions and groups of instructions that repeat. All of the projects have been successively more complex.

Implementing the solutions to the assignments so far has required a little more thought at each step. You understand the question and the desired result, but it's not immediately clear sometimes how to get it done. You should have realized that the way you would do it if you were Guido is often the way Guido would do it, using the instructions available.

Often, then, it's best to figure out how you would accomplish a task. Write the steps down in your own words with pencil and paper. This is sometimes called pseudocode because it isn't really instructions that Guido could use. But it helps you understand what needs to happen. Then you code it -- write the real instructions -- to create a GvR program.

Be sure to think this assignment through before you start coding. First figure out the algorithm, or sequence of steps, required. Then, looking at the sample world, simulate in your mind the execution of the program you are going to write. If it does what you expect, then and only then should you start coding.

Project

Guido's Dad is a farmer. When Guido is not doing his homework, he helps in the field. Today he has to harvest the crop. The field always has 6 rows and 6 columns, but the crop did not grow in all the locations, as shown. Create a world with a mostly populated 6x6 field in the middle as shown.

Step 15 image

Harvest the crop using a nested iterate statement - one or more iterate statements within an iterate statement - to perform the harvesting operation. In pseudocode, this would be something like:

iterate six times 
    go across, harvesting beepers
    go back to left edge
    go up one
stop

but the "go across, harvesting beepers" is an iteration itself:

iterate six times 
    iterate six times
        go one to the right
        harvest if possible
        go back to left edge
        go up one
stop

Note that pseudocode is not GvR code but a more English-like description of the algorithm in code-like structure. Once the pseudocode is written, turn it into GvR code and execute it to complete this assignment.

Here is a sample world file for this project, to save you some typing:

Robot 2 2 E 0

Beepers 3 2 1
Beepers 4 2 1
Beepers 5 2 1
Beepers 6 2 1
Beepers 7 2 1
Beepers 8 2 1

Beepers 4 3 1
Beepers 5 3 1
Beepers 6 3 1
Beepers 7 3 1
Beepers 8 3 1

Beepers 3 4 1
Beepers 4 4 1
Beepers 5 4 1
Beepers 6 4 1
Beepers 7 4 1
Beepers 8 4 1

Beepers 3 5 1
Beepers 4 5 1
Beepers 5 5 1
Beepers 8 5 1

Beepers 3 6 1
Beepers 5 6 1
Beepers 6 6 1
Beepers 7 6 1
Beepers 8 6 1

Beepers 3 7 1
Beepers 4 7 1
Beepers 5 7 1
Beepers 6 7 1
Beepers 7 7 1
Beepers 8 7 1

Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/17_files/0000755000175000017500000000000011326063743016576 5ustar stasstasGvRng_4.4/docs/lessons/en/html/17_files/send-banner.gif0000644000175000017500000000010011326063741021446 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/17_files/sflogo.png0000644000175000017500000000546511326063741020605 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/17_files/step17.wld0000644000175000017500000000075411326063741020435 0ustar stasstasRobot 7 9 S 0 Wall 1 15 N 22 Wall 22 1 E 15 Beepers 1 3 2 Beepers 1 12 1 Beepers 2 5 4 Beepers 3 6 1 Beepers 3 7 2 Beepers 3 8 3 Beepers 4 1 1 Beepers 4 14 1 Beepers 5 10 5 Beepers 7 3 1 Beepers 7 8 1 Beepers 7 9 1 Beepers 7 10 1 Beepers 8 4 1 Beepers 9 13 2 Beepers 10 3 3 Beepers 12 11 1 Beepers 12 12 1 Beepers 13 12 1 Beepers 13 13 1 Beepers 14 3 1 Beepers 15 2 1 Beepers 15 3 2 Beepers 15 4 1 Beepers 16 3 1 Beepers 17 15 5 Beepers 18 8 10 Beepers 20 11 2 Beepers 21 1 3 Beepers 22 11 2 GvRng_4.4/docs/lessons/en/html/17_files/step17.png0000644000175000017500000003051411326063741020430 0ustar stasstasPNG  IHDRy%&'yzbKGD pHYs  ~tIME x%2v IDATx_l37!& $CDSJEXzPnz׻ʶ}; JTةc$'{8t<3fٝ3~)gwϙ33Sq]naaaÆ wFH`Gs !kkjj\]^^9#Q+g...V}naaarrmGsB>q]WUٯo)RSSR__oxݹsgff&m۶k׮<>|ٶq͛7J)/<֭[CCCccc/[N>XqxWٳg߾})G}466vرzjqqm:::n޼955$;ܰaoe˖۷׿KO?t9rDXZZxB?pbbb{mkk+w}W7X,(VQSnX\.?.`ٳ?/XY|_~{nffw裏ݻaÆO?tddGy͛7Ƿnݺo߾]vMLLoZZZ_^mrb޽sou7nܹsۅ7no13OԣJ!?{m9XSS#EeR,KKyѣMMM>ӟ$(ܺuKp?{֭{zsκ}{ -[477?ӏ=w۷7l8ν{[mruݯʕ+ׯ_)Ә׫Kfݧ*Tr X\5\b=Z "yr]]ݑ#Gv}짺Lj>A= !ħ~#y͛_}իDyq 377'M1b hcC^׆h=;w{MMM333444~ᇋ{B᫯RٳΝ;{={0>>8GM n,//;w-/8Ąl-_ Tnol!#֯_+|'7n~f9:t>͛'e׮]mnn^^^{RwuȑvJ ;wʁ\~/hllܷoߍ7߿y[__ӛK=;g}FE>%EW&G)]}K.<͛7L<ktkkk `А<;qZk7J=^qŒhtk}ԮL?VYm5vaaFťeUh=GKKK OH}џuj\W˪Eu,m۶ =D%d-B-y|-ЂZ Y<=DаqF=Z;??T&)ӾZ2fQk0Z YZ̢`VZ›z;mؚ{<yRAsssffjnV ȭcȡ};-+o_.:en櫻J2Q^r ysvsssJS۰5,}.OpY4Z07OPkub_//2'Qx |·H;cJ} `ZoHgDmQǐ^e5(!Ja71M2{|m;Ok6|{s5cY_EZ#NSoc6̷oXDΓ }k6ԡ\^&j]st]2knily15j1TYDju[G:U%H[g6'OK`i2fQk0Z YZ̢`rCCtU@444 ###7nܨTRСCB\v-?8^z%!č7rFZ+7ZUZS]ΝB^xͩk׮|˿6٥^{ƍ-b^fvCdMFmzzvջgϞbԬ:Z0 7d 7d#f%*c---޽X]1=>>>~'zJ:uJK$78Nggg׊N]"-lhh֭[B[o-//jvuu޽{`` {zz|:(/ h }y+W M[[ooM|ҥ'NJ???4k~ԩSN]rkppp?>au 9#{zzzLĆ3NNN8q… Ѷk ;>>.]]]O㽽]]]> 9;U^vG[mvv~ĄH_t͛.]W|bqbbBwq4k}H!޵H S=*kS+˞===}}}r_ԫWqcqy=S:::i۶m|T_{ҥ[n;ê+?~<̛o)͛7Ϟ=q . {o_k"*100p3gtttg``S( |5}}}޲*q-3_nZ9~bGvww9sf``ʕ+*P(?^Uk!Bʕ+* *tݾ}X,644>}w^tWUCCÁ>!Mz_ bɓ'<(?zh~~oo~kerlllppիjש۷nݾ>קWVY!Dww|Z[[B}``@igΜQOQnup4:uGn%&U^)T^fW'200P(tuh .>}zhhhǎ='NѣoƁÇo۶M,--رC=ECCC}}-[ݻw?rȡ;QN~5Dd:;eUTs!CjG}aΜ9366=w\ Ǩc%)]CCC?޽cǎw>|xtt6Vsw{JBP(-bՂk|P(~|Xi\BSzjGG &9@kkkPu$knnn޽6mٹsgMM͏g~ߕ}V<ׯCCCǏݻ'NV:By؏]~`W9]]]jD(.#3bTo]Ncjߪz7!w~rܸ{Q5333::* ǏeU./_>}S]^^^nEZ󲸪yvz{+jgppPRJQڎ_2GZ+c0$5%Xl7;:::;; $Ru23gΜ:uSδRիTBvBVyL%О={[Jgggo߾}Zy졞={vjjJmnn?}xg֝nhh8w\KK~m[[bY$);v444OLLթR׿jkkGFF&&&bޝ===0kDty|{;er仁z9}TY|/Tŋ'OfM`k WkZIU/~o,jmIU/~o,%Uѯl?viiizzM:?HS-⯵sCjk"Ν;w!Ye_x455=S9_ YRkΝFcСCr]NK/9_@#1?O|q]7ʝB'BUUS,RvIPaIkm K/E,j-fQk09P]S"("hZؾDEQD(jmpQc/dnZkKI!`E,+Flg"(2ee{DŽg$("(Q&>OwE@"(2Ѵt*_@by!A yB: (qθ8N"]k]*^,!Z֤Ի6^%*okQb ym[in̲\' b@kr];TP jڨ$Uʤc|[xR|WeikwfuP{'#T|c+<㿒 _anڂG( /NQk#a /N17 eiDEQDe/JUVk&<("(LGWk{"("QZB,jmptDEQDU(jX 'EQDE([xe"(10yZ,B,j-f_;W{q+@lzj&<V qs@!k9sȲ;RnQzOeB~@۔[@D:FeS @rC^[S @t!G"Rh1hex@9J>I]&F"Vks]Rhѯ]z "jm$W@lYZ̲u wb"( LCzIxY!"(2e_ .j'(" DWk 쫵]ӱwVEQDET쫵b&`FQDEQl=G闉"(^!Vkmk ĦzO8䓩2<׊D 9ÅVn(Egu')FZy\\ - "mVr @BjmƆHc~֖_J`c~i4,'@nHז~i;EJ*^Z@t^秒PhQk#bcnfQk01dӞ"(^ LCzODEQDe:ʾZ\ OQDEQ`j-fWkc&(" DWkEM8("(LGz̏/EQD(C`j-fQk0KZ߱Bx4; %9-sF{T~3$hIHdvz뫖 i![ $1d9=6}Gqd<@Nz5N-\@ui_Qe&@11 Py<[n=\ - 23WK?/F߫tFC2KΊdPw>,}i\4_EZ:_xuW}cMgʩHm '*ƕA۞Uisn뺮&f:J2W[H=Z}YKr1ޕAז!'(&]Z,RU*xa;=?WBMdsf?l|+ gc5Ҹ2h2d~Eij x;`ɜYUޙHʠqːU1n|O0 *Q@t骵~3i|Dĵ0Z YCHe"(d LCzg'<QDEQD5EQDET쫵؅Z Y;"("QZzQN0#("(QDEQDe/Jc`+XZ YZҶV@BxZ=ᤖOa;=cWx˪ݺKiy-ZB8AEtZ -Aj-!_a;=B .`kӒh"'@nHז~`= Un({( (s0Z Y!kQDEQًRihZEN3EQDE(jmpQc/^ {TU1u;W>Fb~mEjr>.ڊ:B\Zj-|W/Ɛ+Dvm3;@ެl\ d5I*G>6хN TޙMڊ R @>VZ017 E,j-fUcnTjTH+N40U~m'}r~-fQk0Z YZ̢`Rzq\ 7xu4DQcueUZYO?*aUzѣ`0,QMz.Oj2aaB&H& ,bF.HRQOԞJWԚzEzڧ >KoTVUBn u]]CW(nHz:w F/UD{'ZJ.Ei){mxgգDkM;"wd;m 躮`,`zV{?MG%'VgjHC{tņ$O|d[c>J3Њk{p뺋d֦m3mJmtnҶ=^m.V|Z-*}7()ylkb`GB,gly e֦!:6Uj_-]ս?n푞V)ԂվQaƨBW~SZkz<ڿi[Fb$ }b4߳W-M*F[ETQ1}eE cE,j-fQk0Z YZ̢`E,j-fQk0Z YZ̢`UiQS+KZw]@ Z!믿n=cE,j-fQk0kZ۸ښ¡(e(? y-tHS WR}Go]PTlkG|E޽kU$_N{;?B dk5(C&^ԝџj3 l د9XocШ$]0 }J5; ȏsԈXݟ zdUtO'mg,@]k}WoBe6КkN2g*z;DXL,h,j-fQk`(UrrCCC%@V_}~~M j9Qe4xɓ']nmX:3::*xg*vE!ɓ'oqj]]^^hkkB\p-n'OBB+pχkkkO[ݎiueBǣIYIENDB`GvRng_4.4/docs/lessons/en/html/langref.html0000644000175000017500000001015711326063741017473 0ustar stasstas GvR Lessons

The Roger Frank Lessons
Introduction to Computer Science: GvR Unit

Guido van Robot Programming Summary

The Five Primitive Guido van Robot Instructions:


   1. move
   2. turnleft
   3. pickbeeper
   4. putbeeper
   5. turnoff

Block Structuring


Each Guido van Robot instruction must be on a separate line. A sequence of Guido van Robot instructions can be treated as a single instruction by indenting the same number of spaces. <instruction> refers to any of the five primitive instructions above, the conditional branching or iteration instructions below, or a user defined instruction.
    <instruction>
    <instruction>
      ...
    <instruction>

Conditionals


GvR has eighteen built-in tests that are divided into three groups: the first six are wall tests,
the next four are beeper tests,
and the last eight are compass tests:
   1. front_is_clear
   2. front_is_blocked
   3. left_is_clear
   4. left_is_blocked
   5. right_is_clear
   6. right_is_blocked
   7. next_to_a_beeper
   8. not_next_to_a_beeper
   9. any_beepers_in_beeper_bag
  10. no_beepers_in_beeper_bag
  11. facing_north
  12. not_facing_north
  13. facing_south
  14. not_facing_south
  15. facing_east
  16. not_facing_east
  17. facing_west
  18. not_facing_west

Conditional Branching


Conditional branching refers to the ability of a program to alter it's flow of execution based on the result of the evaluation of a conditional.
The three types of conditional branching instructions in Guido van Robot are if and if/else and if/elif/else. <test> refers to one of the eighteen conditionals above.
if :
    

if :
    
else:
    

if :
    
elif :
    
...
elif :
    
else:
    

Iteration


Iteration refers to the ability of a program to repeate an instruction (or block of instructions) over and over until some condition is met. The two types of iteration instructions are the do and while instructions. <positive_number> must be an integer greater than 0.
do :
    

while :
    

Defining a New Instruction:


New instructions can be created for Guido van Robot using the define statement. <new_name> can be any sequence of letters or digits as long as it begins with a letter and is not already used as an instruction. Letters for Guido van Robot are A..Z, a..z, and the underscore (_) character. Guido van Robot is case sensitive, so TurnRight, turnright, and turnRight are all different names.
define :
    

Previous | Index

Copyright 2003 Jeffrey Elkner.

GvRng_4.4/docs/lessons/en/html/04.html0000644000175000017500000000756511326063741016311 0ustar stasstas Another Brick in the Wall

Just Another Brick in the Wall

Tutorial

You can now program Guido to move around, pick up beepers, and drop them off anywhere in his world. To make his world more interesting, we will add walls to the world file that Guido will have to avoid. If Guido is about to run into a wall, he does an error shut-off and your program stops. This behavior is built-in to the robot. If he is asked to do anything he cannot do, he shuts down. For example, if you tell him to pick up a beeper that isn't there, he shuts off. The same goes for put_beeper -- he shuts off if he doesn't have any in his beeper-bag. So be careful and don't ask the robot to go into a wall!

Here is an example of a world file with walls:

Robot 1 5 E 1
Wall 2 4 N
Wall 2 4 E
Wall 3 4 E
Wall 4 4 N 2
Wall 2 5 N
Wall 2 6 E
Wall 3 6 E
Wall 4 5 N 2

The format of a Wall descriptor is:

1st number: avenue
2nd number: street 
3rd number: intersection blocked to (N)orth, (S)outh, (E)ast, or (W)est
4th number: (optional) wall length (extending East or North)

Using this world file, GVR's graphical display starts like this:

Step 4a image

Your Turn

Modify the world file to change Guido's world such that his path is completely enclosed as shown in this diagram.

Step 4b image

The default length of a wall section is one block, but you can use an optional 4th number to make the wall section as long as you wish. Lengths always extend in either the North or East direction. That means there are two ways to describe a given section of wall. The longest section of wall in the example above could be written as either Wall 3 7 N 4 or Wall 3 8 S 4.

You will find it much easier if you use a piece of grid paper to sketch the world and then mark the intersections and walls' positions.

Put a robot with one beeper at the corner of 1st Avenue and 5th Street facing east as shown in the example world. In your program, he should go two blocks east, drop the beeper, and continue three blocks ahead. Facing a wall, he should turn left, go two blocks north, then three blocks west, then two south back to where he dropped the beeper. Then he picks it up and carries it three blocks south, drops it again, goes one more block and turns off.


To lay out your world grid, here is a printable map you may find useful.


Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/07.html0000644000175000017500000000464311326063741016306 0ustar stasstas Birthday Message

Birthday Message

Project

Guido has just turned 18 and wants to let everyone in the universe to know it. Since he cannot talk, he can only write the number eighteen using beepers. Guido is a robot and only knows binary, so 18 in decimal is represented as 10010.

Define these new instructions:

  • drawone to draw a numeral 1 in beepers
  • drawzero to draw a numeral 0 in beepers

Use those instructions in a GvR program to create his birthday message. Each instruction should properly position and orient Guido for the next digit. The main program should use the drawone and drawzero and instructions to make a binary 18.

When the program starts, the display should look exactly like this:

Birthday start image

When he is done, the display should look exactly like this:

Birthday finish image


Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/13_files/0000755000175000017500000000000011326063743016572 5ustar stasstasGvRng_4.4/docs/lessons/en/html/13_files/step13.wld0000644000175000017500000000025611326063741020422 0ustar stasstasRobot 1 1 E 1 Wall 5 1 E 3 Wall 3 3 N 3 Wall 2 4 E 2 Wall 3 5 N 5 Wall 7 3 E 3 Wall 8 2 N 4 Wall 11 3 E 8 Wall 7 10 N 5 Wall 6 9 E 2 Wall 4 8 N 3 Wall 3 9 E 4 Wall 1 12 N 3 GvRng_4.4/docs/lessons/en/html/13_files/send-banner.gif0000644000175000017500000000010011326063741021442 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/13_files/sflogo.png0000644000175000017500000000546511326063741020601 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/13_files/step13.png0000644000175000017500000002142011326063741020414 0ustar stasstasPNG  IHDRhMbKGD pHYs  ~tIME 8 IDATxMlӍ_b` Lx`$6bD$l"E ˝.Jm]u\'dYpB * ׏@CT.ZYYe<33cExvd|7O>]%766֖@{|o۶mpϞ=CCC2.Wu֦MUIR/^xH1/*WwC 8АeYe-//MNN^~ɓdǏtR(z܃~풶@nׯ_Ͻɓ'sl9~$gUc!eR)6lhllY^^N&Vձ;w~Vfwʕ5Ph˖-ǎ۾}{Ml^ZWW^dSX[[rrƤR>lzz---ֿzӧ_4 ʎ|RC .JTRW 𵙙!ÇRssO~wy'Vwޕ>z֭[T[ >ϓ6n_NLLݻW)%Db֭ܽ{?OgFFF׆ݘϟ?{Ų;w<|0BM6}{SxQ2J} )ʫx895N+++pXv׾\ ?'ݽ{Wqĉ/_GB?ؾ}o}{8p]gggb[lihhx뭷VWWV.J*Qko,jkllB&Ǐڵ˹AX#B^Kg^(b1!ė_~*~קOlV  1KhUyp[!8СC=z᧟~Z__4??oN"g}b;۷off{,>?o߾d2ܜy}}}$I$PHF͛7?xhYV$ׯڵ+HȖRlBiZxȕϳ5H;/CWjjj/bffffffӦMaΣGLOOݻ޽ȑ#㓓 dR>޽㵵r pHP(MLLڵK/>|xddhwyy1uuu[nyɚlߞꫯ*ɎW*ܥn]](G:FG% Occc/G {}]{娽ʕ+gϞvju)vGMRlfX^^E*Z[KکL&'aPX]]ӟaCزD*"J٧_eDQNEڶmؘ^mh01q@6e1/^dB @`E"M69ciiM`9Wpp@@@@@YMc/w=Y-OrY(=[Iaߖj݅eFr$d[WOٺK9"^F9~GexvB#Ooڂu]]ff/@omH ?oWZ4Z(鳣(CXIw?OpUow.a܊(]jސLPPEhrv#~ME2/p)uۀrS>8N9Z{٘65b?Euf\XɺMvtώ op wkoQsͿa[ʺM-EcrRώ%v[/|&J(['T̻lm.Z18T}V%yfD"%cbbΝ;jA=zQ!۷Ν;;8xo]xQJus<011qp8}X{#{|pΝF*ڿ WT7ލp8JD8 JV7Or1Jgrzzѵ|vvLJI`oAJgwC~cg>9Pb/\_7nܰM$r03 }Et``(X__m۶cǎ]vmvv6188x޽˗/۽9rԩ#Gٳ磏>1::z…M6]ti||O??%7z{{_K<oooXG 93BrD"Av*H$Mmmm]]]uLMM5{{{xА]6 #p7 B!B$EG___E~߿FST$9w˗_9{/#Ço޼)XXXؼy_"R#G\|ٳGB?RCCùs>_8pkk7C!}}}rdĥGFKn(xIZ[[񸽧ڛ_6(=er~;::?dؿW܇_I<bj^tܹsccc;v옜=!<#+EPyx{Ngg}؛g)hW!1{Ucɣ{<^^?w pmI'T OL {}N:%ωȾ8J]vܹsrȓ'Om | Ȥς pshcayQ<㖞mmm(CWc}C hooCvtww߸qC^*hmmW$% YU0ƅ p*\.\0;;+>Νb&&&fff`ccSN]pAm=n;s9-MMMrۃR}}}o{ Uv:nxx8H b19.k{ !,ZYY~'P?w&B9Z.G;r} H$rFy?-]ZZD"/VZZZQR(Ɏ;"tuu;jbbbzz}9m_<&O54׶ahmmgʜxm``Oֱ+755ʎgWWW/>ۑf\rٳ^Q҃#(&8*+8c<$_o 2 ?awO2=+ukkkAT*511Uc11Q__s΀^2x=D8'd ZwC'dtlmmeY."LfGӱS#r pGpPFpPFpP!yF(,(E)Uq/RTyJ/8_po(E/8x>S0(E/8ě/aJQRX C)JQJ/{EpPFpPVlpdD*2c>817vs0~Wxò,gEIN!T @ e^8(<8`pTgdP2222)j(Ee)j(EQե,`)J^U*oqB)JSJ[^8;ҕE7zfNQC)JcpSSʯc FoA3_ (%[eeL@2PƄLjPJPT<2@:4-"iCz0q4URq9E (R w(URse 3SJ18SPR)ӱNQ/R|-222e[b蟐2q01@@@@@@Y+gdF2222)jj(/{fNQC)Jz),>)U@)˱:"ʻTU%w9o.]_}]_)j(E~ a5TpJP)jR gOzB&{E˟l0 ci[˲߉i  8T̯w3pgAZ {)9e)j(E_pd(E~ #8(_p9E (R!LR N)eOJi,h 4ƂL3ee8zy@P22=*{xGcj0* z@\,PqxqPFpPFpPFpP;1q'FKi/{fNQC)Jz),>KTʾ:oTpT7io;VJ[q麾-_)j(E~ a5TpJP̉s(ERX x (cB&8T{Pơ ePFpPFpP(eL@*`fNC)J]МVa5TpJ/82+C)JQlfNQC)JcpSSʯc͜8R*E) gʴݬ_T6mwy)+i>Tan Lgpeeڂ 8qP-8nA2222̉s(ER *_8̜R N)SPR)%]Q"ƹo Zwlٜϲn|"B|6t6r+<8؏lesl?'*ejo3`ս_G"} ~:MR~6Af,eõ><Wg8p݃u3L;s)e \r@@Q8peeYϪD"rd3 lBeB!˲VVVn ]rٳ'cU !dcrrRg8W\B={!˲BҥK^Ξ=+8~cY!_Bd2L&-8qRIENDB`GvRng_4.4/docs/lessons/en/html/11.html0000644000175000017500000000700311326063741016272 0ustar stasstas Apple Pie or Cookies?

Apple Pie or Cookies?

Tutorial

You already know about the if statement. You use it to make a decision, as in if next to a beeper, pick it up. Sometimes you have a more complicated decision to make. Guido likes apple pie, but his Mom doesn't always have it available. She does have cookies all the time, though. He wants to make a statement like this: "Mom, I'd like some apple pie, but if you don't have it, then I'd like a cookie." You can use the if...else... statement to allow this two-way kind of decision.

It's like the if statement, but we add the optional else part, providing a different course of action if the if condition is not met.

The form of the conditional instruction with an else clause is:

if test-condition:
    instruction
else:
    other-instruction

where instruction can be either a simple instruction (like "move") or an instruction block. Code to pick up a beeper or else just move on could be written as

if next-to-a-beeper:
    pickbeeper
    move
else:
    move

Remember the else part is optional. Use it if it makes sense.

Your Turn

In this project, Guido is going to circumnavigate a bounded world. He does not know the dimensions of the world (but you do, since you will create it). What he does know is that there is a beeper marking every corner of the world except the one where he starts.

Guido starts facing East in the lower left corner. If he's not next to a beeper, he moves forward, otherwise he picks up the beeper, turns left and moves. Create a world where it will take exactly 32 moves to circumnavigate. You can choose the dimensions, but don't tell Guido! Put beepers in three of the corners (southeast, northeast, northwest). Then use a do statement (32 times) and an if...else statement to go around the world.

Your starting world should look somthing like this, though the dimensions may differ:

step 11 image

Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/lessons/en/html/main.css0000644000175000017500000000167111326063741016626 0ustar stasstasbody { margin: 50px 50px 50px 50px; color: #000000; background-color: #ffffff; } a, :visited { color: #990000; background-color: #ffffff; text-decoration: none; } h1 { text-align: center; color: #000077; background-color: #ffffff; font-size: xx-large; } h2, h3, h4 { color: #000077; background-color: #ffffff; } img { border: 0; } p { text-align: justify; margin: 20px 20px 20px 20px; } pre { color: #4444cc; margin: 20px 20px 20px 40px; } code { color: #4444cc; } .copyleft { text-align: center; font-size: small; } .heading { width: 100%; } .side { width: 138px; text-align: center; } .middle { text-align: center; } h3 { text-align: center; } .buttons { vertical-align: middle; margin-left: auto; margin-right: auto; text-align: center; } table { margin-left: auto; margin-right: auto; } td { padding: 5px 5px 5px 5px; } GvRng_4.4/docs/lessons/en/html/14_files/0000755000175000017500000000000011326063743016573 5ustar stasstasGvRng_4.4/docs/lessons/en/html/14_files/send-banner.gif0000644000175000017500000000010011326063741021443 0ustar stasstasGIF89a!I was a banner! ,D|g;GvRng_4.4/docs/lessons/en/html/14_files/sflogo.png0000644000175000017500000000546511326063741020602 0ustar stasstasPNG  IHDR}%?qbKGD pHYs  ~tIME t IDATxZMl~ԟ~Qb&^"P2F<@(%rqBVP@**hȡJ%()% &Zue\%ЩJ%KʲE= t:M&CCCj1(J0X, BA$)+/BeYfbk2 BB8y^Qe$fqGt l6+I!rN?VrW[|?J}n; łS(,>Pranv|e2<@p!l6ǃbn{rr2x`0t:/XVF^le9 `y||<͎Z㨭n; vttppbS21ZEQnD.| 1Doo%,tvv˲(!ɩfF"PMhę\.G Bݐz@`X*w*tJ$IR(bY@V˲|&4<}XSJQA8hvwdl6(r$3 cDQr^i[@eI*b8ɜ&Fѻ|X5K*2!dddD^x9sH$h,QP-ӄ( 8l6[M-7ϣcN634@G[211A!YEQTy4Bm 3Nkx!FG w5@3Á@`ffl6jrKKKKKK;˲`k{Q [V+qXFE~PFa.'I2`B#1x< `XМFlB#N ix`v3Zݝt:MreI-̲lEw Ӎp`=r\rR8Hʖa5Bhgg'hB޽k9}v̙3G(B[{U,dI @}fh8NŲ ,cv0JjtQ|EQDQZ,P"LWEKߋ-6&ų5=gg` N:+ \Шq6`llL]u…T*e0;uqhp;wÅ:??7JBZ[[t:lnll$nIΟ?/IQ1 K.-,,FkXJZnfpK;yT`0`'ɓ'_666b*:w\X9olld2JbٳgWVVl6ѣG4g$!$H!DeYN$&ͦN$I^ 8LzEAaYբfcYR逕ytR_.遃mPP>$PK2 C=]$ߕH$|6蠷jaM;k\>b{ō5h`sQ^l?)8lr ڟEoxa_0066dv{ @`/y`D"5)5PaqqrL&hT5vʎsss}}}7>55MjJvkCCCez&IzOOӧz}<D"^~ĉ|'+~?թAww_s}i177G|fTz>O!)~nnƫ~7˚Poyy5%z=>q{U-:ES_.iooW?NOOc!x<BAfy_zOEˏOCM{7!WF74BnŋXjO[egJa:{A[kC]NKN^|>6Ax7*~?R}}} 4< / ~?c"Ooo$<ȗ 7ؕ֓+W>zeK^ S5ejjra2mxzE zP#=3D7gͮcP(*d2L&]] x\}}}xWzC!?htZCpIENDB`GvRng_4.4/docs/lessons/en/html/14_files/step14b.png0000644000175000017500000002031511326063741020562 0ustar stasstasPNG  IHDR`ObKGD pHYs  ~tIME " IDATxMLٹS͗ ` [`8_uM_XXt]HEY.Ț-Gɖ P,chf}&/i0]wqJujO5O?Tu` !D Boxv0 0M0JBxL,q0oӞH$****_ޕjmm WVWWgffO0 T>}4s@ PSSS(߳gρ;::nGeJ_|wܙ.J"X^^=u9 cr_?ʼS -JaFKKK}}}i099y֭3gΐԩS^z…VJ=z[o֭[W8sL S5ß7M3HlUQQPSS5Z__F333UUU;z]2l'޽ܹs_>}M֯aڵɓ{MIIƍ;wȳ(9Es,ɼIJXZ۶߿?; 9zP(tǏFCP1ۙF`iiɓ'w**ޑϙ3g_9Z?C L!ae+e՗_~ʫL󩩩3g۷ommÞ={666dںm۶O>d׮]{ywx㍔{t)`cc뫫H$>ꖖt߸qCӿ/ ϑrVB@?Ȕ`Db3ؔ݁533#8~njjO~ogrǏD7\\\|\avv?liiٶmW_}511r!#bݻw=z?Ϟ=[YYihh㣣+B̍ygϚMӼwlڄ۷oJJ%|^G&^@ 9̑3 !N>][[ŋ?r`B{o޽o֍7Y.a"Zז(kuykhhBmnnVUU:ujdd/7B/^ث!kʊ\_}|<667ߜ;w?5arGxƬ]AB%V.RVs$,5;O?6/..Z`0gYÇgffoƺФivvÇ6777 X0 :G;=z1nڿ,-O$7 #OOOBSlaLcXB%T/gfffffo>?qCvi[8:>>>99Y__)G8pԩ񚚚cǎ9$0e㣣= BGwV|ܹsݓiPfd}〔WXa^` $SІ9ˬH+ tWrMXY;;Tbf}w 6ɼj(@9UXF4 !S!7E~|1G1[(S*!;JmO_ A mh@γ`paa$M`0X"aMLLܻwXM'N8qBqڵ޽{e~ K|AIZSZW\B$#G9%011q@ P9˳cXe{nll|+lH$91P W'maaW)$29111,aZ% EYȎV3HNKU.nhhp,?vX kdddjjʾ-c۷I.T @ooa]ttttttj_ )h?BRXatuu_{zz>Drٰˑ\婡>`p8yT677ϟ?F/_ M mmmmmm]]]###Y̳vݪ*5xJAF.zzz 6EVMfffΟ?KIprr#V2#+Fa[$b֟"k,pDD"HX5YY͛Ohnn^ZZرcZZZvdxbr}y\޾} b`YWWaloo'gjkksɛ7o%WXCCC9kll۷oz~j`%?ZD$}v___OOO{{wD"r!766Z9HQ$I,#gbXT{{{wwxŦ===}}}Hd```xx ' ÐI!?Ȅzp$ÇCP"/^vگ~+{544_2 ?~Ν;B;v|ǿ/`"hmm][[vڅ Z[[/]/^G׿N%˜۷o[IO>ȗCooLUBn/G"F!D8nkkD"֑gmb}O$n=tvvC:.e'2lI$ ê>Z|_zŋhnrrɓw9}Ua?^f@ p?Ϟ=;y={8uuuV?σ`MMͮ]ٳg6-~Ow!27W$&״>FFFmUO;cojj~qZ~'/wAv9]GFӟϟe#%W^겆r (PUtuuQƛA;ľBh9r_\\Z~gs|V'7o^xQ.}䉵fEEFeppPf(묮L@kZ222"/gU{{#2|)%O if:a'^|HD^%hⱮCV}^f=QɎb2B{{#;˗hiiÇr._<77'Ƕ/^4Dщ9511144`u}}ٳ/_Z(m%_mk.zzz俸QkZzke":FFFbH8XdLW@;4͵5~;y/"Z: cmooO.?VB0rJCCVss%x< 7 w(X]]]0tTj?|ʉi} Ǻ~X^"הgZ=9P&D"~NJ' ;1P&.\(eU'a ˃ U R䟥~HXi<g_o ;ӴJAamllP"P%3/P*P%,e@%,I(BE(|"\o07wJ @y"a 6a)z8(S+@y @(54Mra  aІCW  GS .!mh@$,ޜ VE@OP-+,I(BE(?$"~ @u (4qUXP"P%, E(BkЛA* $JJ @y"a 6Kh{ckW#rj Ù@ t sdY鬹etYJOiYzQ6 Xɭ9 ]B?P^FTXD3kd=d]G\Ky6l)].+HX( d(`6HXkЛAZ=*B7|0$E(KXP e&-B%闰\:M|((*,I(BE(|"\ҵK|f(ҲPHXy1 EkS@)mlUUir0TVXVU(-o3ޯ\;_f>/UrĠ{a`ߙ @(cU (2]Bf+X1*,0LU.JBA2mk7|ڠfY)BT',ߔWi-5lAr'@1%2rP*TX.EBBIׄ|f(+ZE(]BI(BE(dNBpKX^ƀPP$,/ac>HBP.B闰/$"5xs>H07wPPZVX 6HXr/A%YP߽(>pf%(7jd(eMVeΚ FT$/VVzLe+[*=',!<>$S68~QaІAwȓ5|(1^攝%$OAgVn 䫮V aPp`6HXkЛAZ=*BVʢe E(B_rEw9@츈Z[t2^Fe7moS`ǹ_e U9*{5UXP"P%, E(BkP E(Be<h@L @L @L @ǰ(ʄEPP @)Hlи 6_%8i0$d@6HXA mzQ$"$"~ +̋"!~ @"aІ~ APrJ%|1$E(tA E(Be<h@'P M$dl"Un:  mh@$, aІʄŕ 6HXA mh@;UoTXQ +Klښ7*, a 6HXA mZքGS g(tUJB%\LwwHUjw0y.a)2) e3Tڷs7L#b UBeSW=~9YUTUՏ;ɡOJaT=Waބj;^A4ˇ/{',2¾ kEPU$a^cنb}mIy0Sύa)eR{*@?xp߇+,Qۉ,T>>OX\j;ǽV{&,%ڗX?kH(\L4)jw0ǰ 6HXA mh@$, a 6HXA mh@aUTXoo~K{K.=5t h@$, aFz]֕s|ky.34X(&R]YYB!do f~GFiξ5]*ɺyܵ?'/-eskM@w'tUx`=ӅͰykOb7(s9%,OwZo3ttۙd+aj:yS D澹@mֺr^#TwRʧJ]Ba Y2GZj9[zeIfcsH_;v濛6%xӦ\9a欝ϽBMR@$, aA( mh#Y`0Xv@V֥KTaii _~…u7 6*ȚB&644m=5 Ν;|pMH"7o,//ommͰ9EZ| UEj++NB^x?ymm=ztcccnn^ĺ:ϷL_]]|ɓ{}{S|ccQHT ŋe$fe?H?_[[{wU'> oWOEEEre!L0|Emm2;;;99VVVV__)k>x#G677VTTLLL,..noori߾}><;;[VV;qFD"O?tnn!7oB<}$VBO_Ȕ4#N$#݁5??/8so'rǏ߽{7|XYYy\aaa>illܷo_|155rMG.B:uѣG={^[[WFFFgϞ544yD777 !o{o1\iWK2AdqM*Gvsd#gr<B\pŋÇw>o޼yÇmKJJoɄ|XD)**xbiiimm[fffC Gk+)a0Q²ʶux3\8BTTT!JKK}>,dGL~KJJ|>jԶ G)<`K{%Z]jkk;;;%%%ϟ +&4_xBNxⅽomm%Q~/ڒ'&&K.?F0 CH8Nޘuk2hϗf㡵YWVvӧ?~'TVVᕕzWWW?M;q_W_Y/,,=qN}}}敕^7 !S*ު2i0rUוb_.nI;b_3uBIF{3d,WrFmE}a),b׍wQbEoEV_pl ߳X~`l*I{-R;.HRpLǰ*Dlm7$6} B}P(~?2Nfra&)e:l^=if|းWXa^` $ՆEY/uq7W2VޫRvv+:ʓL7Lalj6|Oվ: kmUa%җp:OxL[R9%Bi%=>uDms2A6HXA mh#,]^^ISF-߿WMrgϞ={Vq޽ڕ~ </knnNsP(4::MiOGGhpW{zz hmm|UUrHI>V}Ύ kllG>>qD HgΨXggg:/ dtvuu~EK'Kǥ,3<J hmmC ~A&yǃ#~gff|>_$zW\qs{5<<9sΝ;B|G?O^o$ijjܼqF{{{SS7իWpMM͕+W>_d3;;;66<::j '_̈WC]}}}r+JOOLUB.+:!onn֑kmb}!IX]]]c{~u\eOVc?veٕ@ U}f~+W`UUsܹsº|J… |3g={vܹ +vUUO~[VVvH$1.Y?z"}syE}LmrMnllV^aC^Ra흝:u-c;Av9G ---UUU---;wnzz8v ZֶTRR5&`-ʅcX~˿=7W(={$ur/+,TPg􌎎Xc諫J:߯ZL>덍x<[o%px||ҥK`~˗#_rg%W6/V>e#V^촆 Vlnnnnn㣲g7Y[WBƒ q'eeezzZf+k'9>Y+Y#ȭ[\"?yvggH 288(3uVW& I^c5Ve-3ȱ٪%*2RF K̒uN:ZZZZ[[J:c]*=::*/B477[+gCj``֞VWWgffNjrY+ ,..ʱ+W5 `pjjj~~^|MMM گDjkkZm%m{.埸NkZzke":BؘXdLW@;4M׿Z: ir9 [r_i^ڵk~X J*?Q`G^oTsnnw(..sp 짉*rMyv8j['_Y@ 288'Xz{{eՕ~': v`d} 2aJl*ae ˅7I(dR#a% ?s~q& BDvsURRbDr՘*8B ٳrбڵgTu%MMMUVV9r\ IXl>jW5(c}YCYY(afcȄe jj~4 HkU3(WX WJ3@<7 @_jVAȀ1,Fd1,ưh@$, aІݪ$E(]BiYa/0BP/aP"^KX  6KXrE(BJ%^ߥ PP(5(EBPҲPHXA ecX@IXL`% @t h.!mh@ ]B a 6HXGuP"PZVXy0$E(μ,g#i[ NTÕRʝ;U%RJ ˵y);[P ,UXg}ePT8ʿ$~V~I(BA(ȋ E(B9kНA* P sue0h@&?XAGʯIq9dcX2aQ^**, aІE@QaІEy ۨh@$, aІwu|V@WPUhYa|"/aŝyP"T!/a(X$,/a|"/aP"P^ t}(ݹҲPHXA ecX=(S+@dy @(54Mr,a  aІCW d GS.!mh@$, VA@WP-+<P"P%P"P%,K1, ӈWa|"/aP"Pv 9€AB*&mhCټ @6p?ڠK@*, ۔MBa=VrkE6$,hThh.!mh@$, VPyJ +$ ~ +?$kC1K*BI%, {tr'**P"P%,APrJ.AʝtJ @a"aaHN.a>!OiR\a2M)V*%(-:`υQHB3U"E.aI(BA(dNB*{KXn(U$,/a|"/aP"P^ t}(ݹҲPHXA |O,Q{ŜDM ` KTqLYYBP68mt]1 K%$O6A mhC;s>H+ZE(]*BY`>HBPBWaŝyYR(>;=_C/#eE PB ¡_fQ_s !T&mc>HBPB闰D^I(BA(]I(BA(-+,@$,`"U`"U`"UP$E(`>HBPB闰μH(BB闰,m藰c>HBPB闰D^I(BA(]/k}>HBPBiYa(L$, aІI(F(&RUP6*7ma 6HXA mhCeYE@$, a 6HXA\ӝ{HƆmmŕves 6HXA mh@p4 a(5abf*j:HUUJBnjwvHdUjw04.a)d6) e0ڷp7#b& YTJDoJws*ڛ=%{=,cC9(V %뻮LW}vTݶi* wT6_y+q[{\0U/-6f 1,MjOH>+,Qۉs- T8y\{{b]S<>];jb0#Dp3/#PҤ۪LJ< ϐh@$, a 6HXA mh@$, a 6HX}?p8v@,絢 6qW~_v"իYn]B a 6HX:a^r4_8oɫd쁴&R]__|>S7#+y&4g_S>MRnh s֮^Ⱦ<5;Ky²cXDalڟ 9Mm \Z ^eQLЈ>l/2^w3&v%uŠtE}h㮜0sWi&$*KHU@& a zv@Nh@ z޽l?a]z M fi"fBȹK_4sH !d5==-8vX[/ !ۿ6 4M4O~_ׯ_u v!ĿiH$bFQQQQQGK;0 02B)QIENDB`GvRng_4.4/docs/lessons/en/html/02.html0000644000175000017500000000523011326063742016273 0ustar stasstas What's That Sound?

What's That Sound?

Tutorial

You discovered that the initial robot placement was of the form:

Robot 1 2 N 0

where the numbers are:

row
column
initial direction (N, W, S, or E)
number of beepers.

Beepers? What are they? A robot can carry beepers, which are little sound devices Guido can hear. Guido can pick them up or put them down, all at your command. A beeper is a device that Guido can hear only when it's located on the same corner he's on. Guido has a beeper-bag he can use to carry beepers he picks up. He can also take beepers out of the bag and place them on the corner he occupies. You specify the initial number of beepers in your world file.

The commands to work with beepers are included in the basic robot commands you will explore. The complete list is:

move
turnleft
pickbeeper
putbeeper
turnoff

Your Turn

Put a robot with four beepers at the corner of 1st Avenue and 5th Street facing east. He should go two blocks east, drop one beeper, and then continue going one block and dropping a beeper at each intersection until he is out of beepers. Then he should take one more step and then turn off. When he has finished, the display should look like this:

Step 2 image


Previous | Index | Next

Copyright 2003 Roger Frank.

GvRng_4.4/docs/tutorial.html0000644000175000017500000001513011326063742014661 0ustar stasstas

Getting started

Guido van Robot is a robot who can do a lot of things, but only if you program him. We're gonna gradually show how it's possible to teach Guido to navigate his world.

Without our help, Guido already understands five primitive instructions:

  • turnleft
  • move
  • putbeeper
  • pickbeeper
  • turnoff

The primitive instructions are called "builtin" instructions, because he already knows them before we ever give him a program to run. Guido also understands the special words "define," "do," "if," and "while," but let's start out simple.

Using primitive instructions (turnleft, move, etc.)

You can write simple programs by combining the five builtin instructions turnleft, move, putbeeper, pickbeeper, and turnoff.

For example, let's have guido move a square (move), turn left (turnleft), move another square (move), put a beeper down (putbeeper), then turn off (turnoff).

move
turnleft
move
putbeeper
turnoff

That's a pretty simple program, but we have to format if very carefully for Guido. Notice how every instruction is on its own line.

Teaching Guido new things (define)

Let's modify the program so that instead of turning left, Guido turns right. The problem is, Guido does not know how to turn right, so we teach him. Look at the program below, and see how we teach Guido:

define turnright:
    turnleft
    turnleft
    turnleft

move
turnright
move
putbeeper
turnoff

We take the first four lines of the program to define to Guido what it means to "turnright." Turning right is 3 left turns. Try acting this yourself to see how it works. Again, Guido is very particular about how you format your program. Let's write a program with two definitions now:

define turnright:
    turnleft
    turnleft
    turnleft

define move_ten_squares:
    move
    move
    move
    move
    move
    move
    move
    move
    move
    move

move_ten_squares
turnright
move_ten_squares
putbeeper
turnoff

Notice how all the instructions in each definition get indented at the same level. Guido needs you to format the instructions like that for him, or else he will get confused. Remember, his brain is made out of sand, and he does not possess human intelligence. On the other hand, he is very loyal when you give him the right format. So please bear with him.

Repeating instructions (do)

Since Guido has a computer brain, there is one thing he's very good at--counting. If you want to tell him to do something ten times, just tell him to do it 10 times. If you want to tell him to do something three times, again, just tell him:

define turnright:
    do 3:
        turnleft

define move_ten_squares:
    do 10:
        move

move_ten_squares
turnright
move_ten_squares
putbeeper
turnoff

The above program does exactly what the one before it did, but we didn't have to type as much. Also, Guido can repeat more than one instruction:

do 5:
    move
    pickbeeper
turnoff
The following program does the same thing:
move
pickbeeper    
move
pickbeeper    
move
pickbeeper    
move
pickbeeper    
move
pickbeeper    
turnoff

But really, who wants to type all that? It's better to use the "do" command.

Making decisions (if, else)

So far Guido does exactly what we tell him, like a good loyal robot, but every now and then, we'd like for him to make decisions on his own. Let's write a really small program for Guido to show his decisionmaking ability. We want him to move one square, unless there's a wall in front of him. If there's a wall in front of him, we'd prefer for him not to run in the wall, so he can just turn off.

if front_is_clear:
    move
turnoff

Guido understand what "if" means. He also knows what "front_is_clear" means. He has already been wired to know those words. Still, it's up to you tell him what to do "if" his "front_is_clear." We are saying "if" his "front_is_clear," he can "move." Then, regardless of the situation, the next command is to "turnoff."

Let's give him a more complex instruction:
if front_is_clear:
   move
   pickbeeper
   pickbeeper
   pickbeeper
else:
   turnleft
   turnleft
turnoff

Here we are telling him that if his front is clear, it's okay for him to move and then pick up three beepers. Or "else," if his front is not clear, then we want him to turnleft twice. Then, regardless, he has to turnoff.

Other conditionals

We said earlier that Guido understand five commands without us having to teach him anything--move, turnleft, putbeeper, pickbeeper, and turnoff. Those were called "builtin" commands.

We also introduced the idea that Guido can check for a condition-- for example "front_is_clear." The word "front_is_clear" is an example of a builtin conditional. It turns out there are eighteen builtin conditionals:

  • front_is_clear
  • front_is_blocked
  • left_is_clear
  • left_is_blocked
  • right_is_clear
  • right_is_blocked
  • next_to_a_beeper
  • not_next_to_a_beeper
  • any_beepers_in_beeper_bag
  • no_beepers_in_beeper_bag
  • facing_north
  • not_facing_north
  • facing_south
  • not_facing_south
  • facing_east
  • not_facing_east
  • facing_west
  • not_facing_west

All the conditionals can be used with the "if" keyword. Here is an example program:

define pick_up_beeper_only_if_its_there:
    if next_to_a_beeper:
        pickbeeper

define move_only_if_you_can:
    if front_is_clear:
        move

pick_up_beeper_only_if_its_there
move_only_if_you_can
pick_up_beeper_only_if_its_there
turnoff

Repeating Conditionally (while)

One common task for Guido is that he wants to approach a wall, but of course he does not want to slam into it.

Here is a program that does this:

while front_is_clear:
    move

The "while" command is like the "if" and "do" commands; it works with a block of commands. Like the "if" command, the "while" command only does its block if the condition is true.

In our example, the "while" command only does the "move" if "front_is_clear."

But the powerful thing about the "while" command is that it keeps doing the "move" as long as "front_is_clear." It repeats the command. This is called "looping." Guido keeps looping through the "while" statement and executing "move" as long as his front is clear. GvRng_4.4/docs/gvrng.1.gz0000644000175000017500000000153211326063742013755 0ustar stasstasDTMs#5W4g {!5W$Z>AF# )~ 9Y2ȌEZ9l$,QAY#4\٬SҗCC>7-xU1ΦCK#ҷgAVf/P+> SZ)5oޔA rR>VB>![~?K:K*86y^3*ӂ8j%`^Y\: ,x.`u& `[i/hI^_fPX-:XF.F!?%t;Ϻ]㱏CG,i6:UNu8=(8 mٔNxJLl"큨53$0JTX S`vCE e<@<`C iY @vascYF2/֪v+=,+_9vw*Xi]BJ++kt*K3^U}NW SY|ڢkds>^VC+;va|,+I!5 WIGvRng_4.4/gvrng.py0000644000175000017500000001117411326063737012705 0ustar stasstas#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (c) 2007 Stas Zykiewicz # # gvrng.py # This program is free software; you can redistribute it and/or # modify it under the terms of version 3 of the GNU General Public License # as published by the Free Software Foundation. A copy of this license should # be included in the file GPL-3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. import logging import sys,os,__builtin__,ConfigParser import utils # ignore warnings as it isn't useful for the user to see them. # At this moment, Editors.Editor.format raises a GTK warning import warnings warnings.simplefilter("ignore") # commandline arguments are used for developing only if len(sys.argv) >= 2 and sys.argv[1] == '--debug': CONSOLELOGLEVEL = logging.DEBUG FILELOGLEVEL = logging.DEBUG else: CONSOLELOGLEVEL = logging.ERROR FILELOGLEVEL = None PLATFORM = utils.platform if PLATFORM != 'XO': fh = None LOGPATH = 'gvr.log' #create logger logger = logging.getLogger("gvr") logger.setLevel(CONSOLELOGLEVEL) #create console handler and set level to error ch = logging.StreamHandler() ch.setLevel(CONSOLELOGLEVEL) if FILELOGLEVEL: #create file handler and set level to debug fh = logging.FileHandler(LOGPATH) fh.setLevel(FILELOGLEVEL) #create formatter formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") #add formatter to ch and fh ch.setFormatter(formatter) #add ch and fh to logger if fh: fh.setFormatter(formatter) logger.addHandler(fh) logger.addHandler(ch) if fh: logger.debug("Starting logfile: %s" % os.path.join(os.getcwd(),LOGPATH)) module_logger = logging.getLogger("gvr.gvrng") module_logger.debug("Start logging") if PLATFORM != 'XO': # This is a kludge to execute the toplevel code in utils as it is already # imported before the loggers are set. reload(utils) import utils utils.setUpUnixRC() # This stuff must be called before importing worldMap,world and guiWorld def SetLocale(lang=None): global LocaleLang,LocaleMesg # This also sets up the global rc dict in utils.py rc_d = utils.parseRcFile() try: LocaleLang = rc_d['default']['lang'] except Exception,info: module_logger.exception("Error reading rc dict, setting language to system") module_logger.error("contents of rc_d: %s" % rc_d) LocaleLang = 'system' #This will set the locale used by gvr and returns the tuple (txt,loc) # txt is a error message, if any else it will be an empty string. # loc is a string with the locale country code set for gvr, this can be # different from the systems locale. LocaleMesg = utils.set_locale(LocaleLang) try: SetLocale() except Exception,info: module_logger.exception("Problems setting the locale.\n switching to English\nPlease inform the GvR developers about this.") __builtin__.__dict__['_'] = lambda x:x import Text Text.set_summary(LocaleMesg[1])# needed to set summary file used to the current locale Text.set_WBsummary(LocaleMesg[1])# idem for the worldbuilder Text.set_Intro(LocaleMesg[1])# and the intro text # when the frontend is not in sitepackages, as is the case for the org install sys.path.append('gui-gtk') import gvr_gtk # the frontend to use import GvrModel import GvrController def main(handle=None,parent=None): module_logger.debug("main called with: %s,%s" % (handle,parent)) try: # The abstraction layer on top of the gvr stuff model = GvrModel.GvrModel() # view must be the main GUI window if PLATFORM == 'XO': view = gvr_gtk.WindowXO(handle,parent)# all the gui windows runs in one window on XO else: view = gvr_gtk.Window(parent) # the controller must have access to the model and view contr = GvrController.Controller(model,view) # we also must give the model access to the controller model.set_controller(contr) view.set_controller(contr) # Now start the GUI contr.start_view()# args are optional except Exception: module_logger.exception("Toplevel error") return 1 if __name__ == "__main__": main() GvRng_4.4/out.py0000644000175000017500000000161111326063737012364 0ustar stasstasimport sys,os try: logpath = os.path.join(os.environ["HOMEDRIVE"],os.environ["HOMEPATH"]) except: # for win 98 logpath = os.environ["TEMP"] class StdoutCatcher: def __init__(self): self.pyoutf = os.path.join(logpath,"gvr_stdout.log") f = open(self.pyoutf,'w') f.close() def write(self, msg): self.outfile = open(self.pyoutf, 'a') self.outfile.write(msg) self.outfile.close() def flush(self): return None class StderrCatcher: def __init__(self): self.pyerrf = os.path.join(logpath,"gvr_stderr.log") f = open(self.pyerrf,'w') f.close() def write(self, msg): self.outfile = open(self.pyerrf, 'a') self.outfile.write(msg) self.outfile.close() def flush(self): return None sys.stdout = StdoutCatcher() sys.stderr = StderrCatcher() GvRng_4.4/guiWorld.py0000644000175000017500000000322711326063737013356 0ustar stasstas''' GuiWorld is a thin object that delegates most of its work to a World object and a WorldDisplay object. You pass it into a Stepper, and the Stepper calls back to it when it needs to do the next instruction. GuiWorld.MOVE() is the best method to study. Run GvR with a program that moves the robot, then get a traceback from GuiWorld.MOVE() ''' import gvrparser import cheat class GuiWorldException(Exception): def __init__(self, str): self.str = str def __str__(self): return self.str class TurnedOffException: pass class GuiWorld: def __init__(self, gui, logicalWorld): self.world = logicalWorld self.gui = gui for cond in gvrparser.TESTS: setattr(self, cond, getattr(self.world, cond)) self.myCheat = cheat.Cheat() def MOVE(self): if self.world.front_is_blocked(): self.abort(_("Ran into a wall")) else: oldCoords = self.world.robot self.world.MOVE() self.gui.updateWorldBitmapAfterMove(oldCoords) def TURNLEFT(self): self.world.TURNLEFT() self.gui.updateWorldBitmapAfterMove() def PUTBEEPER(self): if not self.world.PUTBEEPER(): self.abort(_("No beepers to put down.")) else: self.gui.updateWorldBitmapAfterBeeper() def PICKBEEPER(self): if not self.world.PICKBEEPER(): self.abort(_("No beepers to pick up.")) else: self.gui.updateWorldBitmapAfterBeeper() def TURNOFF(self): raise TurnedOffException def abort(self, msg): raise GuiWorldException(msg) def cheat(self, command): self.myCheat(command, self) GvRng_4.4/gvr_progs/0000755000175000017500000000000011326063743013211 5ustar stasstasGvRng_4.4/gvr_progs/beeperTest.gvr0000644000175000017500000000012511326063740016026 0ustar stasstas# run in escape1.wld putbeeper move turnleft turnleft move pickbeeper turnleft move GvRng_4.4/gvr_progs/escape.gvr0000644000175000017500000000126511326063740015172 0ustar stasstas# define turnright: do 3: turnleft define sidestep_right: turnright move turnleft define sidestep_back_left: turnleft move turnright define shuffle: sidestep_right if front_is_clear: sidestep_back_left move define go_to_wall: while front_is_clear: if right_is_blocked: turnright else: shuffle define follow_perimeter: if front_is_clear: move else: turnleft define follow_until_door_is_on_right: while right_is_blocked: follow_perimeter define exit_door: turnright move go_to_wall turnleft follow_until_door_is_on_right exit_door turnoff GvRng_4.4/gvr_progs/escape1.wld0000644000175000017500000000016711326063740015243 0ustar stasstas# give robot a beeper for beeperTest.gvr Robot 5 4 N 1 Wall 3 2 N 6 Wall 2 3 E 4 Wall 3 6 N 6 Wall 8 3 E 2 Wall 8 6 E GvRng_4.4/gvr_progs/boring.gvr0000644000175000017500000000002011326063740015176 0ustar stasstasdo 12: move GvRng_4.4/gvr_progs/maze1.wld0000644000175000017500000000020411326063740014727 0ustar stasstasBeepers 3 3 1 Robot 1 4 E 0 Wall 1 5 N 5 Wall 5 1 E 5 Wall 2 3 N 2 Wall 2 4 N 2 Wall 1 1 E 2 Wall 2 2 E 2 Wall 3 1 E 3 Wall 4 1 E 4 GvRng_4.4/gvr_progs/boring.wld0000644000175000017500000000001611326063740015173 0ustar stasstasRobot 1 1 N 0 GvRng_4.4/po/0000755000175000017500000000000011326063743011617 5ustar stasstasGvRng_4.4/po/ca/0000755000175000017500000000000011326063743012202 5ustar stasstasGvRng_4.4/po/ca/gvrng.po0000644000175000017500000005210711326063742013671 0ustar stasstas# DONT REMOVE THESE THREE LINES. # Catalan translation of Guido van Robot. # Copyright © 2005 Free Software Foundation, Inc. # Jordi Mallach , 2005. # msgid "" msgstr "Project-Id-Version: gvr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-18 09:46:55.092971\n" "PO-Revision-Date: 2008-01-29 14:21+0100\n" "Last-Translator: Stas Zytkiewicz \n" "Language-Team: Catalan \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Catalan\n" "X-Poedit-Country: SPAIN\n" #. file 'gvrparser.py', line 378 msgid "\"%s\" has already been defined" msgstr "\"%s\" està realment ben definida" #. file 'gvrparser.py', line 374 msgid "\"%s\" is not a valid name" msgstr "\"%s\" no és un nom vàlid" #. file 'gvrparser.py', line 370 msgid "\"%s\" is not a valid test" msgstr "\"%s\" no és una prova vàlida" #. file 'gvrparser.py', line 366 msgid "\"%s\" not defined" msgstr "\"%s\" no definida" #. file 'gvrparser.py', line 358 msgid "'%s' statement is incomplete" msgstr "Declaració '%s' és incompleta" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Alter the arguments for the 'robot' statement." msgstr "Modifica els paràmetres de la posició del robot." #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Code Editor" msgstr "Editor de Codi" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr " Món de Guido" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "World Editor" msgstr "Editor del Món" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Abort" msgstr "Avorta" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "About GvR" msgstr "Quant a GvR" #. file 'worldMap.py', line 22 #. file 'worldMap.py', line 114 msgid "BEEPERS" msgstr "BRUNZIDORS" #. file 'world.py', line 179 msgid "Bad x value for positioning robot: %s" msgstr "El valor x és invàlid per a posicionar el robot: %s" #. file 'world.py', line 181 msgid "Bad y value for positioning robot: %s" msgstr "El valor y és invàlid per posicionar el robot: %s" #. file 'gui-gtk/gvr_gtk.py', line 363 msgid "Can't find the lessons.\n" "Make sure you have installed the GvR-Lessons package.\n" "Check the GvR website for the lessons package.\n" "http://gvr.sf.net" msgstr "No es troben les lliçons. \n" "Assegureu-vos d'haver instal·lat el paquet de les lliçons del GvR. \n" "Consulteu el web del GvR per a obtindre els paquets de lliçons.\n" "http://gvr.sf.net/" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Catalan\n" "Dutch\n" "English\n" "French\n" "Norwegian\n" "Romenian\n" "Spanish\n" "Italian" msgstr "Català\n" "Dutch\n" "English\n" "French\n" "Norwegian\n" "Romenian\n" "Español\n" "Italian" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Change the language used\n" "(After you restart GvR)" msgstr "Canvia l'idioma utilitzat\n" "(Després de reiniciar GvR )" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Choose a file" msgstr "Seleccioneu un fitxer" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Direction robot is facing (N,E,S,W)" msgstr "La direcció del robot està encarat ( N,E,S,O)" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Do you really want to quit ?" msgstr "Esteu segur de voler sortir?" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 537 #. file 'gui-gtk/Widgets.py', line 540 #. file 'gui-gtk/gvr_gtk.py', line 298 msgid "E" msgstr "E" #. file 'worldMap.py', line 135 msgid "Error in line %s:\n" "%s\n" "Check your world file for syntax errors" msgstr "Error a la línia %s:\n" "%s\n" "Mireu el vostre fitxer Món per buscar errors sintàctics" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Execute" msgstr "Executa" #. file 'gvrparser.py', line 362 msgid "Expected '%s' statement to end in ':'" msgstr "Declaració esperada '%s' al final" #. file 'gvrparser.py', line 354 msgid "Expected code to be indented here" msgstr "Codi esperat per indentar aquí" #. file 'gvrparser.py', line 342 msgid "Expected positive integer\n" "Got: %s" msgstr "Esperat nombre enter: \n" "%s" #. file 'utils.py', line 246 msgid "Failed to save the file.\n" msgstr "Errada al desar el fitxer.\n" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Fast" msgstr "Ràpida" #. file 'gui-gtk/Widgets.py', line 737 msgid "Go back one page" msgstr "Torna enrere una pàgina" #. file 'gui-gtk/Widgets.py', line 743 msgid "Go one page forward" msgstr "Avança una pàgina" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot - Robot arguments" msgstr " Paràmetres del robot Guido van Robot " #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot Programming Summary" msgstr " Resum de Programació de Guido van robot" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "Món de Guido" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "GvR - Editor" msgstr "GvR - Editor" #. file 'gui-gtk/gvr_gtk.py', line 285 msgid "GvR - Worldbuilder" msgstr "Creador de mons GvR" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "GvR Worldbuilder" msgstr "Creador de mons GvR" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Gvr Lessons" msgstr "Lliçons del GvR" #. file 'gvrparser.py', line 348 msgid "Indentation error" msgstr "Error d'indentació " #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Instant" msgstr "Instantani" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Instant\n" "Fast\n" "Medium\n" "Slow" msgstr "Instant\n" "Ràpid\n" "Mitjana\n" "Lenta" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Introduction" msgstr "Introducció" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Language reference" msgstr "Referència del llenguatge" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Lessons" msgstr "Lliçons" #. file 'gvrparser.py', line 338 msgid "Line %i:\n" "%s" msgstr "Línia %i:\n" "%s" #. file 'gui-gtk/gvr_gtk.py', line 67 #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Medium" msgstr "Mitjana" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 544 #. file 'gui-gtk/Widgets.py', line 547 msgid "N" msgstr "N" #. file 'guiWorld.py', line 47 msgid "No beepers to pick up." msgstr "No hi ha brunzidors per recollir." #. file 'guiWorld.py', line 43 msgid "No beepers to put down." msgstr "No hi ha brunzidors per desar." #. file 'gui-gtk/gvr_gtk.py', line 612 msgid "No content to save" msgstr "No hi ha contingut per desar" #. file 'gui-gtk/Widgets.py', line 102 #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Number of beepers:" msgstr "Nombre de brunzidors:" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Open worldbuilder" msgstr "Obrir Creador de mons GvR" #. file 'gui-gtk/Widgets.py', line 592 msgid "Please give the number of beepers\n" "to place on %d,%d" msgstr "Si-us-plau poseu el nombre de brunzidors \n" "per col·locar %d,%d " #. file 'GvrModel.py', line 91 msgid "Please load a world and program before executing." msgstr "Carregueu un món i programa abans d'executar." #. file 'gui-gtk/gvr_gtk.py', line 533 msgid "Programs" msgstr "Programes" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Quit ?" msgstr "Surt ?" #. file 'worldMap.py', line 20 #. file 'worldMap.py', line 98 msgid "ROBOT" msgstr "ROBOT" #. file 'guiWorld.py', line 31 msgid "Ran into a wall" msgstr "Corre per un mur" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Reload" msgstr "Recarregar" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robot Speed" msgstr "Velocitat del robot" #. file 'GvrModel.py', line 146 msgid "Robot turned off" msgstr "Robot apagat" #. file 'gui-gtk/Widgets.py', line 702 msgid "Robots position is %s %s %s and carrying %s beepers" msgstr "La posició del robot és %s %s %s i està carregant %s brunzidors" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the x-axes:" msgstr "Posició del robots a l'eix 'x':" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the y-axes:" msgstr "Posició del robots a l'eix 'y':" #. file 'gui-gtk/gvr_gtk.py', line 323 msgid "Running Worldbuilder" msgstr "Executant el Creador de mons" #. file 'worldMap.py', line 46 msgid "S" msgstr "S" #. file 'worldMap.py', line 23 #. file 'worldMap.py', line 119 msgid "SIZE" msgstr "MIDA" #. file 'gui-gtk/gvr_gtk.py', line 718 msgid "Selected path is not a program file" msgstr "El camí seleccionat no té un fitxer programa" #. file 'gui-gtk/gvr_gtk.py', line 765 msgid "Selected path is not a world file" msgstr "El camí seleccionat no té un fitxer Món" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set Robot Speed" msgstr "Ajusta la velocitat del robot" #. file 'gui-gtk/gvr_gtk.glade', line ? #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set language" msgstr "Estableix l'idioma" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set speed..." msgstr "Estableix la velocitat..." #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Slow" msgstr "Lenta" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Step" msgstr "Pas" #. file 'gui-gtk/gvr_gtk.py', line 643 msgid "The editor's content is changed.\n" "Do you want to save it?" msgstr "El contingut de l'editor ha canviat. \n" "Voleu desar el contingut ?" #. file 'worldMap.py', line 46 msgid "W" msgstr "O" #. file 'worldMap.py', line 21 #. file 'worldMap.py', line 92 msgid "WALL" msgstr "MUR" #. file 'gui-gtk/gvr_gtk.py', line 528 msgid "Worlds" msgstr "Mons" #. file 'utils.py', line 264 msgid "Written the new configuration to disk\n" "You have to restart GvRng to see the effect" msgstr "S'ha escrit la configuració nova al disc\n" "Heu de tornar a iniciar el GvRng per a que tinga efecte" #. file 'gui-gtk/gvr_gtk.py', line 231 msgid "You don't have a program file loaded." msgstr "No heu carregat cap programa." #. file 'gui-gtk/gvr_gtk.py', line 224 msgid "You don't have a world file loaded." msgstr "No heu carregat cap fitxer Món." #. file 'gvrparser.py', line 331 msgid "Your program must have commands." msgstr "Al seu programa li calen ordres." #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_About" msgstr "_Quant a" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_Edit" msgstr "_Edita" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_File" msgstr "_Fitxer" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_GvR" msgstr "_GvR" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_Help" msgstr "_Ajuda" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_Setup" msgstr "_Configurar" #. file 'gvrparser.py', line 55 msgid "any_beepers_in_beeper_bag" msgstr "algun_brunzidor_a_la_bossa" #. file 'gui-gtk/Widgets.py', line 593 #. file 'gui-gtk/Widgets.py', line 605 msgid "beepers" msgstr "brunzidor" #. file 'gvrparser.py', line 81 msgid "cheat" msgstr "trampa" #. file 'gvrparser.py', line 89 msgid "define" msgstr "defineix" #. file 'gvrparser.py', line 95 msgid "do" msgstr "fes" #. file 'gvrparser.py', line 92 msgid "elif" msgstr "osi" #. file 'gvrparser.py', line 93 msgid "else" msgstr "sino" #. file 'gvrparser.py', line 90 #. file 'gvrparser.py', line 96 msgid "end" msgstr "fi" #. file 'gvrparser.py', line 57 msgid "facing_east" msgstr "encarat_est" #. file 'gvrparser.py', line 56 msgid "facing_north" msgstr "encarat_nord" #. file 'gvrparser.py', line 58 msgid "facing_south" msgstr "encarat_sud" #. file 'gvrparser.py', line 59 msgid "facing_west" msgstr "encarat_oest" #. file 'gvrparser.py', line 60 msgid "front_is_blocked" msgstr "davant_bloquejat" #. file 'gvrparser.py', line 61 msgid "front_is_clear" msgstr "davant_net" #. file 'gvrparser.py', line 91 msgid "if" msgstr "si" #. file 'gvrparser.py', line 69 msgid "left_is_blocked" msgstr "esquerra_bloquejat" #. file 'gvrparser.py', line 70 msgid "left_is_clear" msgstr "esquerra_net" #. file 'gvrparser.py', line 76 msgid "move" msgstr "mou" #. file 'gvrparser.py', line 63 msgid "next_to_a_beeper" msgstr "junt_a_un_brunzidor" #. file 'gvrparser.py', line 62 msgid "no_beepers_in_beeper_bag" msgstr "cap_brunzidor_a_la_bossa" #. file 'gvrparser.py', line 66 msgid "not_facing_east" msgstr "no_encarat_est" #. file 'gvrparser.py', line 65 msgid "not_facing_north" msgstr "no_encarat_nord" #. file 'gvrparser.py', line 67 msgid "not_facing_south" msgstr "no_encarat_sud" #. file 'gvrparser.py', line 68 msgid "not_facing_west" msgstr "no_encarat_oest" #. file 'gvrparser.py', line 64 msgid "not_next_to_a_beeper" msgstr "no_junt_a_un_brunzidor" #. file 'gvrparser.py', line 77 msgid "pickbeeper" msgstr "recullbrunzidor" #. file 'gvrparser.py', line 78 msgid "putbeeper" msgstr "desabrunzidor" #. file 'gvrparser.py', line 71 msgid "right_is_blocked" msgstr "dreta_bloquejat" #. file 'gvrparser.py', line 72 msgid "right_is_clear" msgstr "dreta_net" #. file 'gui-gtk/Widgets.py', line 558 #. file 'gui-gtk/gvr_gtk.py', line 298 msgid "robot" msgstr "robot" #. file 'gvrparser.py', line 79 msgid "turnleft" msgstr "giraesquerra" #. file 'gvrparser.py', line 80 msgid "turnoff" msgstr "apaga" #. file 'gui-gtk/Widgets.py', line 533 msgid "wall" msgstr "mur" #. file 'gvrparser.py', line 94 msgid "while" msgstr "mentre" #~ msgid " I obey your command: turning myself off." #~ msgstr " Obeïsc la teua ordre: m'estic apagant." #~ msgid "&About" #~ msgstr "&Quant a" #~ msgid "&Help" #~ msgstr "A&juda" #~ msgid "&Open Program for Editing..." #~ msgstr "&Obre un programa per a editar..." #~ msgid "&Open World for Editing..." #~ msgstr "&Obre un món per a editar..." #~ msgid "&Program Window" #~ msgstr "&Finestra del programa" #~ msgid "&Save Program" #~ msgstr "&Desa el programa" #~ msgid "&Save World" #~ msgstr "&Desa el món" #~ msgid "&World Builder" #~ msgstr "&Creador de mons" #~ msgid "&World Window" #~ msgstr "Finestra del &món" #~ msgid "About WorldBuilder" #~ msgstr "Quant al creador de mons" #~ msgid "About this program" #~ msgstr "Quant a aquest programa" #~ msgid "Can't make the default directory.\n" #~ " The error message was: %s" #~ msgstr "No es pot crear el directori per defecte. \n" #~ "El missatge d'error ha estat: %s" #~ msgid "Can't save the file to chosen location,\n" #~ "make sure you have the proper permissions." #~ msgstr "No puc desar al lloc escollit,\n" #~ "assegura't que teniu els permissos adequats." #~ msgid "Cannot understand: %s" #~ msgstr "No es pot entendre: %s" #~ msgid "Change the time Guido pauses between moves" #~ msgstr "Canvia el retard entre els moviments de Guido" #~ msgid "Choose a filename for your program" #~ msgstr "Seleccioneu un nom de fitxer per al vostre programa" #~ msgid "Choose a program to open" #~ msgstr "Seleccioneu un programa per a obrir" #~ msgid "Close Program Window" #~ msgstr "Tanca la finestra del programa" #~ msgid "Close World Window" #~ msgstr "Tanca la finestra del món" #~ msgid "Code window" #~ msgstr "Finestra del codi" #~ msgid "Create a new blank program" #~ msgstr "Crea un nou programa en blanc" #~ msgid "Create a new blank world" #~ msgstr "Crea un món nou en blanc" #~ msgid "Execute the GvR program" #~ msgstr "Executa el programa GvR" #~ msgid "Export" #~ msgstr "Exporta" #~ msgid "Export your world map into a GvR format" #~ msgstr "Exporteu el vostre mapa del món amb el format GvR" #~ msgid "General info about this application" #~ msgstr "Informació general sobre aquesta aplicació" #~ msgid "Get some help about usage" #~ msgstr "Obteniu ajuda sobre l'ús" #~ msgid "GvR Lessons in HTML format" #~ msgstr "Lliçons del GvR en format HTML" #~ msgid "GvR Reference" #~ msgstr "Referència de GvR" #~ msgid "Hey! There are no beepers here!" #~ msgstr "Ei! No hi ha brunzidors ací!" #~ msgid "Hides the Program Window" #~ msgstr "Amaga la finestra del programa" #~ msgid "Hides the World Window" #~ msgstr "Amaga la finestra del món" #~ msgid "Hit execute to resume" #~ msgstr "Premeu «executa» per a continuar" #~ msgid "I don't have any beepers left!" #~ msgstr "No em queden brunzidors!" #~ msgid "In line %d:\n" #~ "%s is not a valid direction -- use N, S, E, or W" #~ msgstr "A la línia %d:\n" #~ "%s no és una direcció vàlida -- useu N, S, E, o O" #~ msgid "Invalid input" #~ msgstr "L'entrada és invàlida" #~ msgid "Language to use" #~ msgstr "Idioma a utilitzar" #~ msgid "Language used" #~ msgstr "Idioma utilitzat" #~ msgid "Modified " #~ msgstr "Modificat" #~ msgid "New %s" #~ msgstr "Nou %s" #~ msgid "New program" #~ msgstr "Programa nou" #~ msgid "New world" #~ msgstr "Món nou" #~ msgid "Next to %d beepers" #~ msgstr "Pròxim a %d brunzidors" #~ msgid "Number of beepers > 100" #~ msgstr "Nombre de brunzidors > 100" #~ msgid "Ok" #~ msgstr "D'acord!" #~ msgid "Open Program..." #~ msgstr "Obre un programa..." #~ msgid "Open World..." #~ msgstr "Obre un món..." #~ msgid "Open a Guido program" #~ msgstr "Obre un programa per a Guido" #~ msgid "Open a file in the %s" #~ msgstr "Obre un fitxer al %s" #~ msgid "Open a program and edit it" #~ msgstr "Obre un programa i edita'l" #~ msgid "Open a world and edit it" #~ msgstr "Obre un món i edita'l" #~ msgid "Open a world for Guido to explore" #~ msgstr "Obre un món a explorar per a Guido" #~ msgid "Ouch! I hit a wall!" #~ msgstr "Ai! M'he colpejat amb un mur!" #~ msgid "Please open a 'world' file first.\n" #~ "The world will now be reset to a empty world." #~ msgstr "Obriu un fitxer de món primer. \n" #~ "El món es posarà netejarà i es buidarà." #~ msgid "Please use the 'quit' option in the 'file' menu" #~ msgstr "Utilitzeu l'opció «Surt» al menú «Fitxer»" #~ msgid "Quit the WorldBuilder" #~ msgstr "Surt del creador de mons" #~ msgid "Reset" #~ msgstr "Neteja" #~ msgid "Reset World" #~ msgstr "Neteja el món" #~ msgid "Robot has %d beepers" #~ msgstr "El Robot té %d brunzidors" #~ msgid "Robot has unlimited beepers" #~ msgstr "El Robot té brunzidors il·limitats" #~ msgid "S&ave Program As..." #~ msgstr "&Anomena i desa el programa..." #~ msgid "S&ave World As..." #~ msgstr "&Anomena i desa el món..." #~ msgid "Save" #~ msgstr "Desa" #~ msgid "Save the program you are currently editing" #~ msgstr "Desa el programa que s'està editant" #~ msgid "Save the program you are currently editing to a specific " #~ "file name" #~ msgstr "Desa el programa que està s'editant amb un altre nom de " #~ "fitxer" #~ msgid "Save the world you are currently editing" #~ msgstr "Desa el món que s'està editant" #~ msgid "Save the world you are currently editing under another file " #~ "name" #~ msgstr "Desa el món que s'està editant amb un altre nom de fitxer" #~ msgid "Save your world map into a GvR format" #~ msgstr "Desa el vostre món amb el format GvR" #~ msgid "Select the desired value, or sum of values as the number\n" #~ "of beepers in the robot's beeper bag." #~ msgstr "Seleccioneu el valor dessitjat, o la suma de valors com el " #~ "nombre de brunzidors en la bossa de brunzidors del robot." #~ msgid "Select the desired world dimensions (streets and avenues).\n" #~ "WARNING: The existing walls and beepers will be removed." #~ msgstr "Seleccioneu les dimensions desitjades del món (carreres i " #~ "avingudes).\n" #~ "S'eliminaran els murs i brunzidors existents." #~ msgid "Show/Hide the Program Window" #~ msgstr "Mostra/amaga la finestra del programa" #~ msgid "Show/Hide the World Builder" #~ msgstr "Mostra/Amaga la finestra del creador de mons" #~ msgid "Show/Hide the World Window" #~ msgstr "Mostra/amaga la finestra del món" #~ msgid "Size coordinates must be at least 7" #~ msgstr "Les coordenades de la mida han de ser almenys 7" #~ msgid "Size statement should have 2 integers" #~ msgstr "La definició de la mida ha de tindre 2 enters" #~ msgid "Step through one instruction" #~ msgstr "Avança una instrucció" #~ msgid "Success!" #~ msgstr "Èxit!" #~ msgid "Terminate the program" #~ msgstr "Finalitza el programa" #~ msgid "The %s file has been modified. Would you like to save it " #~ "before exiting?" #~ msgstr "S'ha modificat el fitxer %s. Voleu desar-lo abans de sortir?" #~ msgid "The world file, %s, is not readable." #~ msgstr "El fitxer de món, %s, no es pot llegir." #~ msgid "The world map seems to be missing information." #~ msgstr "Al mapa del món sembla que manca informació" #~ msgid "There was an error in the program\n" #~ "%s" #~ msgstr "Hi ha un error al programa\n" #~ "%s" #~ msgid "Turn off" #~ msgstr "Apaga" #~ msgid "User aborted program" #~ msgstr "Programa avortat per l'usuari" #~ msgid "World window" #~ msgstr "Finestra del món" #~ msgid "WorldBuilder question" #~ msgstr "Pregunta del creador de mons" #~ msgid "Would you like to create default directories for your worlds " #~ "and programs? " #~ msgstr "Voleu crear els directoris per defecte pels vostres mons i " #~ "programes?" #~ msgid "You may only have one robot definition." #~ msgstr "Només podeu tenir una definició de robot" #~ msgid "You may only have one size statement" #~ msgstr "Només podeu tenir una definició de mida" #~ msgid "You must be next to a beeper before you can pick it up." #~ msgstr "Heu d'estar al costat d'un brunzidor abans de poder recollir-" #~ "lo." #~ msgid "You must make sure that there is no wall in front of me!" #~ msgstr "Heu d'assegurar-vos que no hi ha murs davant meu!" #~ msgid "move failed.\n" #~ msgstr "ha fallat el moviment.\n" #~ msgid "pick_beeper failed.\n" #~ msgstr "Ha fallat recull_brunzidor.\n" #~ msgid "put_beeper failed.\n" #~ " You are not carrying any beepers." #~ msgstr "ha fallat put_beeper.\n" #~ " No porteu cap brunzidor." #~ msgid "window-xo" #~ msgstr "Finestra-xo" GvRng_4.4/po/ca/WBSummary-ca.txt0000644000175000017500000000076011326063742015214 0ustar stasstasResum del creador de mons del Guido van Robot Editant mons: Bot esquerre del ratol: Afegeix o suprimeix parets Bot central del ratol: Estableix arguments per a les sentncies del robot Bot dret del ratol: Estableix arguments per a les sentncies dels brunzidors Botons: Torna a carregar: Torna a carregar el mon des de la finestra d'edici al creador de mons. Avorta: Surt del creador de mons, *no* del GvRng. GvRng_4.4/po/ca/Summary-ca.txt0000644000175000017500000000534211326063742014764 0ustar stasstasResum de programació del Guido van Robot Les cinc instruccions bàsiques del Guido van Robot: 1. mou 2. giraesquerra 3. recullbrunzidor 4. desabrunzidor 5. apaga Estructuració de blocs Cada instrucció del Guido van Robot ha d'anar en una línia apart. Una seqüència d'instruccions del Guido van Robot es pot tractar com una instrucció única indentant amb el mateix nom d'espais. es refereix a una de les cinc instruccions bàsiques descrites anteriorment, les branques condicionals o intruccions d'iteracions que es descriuen a continuació, o una instrucció definida per l'usuari. ... Condicionals GvR té divuit proves integrades que estan dividides en tres grups: les sis primeres són proves de murs, les següents quatre són proves de brunzidors i les vuit últimes són proves d'orientació: 1. davant_net 2. davant_bloquejat 3. esquerra_net 4. esquerra_bloquejat 5. dreta_net 6. dreta_bloquejat 7. junt_a_un_brunzidor 8. no_junt_a_un_brunzidor 9. algun_brunzidor_a_la_bossa 10. cap_brunzidor_a_la_bossa 11. encarat_nord 12. no_encarat_nord 13. encarat_sud 14. no_encarat_sud 15. encarat_est 16. no_encarat_est 17. encarat_oest 18. no_encarat_oest Branques condicionals Les branques condicionals són l'habilitat d'un programa per a alterar el flux de l'execució basant-se en el resultat de l'evaluació d'un condicional. Els tres tipus de branques condicionals al Guido van Robot són si, si/sino i si/osi/sino. es refereix a una de les divuit condicions anteriors. si : si : sino: si : osi : ... osi : sino: Iteracions Les iteracions són l'habilitat d'un programa per a repetir una instrucció (o bloc d'instruccions) una i altra vegada fins que es compleix una condició. Els dos tipus d'instruccions iteratives són fes i mentre. ha de ser un enter més gran que 0. fes : mentre : Definir una instrucció nova: Es poden crear instruccions noves per al Guido van Robot utilitzant l'ordre defineix. pot ser qualsevol seqüència de lletres o nombres sempre que comence per una lletra i no estiga utilitzat per una altra instrucció. Per a Guido van Robot, les lletres són A..Z, a..z i el caràcter de subratllat. Guido van Robot és sensible a majúscules i minúscules, així GiraDreta, giradreta i giraDreta són noms diferents. defineix : GvRng_4.4/po/gvr_ca.lang0000644000175000017500000000567211326063742013734 0ustar stasstas \ [uUrR]?""" """ [uUrR]?''' ''' [uUrR]?" " [uUrR]?' ' # robot mur mida beeper mou giraesquerra recullbrunzidor desabrunzidor apaga defineix davant_net davant_bloquejat esquerra_net esquerra_bloquejat dreta_net dreta_bloquejat junt_a_un_brunzidor no_junt_a_un_brunzidor algun_brunzidor_a_la_bossa cap_brunzidor_a_la_bossa encarat_nord no_encarat_nord encarat_sud no_encarat_sud encarat_est no_encarat_est encarat_oest no_encarat_oest si sino osi fes mentre \b([1-9][0-9]*|0)([Uu]([Ll]|LL|ll)?|([Ll]|LL|ll)[Uu]?)?\b GvRng_4.4/po/gvr_fr.lang0000644000175000017500000000600611326063742013750 0ustar stasstas \ [uUrR]?""" """ [uUrR]?''' ''' [uUrR]?" " [uUrR]?' ' # robot mur size beeper avance tourne_a_gauche recupere_une_balise place_une_balise eteindre definis voie_frontale_libre voie_frontale_bloquee voie_gauche_libre voie_gauche_bloquee voie_droite_libre voie_droite_bloquee proche_d_une_balise pas_proche_d_une_balise au_moins_une_balise_dans_le_sac plus_de_balise_dans_le_sac face_au_nord pas_face_au_nord face_au_sud pas_face_au_sud face_a_l_est pas_face_a_l_est face_a_l_ouest pas_face_a_l_ouest si sinon sinon_si repete tant_que \b([1-9][0-9]*|0)([Uu]([Ll]|LL|ll)?|([Ll]|LL|ll)[Uu]?)?\b GvRng_4.4/po/nl/0000755000175000017500000000000011326063743012230 5ustar stasstasGvRng_4.4/po/nl/gvrng.po0000644000175000017500000003116511326063742013720 0ustar stasstas# Dutch translation of GvR. # Copyright (C) 2005 GvR # stas Z stas@linux.isbeter.nl , 2005. # stas Z stas@linux.isbeter.nl , 2005. # # msgid "" msgstr "" "Project-Id-Version: GvR 1.3.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-18 09:46:55.092971\n" "PO-Revision-Date: 2008-03-18 09:55+0100\n" "Last-Translator: Stas Zytkiewicz \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. file 'gvrparser.py', line 378 msgid "\"%s\" has already been defined" msgstr "\"%s\" is al gedefineerd" #. file 'gvrparser.py', line 374 msgid "\"%s\" is not a valid name" msgstr "\"%s\" is geen legale naam" #. file 'gvrparser.py', line 370 msgid "\"%s\" is not a valid test" msgstr "\"%s\" is geen legale test" #. file 'gvrparser.py', line 366 msgid "\"%s\" not defined" msgstr "\"%s\" niet gedefineerd" #. file 'gvrparser.py', line 358 msgid "'%s' statement is incomplete" msgstr "'%s' statement is incompleet" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Alter the arguments for the 'robot' statement." msgstr "Verander de argumenten voor het 'robot' statement." #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Code Editor" msgstr "Code Editor" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "Guido's wereld" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "World Editor" msgstr "Wereld Editor" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Abort" msgstr "Stop" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "About GvR" msgstr "Info over GvR" #. file 'worldMap.py', line 22 #. file 'worldMap.py', line 114 msgid "BEEPERS" msgstr "PIEPERS" #. file 'world.py', line 179 msgid "Bad x value for positioning robot: %s" msgstr "Verkeerde x waarde in de robot positie: %s" #. file 'world.py', line 181 msgid "Bad y value for positioning robot: %s" msgstr "Verkeerde y waarde in de robot positie: %s" #. file 'gui-gtk/gvr_gtk.py', line 363 msgid "" "Can't find the lessons.\n" "Make sure you have installed the GvR-Lessons package.\n" "Check the GvR website for the lessons package.\n" "http://gvr.sf.net" msgstr "" "Kan de lessen niet vinden.\n" "Verzeker je ervan dat het GvR-Lessons pakket is geinstaleerd.\n" "Controleer de GvR website voor het lessen pakket.\n" "http://gvr.sf.net" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "" "Catalan\n" "Dutch\n" "English\n" "French\n" "Norwegian\n" "Romenian\n" "Spanish\n" "Italian" msgstr "" "Catalaans\n" "Hollands\n" "Engels\n" "Frans\n" "Noors\n" "Romeens\n" "Spaans\n" "Italiaans" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "" "Change the language used\n" "(After you restart GvR)" msgstr "" "Verander de gebruikte taal\n" "(waneer Gvr is herstart)" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Choose a file" msgstr "Kies een bestand" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Direction robot is facing (N,E,S,W)" msgstr "Richting van de robot is (N,O,Z,W)" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Do you really want to quit ?" msgstr "Wil je echt stoppen?" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 537 #. file 'gui-gtk/Widgets.py', line 540 #. file 'gui-gtk/gvr_gtk.py', line 298 msgid "E" msgstr "O" #. file 'worldMap.py', line 135 msgid "" "Error in line %s:\n" "%s\n" "Check your world file for syntax errors" msgstr "" "Fout in regel %s:\n" "%s\n" "Controleer je wereld bestand voor gramaticale fouten" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Execute" msgstr "Voer uit" #. file 'gvrparser.py', line 362 msgid "Expected '%s' statement to end in ':'" msgstr "Verwacht een ':' na een '%s' statement " #. file 'gvrparser.py', line 354 msgid "Expected code to be indented here" msgstr "Verwachte inspringende code " #. file 'gvrparser.py', line 342 msgid "" "Expected positive integer\n" "Got: %s" msgstr "" "Verwacht een positive integer\n" "Kreeg: %s" #. file 'utils.py', line 246 msgid "Failed to save the file.\n" msgstr "Bestand bewaren is mislukt.\n" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Fast" msgstr "Snel" #. file 'gui-gtk/Widgets.py', line 737 msgid "Go back one page" msgstr "Ga een pagina terug" #. file 'gui-gtk/Widgets.py', line 743 msgid "Go one page forward" msgstr "Ga een pagina verder" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot - Robot arguments" msgstr "Guido van Robot - Robot argumenten" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot Programming Summary" msgstr "Guido van Robot Programeer samenvatting" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "Guido's wereld" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "GvR - Editor" msgstr "GvR - Editor" #. file 'gui-gtk/gvr_gtk.py', line 285 msgid "GvR - Worldbuilder" msgstr "GvR Wereld Constructeur" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "GvR Worldbuilder" msgstr "GvR Wereld Constructeur " #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Gvr Lessons" msgstr "GvR lessen " #. file 'gvrparser.py', line 348 msgid "Indentation error" msgstr "Inspring fout" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Instant" msgstr "Gelijk" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "" "Instant\n" "Fast\n" "Medium\n" "Slow" msgstr "" "Meteen\n" "Snel\n" "Gemiddeld\n" "Langzaam" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Introduction" msgstr "Introductie" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Language reference" msgstr "GvR programma referentie" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Lessons" msgstr "lessen" #. file 'gvrparser.py', line 338 msgid "" "Line %i:\n" "%s" msgstr "" "Regel %i:\n" "%s" #. file 'gui-gtk/gvr_gtk.py', line 67 #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Medium" msgstr "Gemiddeld" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 544 #. file 'gui-gtk/Widgets.py', line 547 msgid "N" msgstr "N" #. file 'guiWorld.py', line 47 msgid "No beepers to pick up." msgstr "Geen piepers om op te pakken." #. file 'guiWorld.py', line 43 msgid "No beepers to put down." msgstr "Geen piepers om te plaatsen" #. file 'gui-gtk/gvr_gtk.py', line 612 msgid "No content to save" msgstr "Geen inhoud om te bewaren" #. file 'gui-gtk/Widgets.py', line 102 #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Number of beepers:" msgstr "Aantal piepers:" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Open worldbuilder" msgstr "GvR Wereld Constructeur" #. file 'gui-gtk/Widgets.py', line 592 msgid "" "Please give the number of beepers\n" "to place on %d,%d" msgstr "" "Geef het te plaatsen aantal piepers\n" "op %d, %d" #. file 'GvrModel.py', line 91 msgid "Please load a world and program before executing." msgstr "Laad eerst een wereld en programma omn uit te voeren." #. file 'gui-gtk/gvr_gtk.py', line 533 msgid "Programs" msgstr "Programma's" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Quit ?" msgstr "Stoppen ?" #. file 'worldMap.py', line 20 #. file 'worldMap.py', line 98 msgid "ROBOT" msgstr "ROBOT" #. file 'guiWorld.py', line 31 msgid "Ran into a wall" msgstr "Liep tegen een muur" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Reload" msgstr "Herlaad" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robot Speed" msgstr "Robot snelheid" #. file 'GvrModel.py', line 146 msgid "Robot turned off" msgstr "Robot uitgezet" #. file 'gui-gtk/Widgets.py', line 702 msgid "Robots position is %s %s %s and carrying %s beepers" msgstr "Robots positie is %s %s %s en draagt %s piepers" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the x-axes:" msgstr "Robots postitie op de x-as:" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the y-axes:" msgstr "Robots positie op de y-as:" #. file 'gui-gtk/gvr_gtk.py', line 323 msgid "Running Worldbuilder" msgstr "Start Wereld Constructeur" #. file 'worldMap.py', line 46 msgid "S" msgstr "Z" #. file 'worldMap.py', line 23 #. file 'worldMap.py', line 119 msgid "SIZE" msgstr "Formaat" #. file 'gui-gtk/gvr_gtk.py', line 718 msgid "Selected path is not a program file" msgstr "Geslecteerd pad is geen programma bestand" #. file 'gui-gtk/gvr_gtk.py', line 765 msgid "Selected path is not a world file" msgstr "Geselecteerd pad is geen wereld bestand" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set Robot Speed" msgstr "Stel de Robot snelheid in" #. file 'gui-gtk/gvr_gtk.glade', line ? #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set language" msgstr "Stel de taal in" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set speed..." msgstr "Stel snelheid in... " #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Slow" msgstr "Langzaam" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Step" msgstr "Stap" #. file 'gui-gtk/gvr_gtk.py', line 643 msgid "" "The editor's content is changed.\n" "Do you want to save it?" msgstr "" "De inhoud van de Editor is veranderd.\n" "Wil je het bewaren?" #. file 'worldMap.py', line 46 msgid "W" msgstr "W" #. file 'worldMap.py', line 21 #. file 'worldMap.py', line 92 msgid "WALL" msgstr "MUUR" #. file 'gui-gtk/gvr_gtk.py', line 528 msgid "Worlds" msgstr "Werelden" #. file 'utils.py', line 264 msgid "" "Written the new configuration to disk\n" "You have to restart GvRng to see the effect" msgstr "" "De nieuwe configuratie is naar de schijf geschreven\n" "Herstart GvR om het effect te zien." #. file 'gui-gtk/gvr_gtk.py', line 231 msgid "You don't have a program file loaded." msgstr "Je heb geen programma bestand geladen." #. file 'gui-gtk/gvr_gtk.py', line 224 msgid "You don't have a world file loaded." msgstr "Je heb geen wereld bestand geladen." #. file 'gvrparser.py', line 331 msgid "Your program must have commands." msgstr "Je programma moet commando's hebben." #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_About" msgstr "Over" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_Edit" msgstr "Verander" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_File" msgstr "Bestand " #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_GvR" msgstr "GvR" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_Help" msgstr "Help " #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_Setup" msgstr "Instellen" #. file 'gvrparser.py', line 55 msgid "any_beepers_in_beeper_bag" msgstr "enige_piepers_in_piepertas" #. file 'gui-gtk/Widgets.py', line 593 #. file 'gui-gtk/Widgets.py', line 605 msgid "beepers" msgstr "piepers" #. file 'gvrparser.py', line 81 msgid "cheat" msgstr "cheat" #. file 'gvrparser.py', line 89 msgid "define" msgstr "definieer" #. file 'gvrparser.py', line 95 msgid "do" msgstr "doe" #. file 'gvrparser.py', line 92 msgid "elif" msgstr "andersals" #. file 'gvrparser.py', line 93 msgid "else" msgstr "anders" #. file 'gvrparser.py', line 90 #. file 'gvrparser.py', line 96 msgid "end" msgstr "eind" #. file 'gvrparser.py', line 57 msgid "facing_east" msgstr "naar_oost" #. file 'gvrparser.py', line 56 msgid "facing_north" msgstr "naar_noord" #. file 'gvrparser.py', line 58 msgid "facing_south" msgstr "naar_zuid" #. file 'gvrparser.py', line 59 msgid "facing_west" msgstr "naar_west" #. file 'gvrparser.py', line 60 msgid "front_is_blocked" msgstr "voorkant_is_versperd" #. file 'gvrparser.py', line 61 msgid "front_is_clear" msgstr "voorkant_is_vrij" #. file 'gvrparser.py', line 91 msgid "if" msgstr "als" #. file 'gvrparser.py', line 69 msgid "left_is_blocked" msgstr "links_is_versperd" #. file 'gvrparser.py', line 70 msgid "left_is_clear" msgstr "links_is_vrij" #. file 'gvrparser.py', line 76 msgid "move" msgstr "beweeg" #. file 'gvrparser.py', line 63 msgid "next_to_a_beeper" msgstr "naast_een_pieper" #. file 'gvrparser.py', line 62 msgid "no_beepers_in_beeper_bag" msgstr "geen_piepers_in_piepertas" #. file 'gvrparser.py', line 66 msgid "not_facing_east" msgstr "niet_naar_oost" #. file 'gvrparser.py', line 65 msgid "not_facing_north" msgstr "niet_naar_noord" #. file 'gvrparser.py', line 67 msgid "not_facing_south" msgstr "niet_naar_zuid" #. file 'gvrparser.py', line 68 msgid "not_facing_west" msgstr "niet_naar_west" #. file 'gvrparser.py', line 64 msgid "not_next_to_a_beeper" msgstr "niet_naast_een_pieper" #. file 'gvrparser.py', line 77 msgid "pickbeeper" msgstr "pak_pieper" #. file 'gvrparser.py', line 78 msgid "putbeeper" msgstr "plaats_pieper" #. file 'gvrparser.py', line 71 msgid "right_is_blocked" msgstr "rechts_is_versperd" #. file 'gvrparser.py', line 72 msgid "right_is_clear" msgstr "rechts_is_vrij" #. file 'gui-gtk/Widgets.py', line 558 #. file 'gui-gtk/gvr_gtk.py', line 298 msgid "robot" msgstr "robot" #. file 'gvrparser.py', line 79 msgid "turnleft" msgstr "linksaf" #. file 'gvrparser.py', line 80 msgid "turnoff" msgstr "zetuit" #. file 'gui-gtk/Widgets.py', line 533 msgid "wall" msgstr "muur" #. file 'gvrparser.py', line 94 msgid "while" msgstr "terwijl" #~ msgid "window-xo" #~ msgstr "Venster" GvRng_4.4/po/nl/Summary-nl.txt0000644000175000017500000000515611326063742015043 0ustar stasstasSamenvatting van Guido's programmeertaal De vijf basis 'Guido van robot' instructies: 1. beweeg 2. linksaf 3. plaats_pieper 4. pak_pieper 5. zetuit Blok structuur: Elke Guido van Robot instructie moet op een aparte regel staan. Een aantal van Guido van Robot instructies kunnen als een enkele instructie beschouwd worden door ze een aantal spaties te laten inspringen. refereert aan één van de van de vijf basis instructies hierboven, beslissing instructies en herhaling instructies, of een door de gebruiker gedefinieerde instructie. Condities/tests: GvR heeft achttien ingebouwde tests die verdeeld zijn in drie groepen. De eerste zes zijn blokkade tests, de volgende vier zijn pieper tests, en de laatste acht zijn richting tests. Muur tests: 1. voorkant_is_vrij 2. voorkant_is_versperd 3. links_is_versperd 4. links_is_vrij 5. rechts_is_vrij 6. rechts_is_versperd pieper tests: 7. naast_een_pieper 8. niet_naar_een_pieper 9. enige_piepers_in_piepertas 10. geen_piepers_in_piepertas richting tests: 11. naar_noord 12. niet_naar_noord 13. naar_zuid 14. niet_naar_zuid 15. naar_oost 16. niet_naar_oost 17. naar_west 18. niet_naar_west Beslissingen: Beslissingen refereert aan de mogelijkheid die programma heeft om zijn werking te beïnvloeden naar aanleiding van de uitkomst van een conditie. De drie beslissingen in GvR zijn 'als', 'anders' en 'andersals'. refereert aan één van de tests hier boven. als : als : anders: als : andersals : anders: Herhalingen: Herhalingen refereert aan de mogelijkheid van een programma om instructies, of een blok instructies, te herhalen net zolang totdat een bepaalde test is geslaagd. De twee typen van herhalingen zijn 'doe' en 'terwijl'. moet een integer (geheel getal) zijn groter dan 0 (nul). doe : terwijl : Eigen instructie: Nieuwe instructies kunnen gemaakt worden door het 'definieer' commando te gebruiken. kan iedere verzameling zijn van letters of cijfers zolang het maar met een letter begint en dat de naam niet gelijk is aan een naam van een bestaande instructie. Letters zijn A..Z, a..z, en de 'underscore' karakter(_). Voor Guido van Robot zijn hoofdletters en kleine letters verschillend, dus 'Linksaf' en 'linksaf' zijn verschillende namen. definieer : GvRng_4.4/po/nl/Summary-nl.sxw0000644000175000017500000001537111326063742015045 0ustar stasstasGvRng_4.4/po/nl/WBSummary-nl.txt0000644000175000017500000000062411326063742015267 0ustar stasstasGuido van Robot Wereld constructeur Editing wereld: Linker muisknop : Plaats of verwijder muren Middelste muisknop: Zet de argumenten voor het robot statement Rechter muisknop : Zet de argumenten voor het bieper statement Knoppen: Herlaad : Herlaad de wereld vanuit het editor venster in de wereld constructeur. Stop : Beeindig de wereld constructeur, niet GvRng. GvRng_4.4/po/nl/WBSummary-nl.odt0000644000175000017500000002053011326063742015234 0ustar stasstasPKn>4^2 ''mimetypeapplication/vnd.oasis.opendocument.textPKn>4Configurations2/statusbar/PKn>4'Configurations2/accelerator/current.xmlPKPKn>4Configurations2/floater/PKn>4Configurations2/popupmenu/PKn>4Configurations2/progressbar/PKn>4Configurations2/menubar/PKn>4Configurations2/toolbar/PKn>4Configurations2/images/Bitmaps/PKn>4 content.xmlWMo6W:Tq{bmX$zY.E$e9CҒN^dfq8>lKI6`jL'g k.jqK>0J!:KP.͵rK[,ZgImT6S<+룳+Xw/Gp֍u؁/[}onX3cQԾ{:oL s,Y;We6M3i.&ڬkG8pUmd@dJ[l }J.`FK;XUY4ѵ}K'=]1<Z0\;*7=͈k;!n@=t(1G9y.)ED _]{! s^\k(,BYǔWf}t6(@3-X)\U,nw#|e)KZ`RY=!0&d;+P`J95TXOhj10ڥ0#|sOf"]<*4 styles.xmlZK6W*m˛k7@ $@D[L$R )ۛ_RhYj-Cs8q8cOLi.:hD"S.vOwovJeRL}^9:XI^ Z02JLxUSlU ;ƨ{bK7gʡua1BLCk|9JȢwPs.̘r5f*n/˙6FTndrYH! <_G?Rꟻn48Gc).dʔ8Q)I[~di4 -Q=ݞ*k4"J7+|bkqwz)*E﹆Sxy7)le8x8tFSy _3Ch>IOx\ =# 3$4GE=HUvzK8pwpU(6@ax )[MDA`R̥1JHo4^ƎT*!&@"+aNVvN*uځ )վDO?M*DB_(57--^?T-{J);U[)Xz=ؚyq7h ǭ{t*ƭ/IR$3P֟" +Y~!|\9W,5~Ywٞu#⸂9Ԯ& Xj. W H~Էq}>Jq\)WWzs~R\WkyT0 g]=zH}n4x\wsO QՃPRjnڸgП+t cDZ} 6U^/:6 9ۚZEGB־|xvmz=i"zt:]x- 2w>,o.,"hTB\Knn6p cU iuH zlVm`aVЬ\4y|N`kQ'=:tk }*4Ri8lV?/f} W)c44Ka AAmeta.xml OpenOffice.org/2.0$Linux OpenOffice.org_project/680$Build-90112006-04-23T09:46:18stas zytkiewicz2006-04-23T09:51:27en-IE1PT0SPKn>4Thumbnails/thumbnail.pngU3U(rҠCIa^\* x'#R\ŻhI0\ԳGWGԻA ~3?|,);2/UVE[$ t9zF-uN U640r|-RFgwvF[hkz3f»ށ޽8u2NESB>2wC OiUHRxh0$\Yh'DO"-9w3ya'\X<%5>y(>qdoo +eJR"EEcd---~F6tx >3cQ8K10 ͖bUOKz1MR_?"k$8PèI"*`|{  VT+S4 settings.xmlYs8~"wzOhi`i}Z$oeC&;GҮvM$.^@i5/C.mq6}q1H"/h~%J4׾dh> Yd#|n{+cb^_חKTz榞 P.TW跮Ց-&uj4ob_BaAQ"cG.רyy~wKuc [80Cʳۺjyu/WnZOW~K: &4s2=k 0J"׸ aqѕΡPB> "z V,BUqՂ,,mT$ZuNF^,=4Ի.g'b4#K0[* kt*lQPOA@` (zP"sɢ׻4@zre HQ7 'L#(LcX(ؿQIIr S cY~D"I4f61#=ԧ(6 {Gʟp)Q+mh0$J3.Eګ(kA1h[qU i঴_pB("6bA8I1a1(h &9*PΧD7^,)\+݇WG0ޕux^=.zҠ0`"G G֟ 2qJ&ժb -#d8D5cr'3L"ӆ.юHs7QcUo~`%gmXjl|8gnwak'J՜I"Iǂ/%wj09(Z['|Jߴ1`j<)x/Eҕ-P^z0@Unkķni͞yJnk*:9Uc*\LZh 5}&y:09'=/6|iY}c2a=LS2:0mj-&Mk?HJop,B[BK, bMKYe~~M߬PK7SPKn>4META-INF/manifest.xmlKj0@=VU1q-&fW6X; F#h[S0Oͣ)k7vc^aaӠHѵHS"Z^%ۯɴ|.Ax.25| h;7GWsh,.dLB%Mync Y'@,`(Uq:bbqW`<0RO G?Fr7=^ ޛbpmaD-*긓_PrS4I7ZOHNzbK|0Hc-2xd7!ɧa87|"sϩ]PK5b9>JPKn>4^2 ''mimetypePKn>4MConfigurations2/statusbar/PKn>4'Configurations2/accelerator/current.xmlPKn>4Configurations2/floater/PKn>4Configurations2/popupmenu/PKn>4JConfigurations2/progressbar/PKn>4Configurations2/menubar/PKn>4Configurations2/toolbar/PKn>4Configurations2/images/Bitmaps/PKn>4*k -content.xmlPKn>4|X! Cstyles.xmlPKn>4Ka AA" meta.xmlPKn>4VNwThumbnails/thumbnail.pngPKn>47S Fsettings.xmlPKn>45b9>JMETA-INF/manifest.xmlPKTGvRng_4.4/po/nl/Intro-nl.txt0000644000175000017500000000222311326063742014471 0ustar stasstasWelkom in de Guido van Robot wereld. Guido van Robot of, in het kort GvR, is een programmeer taal en een vrije-software programma ontworpen om de basis vaardigheden van het programmeren aan beginners te leren. GvR draait op GNU/Linux, XO, Windows en de Macintosh, en in vele talen! Het is prima te gebruiken in het klaslokaal en thuis als een manier om de basis principes van programmeren te introduceren. Op dit moment vraag je jezelf waarschijnlijk af, wat is GvR eigenlijk? In het kort is het een robot aangeduid met een driehoek op het scherm dat zich in een wereld beweegt bestaande uit straten en lanen, muren en piepers, die Guido kan oppakken en neerzetten. GvR heeft 18 lessen en oefeningen en een taal referentie. Zie de "lessen" tab en start met les 1. Gebruik de "Taal referentie" tab om een overzicht te krijgen van de GvR taal. Extra help en informatie: OLPC: http://wiki.laptop.org/go/Guido_van_Robot GvR web page: http://gvr.sourceforge.net/index.php GvR contact: http://gvr.sourceforge.net/contact/ GvR project page: http://sourceforge.net/projects/gvrGvRng_4.4/po/Intro-en.txt0000644000175000017500000000220511326063742014051 0ustar stasstasWelcome to the Guido van Robot world. Guido van Robot, or GvR for short, is a programming language and free software application designed to introduce beginners to the fundamentals of programming. GvR runs on GNU/Linux, XO, Windows, and Macintosh, in a variety of languages! It's great in both the classroom and the home as a way of introducing people to the basic concepts of programming. At this point, you are probably asking yourself, What is GvR, specifically? The gist of it is that it is a robot represented by a triangle on the screen that moves around in a world made up of streets and avenues, walls and beepers, which Guido can collect or set. His actions are completely guided by a program written by the user. GvR comes with 18 lessons and assignments and a language reference. See the "Lessons" tab and start with lesson 1. Use the "Language reference" tab to get a overview of the GvR language. Additional help and information: OLPC: http://wiki.laptop.org/go/Guido_van_Robot GvR web page: http://gvr.sourceforge.net/index.php GvR contact: http://gvr.sourceforge.net/contact/ GvR project page: http://sourceforge.net/projects/gvr/ GvRng_4.4/po/de/0000755000175000017500000000000011326063743012207 5ustar stasstasGvRng_4.4/po/de/gvrng.po0000644000175000017500000003160111326063742013672 0ustar stasstasmsgid "" msgstr "" "Project-Id-Version: GvRGerman 1.0.5\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-18 09:46:55.092971\n" "PO-Revision-Date: 2008-12-04 12:24+0100\n" "Last-Translator: Stas Zytkiewicz \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: German\n" "X-Poedit-Country: GERMANY\n" #. file 'gvrparser.py', line 378 msgid "\"%s\" has already been defined" msgstr "\"%s\" wurde bereits definiert" #. file 'gvrparser.py', line 374 msgid "\"%s\" is not a valid name" msgstr "\"%s\" ist kein gültiger Name" #. file 'gvrparser.py', line 370 msgid "\"%s\" is not a valid test" msgstr "\"%s\" ist kein gültiger Test" #. file 'gvrparser.py', line 366 msgid "\"%s\" not defined" msgstr "\"%s\" ist nicht definiert" #. file 'gvrparser.py', line 358 msgid "'%s' statement is incomplete" msgstr "'%s' Anweisung ist unvollständig" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Alter the arguments for the 'robot' statement." msgstr " Verändere die Argumente der Roboter-Anweisung." #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Code Editor" msgstr " Programmeditor" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr " Guidos Welt " #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "World Editor" msgstr " Landschaftseditor " #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Abort" msgstr "Abbruch" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "About GvR" msgstr "Über GvR" #. file 'worldMap.py', line 22 #. file 'worldMap.py', line 114 msgid "BEEPERS" msgstr "KORN" #. file 'world.py', line 179 msgid "Bad x value for positioning robot: %s" msgstr "Unzulaessiger X-Wert für den Hamster: %s" #. file 'world.py', line 181 msgid "Bad y value for positioning robot: %s" msgstr "Unzulaessiger Y-Wert für den Hamster: %s" #. file 'gui-gtk/gvr_gtk.py', line 363 msgid "" "Can't find the lessons.\n" "Make sure you have installed the GvR-Lessons package.\n" "Check the GvR website for the lessons package.\n" "http://gvr.sf.net" msgstr "" "Ich kann die Übungen nicht finden.\n" "Prüfe, ob die Hamsterübungen installiert wurden!\n" "Schau auf der GvR-Webseite nach den Übungen!\n" "http://www.bvr.sf.net" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "" "Catalan\n" "Dutch\n" "English\n" "French\n" "Norwegian\n" "Romenian\n" "Spanish\n" "Italian" msgstr "" "Katalanisch\n" "Holländisch\n" "Englisch\n" "Französisch\n" "Norwegisch\n" "Rumänisch\n" "Spanisch\n" "Italienisch" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "" "Change the language used\n" "(After you restart GvR)" msgstr "" "Ändere die Sprache\n" "(Wird erst nach Neustart des Programms wirksam)" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Choose a file" msgstr "Wähle eine Landschaft" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Direction robot is facing (N,E,S,W)" msgstr "Himmelsrichtung, in die der Hamster schaut (N,O,S,W)" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Do you really want to quit ?" msgstr "Möchtest du wirklich aufhören? " #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 537 #. file 'gui-gtk/Widgets.py', line 540 #. file 'gui-gtk/gvr_gtk.py', line 298 msgid "E" msgstr "O" #. file 'worldMap.py', line 135 msgid "" "Error in line %s:\n" "%s\n" "Check your world file for syntax errors" msgstr "" "Fehler in Zeile %s:\n" "%s\n" "Prüfe deine Landschaft auf Syntax-Fehler" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Execute" msgstr "Führe aus" #. file 'gvrparser.py', line 362 msgid "Expected '%s' statement to end in ':'" msgstr "Die '%s' - Anweisung sollte beendet werden mit ':" #. file 'gvrparser.py', line 354 msgid "Expected code to be indented here" msgstr "Es wird eine Einrückung im Programmtext erwartet." #. file 'gvrparser.py', line 342 msgid "" "Expected positive integer\n" "Got: %s" msgstr "" "Es wird eine positive ganze Zahl erwartet.\n" "Gefunden: %s" #. file 'utils.py', line 246 msgid "Failed to save the file.\n" msgstr "Die Sicherung der Datei ist fehlgeschlagen.\n" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Fast" msgstr "Schnell" #. file 'gui-gtk/Widgets.py', line 737 msgid "Go back one page" msgstr "Gehe eine Seite zurück" #. file 'gui-gtk/Widgets.py', line 743 msgid "Go one page forward" msgstr "Gehe eine Seite vorwärts" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot - Robot arguments" msgstr "Guido van Robot - Hamster-Argumente" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot Programming Summary" msgstr "Guidi von Robot, Überblick über die Programmierung" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "Guidos Welt" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "GvR - Editor" msgstr "GvR - Editor" #. file 'gui-gtk/gvr_gtk.py', line 285 msgid "GvR - Worldbuilder" msgstr "GvR - Weltwerkstatt" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "GvR Worldbuilder" msgstr "GvR Weltwerkstatt" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Gvr Lessons" msgstr "Hamsterübungen" #. file 'gvrparser.py', line 348 msgid "Indentation error" msgstr "Einrückungsfehler" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Instant" msgstr "Augenblicklich" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "" "Instant\n" "Fast\n" "Medium\n" "Slow" msgstr "" "Augenblicklich\n" "Schnell\n" "Mittel\n" "Langsam" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Introduction" msgstr "Einführung" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Language reference" msgstr "Hamster Sprachbeschreibung" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Lessons" msgstr "Hamsterübungen" #. file 'gvrparser.py', line 338 msgid "" "Line %i:\n" "%s" msgstr "" "Zeile %i:\n" "%s" #. file 'gui-gtk/gvr_gtk.py', line 67 #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Medium" msgstr "Mittel" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 544 #. file 'gui-gtk/Widgets.py', line 547 msgid "N" msgstr "N" #. file 'guiWorld.py', line 47 msgid "No beepers to pick up." msgstr "Hier liegen keine Körner" #. file 'guiWorld.py', line 43 msgid "No beepers to put down." msgstr "Ich habe keine Körner zum Ablegen" #. file 'gui-gtk/gvr_gtk.py', line 612 msgid "No content to save" msgstr "Es gibt nichts zu sichern" #. file 'gui-gtk/Widgets.py', line 102 #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Number of beepers:" msgstr "Anzahl der Körner:" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Open worldbuilder" msgstr "Öffne die Weltwerkstatt" #. file 'gui-gtk/Widgets.py', line 592 msgid "" "Please give the number of beepers\n" "to place on %d,%d" msgstr "" "Gib bitte die Anzahl der Körner an\n" "die auf der Scholle abgelegt werden sollen: %d,%d" #. file 'GvrModel.py', line 91 msgid "Please load a world and program before executing." msgstr "Bitte lade eine Landschaft und ein Programm, bevor du startest! " #. file 'gui-gtk/gvr_gtk.py', line 533 msgid "Programs" msgstr "Programme" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Quit ?" msgstr "Beenden?" #. file 'worldMap.py', line 20 #. file 'worldMap.py', line 98 msgid "ROBOT" msgstr "HAMSTER" #. file 'guiWorld.py', line 31 msgid "Ran into a wall" msgstr "Volle Kanne gegen die Wand gelaufen" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Reload" msgstr "Neu laden" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robot Speed" msgstr "Hamstergeschwindigkeit" #. file 'GvrModel.py', line 146 msgid "Robot turned off" msgstr "Der Hamster ruht" #. file 'gui-gtk/Widgets.py', line 702 msgid "Robots position is %s %s %s and carrying %s beepers" msgstr "Guidos Position ist %s %s %s und er hat %s Körner in den Backen" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the x-axes:" msgstr "GuidosPposition auf der X-Achse:" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the y-axes:" msgstr "Guidos Position auf der Y-Achse:" #. file 'gui-gtk/gvr_gtk.py', line 323 msgid "Running Worldbuilder" msgstr "Öffne Weltwerkstatt" #. file 'worldMap.py', line 46 msgid "S" msgstr "S" #. file 'worldMap.py', line 23 #. file 'worldMap.py', line 119 msgid "SIZE" msgstr "GRÖSSE" #. file 'gui-gtk/gvr_gtk.py', line 718 msgid "Selected path is not a program file" msgstr "Der ausgewählte Pfad beschreibt keine Programmdatei" #. file 'gui-gtk/gvr_gtk.py', line 765 msgid "Selected path is not a world file" msgstr "Der ausgewählte Pfad beschreibt keine Landschaftsdatei" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set Robot Speed" msgstr "Setze die Hamstergeschwindiglkeit" #. file 'gui-gtk/gvr_gtk.glade', line ? #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set language" msgstr "Wähle eine Sprache" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set speed..." msgstr "Setze die Geschwindigkeit ..." #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Slow" msgstr "Langsam" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Step" msgstr "Schritt" #. file 'gui-gtk/gvr_gtk.py', line 643 msgid "" "The editor's content is changed.\n" "Do you want to save it?" msgstr "" "Der Dateiinhalt wurde verändert.\n" "Soll die Datei gesichert werden?" #. file 'worldMap.py', line 46 msgid "W" msgstr "W" #. file 'worldMap.py', line 21 #. file 'worldMap.py', line 92 msgid "WALL" msgstr "WAND" #. file 'gui-gtk/gvr_gtk.py', line 528 msgid "Worlds" msgstr "Landschaften" #. file 'utils.py', line 264 msgid "" "Written the new configuration to disk\n" "You have to restart GvRng to see the effect" msgstr "" "Ich habe die neue Konfiguration gespeichert.\n" "GvR muss neu gestartet werden." #. file 'gui-gtk/gvr_gtk.py', line 231 msgid "You don't have a program file loaded." msgstr "Es wurde keine Programmdatei geöffnet." #. file 'gui-gtk/gvr_gtk.py', line 224 msgid "You don't have a world file loaded." msgstr "Es wurde keine Landschaft geöffnet" #. file 'gvrparser.py', line 331 msgid "Your program must have commands." msgstr "Das Programm enthält keine Befehle " #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_About" msgstr "_Über" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_Edit" msgstr "_Edit" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_File" msgstr "_Datei" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_GvR" msgstr "_GvR" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_Help" msgstr "_Hilfe" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_Setup" msgstr "_Konfiguration" #. file 'gvrparser.py', line 55 msgid "any_beepers_in_beeper_bag" msgstr "korn_in_backentasche" #. file 'gui-gtk/Widgets.py', line 593 #. file 'gui-gtk/Widgets.py', line 605 msgid "beepers" msgstr "Körner" #. file 'gvrparser.py', line 81 msgid "cheat" msgstr "cheat" #. file 'gvrparser.py', line 89 msgid "define" msgstr "define" #. file 'gvrparser.py', line 95 msgid "do" msgstr "do" #. file 'gvrparser.py', line 92 msgid "elif" msgstr "elif" #. file 'gvrparser.py', line 93 msgid "else" msgstr "else" #. file 'gvrparser.py', line 90 #. file 'gvrparser.py', line 96 msgid "end" msgstr "end" #. file 'gvrparser.py', line 57 msgid "facing_east" msgstr "blickrichtung_ost" #. file 'gvrparser.py', line 56 msgid "facing_north" msgstr "blickrichtung_nord" #. file 'gvrparser.py', line 58 msgid "facing_south" msgstr "blickrichtung_sued" #. file 'gvrparser.py', line 59 msgid "facing_west" msgstr "blickrichtung_west" #. file 'gvrparser.py', line 60 msgid "front_is_blocked" msgstr "vorn_nicht_frei" #. file 'gvrparser.py', line 61 msgid "front_is_clear" msgstr "vorn_frei" #. file 'gvrparser.py', line 91 msgid "if" msgstr "if" #. file 'gvrparser.py', line 69 msgid "left_is_blocked" msgstr "links_nicht_frei" #. file 'gvrparser.py', line 70 msgid "left_is_clear" msgstr "links_frei" #. file 'gvrparser.py', line 76 msgid "move" msgstr "vor" #. file 'gvrparser.py', line 63 msgid "next_to_a_beeper" msgstr "korn_da" #. file 'gvrparser.py', line 62 msgid "no_beepers_in_beeper_bag" msgstr "kein_korn_in_backentasche" #. file 'gvrparser.py', line 66 msgid "not_facing_east" msgstr "blickrichtung_nicht_ost" #. file 'gvrparser.py', line 65 msgid "not_facing_north" msgstr "blickrichtung_nicht_nord" #. file 'gvrparser.py', line 67 msgid "not_facing_south" msgstr "blickrichtung_nicht_sued" #. file 'gvrparser.py', line 68 msgid "not_facing_west" msgstr "blickrichtung_nicht_west" #. file 'gvrparser.py', line 64 msgid "not_next_to_a_beeper" msgstr "kein_korn_da" #. file 'gvrparser.py', line 77 msgid "pickbeeper" msgstr "nimm" #. file 'gvrparser.py', line 78 msgid "putbeeper" msgstr "gib" #. file 'gvrparser.py', line 71 msgid "right_is_blocked" msgstr "rechts_nicht_frei" #. file 'gvrparser.py', line 72 msgid "right_is_clear" msgstr "rechts_frei" #. file 'gui-gtk/Widgets.py', line 558 #. file 'gui-gtk/gvr_gtk.py', line 298 msgid "robot" msgstr "Hamster" #. file 'gvrparser.py', line 79 msgid "turnleft" msgstr "linksum" #. file 'gvrparser.py', line 80 msgid "turnoff" msgstr "ruhe" #. file 'gui-gtk/Widgets.py', line 533 msgid "wall" msgstr "Wand" #. file 'gvrparser.py', line 94 msgid "while" msgstr "while" #, fuzzy #~ msgid "window-xo" #~ msgstr "&Fenster" GvRng_4.4/po/de/Summary-de.txt0000644000175000017500000000604111326063742014773 0ustar stasstasGuido van Robot - Guido der Hamster Überblick über die Programmierumgebung Die fünf elementaren Anweisungen lauten: 1. vor 2. linksum 3. nimm 4. gib 5. ruhe Blockstruktur Jede Anweisung verlangt eine eigene Programmzeile. Eine Folge von Anweisungen kann behandelt werden wie eine einzelne Anweisung. Jede Anweisung benötigt eine Zeile. Allerdings müssen sie alle mit derselben Anzahl von Leerzeichen eingerückt werden, wie die erste Anweisung der Folge. So entsteht eine leicht lesbare Blockstruktur. Ein abschließendes Zeichen, wie etwa ein Semikolon oder Komma, entfällt. bezeichnet eine der fünf elementaren Anweisungen von oben, eine bedingte Anweisung(sfolge)sowie eine Wiederholungsanweisung oder eine vom Benutzer definierte neue Anweisung. ... Bedingungen GvR verfügt über 18 vorgegebene Test die in drei Gruppen eingeteilt sind: die ersten sechs testen, ob eine Wand vorhanden ist, die nächsten vier sind Körner-Tests, und die letzte acht prüfen die Himmelsrichtung: 1. vorn_frei 2. vorn_nicht_frei 3. links_frei 4. links_nicht_frei 5. rechts_frei 6. rechts_nicht_frei 7. korn_da 8. kein_korn_da 9. korn_in_backentasche 10. kein_korn_in_backentasche 11. blickrichtung_nord 12. blickrichtung_nicht_nord 13. blickrichtung_süd 14. blickrichtung_nicht_süd 15. blickrichtung_ost 16. blickrichtung_nicht_ost 17. blickrichtung_west 18. blickrichtung_nicht_west Fallunterscheidungen Die bedingte Verzweigung verweist auf die Möglichkeit eines Programms, den Ablauf einer Anweisungsfolge vom Ergebnis einer Bedingung abhängig zu machen. Die drei Typen der Fallunterscheidung in Guido der Hamster sind if sowie if/else und if/elif/else. verweist auf eine der 18 Bedingungen (siehe oben). if : if : else: if : elif : ... elif : else: Wiederholung Wiederholungen beschreiben die Möglichkeit, in einem Programm eine Anweisung oder eine Anweisungsfolge zu wiederholen und zwar so lange, bis eine Bedingung erfüllt ist. Die zwei Wiederholungsanweisungen sind do- und while-Anweisungen. muss eine ganze Zahl größer als 0 sein. do : while : Eine neue Anweisung definieren: Neue Anweisungen können mit dem Schlüsselwort define erläutert werden. kann aus jeder Folge von Buchstaben und Ziffern gebildet werden, so lange das Wort mit einem Buchstaben beginnt und die Folge nicht bereits als Anweisung definiert wurde. Buchstaben sind für Guido dem Hamster die Buchstaben A..Z, a..z und der Unterstrich (_). Guido der Hamster unterscheidet Groß- und Kleinbuchstaben. Rechtsum und rechtsum sind also verschiedene Namen für Anweisungen. define : GvRng_4.4/po/de/Summary-de.sxw0000644000175000017500000001605611326063742015004 0ustar stasstasGvRng_4.4/po/WBSummary-en.odt0000644000175000017500000002034211326063742014615 0ustar stasstasPK=4^2 ''mimetypeapplication/vnd.oasis.opendocument.textPK=4Configurations2/statusbar/PK=4'Configurations2/accelerator/current.xmlPKPK=4Configurations2/floater/PK=4Configurations2/popupmenu/PK=4Configurations2/progressbar/PK=4Configurations2/menubar/PK=4Configurations2/toolbar/PK=4Configurations2/images/Bitmaps/PK=4 content.xmlWQo6~߯ b5vѡ[1 VIF4#i+r7JﻻջMgtr0 Yǧ_7ɻwWX\`֠]Zv[ͦiX~;z f4UjtG#+nFFB/ܭM cX\ #ی?"TC<,>Wᝑ^|^pUchfHa۴o|/=pEsh׷ j~OS+istQp % ϴ eWe}gn-ז-Pc¨Z,7hՄi(H#]A[ $Mm:#vH?\f$=hk%E;| )NZX7yhgNi3%moAg҉aaܹ4?蔕\Yjhl+JfJX sz’Q|b螂T WFS0GUԏgxFO{- +A(q՚F 2p@|9??R [snpFe+rv57]湱UKp״k(sY 05u\)Ns!Pp5y7U*`n)iλtJ7ZQ$ aX?p `Md]J9I):KSHYvxqw&%`aǿ={ѽb7z)vp5dGPKe /PK=4 styles.xmlZK6W*m˛k7@ $@D[L$R )ۛ_RhYj-Cs8q8cOLi.:hD"S.vOwovJeRL}^9:XI^ Z02JLxUSlU ;ƨ{bK7gʡua1BLCk|9JȢwPs.̘r5f*n/˙6FTndrYH! <_G?Rꟻn48Gc).dʔ8Q)I[~di4 -Q=ݞ*k4"J7+|bkqwz)*E﹆Sxy7)le8x8tFSy _3Ch>IOx\ =# 3$4GE=HUvzK8pwpU(6@ax )[MDA`R̥1JHo4^ƎT*!&@"+aNVvN*uځ )վDO?M*DB_(57--^?T-{J);U[)Xz=ؚyq7h ǭ{t*ƭ/IR$3P֟" +Y~!|\9W,5~Ywٞu#⸂9Ԯ& Xj. W H~Էq}>Jq\)WWzs~R\WkyT0 g]=zH}n4x\wsO QՃPRjnڸgП+t cDZ} 6U^/:6 9ۚZEGB־|xvmz=i"zt:]x- 2w>,o.,"hTB\Knn6p cU iuH zlVm`aVЬ\4y|N`kQ'=:tk }*4Ri8lV?/f} W)c4 OpenOffice.org/2.0$Linux OpenOffice.org_project/680$Build-90112006-04-23T09:46:18stas zytkiewicz2006-04-23T09:46:58en-IE1PT0SPK=4Thumbnails/thumbnail.png}8W"γQRhۼ jy+/9Ily9ʻM1ry2m 35Xlsy~_/i (Qw2w{pU\:w0=q5|#wDL @e\*~uRH Rר֗-jѕ]Cn| [!| 'B!OWw i.##ǫ-r+qJَa|qqx.J>!k8V6V&יLo٠f^^^U>;{2Kt,IAM-nxz>" b)p4FO=oW /W|ë'H5b^c}XdiJl6rj~ta11,Oa3W4@P \ }=-UP$|v~"͇{BY[$dz!Żlׄ'7%uuS 2zODǼxiľjV`xM+VPL4pjG!Щk<]E ǖ$;Ra,;b r'OGO?"H4]{ss466JuЛJ?}K"Ntz1t8etjiT="kcԾv5,Lc;mܳuK _hj bP999!-P *[*R[,9sz`8Q(9]NS(a}ek[#7D)jw[rHrb9;+?'T$ހkA PKt_nPK=4 settings.xmlYs8~"wzOhi`i}Z$oeC&;GҮvM$.^@i5/C.mq6}q1H"/h~%J4׾dh> Yd#|n{+cb^_חKTz榞 P.TW跮Ց-&uj4ob_BaAQ"cG.רyy~wKuc [80Cʳۺjyu/WnZOW~K: &4s2=k 0J"׸ aqѕΡPB> "z V,BUqՂ,,mT$ZuNF^,=4Ի.g'b4#K0[* kt*lQPOA@` (zP"sɢ׻4@zre HQ7 'L#(LcX(ؿQIIr S cY~D"I4f61#=ԧ(6 {Gʟp)Q+mh0$J3.Eګ(kA1h[qU i঴_pB("6bA8I1a1(h &9*PΧD7^,)\+݇WG0ޕux^=.zҠ0`"G G֟ 2qJ&ժb -#d8D5cr'3L"ӆ.юHs7QcUo~`%gmXjl|8gnwak'J՜I"Iǂ/%wj09(Z['|Jߴ1`j<)x/Eҕ-P^z0@Unkķni͞yJnk*:9Uc*\LZh 5}&y:09'=/6|iY}c2a=LS2:0mj-&Mk?HJop,B[BK, bMKYe~~M߬PK7SPK=4META-INF/manifest.xmlKj0@=VU1q-&fW6X; F#h[S0Oͣ)k7vc^aaӠHѵHS"Z^%ۯɴ|.Ax.25| h;7GWsh,.dLB%Mync Y'@,`(Uq:bbqW`<0RO G?Fr7=^ ޛbpmaD-*긓_PrS4I7ZOHNzbK|0Hc-2xd7!ɧa87|"sϩ]PK5b9>JPK=4^2 ''mimetypePK=4MConfigurations2/statusbar/PK=4'Configurations2/accelerator/current.xmlPK=4Configurations2/floater/PK=4Configurations2/popupmenu/PK=4JConfigurations2/progressbar/PK=4Configurations2/menubar/PK=4Configurations2/toolbar/PK=4Configurations2/images/Bitmaps/PK=4e / -content.xmlPK=4|X! styles.xmlPK=43rAA meta.xmlPK=4t_n+Thumbnails/thumbnail.pngPK=47S settings.xmlPK=45b9>J]META-INF/manifest.xmlPKGvRng_4.4/po/gvr_es.lang0000644000175000017500000000571011326063742013751 0ustar stasstas \ [uUrR]?""" """ [uUrR]?''' ''' [uUrR]?" " [uUrR]?' ' # robot pared tamaño beeper mover girarizquierda tomarzumbador ponerzumbador apagar definir frente_libre frente_bloqueado izquierda_libre izquierda_bloqueado derecha_libre derecha_bloqueado proximo_a_zumbador no_proximo_a_zumbador zumbadores_en_bolsa sin_zumbadores_en_bolsa viendo_norte no_viendo_norte viendo_sur no_viendo_sur viendo_este no_viendo_este viendo_oeste no_viendo_oeste si sino sinosi hacer mientras \b([1-9][0-9]*|0)([Uu]([Ll]|LL|ll)?|([Ll]|LL|ll)[Uu]?)?\b GvRng_4.4/po/Summary-en.sxw0000644000175000017500000001453211326063742014423 0ustar stasstasPKvAC219mimetypeapplication/vnd.sun.xml.writerPKvAC2| layout-cachepP 4PKvAC2 content.xmlZn8}߯C[$M\IZH/hR`w_ ZD%RKRv_CR%ql/D oo 4$ @˄IC x/~=<ƣDe´b) _^BЊ//N,EggϪQ@zs edG$SE$5rfw{{;A5@QZIoJi+0f;D-(6\)m|*09ɝ菫T9rqcEEwQ6=-MLxd/#{I-L/A:ݟO|%/VXm gLm&[)Vqɓ崯Y_l'Tz<[pYpur">?md,>fӁ ^=7(2qRGnL\R6aG l$MQY(t${7} D'T08 29/óxst0- i![o)$9xtǤ 2%dC]t#]5:]pMBeO  *Ğn<24]|TfU+U+Dµ%UC(84 E༔qlYqx)L|)=8fOg%bV)ywy||u8Ud@QJ*9d!AcBZm(u>U1bymsXnkm^E=TJ i!1fHʊ@l1MH v{ÉTTMgfܓ˚pSY!9Yv8} đ?al>}-RLt$(B=sD OiǨ(Ez$C1\hVOtࢤ, 0aw^L+R$L/¦Ynڐccw"_ozg׃ {?ϞClz&h*3lɤdTMj%w^)1x#EbWL9lcr^%w$m-ښKD*hFj{s1;օbb~lWHc#K(vq߫BnSg'Qκcټ[Q]vүkJiY8SP%8 jJ]INZ}~ꋓV|' OpenOffice.org 1.1.2 (Linux)2005-02-03T09:10:432005-02-03T09:11:45en-US3PT1M2SPKvAC2 settings.xmlY[s6~ﯠ~LŽ_:%,i%6Ly[:tpa)JV@ģ'[m4Wo77Y@sCאza, $ިn?3D 6 }sXA)VR (VDW$:ՖRk]J[O0 =׶O^(*lZNԣd/"ݒk7K)l NV>vzXɛ!enFnjƍOh.sP.Ki_,.TvAEX@bOK)Fh5Ct{ ⓥQH(d),NdQ*& 8P_ +5$Ϩ7cQ-UHfxvf9S0N@pS@btvOPAttJIh8l`ix[Ġ$aKƑma#<n|`W̚޺a"?PӛRɬ&=( xDȞ -rǝs?f bALoЀq$Nc+c@̴{RX\$ Vys0cE6~<EGUm}ĩr)r +PsZ}Fq^A {@_/>|fz/3}Ǘ(mݙȀNLc7~e3R?hY6 :`.`WGp &k1볕`ƗWKV /4ً[3gکvl gh;MѝXCeӮN!lSF5mU7Nk֢y?z]L*_`Ž8wr5e>&3dg:y{{uLBL`v.82LH 0smB}& LEI Vx#yxDOɩq *^ے~Nj!\1H4XXğpxXg+b.'OEo̧4ٯMiKs8L-y8`K4LiP%o.jx~?AP[ur /gs9Dbz#x1솁xZu.8 Ifvs9-t497=,U2{s=߀_PK}*PKvAC2META-INF/manifest.xmln0>{{rЩB*UjK:΅XrȾPu@%Db|scĉ|f0Og *Wj{MazX>؊FZ]QŰm# AܵdwU}.>F~(-eF). jv"]OWR %d2ᾥ d$[ɖilC<\Θ\g2)Vy SixV~od:NT5ML`:3!tWnP;!w%1.Ky_PK4RPKvAC219mimetypePKvAC2| Dlayout-cachePKvAC2Y$ content.xmlPKvAC2nȧ Estyles.xmlPKvAC2 ;(() meta.xmlPKvAC2}* wsettings.xmlPKvAC24RZMETA-INF/manifest.xmlPKGvRng_4.4/po/Summary-en.txt0000644000175000017500000000475711326063742014431 0ustar stasstasGuido van Robot Programming Summary The Five Primitive Guido van Robot Instructions: 1. move 2. turnleft 3. pickbeeper 4. putbeeper 5. turnoff Block Structuring Each Guido van Robot instruction must be on a separate line. A sequence of Guido van Robot instructions can be treated as a single instruction by indenting the same number of spaces. refers to any of the five primitive instructions above, the conditional branching or iteration instructions below, or a user defined instruction. ... Conditionals GvR has eighteen built-in tests that are divided into three groups: the first six are wall tests, the next four are beeper tests, and the last eight are compass tests: 1. front_is_clear 2. front_is_blocked 3. left_is_clear 4. left_is_blocked 5. right_is_clear 6. right_is_blocked 7. next_to_a_beeper 8. not_next_to_a_beeper 9. any_beepers_in_beeper_bag 10. no_beepers_in_beeper_bag 11. facing_north 12. not_facing_north 13. facing_south 14. not_facing_south 15. facing_east 16. not_facing_east 17. facing_west 18. not_facing_west Conditional Branching Conditional branching refers to the ability of a program to alter it's flow of execution based on the result of the evaluation of a conditional. The three types of conditional branching instructions in Guido van Robot are if and if/else and if/elif/else. refers to one of the eighteen conditionals above. if : if : else: if : elif : ... elif : else: Iteration Iteration refers to the ability of a program to repeate an instruction (or block of instructions) over and over until some condition is met. The two types of iteration instructions are the do and while instructions. must be an integer greater than 0. do : while : Defining a New Instruction: New instructions can be created for Guido van Robot using the define statement. can be any sequence of letters or digits as long as it begins with a letter and is not already used as an instruction. Letters for Guido van Robot are A..Z, a..z, and the underscore (_) character. Guido van Robot is case sensitive, so TurnRight, turnright, and turnRight are all different names. define : GvRng_4.4/po/gvr_ro.lang0000644000175000017500000000600611326063742013761 0ustar stasstas \ [uUrR]?""" """ [uUrR]?''' ''' [uUrR]?" " [uUrR]?' ' # robot perete size beeper muta intoarcerestanga ridicapiuitoare punepiuitoare opreste defineste fata_e_libera fata_e_blocata stanga_e_libera stanga_e_blocata dreapta_e_libera dreapta_e_blocata langa_o_piuitoare nu_langa_o_piuitoare orice_piuitoare_in_punga_cu_piuitoare fara_piuitoare_in_punga_cu_piuitoare cu_fata_la_nord nu_cu_fata_la_nord cu_fata_la_sud nu_cu_fata_la_sud cu_fata_la_est nu_cu_fata_la_est cu_fata_la_vest nu_cu_fata_la_vest daca altfel altfeldaca fa cattimp \b([1-9][0-9]*|0)([Uu]([Ll]|LL|ll)?|([Ll]|LL|ll)[Uu]?)?\b GvRng_4.4/po/fr/0000755000175000017500000000000011326063743012226 5ustar stasstasGvRng_4.4/po/fr/gvrng.po0000644000175000017500000004250011326063742013711 0ustar stasstas# translation of gvr-new-fr.po to # translation of gvrnew2.po to # translation of gvrparser.po to # # Copyright (C) YEAR ORGANIZATION. # Andre Roberge. msgid "" msgstr "Project-Id-Version: gvr-new-fr\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-18 09:46:55.092971\n" "PO-Revision-Date: 2005-01-22 16:23+0100\n" "Last-Translator: Stas Zytkiewicz \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. file 'gvrparser.py', line 378 msgid "\"%s\" has already been defined" msgstr "" #. file 'gvrparser.py', line 374 msgid "\"%s\" is not a valid name" msgstr "" #. file 'gvrparser.py', line 370 msgid "\"%s\" is not a valid test" msgstr "" #. file 'gvrparser.py', line 366 msgid "\"%s\" not defined" msgstr "" #. file 'gvrparser.py', line 358 msgid "'%s' statement is incomplete" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Alter the arguments for the 'robot' statement." msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Code Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "World Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Abort" msgstr "Abandonner" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "About GvR" msgstr "À &propos" #. file 'worldMap.py', line 22 #. file 'worldMap.py', line 114 msgid "BEEPERS" msgstr "BALISES" #. file 'world.py', line 179 msgid "Bad x value for positioning robot: %s" msgstr "Mauvaise abscisse pour positionner le robot %s" #. file 'world.py', line 181 msgid "Bad y value for positioning robot: %s" msgstr "Mauvaise ordonnée pour positionner le robot %s" #. file 'gui-gtk/gvr_gtk.py', line 363 #, fuzzy msgid "Can't find the lessons.\n" "Make sure you have installed the GvR-Lessons package.\n" "Check the GvR website for the lessons package.\n" "http://gvr.sf.net" msgstr "Impossible de trouver les leçons.\n" "Assurez-vous que le paquet des leçons de GvR est installé.\n" "Ce paquet est disponible sur le site internet de GvR.\n" "www.gvr.sf.net" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Catalan\n" "Dutch\n" "English\n" "French\n" "Norwegian\n" "Romenian\n" "Spanish\n" "Italian" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Change the language used\n" "(After you restart GvR)" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Choose a file" msgstr "Sélectionnerr un monde à ouvrir" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Direction robot is facing (N,E,S,W)" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Do you really want to quit ?" msgstr "" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 537 #. file 'gui-gtk/Widgets.py', line 540 #. file 'gui-gtk/gvr_gtk.py', line 298 msgid "E" msgstr "E" #. file 'worldMap.py', line 135 msgid "Error in line %s:\n" "%s\n" "Check your world file for syntax errors" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Execute" msgstr "Exécuter" #. file 'gvrparser.py', line 362 msgid "Expected '%s' statement to end in ':'" msgstr "" #. file 'gvrparser.py', line 354 msgid "Expected code to be indented here" msgstr "" #. file 'gvrparser.py', line 342 msgid "Expected positive integer\n" "Got: %s" msgstr "" #. file 'utils.py', line 246 msgid "Failed to save the file.\n" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Fast" msgstr "Rapide" #. file 'gui-gtk/Widgets.py', line 737 msgid "Go back one page" msgstr "" #. file 'gui-gtk/Widgets.py', line 743 msgid "Go one page forward" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot - Robot arguments" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot Programming Summary" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "GvR - Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 285 #, fuzzy msgid "GvR - Worldbuilder" msgstr "Fenêtre &monde" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "GvR Worldbuilder" msgstr "Fenêtre &monde" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Gvr Lessons" msgstr "Leçons de GvR" #. file 'gvrparser.py', line 348 msgid "Indentation error" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Instant" msgstr "Instantané" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Instant\n" "Fast\n" "Medium\n" "Slow" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Introduction" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Language reference" msgstr "Guide du langage de GvR" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Lessons" msgstr "Leçons de GvR" #. file 'gvrparser.py', line 338 msgid "Line %i:\n" "%s" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 67 #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Medium" msgstr "Moyen" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 544 #. file 'gui-gtk/Widgets.py', line 547 msgid "N" msgstr "N" #. file 'guiWorld.py', line 47 msgid "No beepers to pick up." msgstr "" #. file 'guiWorld.py', line 43 msgid "No beepers to put down." msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 612 msgid "No content to save" msgstr "" #. file 'gui-gtk/Widgets.py', line 102 #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Number of beepers:" msgstr "Proche de %d balises" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Open worldbuilder" msgstr "Fenêtre &monde" #. file 'gui-gtk/Widgets.py', line 592 msgid "Please give the number of beepers\n" "to place on %d,%d" msgstr "" #. file 'GvrModel.py', line 91 msgid "Please load a world and program before executing." msgstr "S'il vous plait, chargez un monde et un programme avant d'exécuter." #. file 'gui-gtk/gvr_gtk.py', line 533 #, fuzzy msgid "Programs" msgstr "Nouveau programme" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Quit ?" msgstr "" #. file 'worldMap.py', line 20 #. file 'worldMap.py', line 98 msgid "ROBOT" msgstr "ROBOT" #. file 'guiWorld.py', line 31 msgid "Ran into a wall" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Reload" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robot Speed" msgstr "Vitesse du robot" #. file 'GvrModel.py', line 146 msgid "Robot turned off" msgstr "Le robot est éteint" #. file 'gui-gtk/Widgets.py', line 702 msgid "Robots position is %s %s %s and carrying %s beepers" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the x-axes:" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the y-axes:" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 323 #, fuzzy msgid "Running Worldbuilder" msgstr "Fenêtre &monde" #. file 'worldMap.py', line 46 msgid "S" msgstr "S" #. file 'worldMap.py', line 23 #. file 'worldMap.py', line 119 msgid "SIZE" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 718 msgid "Selected path is not a program file" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 765 msgid "Selected path is not a world file" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set Robot Speed" msgstr "Configurer la vitesse du robot" #. file 'gui-gtk/gvr_gtk.glade', line ? #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set language" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Set speed..." msgstr "Configurer la &vitesse" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Slow" msgstr "Lent" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Step" msgstr "Une instruction" #. file 'gui-gtk/gvr_gtk.py', line 643 msgid "The editor's content is changed.\n" "Do you want to save it?" msgstr "" #. file 'worldMap.py', line 46 msgid "W" msgstr "O" #. file 'worldMap.py', line 21 #. file 'worldMap.py', line 92 msgid "WALL" msgstr "MUR" #. file 'gui-gtk/gvr_gtk.py', line 528 #, fuzzy msgid "Worlds" msgstr "Nouveau monde" #. file 'utils.py', line 264 msgid "Written the new configuration to disk\n" "You have to restart GvRng to see the effect" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 231 msgid "You don't have a program file loaded." msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 224 msgid "You don't have a world file loaded." msgstr "" #. file 'gvrparser.py', line 331 msgid "Your program must have commands." msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_About" msgstr "À &propos" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_Edit" msgstr "&Quitter" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_File" msgstr "&Fichier" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_GvR" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_Help" msgstr "&Aide" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_Setup" msgstr "&Configuration" #. file 'gvrparser.py', line 55 msgid "any_beepers_in_beeper_bag" msgstr "au_moins_une_balise_dans_le_sac" #. file 'gui-gtk/Widgets.py', line 593 #. file 'gui-gtk/Widgets.py', line 605 #, fuzzy msgid "beepers" msgstr "place_une_balise" #. file 'gvrparser.py', line 81 msgid "cheat" msgstr "triche" #. file 'gvrparser.py', line 89 msgid "define" msgstr "definis" #. file 'gvrparser.py', line 95 msgid "do" msgstr "repete" #. file 'gvrparser.py', line 92 msgid "elif" msgstr "sinon_si" #. file 'gvrparser.py', line 93 msgid "else" msgstr "sinon" #. file 'gvrparser.py', line 90 #. file 'gvrparser.py', line 96 msgid "end" msgstr "fin" #. file 'gvrparser.py', line 57 msgid "facing_east" msgstr "face_a_l_est" #. file 'gvrparser.py', line 56 msgid "facing_north" msgstr "face_au_nord" #. file 'gvrparser.py', line 58 msgid "facing_south" msgstr "face_au_sud" #. file 'gvrparser.py', line 59 msgid "facing_west" msgstr "face_a_l_ouest" #. file 'gvrparser.py', line 60 msgid "front_is_blocked" msgstr "voie_frontale_bloquee" #. file 'gvrparser.py', line 61 msgid "front_is_clear" msgstr "voie_frontale_libre" #. file 'gvrparser.py', line 91 msgid "if" msgstr "si" #. file 'gvrparser.py', line 69 msgid "left_is_blocked" msgstr "voie_gauche_bloquee" #. file 'gvrparser.py', line 70 msgid "left_is_clear" msgstr "voie_gauche_libre" #. file 'gvrparser.py', line 76 msgid "move" msgstr "avance" #. file 'gvrparser.py', line 63 msgid "next_to_a_beeper" msgstr "proche_d_une_balise" #. file 'gvrparser.py', line 62 msgid "no_beepers_in_beeper_bag" msgstr "plus_de_balise_dans_le_sac" #. file 'gvrparser.py', line 66 msgid "not_facing_east" msgstr "pas_face_a_l_est" #. file 'gvrparser.py', line 65 msgid "not_facing_north" msgstr "pas_face_au_nord" #. file 'gvrparser.py', line 67 msgid "not_facing_south" msgstr "pas_face_au_sud" #. file 'gvrparser.py', line 68 msgid "not_facing_west" msgstr "pas_face_a_l_ouest" #. file 'gvrparser.py', line 64 msgid "not_next_to_a_beeper" msgstr "pas_proche_d_une_balise" #. file 'gvrparser.py', line 77 msgid "pickbeeper" msgstr "recupere_une_balise" #. file 'gvrparser.py', line 78 msgid "putbeeper" msgstr "place_une_balise" #. file 'gvrparser.py', line 71 msgid "right_is_blocked" msgstr "voie_droite_bloquee" #. file 'gvrparser.py', line 72 msgid "right_is_clear" msgstr "voie_droite_libre" #. file 'gui-gtk/Widgets.py', line 558 #. file 'gui-gtk/gvr_gtk.py', line 298 #, fuzzy msgid "robot" msgstr "Vitesse du robot" #. file 'gvrparser.py', line 79 msgid "turnleft" msgstr "tourne_a_gauche" #. file 'gvrparser.py', line 80 msgid "turnoff" msgstr "eteindre" #. file 'gui-gtk/Widgets.py', line 533 msgid "wall" msgstr "" #. file 'gvrparser.py', line 94 msgid "while" msgstr "tant_que" #~ msgid "&About" #~ msgstr "À &propos" #~ msgid "&Help" #~ msgstr "&Aide" #~ msgid "&Open Program for Editing..." #~ msgstr "&Ouvrir un programme pour l'éditer" #~ msgid "&Open World for Editing..." #~ msgstr "&Ouvrir le monde pour l'éditer" #~ msgid "&Program Window" #~ msgstr "Fenêtre &programme" #~ msgid "&Save Program" #~ msgstr "&Enregistrer un programme" #~ msgid "&Save World" #~ msgstr "&Enregistrer le monde" #~ msgid "&World Window" #~ msgstr "Fenêtre &monde" #~ msgid "About this program" #~ msgstr "À propos de ce programme" #~ msgid "BDFL" #~ msgstr "DBPLV" #~ msgid "Can't make the default directory.\n" #~ " The error message was: %s" #~ msgstr "Impossible de créer le répertoire par défaut.\n" #~ " Le message d'erreur est : %s" #~ msgid "Can't save the file to chosen location,\n" #~ "make sure you have the proper permissions." #~ msgstr "Impossible d'enregistrer à l'emplacement choisi\n" #~ ", assurez-vous que vous vous avez les bonnes permissions." #~ msgid "Cannot understand: %s" #~ msgstr "Impossible de comprendre %s" #~ msgid "Change the time Guido pauses between moves" #~ msgstr "Modifier le temps de pause de Guido entre les mouvements" #~ msgid "Choose a filename for your program" #~ msgstr "Choisir un nom de fichier pour votre programme" #~ msgid "Choose a program to open" #~ msgstr "Sélectionner un programme à ouvrir" #~ msgid "Close Program Window" #~ msgstr "Ferme la fenêtre du programme" #~ msgid "Close World Window" #~ msgstr "Fermer la fenêtre du monde" #~ msgid "Code window" #~ msgstr "Fenêtre du code" #~ msgid "Create a new blank program" #~ msgstr "Créer un nouveau programme vierge" #~ msgid "Create a new blank world" #~ msgstr "Créer un nouveau monde vierge" #~ msgid "Execute the GvR program" #~ msgstr "Terminer le programme GvR" #~ msgid "GvR Lessons in HTML format" #~ msgstr "Leçons de GvR au format HTML" #~ msgid "GvR Reference" #~ msgstr "Guide de GvR" #~ msgid "Hides the Program Window" #~ msgstr "Cacher la fenêtre du programme" #~ msgid "Hides the World Window" #~ msgstr "Cacher la fenêtre du monde" #~ msgid "Hit execute to resume" #~ msgstr "Clique sur exécuter pour reprendre" #, fuzzy #~ msgid "In line %d:\n" #~ "%s is not a valid direction -- use N, S, E, or W" #~ msgstr "À la ligne %s:\n" #~ "%s n'est pas une direction valide -- utilisez N, S, E, ou O" #~ msgid "Invalid input" #~ msgstr "Entrée invalide" #~ msgid "Modified " #~ msgstr "Modifié " #~ msgid "New %s" #~ msgstr "Nouveau %s" #, fuzzy #~ msgid "New program" #~ msgstr "Nouveau programme" #, fuzzy #~ msgid "New world" #~ msgstr "Nouveau monde" #~ msgid "Open Program..." #~ msgstr "Ouvrir un programme" #~ msgid "Open World..." #~ msgstr "Ouvrir un monde" #~ msgid "Open a Guido program" #~ msgstr "Ouvrir un programme pour Guido" #~ msgid "Open a file in the %s" #~ msgstr "Ouvrir un fichier dans le %s" #~ msgid "Open a program and edit it" #~ msgstr "Ouvrir un programme et l'éditer" #~ msgid "Open a world and edit it" #~ msgstr "Ouvrir un monde et l'éditer" #~ msgid "Open a world for Guido to explore" #~ msgstr "Ouvrir un monde à explorer pour Guido" #~ msgid "Please open a 'world' file first.\n" #~ "The world will now be reset to a empty world." #~ msgstr "Il faut d'abord ouvrir un monde.\n" #~ "Le monde va à présent être initialisé en un monde vierge." #, fuzzy #~ msgid "Quit the WorldBuilder" #~ msgstr "Cacher la fenêtre du monde" #~ msgid "Reset" #~ msgstr "Annulation" #~ msgid "Reset World" #~ msgstr "Nouveau monde" #~ msgid "Robot has %d beepers" #~ msgstr "Le robot possède %d balises" #~ msgid "Robot has unlimited beepers" #~ msgstr "Le robot possède un nombre illimité de balises" #~ msgid "S&ave Program As..." #~ msgstr "&Enregistrer le programme sous..." #~ msgid "S&ave World As..." #~ msgstr "Enregistrer le monde &sous" #~ msgid "Save the program you are currently editing" #~ msgstr "Enregistrer le programme que vous êtes en train d'éditer" #~ msgid "Save the program you are currently editing to a specific " #~ "file name" #~ msgstr "Enregistrer le programme que vous êtes en train d'éditer " #~ "sous un nom de fichier spécifique" #~ msgid "Save the world you are currently editing" #~ msgstr "Enregistrer le monde que vous êtes en train d'éditer" #~ msgid "Save the world you are currently editing under another file " #~ "name" #~ msgstr "Enregistrer le monde que vous êtes en train d'éditer sous un " #~ "autre nom" #~ msgid "Show/Hide the Program Window" #~ msgstr "Montrer/cacher la fenêtre du programme" #, fuzzy #~ msgid "Show/Hide the World Builder" #~ msgstr "Montrer/cacher la fenêtre du monde" #~ msgid "Show/Hide the World Window" #~ msgstr "Montrer/cacher la fenêtre du monde" #~ msgid "Step through one instruction" #~ msgstr "Une instruction" #~ msgid "Terminate the program" #~ msgstr "Terminer le programme" #, fuzzy #~ msgid "The %s file has been modified. Would you like to save it " #~ "before exiting?" #~ msgstr "%s a été modifié. Voulez-vous l'enregistrer avant de " #~ "quitter ?" #~ msgid "The world file, %s, is not readable." #~ msgstr "Le fichier du monde, %s, n'est pas lisible" #~ msgid "The world map seems to be missing information." #~ msgstr "Une information semble manquer sur la carte du monde." #, fuzzy #~ msgid "Turn off" #~ msgstr "eteindre" #~ msgid "User aborted program" #~ msgstr "Programme utilisateur abandonné" #~ msgid "World window" #~ msgstr "Fenêtre monde" #~ msgid "Would you like to create default directories for your worlds " #~ "and programs? " #~ msgstr "Voulez-vous créer le répertoire par défaut pour vos mondes " #~ "et vos programmes ?" #~ msgid "You may only have one robot definition." #~ msgstr "Vous ne pouvez avoir qu'une seule déclaration de robot." #, fuzzy #~ msgid "You may only have one size statement" #~ msgstr "Vous ne pouvez avoir qu'une seule déclaration de robot." #, fuzzy #~ msgid "pick_beeper failed.\n" #~ msgstr "recupere_une_balise" #, fuzzy #~ msgid "window-xo" #~ msgstr "Fe&nêtre" GvRng_4.4/po/gvr_it.lang0000644000175000017500000000571211326063742013760 0ustar stasstas \ [uUrR]?""" """ [uUrR]?''' ''' [uUrR]?" " [uUrR]?' ' # robot muro size beeper muovi gira_sinistra prendi_sirena posa_sirena spento definisci libero_davanti chiuso_davanti libero_a_sinistra chiuso_a_sinistra libero_a_destra chiuso_a_destra vicino_sirena non_vicino_sirena qualche_sirena_in_borsa nessuna_sirena_in_borsa faccia_nord non_faccia_nord faccia_sud non_faccia_sud faccia_est non_faccia_est faccia_ovest non_faccia_ovest se altrimenti se_altrimenti ripeti mentre \b([1-9][0-9]*|0)([Uu]([Ll]|LL|ll)?|([Ll]|LL|ll)[Uu]?)?\b GvRng_4.4/po/gvr_de.lang0000644000175000017500000000570311326063742013734 0ustar stasstas \ [uUrR]?""" """ [uUrR]?''' ''' [uUrR]?" " [uUrR]?' ' # hamster wand grösse beeper vor linksum nimm gib ruhe define vorn_frei vorn_nicht_frei links_frei links_nicht_frei rechts_frei rechts_nicht_frei korn_da kein_korn_da korn_in_backentasche kein_korn_in_backentasche blickrichtung_nord blickrichtung_nicht_nord blickrichtung_sued blickrichtung_nicht_sued blickrichtung_ost blickrichtung_nicht_ost blickrichtung_west blickrichtung_nicht_west if else elif do while \b([1-9][0-9]*|0)([Uu]([Ll]|LL|ll)?|([Ll]|LL|ll)[Uu]?)?\b GvRng_4.4/po/gvr_cs.lang0000644000175000017500000000561611326063742013754 0ustar stasstas \ [uUrR]?""" """ [uUrR]?''' ''' [uUrR]?" " [uUrR]?' ' # robot zed velikost bzucaky jdi doleva poloz seber vypni nauc vpredu_volno vpredu_zed vlevo_volno vlevo_zed vpravo_volno vpravo_zed je_bzucak neni_bzucak jsou_bzucaky_v_pytli nejsou_bzucaky_v_pytli kouka_na_sever nekouka_na_sever kouka_na_jih nekouka_na_jih kouka_na_vychod nekouka_na_vychod kouka_na_zapad nekouka_na_zapad kdyz jinak nebo_kdyz delej dokud \b([1-9][0-9]*|0)([Uu]([Ll]|LL|ll)?|([Ll]|LL|ll)[Uu]?)?\b GvRng_4.4/po/gvr_no.lang0000644000175000017500000000567411326063742013767 0ustar stasstas \ [uUrR]?""" """ [uUrR]?''' ''' [uUrR]?" " [uUrR]?' ' # robot vegg støerrelse beeper flytt vendvenstre plukkalarm settalarm slåav definer fronten_er_fri fronten_er_blokkert venstre_er_fri venstre_er_blokkert høyre_er_fri høyre_er_blokkert ved_en_alarm ikke_ved_en_alarm noen_alarmer_i_sekken ingen_alarmer_i_sekken vendt_nord ikke_vendt_nord vendt_sør ikke_vendt_sør vendt_øst ikke_vendt_øst vendt_vest ikke_vendt_vest hvis ellers ellhvis gjør mens \b([1-9][0-9]*|0)([Uu]([Ll]|LL|ll)?|([Ll]|LL|ll)[Uu]?)?\b GvRng_4.4/po/cs/0000755000175000017500000000000011326063743012224 5ustar stasstasGvRng_4.4/po/cs/gvrng.po0000644000175000017500000003107711326063742013716 0ustar stasstasmsgid "" msgstr "Project-Id-Version: GvRCzech 0.0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-18 09:46:55.092971\n" "PO-Revision-Date: 2008-01-08 19:34+0100\n" "Last-Translator: Stas Zytkiewicz \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Czech\n" "X-Poedit-Country: CZECH REPUBLIC\n" #. file 'gvrparser.py', line 378 msgid "\"%s\" has already been defined" msgstr "\"%s\" už bylo definováno" #. file 'gvrparser.py', line 374 msgid "\"%s\" is not a valid name" msgstr "\"%s\" není platné jméno" #. file 'gvrparser.py', line 370 msgid "\"%s\" is not a valid test" msgstr "\"%s\" není správně zadaná podmínka" #. file 'gvrparser.py', line 366 msgid "\"%s\" not defined" msgstr "\"%s\" není definováno" #. file 'gvrparser.py', line 358 msgid "'%s' statement is incomplete" msgstr "'%s' instrukce není úplná" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Alter the arguments for the 'robot' statement." msgstr "Změňte parametry příkazu 'robot'." #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Code Editor" msgstr "Editor instrukcí" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "Guidův svět" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "World Editor" msgstr "Editor světa" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Abort" msgstr "Zastav" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "About GvR" msgstr "O GvR" #. file 'worldMap.py', line 22 #. file 'worldMap.py', line 114 msgid "BEEPERS" msgstr "BZUCAKY" #. file 'world.py', line 179 msgid "Bad x value for positioning robot: %s" msgstr "Špatná souřadnice x pro umístění robota: %s" #. file 'world.py', line 181 msgid "Bad y value for positioning robot: %s" msgstr "Špatná souřadnice y pro umístění robota: %s" #. file 'gui-gtk/gvr_gtk.py', line 363 msgid "Can't find the lessons.\n" "Make sure you have installed the GvR-Lessons package.\n" "Check the GvR website for the lessons package.\n" "http://gvr.sf.net" msgstr "Nemohu najít lekce.\n" "Zkontrolujte, zdali jste je nainstalovali.\n" "Navštivte webové stránky GvR, kde je najdete.\n" "http://www.bvr.sf.net" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Catalan\n" "Dutch\n" "English\n" "French\n" "Norwegian\n" "Romenian\n" "Spanish\n" "Italian" msgstr "Katalánsky\n" "Holandsky\n" "Anglicky\n" "Francouzsky\n" "Norsky\n" "Rumunsky\n" "Španělsky\n" "Italsky" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Change the language used\n" "(After you restart GvR)" msgstr "Změňte použitý jazyk\n" "(Projeví se po restartu GvR)" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Choose a file" msgstr "Vyberte soubor" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Direction robot is facing (N,E,S,W)" msgstr "Směr, kterým se robot kouká (S,V,J,Z)" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Do you really want to quit ?" msgstr "Opravdu chcete skončit?" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 537 #. file 'gui-gtk/Widgets.py', line 540 #. file 'gui-gtk/gvr_gtk.py', line 298 msgid "E" msgstr "V" #. file 'worldMap.py', line 135 msgid "Error in line %s:\n" "%s\n" "Check your world file for syntax errors" msgstr "Chyba na řádku %s:\n" "%s\n" "Zkontrolujte, nejsou-li v souboru světa syntaktické chyby." #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Execute" msgstr "Spusť" #. file 'gvrparser.py', line 362 msgid "Expected '%s' statement to end in ':'" msgstr "Instrukce '%s' by měla končit dvojtečkou ':'" #. file 'gvrparser.py', line 354 msgid "Expected code to be indented here" msgstr "Kód na tomto místě by měl být pravděpoobně odsazen." #. file 'gvrparser.py', line 342 msgid "Expected positive integer\n" "Got: %s" msgstr "Očekávano přirozené číslo\n" "Místo toho jsem našel: %s" #. file 'utils.py', line 246 msgid "Failed to save the file.\n" msgstr "Nepodařilo se uložit soubor.\n" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Fast" msgstr "" #. file 'gui-gtk/Widgets.py', line 737 msgid "Go back one page" msgstr "Vrať se o stranu zpět" #. file 'gui-gtk/Widgets.py', line 743 msgid "Go one page forward" msgstr "Poskoč o stranu dopředu" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot - Robot arguments" msgstr "Guido van Robot - parametry robota" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot Programming Summary" msgstr "Shrnutí programování Guida van Robota" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "Guidův svět" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "GvR - Editor" msgstr "GvR - editor" #. file 'gui-gtk/gvr_gtk.py', line 285 msgid "GvR - Worldbuilder" msgstr "GvR - Stavitel světa" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "GvR Worldbuilder" msgstr "Stavitel světa GvR" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Gvr Lessons" msgstr "Lekce GvR" #. file 'gvrparser.py', line 348 msgid "Indentation error" msgstr "Chyba odsazení" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Instant" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Instant\n" "Fast\n" "Medium\n" "Slow" msgstr "Okamžitě\n" "Rychle\n" "Normálně\n" "Pomalu" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Introduction" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Language reference" msgstr "Přehled jazyka" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Lessons" msgstr "Lekce" #. file 'gvrparser.py', line 338 msgid "Line %i:\n" "%s" msgstr "Řádek %i:\n" "%s" #. file 'gui-gtk/gvr_gtk.py', line 67 #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Medium" msgstr "" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 544 #. file 'gui-gtk/Widgets.py', line 547 msgid "N" msgstr "S" #. file 'guiWorld.py', line 47 msgid "No beepers to pick up." msgstr "Nejsou tu žádné bzučáky, které by šly sebrat." #. file 'guiWorld.py', line 43 msgid "No beepers to put down." msgstr "Nemám žádné bzučáky, nemůžu je položit." #. file 'gui-gtk/gvr_gtk.py', line 612 msgid "No content to save" msgstr "Není co uložit." #. file 'gui-gtk/Widgets.py', line 102 #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Number of beepers:" msgstr "Počet bzučáků:" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Open worldbuilder" msgstr "Stavitel světa GvR" #. file 'gui-gtk/Widgets.py', line 592 msgid "Please give the number of beepers\n" "to place on %d,%d" msgstr "Prosím zadej počet bzučáků\n" "na pozici %d, %d" #. file 'GvrModel.py', line 91 msgid "Please load a world and program before executing." msgstr "Prosím načtěte soubor světa a program, než robota spustíte." #. file 'gui-gtk/gvr_gtk.py', line 533 msgid "Programs" msgstr "Soubory instrukcí" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Quit ?" msgstr "Skončit?" #. file 'worldMap.py', line 20 #. file 'worldMap.py', line 98 msgid "ROBOT" msgstr "ROBOT" #. file 'guiWorld.py', line 31 msgid "Ran into a wall" msgstr "Aúúú! Naboural jsem do zdi." #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Reload" msgstr "Obnovit" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robot Speed" msgstr "Rychlost robota" #. file 'GvrModel.py', line 146 msgid "Robot turned off" msgstr "Robot vypnut" #. file 'gui-gtk/Widgets.py', line 702 msgid "Robots position is %s %s %s and carrying %s beepers" msgstr "Robot je na místě %s %s %s a nese %s bzučáků" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the x-axes:" msgstr "Souřadnice x robota:" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the y-axes:" msgstr "Souřadnice y robota:" #. file 'gui-gtk/gvr_gtk.py', line 323 #, fuzzy msgid "Running Worldbuilder" msgstr "Stavitel světa GvR" #. file 'worldMap.py', line 46 msgid "S" msgstr "J" #. file 'worldMap.py', line 23 #. file 'worldMap.py', line 119 msgid "SIZE" msgstr "VELIKOST" #. file 'gui-gtk/gvr_gtk.py', line 718 msgid "Selected path is not a program file" msgstr "Zvolený soubor není platným programem." #. file 'gui-gtk/gvr_gtk.py', line 765 msgid "Selected path is not a world file" msgstr "Vybraný soubor není platný soubor světa" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set Robot Speed" msgstr "Nastav rychlost robota" #. file 'gui-gtk/gvr_gtk.glade', line ? #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set language" msgstr "Nastavte jazyk" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set speed..." msgstr "Nastavit rychlost..." #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Slow" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Step" msgstr "Krok" #. file 'gui-gtk/gvr_gtk.py', line 643 msgid "The editor's content is changed.\n" "Do you want to save it?" msgstr "Obsah okna se změnil.\n" "Chcete jej uložit?" #. file 'worldMap.py', line 46 msgid "W" msgstr "Z" #. file 'worldMap.py', line 21 #. file 'worldMap.py', line 92 msgid "WALL" msgstr "ZED" #. file 'gui-gtk/gvr_gtk.py', line 528 msgid "Worlds" msgstr "Soubory světa" #. file 'utils.py', line 264 msgid "Written the new configuration to disk\n" "You have to restart GvRng to see the effect" msgstr "Změny v nastavení byly uložena.\n" "Projeví se po restartování GvR." #. file 'gui-gtk/gvr_gtk.py', line 231 msgid "You don't have a program file loaded." msgstr "Nemáte načtený program." #. file 'gui-gtk/gvr_gtk.py', line 224 msgid "You don't have a world file loaded." msgstr "Nemáte načtený soubor světa." #. file 'gvrparser.py', line 331 msgid "Your program must have commands." msgstr "Ve vašem programu musí být alespoň jedna instrukce." #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_About" msgstr "_O programu" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_Edit" msgstr "Úpr_avy" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_File" msgstr "_Soubor" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_GvR" msgstr "_GvR" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_Help" msgstr "_Nápověda" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_Setup" msgstr "_Nastavení" #. file 'gvrparser.py', line 55 msgid "any_beepers_in_beeper_bag" msgstr "jsou_bzucaky_v_pytli" #. file 'gui-gtk/Widgets.py', line 593 #. file 'gui-gtk/Widgets.py', line 605 msgid "beepers" msgstr "bzucaky" #. file 'gvrparser.py', line 81 msgid "cheat" msgstr "svindluj" #. file 'gvrparser.py', line 89 msgid "define" msgstr "nauc" #. file 'gvrparser.py', line 95 msgid "do" msgstr "delej" #. file 'gvrparser.py', line 92 msgid "elif" msgstr "nebo_kdyz" #. file 'gvrparser.py', line 93 msgid "else" msgstr "jinak" #. file 'gvrparser.py', line 90 #. file 'gvrparser.py', line 96 msgid "end" msgstr "konec" #. file 'gvrparser.py', line 57 msgid "facing_east" msgstr "kouka_na_vychod" #. file 'gvrparser.py', line 56 msgid "facing_north" msgstr "kouka_na_sever" #. file 'gvrparser.py', line 58 msgid "facing_south" msgstr "kouka_na_jih" #. file 'gvrparser.py', line 59 msgid "facing_west" msgstr "kouka_na_zapad" #. file 'gvrparser.py', line 60 msgid "front_is_blocked" msgstr "vpredu_zed" #. file 'gvrparser.py', line 61 msgid "front_is_clear" msgstr "vpredu_volno" #. file 'gvrparser.py', line 91 msgid "if" msgstr "kdyz" #. file 'gvrparser.py', line 69 msgid "left_is_blocked" msgstr "vlevo_zed" #. file 'gvrparser.py', line 70 msgid "left_is_clear" msgstr "vlevo_volno" #. file 'gvrparser.py', line 76 msgid "move" msgstr "jdi" #. file 'gvrparser.py', line 63 msgid "next_to_a_beeper" msgstr "je_bzucak" #. file 'gvrparser.py', line 62 msgid "no_beepers_in_beeper_bag" msgstr "nejsou_bzucaky_v_pytli" #. file 'gvrparser.py', line 66 msgid "not_facing_east" msgstr "nekouka_na_vychod" #. file 'gvrparser.py', line 65 msgid "not_facing_north" msgstr "nekouka_na_sever" #. file 'gvrparser.py', line 67 msgid "not_facing_south" msgstr "nekouka_na_jih" #. file 'gvrparser.py', line 68 msgid "not_facing_west" msgstr "nekouka_na_zapad" #. file 'gvrparser.py', line 64 msgid "not_next_to_a_beeper" msgstr "neni_bzucak" #. file 'gvrparser.py', line 77 msgid "pickbeeper" msgstr "seber" #. file 'gvrparser.py', line 78 msgid "putbeeper" msgstr "poloz" #. file 'gvrparser.py', line 71 msgid "right_is_blocked" msgstr "vpravo_zed" #. file 'gvrparser.py', line 72 msgid "right_is_clear" msgstr "vpravo_volno" #. file 'gui-gtk/Widgets.py', line 558 #. file 'gui-gtk/gvr_gtk.py', line 298 msgid "robot" msgstr "robot" #. file 'gvrparser.py', line 79 msgid "turnleft" msgstr "doleva" #. file 'gvrparser.py', line 80 msgid "turnoff" msgstr "vypni" #. file 'gui-gtk/Widgets.py', line 533 msgid "wall" msgstr "zed" #. file 'gvrparser.py', line 94 msgid "while" msgstr "dokud" #~ msgid "window-xo" #~ msgstr "Guido van Robot" GvRng_4.4/po/cs/Summary-cs.txt0000644000175000017500000000473011326063742015030 0ustar stasstasGuido van Robot - Stručný přehled instrukcí Pět základních příkazů Guido van Robota: 1. jdi 2. doleva 3. seber 4. poloz 5. vypni Psaní příkazů Každý příkaz pro Guida musí být napsán na novém řádku. Skupinu příkazů pro Guida můžete považovat jako jeden dlouhý příkaz, když jsou napsány pod sebou a každý řádek s příkazem začíná stejným počtem mezer. Místo slova můžete použít kterýkoliv z pěti základních příkazů, podmínku, opakování nebo dokonce vlastní příkazy. ... Podmínky GvR má osmnáct zabudovaných podmínek, které se dělí do třech skupin: prvních šest kontroluje zdi, další čtyři na bzučáky a posledních osm zjišťuje, kam se robot dívá. 1. vpredu_volno 2. vpredu_zed 3. vlevo_volno 4. vlevo_zed 5. vpravo_volno 6. vpravo_zed 7. je_bzucak 8. neni_bzucak 9. jsou_bzucaky_v_pytli 10. nejsou_bzucaky_v_pytli 11. kouka_na_sever 12. nekouka_na_sever 13. kouka_na_jih 14. nekouka_na_jih 15. kouka_na_vychod 16. nekouka_na_vychod 17. kouka_na_zapad 18. nekouka_na_zapad Větvení na základě podmínek Robot se může rozhodnout, co bude dále dělat, na základě zjištění, jestli je splněna nějaká podmínka. Tři typy větvících příkazů pro Guida van Robota jsou kdyz, kdyz/jinak a kdyz/nebo_kdyz/jinak/. značí jednu z osmnácti výše uvedených podmínek kdyz : kdyz : jinak: kdyz : nebo_kdyz : ... nebo_kdyz : jinak: Opakování Robot může opakovat jeden příkaz (nebo skupinu příkazů), dokud je splněna nějaká podmínka. Dva typy opakovacích příkazů jsou delej a dokud. musí být větší než 0. delej : dokud : Naučení nového příkazu Guido van Robota můžete naučit nové příkazy pomocí příkazu nauc. je libovolné jméno skládající se z písmen, číslic nebo podtržítka (_). Jméno příkazu ale nesmí začínat číslem a nesmí se shodovat s některým ze slov, kterým už Guido rozumí. Guido ale rozlišuje velká a malá písmena, takže vpravo_vbok, VPRAVO_vbok a Vpravo_Vbok jsou všechno jiná jména. nauc : GvRng_4.4/po/gvr_en.lang0000644000175000017500000000567211326063742013753 0ustar stasstas \ [uUrR]?""" """ [uUrR]?''' ''' [uUrR]?" " [uUrR]?' ' # robot wall size beepers move turnleft pickbeeper putbeeper turnoff define front_is_clear front_is_blocked left_is_clear left_is_blocked right_is_clear right_is_blocked next_to_a_beeper not_next_to_a_beeper any_beepers_in_beeper_bag no_beepers_in_beeper_bag facing_north not_facing_north facing_south not_facing_south facing_east not_facing_east facing_west not_facing_west if else elif do while \b([1-9][0-9]*|0)([Uu]([Ll]|LL|ll)?|([Ll]|LL|ll)[Uu]?)?\b GvRng_4.4/po/ro/0000755000175000017500000000000011326063743012237 5ustar stasstasGvRng_4.4/po/ro/gvrng.po0000644000175000017500000004203711326063742013727 0ustar stasstas# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "Project-Id-Version: GVR CVS\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-18 09:46:55.092971\n" "PO-Revision-Date: 2005-02-03 09:22+0200\n" "Last-Translator: Peter Damoc \n" "Language-Team: ROMANIA \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Romanian\n" "X-Poedit-Country: ROMANIA\n" #. file 'gvrparser.py', line 378 msgid "\"%s\" has already been defined" msgstr "" #. file 'gvrparser.py', line 374 msgid "\"%s\" is not a valid name" msgstr "" #. file 'gvrparser.py', line 370 msgid "\"%s\" is not a valid test" msgstr "" #. file 'gvrparser.py', line 366 msgid "\"%s\" not defined" msgstr "" #. file 'gvrparser.py', line 358 msgid "'%s' statement is incomplete" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Alter the arguments for the 'robot' statement." msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Code Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "World Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Abort" msgstr "Opreşte" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "About GvR" msgstr "Despre GvR" #. file 'worldMap.py', line 22 #. file 'worldMap.py', line 114 msgid "BEEPERS" msgstr "PIUITOARE" #. file 'world.py', line 179 msgid "Bad x value for positioning robot: %s" msgstr "Valoarea x este incorectă: %s" #. file 'world.py', line 181 msgid "Bad y value for positioning robot: %s" msgstr "Valoarea y este incorectă: %s" #. file 'gui-gtk/gvr_gtk.py', line 363 #, fuzzy msgid "Can't find the lessons.\n" "Make sure you have installed the GvR-Lessons package.\n" "Check the GvR website for the lessons package.\n" "http://gvr.sf.net" msgstr "Nu găsesc lecţiile! \n" "Asiguraţi-vă că aveţi pachetul GvR-Lessons instalat.\n" "Accesaţi site-ul GvR pentru pachetul cu lecţii gvr.sf.net" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Catalan\n" "Dutch\n" "English\n" "French\n" "Norwegian\n" "Romenian\n" "Spanish\n" "Italian" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Change the language used\n" "(After you restart GvR)" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Choose a file" msgstr "Alege o lume pentru a fi deschisă" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Direction robot is facing (N,E,S,W)" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Do you really want to quit ?" msgstr "" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 537 #. file 'gui-gtk/Widgets.py', line 540 #. file 'gui-gtk/gvr_gtk.py', line 298 msgid "E" msgstr "E" #. file 'worldMap.py', line 135 msgid "Error in line %s:\n" "%s\n" "Check your world file for syntax errors" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Execute" msgstr "Execută" #. file 'gvrparser.py', line 362 msgid "Expected '%s' statement to end in ':'" msgstr "" #. file 'gvrparser.py', line 354 msgid "Expected code to be indented here" msgstr "" #. file 'gvrparser.py', line 342 msgid "Expected positive integer\n" "Got: %s" msgstr "" #. file 'utils.py', line 246 msgid "Failed to save the file.\n" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Fast" msgstr "Rapid" #. file 'gui-gtk/Widgets.py', line 737 msgid "Go back one page" msgstr "" #. file 'gui-gtk/Widgets.py', line 743 msgid "Go one page forward" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot - Robot arguments" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot Programming Summary" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "GvR - Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 285 #, fuzzy msgid "GvR - Worldbuilder" msgstr "Fereastră Lume" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "GvR Worldbuilder" msgstr "Fereastră Lume" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Gvr Lessons" msgstr "Lecţii GvR" #. file 'gvrparser.py', line 348 msgid "Indentation error" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Instant" msgstr "Instant" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Instant\n" "Fast\n" "Medium\n" "Slow" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Introduction" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Language reference" msgstr "Referinţă limbaj GvR" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Lessons" msgstr "Lecţii GvR" #. file 'gvrparser.py', line 338 msgid "Line %i:\n" "%s" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 67 #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Medium" msgstr "Mediu" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 544 #. file 'gui-gtk/Widgets.py', line 547 msgid "N" msgstr "N" #. file 'guiWorld.py', line 47 msgid "No beepers to pick up." msgstr "" #. file 'guiWorld.py', line 43 msgid "No beepers to put down." msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 612 msgid "No content to save" msgstr "" #. file 'gui-gtk/Widgets.py', line 102 #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Number of beepers:" msgstr "În vecinătatea a %d piuitoare" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Open worldbuilder" msgstr "Fereastră Lume" #. file 'gui-gtk/Widgets.py', line 592 msgid "Please give the number of beepers\n" "to place on %d,%d" msgstr "" #. file 'GvrModel.py', line 91 msgid "Please load a world and program before executing." msgstr "Încărcaţi vă rog o lume şi un program inainte de execuţie" #. file 'gui-gtk/gvr_gtk.py', line 533 #, fuzzy msgid "Programs" msgstr "Program Nou" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Quit ?" msgstr "" #. file 'worldMap.py', line 20 #. file 'worldMap.py', line 98 msgid "ROBOT" msgstr "ROBOT" #. file 'guiWorld.py', line 31 msgid "Ran into a wall" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Reload" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robot Speed" msgstr "Viteză Robot" #. file 'GvrModel.py', line 146 msgid "Robot turned off" msgstr "Robotul s-a oprit" #. file 'gui-gtk/Widgets.py', line 702 msgid "Robots position is %s %s %s and carrying %s beepers" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the x-axes:" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the y-axes:" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 323 #, fuzzy msgid "Running Worldbuilder" msgstr "Fereastră Lume" #. file 'worldMap.py', line 46 msgid "S" msgstr "S" #. file 'worldMap.py', line 23 #. file 'worldMap.py', line 119 msgid "SIZE" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 718 msgid "Selected path is not a program file" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 765 msgid "Selected path is not a world file" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set Robot Speed" msgstr "Setează viteza robotului" #. file 'gui-gtk/gvr_gtk.glade', line ? #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set language" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Set speed..." msgstr "Setează Viteza" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Slow" msgstr "Încet" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Step" msgstr "Paşeşte" #. file 'gui-gtk/gvr_gtk.py', line 643 msgid "The editor's content is changed.\n" "Do you want to save it?" msgstr "" #. file 'worldMap.py', line 46 msgid "W" msgstr "V" #. file 'worldMap.py', line 21 #. file 'worldMap.py', line 92 msgid "WALL" msgstr "PERETE" #. file 'gui-gtk/gvr_gtk.py', line 528 #, fuzzy msgid "Worlds" msgstr "Lume Nouă" #. file 'utils.py', line 264 msgid "Written the new configuration to disk\n" "You have to restart GvRng to see the effect" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 231 msgid "You don't have a program file loaded." msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 224 msgid "You don't have a world file loaded." msgstr "" #. file 'gvrparser.py', line 331 msgid "Your program must have commands." msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_About" msgstr "Despre GvR" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_Edit" msgstr "Ieşire" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_File" msgstr "Fişier" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_GvR" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_Help" msgstr "Ajutor" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_Setup" msgstr "Setări" #. file 'gvrparser.py', line 55 msgid "any_beepers_in_beeper_bag" msgstr "orice_piuitoare_in_punga_cu_piuitoare" #. file 'gui-gtk/Widgets.py', line 593 #. file 'gui-gtk/Widgets.py', line 605 #, fuzzy msgid "beepers" msgstr "punepiuitoare" #. file 'gvrparser.py', line 81 msgid "cheat" msgstr "trisare" #. file 'gvrparser.py', line 89 msgid "define" msgstr "defineste" #. file 'gvrparser.py', line 95 msgid "do" msgstr "fa" #. file 'gvrparser.py', line 92 msgid "elif" msgstr "altfeldaca" #. file 'gvrparser.py', line 93 msgid "else" msgstr "altfel" #. file 'gvrparser.py', line 90 #. file 'gvrparser.py', line 96 msgid "end" msgstr "sfarsit" #. file 'gvrparser.py', line 57 msgid "facing_east" msgstr "cu_fata_la_est" #. file 'gvrparser.py', line 56 msgid "facing_north" msgstr "cu_fata_la_nord" #. file 'gvrparser.py', line 58 msgid "facing_south" msgstr "cu_fata_la_sud" #. file 'gvrparser.py', line 59 msgid "facing_west" msgstr "cu_fata_la_vest" #. file 'gvrparser.py', line 60 msgid "front_is_blocked" msgstr "fata_e_blocata" #. file 'gvrparser.py', line 61 msgid "front_is_clear" msgstr "fata_e_libera" #. file 'gvrparser.py', line 91 msgid "if" msgstr "daca" #. file 'gvrparser.py', line 69 msgid "left_is_blocked" msgstr "stanga_e_blocata" #. file 'gvrparser.py', line 70 msgid "left_is_clear" msgstr "stanga_e_libera" #. file 'gvrparser.py', line 76 msgid "move" msgstr "muta" #. file 'gvrparser.py', line 63 msgid "next_to_a_beeper" msgstr "langa_o_piuitoare" #. file 'gvrparser.py', line 62 msgid "no_beepers_in_beeper_bag" msgstr "fara_piuitoare_in_punga_cu_piuitoare" #. file 'gvrparser.py', line 66 msgid "not_facing_east" msgstr "nu_cu_fata_la_est" #. file 'gvrparser.py', line 65 msgid "not_facing_north" msgstr "nu_cu_fata_la_nord" #. file 'gvrparser.py', line 67 msgid "not_facing_south" msgstr "nu_cu_fata_la_sud" #. file 'gvrparser.py', line 68 msgid "not_facing_west" msgstr "nu_cu_fata_la_vest" #. file 'gvrparser.py', line 64 msgid "not_next_to_a_beeper" msgstr "nu_langa_o_piuitoare" #. file 'gvrparser.py', line 77 msgid "pickbeeper" msgstr "ridicapiuitoare" #. file 'gvrparser.py', line 78 msgid "putbeeper" msgstr "punepiuitoare" #. file 'gvrparser.py', line 71 msgid "right_is_blocked" msgstr "dreapta_e_blocata" #. file 'gvrparser.py', line 72 msgid "right_is_clear" msgstr "dreapta_e_libera" #. file 'gui-gtk/Widgets.py', line 558 #. file 'gui-gtk/gvr_gtk.py', line 298 #, fuzzy msgid "robot" msgstr "Viteză Robot" #. file 'gvrparser.py', line 79 msgid "turnleft" msgstr "intoarcerestanga" #. file 'gvrparser.py', line 80 msgid "turnoff" msgstr "opreste" #. file 'gui-gtk/Widgets.py', line 533 msgid "wall" msgstr "" #. file 'gvrparser.py', line 94 msgid "while" msgstr "cattimp" #~ msgid "&About" #~ msgstr "Despre GvR" #~ msgid "&Help" #~ msgstr "Ajutor" #~ msgid "&Open Program for Editing..." #~ msgstr "Deschide Program pentru Editare" #~ msgid "&Open World for Editing..." #~ msgstr "&Deschide o lume pentru editare...." #~ msgid "&Program Window" #~ msgstr "Fereastră &Program" #~ msgid "&Save Program" #~ msgstr "&Salvează Program" #~ msgid "&Save World" #~ msgstr "&Salvează Lume" #~ msgid "&World Window" #~ msgstr "Fereastră Lume" #~ msgid "About this program" #~ msgstr "Despre acest program" #~ msgid "BDFL" #~ msgstr "BDFL" #~ msgid "Can't make the default directory.\n" #~ " The error message was: %s" #~ msgstr "Nu pot crea directorul prestabilit.\n" #~ "Mesajul de eroare a fost: %s" #~ msgid "Can't save the file to chosen location,\n" #~ "make sure you have the proper permissions." #~ msgstr "Nu pot salva fişierul la locaţia aleasa, \n" #~ "asigurativă că aveţi drepturi de scriere." #~ msgid "Cannot understand: %s" #~ msgstr "Nu pot întelege: %s" #~ msgid "Change the time Guido pauses between moves" #~ msgstr "Schimbă intervalul de pauze între miscările lui Guido" #~ msgid "Choose a filename for your program" #~ msgstr "Alegeţi un nume de fişier pentru programul dumneavoastră" #~ msgid "Choose a program to open" #~ msgstr "Alege un program pentru a fi deschis" #~ msgid "Close Program Window" #~ msgstr "Închide Fereastra Program" #~ msgid "Close World Window" #~ msgstr "Închide Fereastră Lume" #~ msgid "Code window" #~ msgstr "Fereastră Cod" #~ msgid "Create a new blank program" #~ msgstr "Crează un program nou" #~ msgid "Create a new blank world" #~ msgstr "Crează o lume nouă" #~ msgid "Execute the GvR program" #~ msgstr "Execută programul GvR" #~ msgid "GvR Lessons in HTML format" #~ msgstr "Lecţii GvR în format HTML" #~ msgid "GvR Reference" #~ msgstr "Referinţă GvR" #~ msgid "Hides the Program Window" #~ msgstr "Ascunde Fereastra Program" #~ msgid "Hides the World Window" #~ msgstr "Ascunde Fereastră Lume" #~ msgid "Hit execute to resume" #~ msgstr "Apăsaţi Execută pentru a relua" #, fuzzy #~ msgid "In line %d:\n" #~ "%s is not a valid direction -- use N, S, E, or W" #~ msgstr "In linia %s:\n" #~ "%s nu este o directie validă -- folositi N, S, E sau V" #~ msgid "Invalid input" #~ msgstr "Intrare Invalidă" #~ msgid "Modified " #~ msgstr "Modificat" #~ msgid "New %s" #~ msgstr "%s nouă" #, fuzzy #~ msgid "New program" #~ msgstr "Program Nou" #, fuzzy #~ msgid "New world" #~ msgstr "Lume Nouă" #~ msgid "Open Program..." #~ msgstr "Deschide Program" #~ msgid "Open World..." #~ msgstr "Deschide Lume" #~ msgid "Open a Guido program" #~ msgstr "Deschide un program pentru Guido" #~ msgid "Open a file in the %s" #~ msgstr "Deschide fişierul în %s" #~ msgid "Open a program and edit it" #~ msgstr "Deschide un program pentru editare" #~ msgid "Open a world and edit it" #~ msgstr "Deschide o lume si o editează." #~ msgid "Open a world for Guido to explore" #~ msgstr "Deschide o Lume pe care Guido să o exploreze" #~ msgid "Please open a 'world' file first.\n" #~ "The world will now be reset to a empty world." #~ msgstr "Dechideţi un fişier 'lume' mai întai. \n" #~ "Lumea va fi resetată acum la o lume goala." #, fuzzy #~ msgid "Quit the WorldBuilder" #~ msgstr "Ascunde Fereastră Lume" #~ msgid "Reset" #~ msgstr "Resetează" #~ msgid "Reset World" #~ msgstr "Resetează Lumea" #~ msgid "Robot has %d beepers" #~ msgstr "Robotul are %d piuitoare" #~ msgid "Robot has unlimited beepers" #~ msgstr "Robotul are un număr nelimitat de piuitoare" #~ msgid "S&ave Program As..." #~ msgstr "S&alvează Programul ca...." #~ msgid "S&ave World As..." #~ msgstr "S&alvează Lumea ca...." #~ msgid "Save the program you are currently editing" #~ msgstr "Salvează programul pe care il editezi" #~ msgid "Save the program you are currently editing to a specific " #~ "file name" #~ msgstr "Salveză programul pe care îl editezi sub un alt nume" #~ msgid "Save the world you are currently editing" #~ msgstr "Salvează lumea pe care o editezi." #~ msgid "Save the world you are currently editing under another file " #~ "name" #~ msgstr "Salvează lumea pe care o editezi sub un alt nume" #~ msgid "Show/Hide the Program Window" #~ msgstr "Arată/Ascunde Fereastră Program" #, fuzzy #~ msgid "Show/Hide the World Builder" #~ msgstr "Arată/Ascunde Fereastră Lume" #~ msgid "Show/Hide the World Window" #~ msgstr "Arată/Ascunde Fereastră Lume" #~ msgid "Step through one instruction" #~ msgstr "Paşeşte printr-o intrucţiune." #~ msgid "Terminate the program" #~ msgstr "Opreşte programul" #, fuzzy #~ msgid "The %s file has been modified. Would you like to save it " #~ "before exiting?" #~ msgstr "%s a fost modificat. Doriti să salvaţi inainte de a ieşi?" #~ msgid "The world file, %s, is not readable." #~ msgstr "Fişierul lume %s nu poate fi citit." #~ msgid "The world map seems to be missing information." #~ msgstr "Se pare ca lipeşte informaţie din harta lumii" #, fuzzy #~ msgid "Turn off" #~ msgstr "opreste" #~ msgid "User aborted program" #~ msgstr "Utilizatorul a oprit programul" #~ msgid "World window" #~ msgstr "Fereastră Lume" #~ msgid "Would you like to create default directories for your worlds " #~ "and programs? " #~ msgstr "Doriţi să creeaţi directoare prestabilite pentru lumile şi " #~ "programele dumneavoastră?" #~ msgid "You may only have one robot definition." #~ msgstr "Poate exista doar o singură definire a robotului" #, fuzzy #~ msgid "You may only have one size statement" #~ msgstr "Poate exista doar o singură definire a robotului" #, fuzzy #~ msgid "pick_beeper failed.\n" #~ msgstr "ridicapiuitoare" #, fuzzy #~ msgid "window-xo" #~ msgstr "Fereastră" GvRng_4.4/po/no/0000755000175000017500000000000011326063743012233 5ustar stasstasGvRng_4.4/po/no/gvrng.po0000644000175000017500000002673111326063742013726 0ustar stasstas# translation of PACKAGE. # Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # <>, 2005. # , fuzzy # <>, 2005. # # msgid "" msgstr "Project-Id-Version: 1.3.4\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-18 09:46:55.092971\n" "PO-Revision-Date: 2006-02-22 20:05+0100\n" "Last-Translator: John Arthur M.Rokkones \n" "Language-Team: Norwegian/Bokmaal\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. file 'gvrparser.py', line 378 msgid "\"%s\" has already been defined" msgstr "" #. file 'gvrparser.py', line 374 msgid "\"%s\" is not a valid name" msgstr "" #. file 'gvrparser.py', line 370 msgid "\"%s\" is not a valid test" msgstr "" #. file 'gvrparser.py', line 366 msgid "\"%s\" not defined" msgstr "" #. file 'gvrparser.py', line 358 msgid "'%s' statement is incomplete" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Alter the arguments for the 'robot' statement." msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Code Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "World Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Abort" msgstr "Avbryt" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "About GvR" msgstr "Om" #. file 'worldMap.py', line 22 #. file 'worldMap.py', line 114 msgid "BEEPERS" msgstr "ALARMER" #. file 'world.py', line 179 msgid "Bad x value for positioning robot: %s" msgstr "Dårlig x verdi for posisjonering av robot:%s" #. file 'world.py', line 181 msgid "Bad y value for positioning robot: %s" msgstr "Dårlig y verdi for posisjonering av robot:%s" #. file 'gui-gtk/gvr_gtk.py', line 363 msgid "Can't find the lessons.\n" "Make sure you have installed the GvR-Lessons package.\n" "Check the GvR website for the lessons package.\n" "http://gvr.sf.net" msgstr "Kan ikke finne leksjonene.\n" "Sjekk at du har installert GvR leksjonen pakken\n" "Se etter leksjonspakken på internettsidene til Gvr.\n" "http://gvr.sf.net" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Catalan\n" "Dutch\n" "English\n" "French\n" "Norwegian\n" "Romenian\n" "Spanish\n" "Italian" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Change the language used\n" "(After you restart GvR)" msgstr "Skift språk" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Choose a file" msgstr "Velg en verden du vil åpne" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Direction robot is facing (N,E,S,W)" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Do you really want to quit ?" msgstr "Vil du virkelig avslutte?\n" "Alle endringer går tapt" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 537 #. file 'gui-gtk/Widgets.py', line 540 #. file 'gui-gtk/gvr_gtk.py', line 298 msgid "E" msgstr "Ø" #. file 'worldMap.py', line 135 msgid "Error in line %s:\n" "%s\n" "Check your world file for syntax errors" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Execute" msgstr "Kjør" #. file 'gvrparser.py', line 362 msgid "Expected '%s' statement to end in ':'" msgstr "" #. file 'gvrparser.py', line 354 msgid "Expected code to be indented here" msgstr "" #. file 'gvrparser.py', line 342 msgid "Expected positive integer\n" "Got: %s" msgstr "" #. file 'utils.py', line 246 msgid "Failed to save the file.\n" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Fast" msgstr "" #. file 'gui-gtk/Widgets.py', line 737 msgid "Go back one page" msgstr "" #. file 'gui-gtk/Widgets.py', line 743 msgid "Go one page forward" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot - Robot arguments" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot Programming Summary" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "GvR - Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 285 #, fuzzy msgid "GvR - Worldbuilder" msgstr "GvR Verdensbygger" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "GvR Worldbuilder" msgstr "GvR Verdensbygger" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Gvr Lessons" msgstr "GvR Leksjoner" #. file 'gvrparser.py', line 348 msgid "Indentation error" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Instant" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Instant\n" "Fast\n" "Medium\n" "Slow" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Introduction" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Language reference" msgstr "GvR språkreferanse" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Lessons" msgstr "GvR Leksjoner" #. file 'gvrparser.py', line 338 msgid "Line %i:\n" "%s" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 67 #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Medium" msgstr "" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 544 #. file 'gui-gtk/Widgets.py', line 547 msgid "N" msgstr "N" #. file 'guiWorld.py', line 47 msgid "No beepers to pick up." msgstr "" #. file 'guiWorld.py', line 43 msgid "No beepers to put down." msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 612 msgid "No content to save" msgstr "" #. file 'gui-gtk/Widgets.py', line 102 #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Number of beepers:" msgstr "Antall alarmer < 100" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Open worldbuilder" msgstr "GvR Verdensbygger" #. file 'gui-gtk/Widgets.py', line 592 msgid "Please give the number of beepers\n" "to place on %d,%d" msgstr "" #. file 'GvrModel.py', line 91 msgid "Please load a world and program before executing." msgstr "Venligst åpne en verden og et program før du starter." #. file 'gui-gtk/gvr_gtk.py', line 533 #, fuzzy msgid "Programs" msgstr "Nytt program" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Quit ?" msgstr "Avslutt" #. file 'worldMap.py', line 20 #. file 'worldMap.py', line 98 msgid "ROBOT" msgstr "ROBOT" #. file 'guiWorld.py', line 31 msgid "Ran into a wall" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Reload" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robot Speed" msgstr "Robotfart" #. file 'GvrModel.py', line 146 msgid "Robot turned off" msgstr "Roboten slo seg av" #. file 'gui-gtk/Widgets.py', line 702 msgid "Robots position is %s %s %s and carrying %s beepers" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the x-axes:" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the y-axes:" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 323 #, fuzzy msgid "Running Worldbuilder" msgstr "GvR Verdensbygger" #. file 'worldMap.py', line 46 msgid "S" msgstr "S" #. file 'worldMap.py', line 23 #. file 'worldMap.py', line 119 msgid "SIZE" msgstr "STØERRELSE" #. file 'gui-gtk/gvr_gtk.py', line 718 msgid "Selected path is not a program file" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 765 msgid "Selected path is not a world file" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set Robot Speed" msgstr "Velg robotfart" #. file 'gui-gtk/gvr_gtk.glade', line ? #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Set language" msgstr "Velg Språk..." #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Set speed..." msgstr "Velg F&art" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Slow" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Step" msgstr "Steg" #. file 'gui-gtk/gvr_gtk.py', line 643 msgid "The editor's content is changed.\n" "Do you want to save it?" msgstr "" #. file 'worldMap.py', line 46 msgid "W" msgstr "V" #. file 'worldMap.py', line 21 #. file 'worldMap.py', line 92 msgid "WALL" msgstr "VEGG" #. file 'gui-gtk/gvr_gtk.py', line 528 #, fuzzy msgid "Worlds" msgstr "Ny Verden" #. file 'utils.py', line 264 #, fuzzy msgid "Written the new configuration to disk\n" "You have to restart GvRng to see the effect" msgstr "Den nye konfigurasjonen er skrevet til disk\n" "Du må starte GvR på nytt for at endringene skal tre i kraft" #. file 'gui-gtk/gvr_gtk.py', line 231 msgid "You don't have a program file loaded." msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 224 msgid "You don't have a world file loaded." msgstr "" #. file 'gvrparser.py', line 331 msgid "Your program must have commands." msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_About" msgstr "Om" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_Edit" msgstr "A&vslutt" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_File" msgstr "&Fil" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_GvR" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_Help" msgstr "Hjelp" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_Setup" msgstr "&Brukervalg" #. file 'gvrparser.py', line 55 msgid "any_beepers_in_beeper_bag" msgstr "noen_alarmer_i_sekken" #. file 'gui-gtk/Widgets.py', line 593 #. file 'gui-gtk/Widgets.py', line 605 #, fuzzy msgid "beepers" msgstr "Pipere" #. file 'gvrparser.py', line 81 msgid "cheat" msgstr "juks" #. file 'gvrparser.py', line 89 msgid "define" msgstr "definer" #. file 'gvrparser.py', line 95 msgid "do" msgstr "gjør" #. file 'gvrparser.py', line 92 msgid "elif" msgstr "ellhvis" #. file 'gvrparser.py', line 93 msgid "else" msgstr "ellers" #. file 'gvrparser.py', line 90 #. file 'gvrparser.py', line 96 msgid "end" msgstr "slutt" #. file 'gvrparser.py', line 57 msgid "facing_east" msgstr "vendt_øst" #. file 'gvrparser.py', line 56 msgid "facing_north" msgstr "vendt_nord" #. file 'gvrparser.py', line 58 msgid "facing_south" msgstr "vendt_sør" #. file 'gvrparser.py', line 59 msgid "facing_west" msgstr "vendt_vest" #. file 'gvrparser.py', line 60 msgid "front_is_blocked" msgstr "fronten_er_blokkert" #. file 'gvrparser.py', line 61 msgid "front_is_clear" msgstr "fronten_er_fri" #. file 'gvrparser.py', line 91 msgid "if" msgstr "hvis" #. file 'gvrparser.py', line 69 msgid "left_is_blocked" msgstr "venstre_er_blokkert" #. file 'gvrparser.py', line 70 msgid "left_is_clear" msgstr "venstre_er_fri" #. file 'gvrparser.py', line 76 msgid "move" msgstr "flytt" #. file 'gvrparser.py', line 63 msgid "next_to_a_beeper" msgstr "ved_en_alarm" #. file 'gvrparser.py', line 62 msgid "no_beepers_in_beeper_bag" msgstr "ingen_alarmer_i_sekken" #. file 'gvrparser.py', line 66 msgid "not_facing_east" msgstr "ikke_vendt_øst" #. file 'gvrparser.py', line 65 msgid "not_facing_north" msgstr "ikke_vendt_nord" #. file 'gvrparser.py', line 67 msgid "not_facing_south" msgstr "ikke_vendt_sør" #. file 'gvrparser.py', line 68 msgid "not_facing_west" msgstr "ikke_vendt_vest" #. file 'gvrparser.py', line 64 msgid "not_next_to_a_beeper" msgstr "ikke_ved_en_alarm" #. file 'gvrparser.py', line 77 msgid "pickbeeper" msgstr "plukkalarm" #. file 'gvrparser.py', line 78 msgid "putbeeper" msgstr "settalarm" #. file 'gvrparser.py', line 71 msgid "right_is_blocked" msgstr "høyre_er_blokkert" #. file 'gvrparser.py', line 72 msgid "right_is_clear" msgstr "høyre_er_fri" #. file 'gui-gtk/Widgets.py', line 558 #. file 'gui-gtk/gvr_gtk.py', line 298 #, fuzzy msgid "robot" msgstr "Robot" #. file 'gvrparser.py', line 79 msgid "turnleft" msgstr "vendvenstre" #. file 'gvrparser.py', line 80 msgid "turnoff" msgstr "slåav" #. file 'gui-gtk/Widgets.py', line 533 #, fuzzy msgid "wall" msgstr "Vegg" #. file 'gvrparser.py', line 94 msgid "while" msgstr "mens" #, fuzzy #~ msgid "window-xo" #~ msgstr "&Vindu" GvRng_4.4/po/no/Summary-no.txt0000644000175000017500000000522311326063742015044 0ustar stasstasOppsummering Guido van Robot programmering De fem grunnleggende Guido van Robot instruksjonene: 1.flytt 2.vendvenstre 3.plukkpiper 4.settpiper 5.slaav Blokk strukturering Enhver Guido van Robot instruksjon må være på separat linje. En sekvens av Guido van Robot instruksjoner kan behandles som en singel instruksjon ved gi alle instruksjonene i sekvensen lik antall innrykk. refererer til alle de grunnleggende instruksjonene over, de betingede fordelingene eller gjentakende instruksjoner under, eller en brukerdefinert instruksjon. .... Betingelser GvR har atten innebygde tester som er fordelt på tre grupper: de seks første er veggtester de fire neste pipertester og de åtte siste er kompasstester 1.fronten_er_blokkert 2.fronten_er_fri 3.venstre_er_blokkert 4.venstre_er_fri 5.hoeyre_er_blokkert 6.hoeyre_er_fri 7.ved_en_piper 8.ikke_ved_en_piper 9.noen_pipere_i_sekken 10.ingen_pipere_i_sekken 11.vendt_nord 12.ikke_vendt_nord 13.vendt_oest 14.ikke_vendt_oest 15.vendt_soer 16.ikke_vendt_soer 17.vendt_vest 18.ikke_vendt_vest Betinget forgrening Betinget forgrening referer til et programs evne til å forandre dets rekkefølge av igangsettelser basert på evalueringer av en betingelse. De tre typene av betinget forgrenings instruksjoner i Guido van Robot er hvis, hvis/ellers og hvis/ellhvis/ellers. referer til en av de atten betingelsene over. hvis : hvis : ellers: hvis : ellhvis : .... ellhvis : ellers: Gjentagelse: Gjentagelse referer til et programs evne til å repetere en instruksjon (eller blokk av instruksjoner) om og om igjen til noen betingelser blir møtt. De to typene av gjentagelse instruksjoner er gjør og mens instruksjonene. må være et heltall større enn 0. gjoer mens Definering av en ny instruksjon: Nye instruksjoner for Guido van Robot kan lages med definer utsagnet. kan være hvilken som helst sekvens av bokstaver og siffer så lenge det starter med en bokstav og ikke allerede er i bruk som en instruksjon. Bokstaver for Guido van Robot er A..Z, a..z og understrek (_) tegnet. Guido er var på liten og stor bokstav, så VendHoeyre, vendhoeyre og vendHoeyre er alle forskjellige navn.(kommandoer kan ikke ha særnorske bokstaver) definer GvRng_4.4/po/es/0000755000175000017500000000000011326063743012226 5ustar stasstasGvRng_4.4/po/es/gvrng.po0000644000175000017500000005007711326063742013721 0ustar stasstas# Spanish translation of 0.1. # Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # David Suarez Pascal , 2005. # msgid "" msgstr "Project-Id-Version: 0.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-18 09:46:55.092971\n" "PO-Revision-Date: 2005-09-23 00:28-0600\n" "Last-Translator: Carlos David Suarez Pascal \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. file 'gvrparser.py', line 378 msgid "\"%s\" has already been defined" msgstr "" #. file 'gvrparser.py', line 374 msgid "\"%s\" is not a valid name" msgstr "" #. file 'gvrparser.py', line 370 msgid "\"%s\" is not a valid test" msgstr "" #. file 'gvrparser.py', line 366 msgid "\"%s\" not defined" msgstr "" #. file 'gvrparser.py', line 358 msgid "'%s' statement is incomplete" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Alter the arguments for the 'robot' statement." msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Code Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "World Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Abort" msgstr "Abortar" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "About GvR" msgstr "Acerca de" #. file 'worldMap.py', line 22 #. file 'worldMap.py', line 114 msgid "BEEPERS" msgstr "ZUMBADORES" #. file 'world.py', line 179 msgid "Bad x value for positioning robot: %s" msgstr "Valor x incorrecto para posicionar robot: %s" #. file 'world.py', line 181 msgid "Bad y value for positioning robot: %s" msgstr "Valor y incorrecto para posicionar robot: %s" #. file 'gui-gtk/gvr_gtk.py', line 363 msgid "Can't find the lessons.\n" "Make sure you have installed the GvR-Lessons package.\n" "Check the GvR website for the lessons package.\n" "http://gvr.sf.net" msgstr "No se encuentran las lecciones.\n" "Asegúrate de haber instalado el paquete GvR-Lessons.\n" "Busca en el sitio web de GvR el paquete de lecciones.\n" "http://gvr.sf.net" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Catalan\n" "Dutch\n" "English\n" "French\n" "Norwegian\n" "Romenian\n" "Spanish\n" "Italian" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Change the language used\n" "(After you restart GvR)" msgstr "Cambiar el idioma usado" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Choose a file" msgstr "Escoge mundo para abrir" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Direction robot is facing (N,E,S,W)" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Do you really want to quit ?" msgstr "¿Realmente deseas salir?\n" "Todos los cambios se perderán." #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 537 #. file 'gui-gtk/Widgets.py', line 540 #. file 'gui-gtk/gvr_gtk.py', line 298 msgid "E" msgstr "E" #. file 'worldMap.py', line 135 msgid "Error in line %s:\n" "%s\n" "Check your world file for syntax errors" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Execute" msgstr "Ejecutar" #. file 'gvrparser.py', line 362 msgid "Expected '%s' statement to end in ':'" msgstr "" #. file 'gvrparser.py', line 354 msgid "Expected code to be indented here" msgstr "" #. file 'gvrparser.py', line 342 msgid "Expected positive integer\n" "Got: %s" msgstr "" #. file 'utils.py', line 246 msgid "Failed to save the file.\n" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Fast" msgstr "Rápido" #. file 'gui-gtk/Widgets.py', line 737 msgid "Go back one page" msgstr "" #. file 'gui-gtk/Widgets.py', line 743 msgid "Go one page forward" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot - Robot arguments" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot Programming Summary" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "GvR - Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 285 #, fuzzy msgid "GvR - Worldbuilder" msgstr "ConstructorDeMundos GvR" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "GvR Worldbuilder" msgstr "ConstructorDeMundos GvR" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Gvr Lessons" msgstr "Lecciones GvR" #. file 'gvrparser.py', line 348 msgid "Indentation error" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Instant" msgstr "Instantáneo" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Instant\n" "Fast\n" "Medium\n" "Slow" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Introduction" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Language reference" msgstr "Refencia del lenguaje GvR" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Lessons" msgstr "Lecciones GvR" #. file 'gvrparser.py', line 338 msgid "Line %i:\n" "%s" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 67 #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Medium" msgstr "Medio" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 544 #. file 'gui-gtk/Widgets.py', line 547 msgid "N" msgstr "N" #. file 'guiWorld.py', line 47 msgid "No beepers to pick up." msgstr "" #. file 'guiWorld.py', line 43 msgid "No beepers to put down." msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 612 msgid "No content to save" msgstr "" #. file 'gui-gtk/Widgets.py', line 102 #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Number of beepers:" msgstr "Número de zumbadores < 100" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Open worldbuilder" msgstr "ConstructorDeMundos GvR" #. file 'gui-gtk/Widgets.py', line 592 msgid "Please give the number of beepers\n" "to place on %d,%d" msgstr "" #. file 'GvrModel.py', line 91 msgid "Please load a world and program before executing." msgstr "Por favor carga un mundo y un programa antes de ejecutar." #. file 'gui-gtk/gvr_gtk.py', line 533 #, fuzzy msgid "Programs" msgstr "Nuevo Programa" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Quit ?" msgstr "Salir" #. file 'worldMap.py', line 20 #. file 'worldMap.py', line 98 msgid "ROBOT" msgstr "ROBOT" #. file 'guiWorld.py', line 31 msgid "Ran into a wall" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Reload" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robot Speed" msgstr "Velocidad del robot" #. file 'GvrModel.py', line 146 msgid "Robot turned off" msgstr "Robot apagado" #. file 'gui-gtk/Widgets.py', line 702 msgid "Robots position is %s %s %s and carrying %s beepers" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the x-axes:" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the y-axes:" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 323 #, fuzzy msgid "Running Worldbuilder" msgstr "ConstructorDeMundos GvR" #. file 'worldMap.py', line 46 msgid "S" msgstr "S" #. file 'worldMap.py', line 23 #. file 'worldMap.py', line 119 msgid "SIZE" msgstr "TAMAÑO" #. file 'gui-gtk/gvr_gtk.py', line 718 msgid "Selected path is not a program file" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 765 msgid "Selected path is not a world file" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set Robot Speed" msgstr "Establecer velocidad del robot" #. file 'gui-gtk/gvr_gtk.glade', line ? #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Set language" msgstr "Establecer idioma..." #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Set speed..." msgstr "Establecer &velocidad" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Slow" msgstr "Lento" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Step" msgstr "Paso" #. file 'gui-gtk/gvr_gtk.py', line 643 msgid "The editor's content is changed.\n" "Do you want to save it?" msgstr "" #. file 'worldMap.py', line 46 msgid "W" msgstr "O" #. file 'worldMap.py', line 21 #. file 'worldMap.py', line 92 msgid "WALL" msgstr "PARED" #. file 'gui-gtk/gvr_gtk.py', line 528 #, fuzzy msgid "Worlds" msgstr "Nuevo mundo" #. file 'utils.py', line 264 #, fuzzy msgid "Written the new configuration to disk\n" "You have to restart GvRng to see the effect" msgstr "La nueva configuración ha sido guardada\n" "Tienes que reiniciar GvR para ver el efecto" #. file 'gui-gtk/gvr_gtk.py', line 231 msgid "You don't have a program file loaded." msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 224 msgid "You don't have a world file loaded." msgstr "" #. file 'gvrparser.py', line 331 msgid "Your program must have commands." msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_About" msgstr "Acerca de" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_Edit" msgstr "Sa&lir" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_File" msgstr "A&rchivo" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_GvR" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_Help" msgstr "Ayuda" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_Setup" msgstr "&Configuración" #. file 'gvrparser.py', line 55 msgid "any_beepers_in_beeper_bag" msgstr "zumbadores_en_bolsa" #. file 'gui-gtk/Widgets.py', line 593 #. file 'gui-gtk/Widgets.py', line 605 #, fuzzy msgid "beepers" msgstr "Zumbadores" #. file 'gvrparser.py', line 81 msgid "cheat" msgstr "trampa" #. file 'gvrparser.py', line 89 msgid "define" msgstr "definir" #. file 'gvrparser.py', line 95 msgid "do" msgstr "hacer" #. file 'gvrparser.py', line 92 msgid "elif" msgstr "sinosi" #. file 'gvrparser.py', line 93 msgid "else" msgstr "sino" #. file 'gvrparser.py', line 90 #. file 'gvrparser.py', line 96 msgid "end" msgstr "fin" #. file 'gvrparser.py', line 57 msgid "facing_east" msgstr "viendo_este" #. file 'gvrparser.py', line 56 msgid "facing_north" msgstr "viendo_norte" #. file 'gvrparser.py', line 58 msgid "facing_south" msgstr "viendo_sur" #. file 'gvrparser.py', line 59 msgid "facing_west" msgstr "viendo_oeste" #. file 'gvrparser.py', line 60 msgid "front_is_blocked" msgstr "frente_bloqueado" #. file 'gvrparser.py', line 61 msgid "front_is_clear" msgstr "frente_libre" #. file 'gvrparser.py', line 91 msgid "if" msgstr "si" #. file 'gvrparser.py', line 69 msgid "left_is_blocked" msgstr "izquierda_bloqueado" #. file 'gvrparser.py', line 70 msgid "left_is_clear" msgstr "izquierda_libre" #. file 'gvrparser.py', line 76 msgid "move" msgstr "mover" #. file 'gvrparser.py', line 63 msgid "next_to_a_beeper" msgstr "proximo_a_zumbador" #. file 'gvrparser.py', line 62 msgid "no_beepers_in_beeper_bag" msgstr "sin_zumbadores_en_bolsa" #. file 'gvrparser.py', line 66 msgid "not_facing_east" msgstr "no_viendo_este" #. file 'gvrparser.py', line 65 msgid "not_facing_north" msgstr "no_viendo_norte" #. file 'gvrparser.py', line 67 msgid "not_facing_south" msgstr "no_viendo_sur" #. file 'gvrparser.py', line 68 msgid "not_facing_west" msgstr "no_viendo_oeste" #. file 'gvrparser.py', line 64 msgid "not_next_to_a_beeper" msgstr "no_proximo_a_zumbador" #. file 'gvrparser.py', line 77 msgid "pickbeeper" msgstr "tomarzumbador" #. file 'gvrparser.py', line 78 msgid "putbeeper" msgstr "ponerzumbador" #. file 'gvrparser.py', line 71 msgid "right_is_blocked" msgstr "derecha_bloqueado" #. file 'gvrparser.py', line 72 msgid "right_is_clear" msgstr "derecha_libre" #. file 'gui-gtk/Widgets.py', line 558 #. file 'gui-gtk/gvr_gtk.py', line 298 #, fuzzy msgid "robot" msgstr "Robot" #. file 'gvrparser.py', line 79 msgid "turnleft" msgstr "girarizquierda" #. file 'gvrparser.py', line 80 msgid "turnoff" msgstr "apagar" #. file 'gui-gtk/Widgets.py', line 533 #, fuzzy msgid "wall" msgstr "Pared" #. file 'gvrparser.py', line 94 msgid "while" msgstr "mientras" #~ msgid " I obey your command: turning myself off." #~ msgstr "Obedezco tu orden: apagándome." #~ msgid "&About" #~ msgstr "&Acerca de" #~ msgid "&Help" #~ msgstr "A&yuda" #~ msgid "&Open Program for Editing..." #~ msgstr "Abrir &programa para edición..." #~ msgid "&Open World for Editing..." #~ msgstr "Abrir un &mundo para edición..." #~ msgid "&Program Window" #~ msgstr "Ventana de &programa" #~ msgid "&Save Program" #~ msgstr "Guardar p&rograma" #~ msgid "&Save World" #~ msgstr "Guardar m&undo" #~ msgid "&World Builder" #~ msgstr "&Constructor de mundos" #~ msgid "&World Window" #~ msgstr "Ventana de &mundo" #~ msgid "About WorldBuilder" #~ msgstr "Acerca de ConstructorDeMundos" #~ msgid "About this program" #~ msgstr "Acerca de este programa" #~ msgid "BDFL" #~ msgstr "BDFL" #~ msgid "Can't make the default directory.\n" #~ " The error message was: %s" #~ msgstr "No se puede crear el directorio predeterminado.\n" #~ " El mensaje de error fue: %s" #~ msgid "Can't save the file to chosen location,\n" #~ "make sure you have the proper permissions." #~ msgstr "No se puede guardar el archivo en el lugar indicado,\n" #~ " asegúrate de tener los permisos necesarios." #~ msgid "Cannot understand: %s" #~ msgstr "No puedo comprender: %s" #~ msgid "Change the time Guido pauses between moves" #~ msgstr "Cambiar el tiempo que Guido tarda entre movimientos" #~ msgid "Choose a filename for your program" #~ msgstr "Escoge un nombre de archivo para tu programa" #~ msgid "Choose a program to open" #~ msgstr "Escoger programa para abrir" #~ msgid "Close Program Window" #~ msgstr "Cerrar Ventana de programa" #~ msgid "Close World Window" #~ msgstr "Cerrar Ventana de mundo" #~ msgid "Code window" #~ msgstr "Ventana de código" #~ msgid "Create a new blank program" #~ msgstr "Crear un programa en blanco" #~ msgid "Create a new blank world" #~ msgstr "Crear un mundo en blanco" #~ msgid "Execute the GvR program" #~ msgstr "Ejecutar el programa GvR" #~ msgid "Export" #~ msgstr "Exportar" #~ msgid "Export your world map into a GvR format" #~ msgstr "Exportar tu mapa del mundo en formato GvR" #~ msgid "General info about this application" #~ msgstr "Información general sobre esta aplicación" #~ msgid "Get some help about usage" #~ msgstr "Obtener ayuda sobre el uso" #~ msgid "GvR Lessons in HTML format" #~ msgstr "Lecciones GvR en formato HTML" #~ msgid "GvR Reference" #~ msgstr "Referencia GvR" #~ msgid "Hey! There are no beepers here!" #~ msgstr "¡Oye! ¡No hay zumbadores aquí!" #~ msgid "Hides the Program Window" #~ msgstr "Oculta Ventana de programa" #~ msgid "Hides the World Window" #~ msgstr "Ocultar Ventana de mundo" #~ msgid "Hit execute to resume" #~ msgstr "Presiona ejecutar para continuar" #~ msgid "I don't have any beepers left!" #~ msgstr "¡No me quedan zumbadores!" #~ msgid "In line %d:\n" #~ "%s is not a valid direction -- use N, S, E, or W" #~ msgstr "En línea %d:\n" #~ "%s no es una dirección válida -- usar N, S, E u O" #~ msgid "Invalid input" #~ msgstr "Entrada inválida" #~ msgid "Language to use" #~ msgstr "Idioma a usar" #~ msgid "Language used" #~ msgstr "Idioma usado" #~ msgid "Modified " #~ msgstr "Modificado" #~ msgid "New %s" #~ msgstr "Nuevo %s" #~ msgid "New program" #~ msgstr "Nuevo programa" #~ msgid "New world" #~ msgstr "Nuevo mundo" #~ msgid "Next to %d beepers" #~ msgstr "Próximo a %d zumbadores" #~ msgid "Number of beepers > 100" #~ msgstr "Número de zumbadores > 100" #~ msgid "Ok" #~ msgstr "De acuerdo" #~ msgid "Open Program..." #~ msgstr "Abrir programa" #~ msgid "Open World..." #~ msgstr "Abrir mundo" #~ msgid "Open a Guido program" #~ msgstr "Abrir un programa de Guido" #~ msgid "Open a file in the %s" #~ msgstr "Abrir un archivo en el %s" #~ msgid "Open a program and edit it" #~ msgstr "Abre un programa y edítalo" #~ msgid "Open a world and edit it" #~ msgstr "Abrir un mundo y editarlo" #~ msgid "Open a world for Guido to explore" #~ msgstr "Abrir un mundo para Guido" #~ msgid "Ouch! I hit a wall!" #~ msgstr "¡Ay! ¡Choqué con una pared!" #~ msgid "Please open a 'world' file first.\n" #~ "The world will now be reset to a empty world." #~ msgstr "Por favor abre antes un archivo de 'mundo'.\n" #~ "El mundo será reiniciado a un mundo vacío." #~ msgid "Please use the 'quit' option in the 'file' menu" #~ msgstr "Por favor utiliza la opción 'salir' en el menu 'archivo'" #~ msgid "Quit the WorldBuilder" #~ msgstr "Salir del ConstructorDeMundos" #~ msgid "Reset" #~ msgstr "Reiniciar" #~ msgid "Reset World" #~ msgstr "Reiniciar mundo" #~ msgid "Robot has %d beepers" #~ msgstr "Robot tiene %d zumbadores" #~ msgid "Robot has unlimited beepers" #~ msgstr "Robot tiene zumbadores ilimitados" #~ msgid "S&ave Program As..." #~ msgstr "Guardar el pr&ograma como..." #~ msgid "S&ave World As..." #~ msgstr "Guardar mu&ndo como..." #~ msgid "Save" #~ msgstr "Guardar" #~ msgid "Save the program you are currently editing" #~ msgstr "Guarda el programa que estás editando actualmente" #~ msgid "Save the program you are currently editing to a specific " #~ "file name" #~ msgstr "Guarda el programa que estás editando con un nombre de " #~ "archivo particular" #~ msgid "Save the world you are currently editing" #~ msgstr "Guardar el mundo que estás editando actualmente" #~ msgid "Save the world you are currently editing under another file " #~ "name" #~ msgstr "Guarda el mundo que estás editando con otro nombre" #~ msgid "Save your world map into a GvR format" #~ msgstr "Guardar tu mapa del mundo en formato GvR" #~ msgid "Select the desired value, or sum of values as the number\n" #~ "of beepers in the robot's beeper bag." #~ msgstr "Elige el valor deseado, o suma de valores como el número\n" #~ "de zumbadores en la bolsa del robot." #, fuzzy #~ msgid "Select the desired world dimensions (streets and avenues).\n" #~ "WARNING: The existing walls and beepers will be removed." #~ msgstr "Elige las dimensiones del mundo que deseas (calles y " #~ "avenidas).\n" #~ "Se removeran las paredes y zumbadores existentes." #~ msgid "Show/Hide the Program Window" #~ msgstr "Mostrar/Ocultar la Ventana de programa" #~ msgid "Show/Hide the World Builder" #~ msgstr "Mostrar/ocultar la ventana del Constructor de Mundos" #~ msgid "Show/Hide the World Window" #~ msgstr "Mostrar/Ocultar la Ventana de mundo" #~ msgid "Size" #~ msgstr "Tamaño" #~ msgid "Size coordinates must be at least 7" #~ msgstr "Las coordenadas de tamaño deben ser al menos 7" #~ msgid "Size statement should have 2 integers" #~ msgstr "La definición de tamaño debería tener 2 enteros" #~ msgid "Step through one instruction" #~ msgstr "Paso a través de una instrucción" #~ msgid "Success!" #~ msgstr "¡Éxito!" #~ msgid "Terminate the program" #~ msgstr "Terminar el programa" #~ msgid "The %s file has been modified. Would you like to save it " #~ "before exiting?" #~ msgstr "El archivo %s ha sido modificado. ¿Deseas guardarlo antes de " #~ "salir?" #~ msgid "The world file, %s, is not readable." #~ msgstr "El archivo de mundo, %s, no se puede leer." #~ msgid "The world map seems to be missing information." #~ msgstr "Parece que falta información en el mapa del mundo." #~ msgid "There was an error in the program\n" #~ "%s" #~ msgstr "Hubo un error en el programa\n" #~ "%s" #~ msgid "Turn off" #~ msgstr "Apagar" #~ msgid "User aborted program" #~ msgstr "Programa de usuario abortado" #~ msgid "World window" #~ msgstr "Ventana de mundo" #~ msgid "WorldBuilder question" #~ msgstr "Pregunta del ConstructorDeMundos" #~ msgid "Would you like to create default directories for your worlds " #~ "and programs? " #~ msgstr "¿Deseas crear los directorios predeterminados para los " #~ "mundos y programas?" #~ msgid "You may only have one robot definition." #~ msgstr "Sólo puedes tener una definición de robot." #~ msgid "You may only have one size statement" #~ msgstr "Sólo puedes tener una definición de tamaño." #~ msgid "You must be next to a beeper before you can pick it up." #~ msgstr "Debes estar próximo a un zumbador antes de tomarlo." #~ msgid "You must make sure that there is no wall in front of me!" #~ msgstr "¡Deberías asegurarte de que no hay pared enfrente de mí!" #~ msgid "move failed.\n" #~ msgstr "movimiento fallido.\n" #~ msgid "pick_beeper failed.\n" #~ msgstr "falló tomarzumbador.\n" #~ msgid "put_beeper failed.\n" #~ " You are not carrying any beepers." #~ msgstr "falló poner_zumbador.\n" #~ " No traes cargando zumbadores." #, fuzzy #~ msgid "window-xo" #~ msgstr "Venta&na" GvRng_4.4/po/es/Summary-es.txt0000644000175000017500000000535111326063742015034 0ustar stasstasGuía de programación de Guido van Robot Las cinco instrucciones primitivas de Guido van Robot 1. mover 2. girarizquierda 3. tomarzumbador 4. ponerzumbador 5. apagar Estructura de bloques Cada instrucción de Guido van Robot debe ir en una línea separada. Una secuencia de intrucciones de Guido van Robot puede ser tratada como una sola instrucción indentandolas el mismo número de espacios. se refiere a cualquiera de las cinco primitivas mencionadas, a las instrucciones de ramificación condicional y de iteración, o a intrucciones definidas por el usuario. ... Condicionales GvR tiene dieciocho pruebas incluídas que se dividen en tres grupos: las primeras seis son pruebas de pared, las siguientes cuatro son pruebas de zumbador, y las últimas ocho son pruebas de compás: 1. frente_libre 2. frente_bloqueado 3. izquierda_libre 4. izquierda_bloqueado 5. derecha_libre 6. derecha_bloqueado 7. proximo_a_zumbador 8. no_proximo_a_zumbador 9. zumbadores_en_bolsa 10. sin_zumbadores_en_bolsa 11. viendo_norte 12. no_viendo_norte 13. viendo_sur 14. no_viendo_sur 15. viendo_este 16. no_viendo_este 17. viendo_oeste 18. no_viendo_oeste Ramificación condicional La ramificación condicional se refiere a la habilidad de un programa para alterar su flujo de ejecución basado en el resultado de la evaluación de un condicional. Los tres tipos de intrucciones condicionales en Guido van Robot son si, si/sino y si/nosi/sino. se refiere a una de las dieciocho condicionales mencionadas arriba. si : if : sino: si : nosi : ... nosi : sino: Iteración La iteración se refiere a la habilidad de un programa para repetir una instrucción (o bloque de instrucciones) una y otra vez hasta que se cumpla una condición. Los dos tipos de instrucciones de iteración son las instrucciones hacer y mientras. debe ser un entero mayor que 0. hacer : mientras : Definiendo una nueva instrucción Las nuevas instrucciones para Guido van Robot pueden ser creadas usando la declaración definir. puede ser cualquier secuencia de letras o dígitos que comienze con una letra y no haya sido ya usada como instrucción. Para Guido van Robot las letras válidas son A..Z, a..z, y el guión bajo (_). Guido van Robot reconoce mayúsculas y minúsculas, de manera que GirarIzquierda, girarizquierda y girarIzquierda son todos nombres diferentes. definir : GvRng_4.4/po/README-Summary.txt0000644000175000017500000000044711326063742014754 0ustar stasstasThe Summary-*.txt files are used to display in the gvr dialog when the user hits the help-reference menu item. When you translate this file you MUST make sure you save it using a utf-8 encoding. The easiest way of doing this is by using gedit to save the file and choose utf-8 as the encoding. GvRng_4.4/po/WBSummary-en.txt0000644000175000017500000000124711326063742014651 0ustar stasstasGuido van Robot Worldbuilder Summary Editing world: Left mouse button : Add or remove walls Middle mouse button: Set arguments for the robot statement Right mouse button: Set arguments for the beeper statement It's possible to alter the number of beepers by clicking the right mouse button when the mouse pointer is at a beepers location. Give another number of beepers in the beeper dialog. When you give 0 (zero) the beeper is removed from the world. Buttons: Reload : Reload the world from the editor window into the worldbuilder. Abort : Quit the worldbuilder, *not* GvRng. GvRng_4.4/po/it/0000755000175000017500000000000011326063743012233 5ustar stasstasGvRng_4.4/po/it/gvrng.po0000644000175000017500000004046211326063743013724 0ustar stasstas# Guido van Robot italian language file. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the GVR package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "Project-Id-Version: 1.3.4\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-18 09:46:55.092971\n" "PO-Revision-Date: 2006-01-01 15:05+0100\n" "Last-Translator: Andrea Primiani \n" "Language-Team: Italien \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #. file 'gvrparser.py', line 378 msgid "\"%s\" has already been defined" msgstr "" #. file 'gvrparser.py', line 374 msgid "\"%s\" is not a valid name" msgstr "" #. file 'gvrparser.py', line 370 msgid "\"%s\" is not a valid test" msgstr "" #. file 'gvrparser.py', line 366 msgid "\"%s\" not defined" msgstr "" #. file 'gvrparser.py', line 358 msgid "'%s' statement is incomplete" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Alter the arguments for the 'robot' statement." msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Code Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "World Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Abort" msgstr "Ferma" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "About GvR" msgstr "&A proposito" #. file 'worldMap.py', line 22 #. file 'worldMap.py', line 114 msgid "BEEPERS" msgstr "SIRENE" #. file 'world.py', line 179 msgid "Bad x value for positioning robot: %s" msgstr "Valore x errato per posizione robot: %s" #. file 'world.py', line 181 msgid "Bad y value for positioning robot: %s" msgstr "Valore y errato per posizione robot: %s" #. file 'gui-gtk/gvr_gtk.py', line 363 msgid "Can't find the lessons.\n" "Make sure you have installed the GvR-Lessons package.\n" "Check the GvR website for the lessons package.\n" "http://gvr.sf.net" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Catalan\n" "Dutch\n" "English\n" "French\n" "Norwegian\n" "Romenian\n" "Spanish\n" "Italian" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Change the language used\n" "(After you restart GvR)" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Choose a file" msgstr "Scegli un mondo da aprire" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Direction robot is facing (N,E,S,W)" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Do you really want to quit ?" msgstr "" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 537 #. file 'gui-gtk/Widgets.py', line 540 #. file 'gui-gtk/gvr_gtk.py', line 298 msgid "E" msgstr "E" #. file 'worldMap.py', line 135 msgid "Error in line %s:\n" "%s\n" "Check your world file for syntax errors" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Execute" msgstr "Esegui" #. file 'gvrparser.py', line 362 msgid "Expected '%s' statement to end in ':'" msgstr "" #. file 'gvrparser.py', line 354 msgid "Expected code to be indented here" msgstr "" #. file 'gvrparser.py', line 342 msgid "Expected positive integer\n" "Got: %s" msgstr "" #. file 'utils.py', line 246 msgid "Failed to save the file.\n" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Fast" msgstr "Veloce" #. file 'gui-gtk/Widgets.py', line 737 msgid "Go back one page" msgstr "" #. file 'gui-gtk/Widgets.py', line 743 msgid "Go one page forward" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot - Robot arguments" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot Programming Summary" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "GvR - Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 285 #, fuzzy msgid "GvR - Worldbuilder" msgstr "Finestra &mondo" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "GvR Worldbuilder" msgstr "Finestra &mondo" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Gvr Lessons" msgstr "Lezioni GvR" #. file 'gvrparser.py', line 348 msgid "Indentation error" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Instant" msgstr "Rapido" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Instant\n" "Fast\n" "Medium\n" "Slow" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Introduction" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Language reference" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Lessons" msgstr "Lezioni GvR" #. file 'gvrparser.py', line 338 msgid "Line %i:\n" "%s" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 67 #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Medium" msgstr "Medio" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 544 #. file 'gui-gtk/Widgets.py', line 547 msgid "N" msgstr "N" #. file 'guiWorld.py', line 47 msgid "No beepers to pick up." msgstr "" #. file 'guiWorld.py', line 43 msgid "No beepers to put down." msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 612 msgid "No content to save" msgstr "" #. file 'gui-gtk/Widgets.py', line 102 #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Number of beepers:" msgstr "Vicino a %d sirene" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Open worldbuilder" msgstr "Finestra &mondo" #. file 'gui-gtk/Widgets.py', line 592 msgid "Please give the number of beepers\n" "to place on %d,%d" msgstr "" #. file 'GvrModel.py', line 91 msgid "Please load a world and program before executing." msgstr "Carica un mondo e un programma prima di avviare." #. file 'gui-gtk/gvr_gtk.py', line 533 #, fuzzy msgid "Programs" msgstr "Nuovo programma" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Quit ?" msgstr "" #. file 'worldMap.py', line 20 #. file 'worldMap.py', line 98 msgid "ROBOT" msgstr "ROBOT" #. file 'guiWorld.py', line 31 msgid "Ran into a wall" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Reload" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robot Speed" msgstr "Velocità robot" #. file 'GvrModel.py', line 146 msgid "Robot turned off" msgstr "Robot fermato" #. file 'gui-gtk/Widgets.py', line 702 msgid "Robots position is %s %s %s and carrying %s beepers" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the x-axes:" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the y-axes:" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 323 #, fuzzy msgid "Running Worldbuilder" msgstr "Finestra &mondo" #. file 'worldMap.py', line 46 msgid "S" msgstr "S" #. file 'worldMap.py', line 23 #. file 'worldMap.py', line 119 msgid "SIZE" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 718 msgid "Selected path is not a program file" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 765 msgid "Selected path is not a world file" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set Robot Speed" msgstr "Imposta velocità robot" #. file 'gui-gtk/gvr_gtk.glade', line ? #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set language" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "Set speed..." msgstr "Imposta &Velocità" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Slow" msgstr "Lento" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Step" msgstr "Passo" #. file 'gui-gtk/gvr_gtk.py', line 643 msgid "The editor's content is changed.\n" "Do you want to save it?" msgstr "" #. file 'worldMap.py', line 46 msgid "W" msgstr "O" #. file 'worldMap.py', line 21 #. file 'worldMap.py', line 92 msgid "WALL" msgstr "MURO" #. file 'gui-gtk/gvr_gtk.py', line 528 #, fuzzy msgid "Worlds" msgstr "Nuovo mondo" #. file 'utils.py', line 264 msgid "Written the new configuration to disk\n" "You have to restart GvRng to see the effect" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 231 msgid "You don't have a program file loaded." msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 224 msgid "You don't have a world file loaded." msgstr "" #. file 'gvrparser.py', line 331 msgid "Your program must have commands." msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_About" msgstr "&A proposito" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_Edit" msgstr "&Esci" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_File" msgstr "&File" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_GvR" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_Help" msgstr "&Aiuto" #. file 'gui-gtk/gvr_gtk.glade', line ? #, fuzzy msgid "_Setup" msgstr "&Impostazioni" #. file 'gvrparser.py', line 55 msgid "any_beepers_in_beeper_bag" msgstr "qualche_sirena_in_borsa" #. file 'gui-gtk/Widgets.py', line 593 #. file 'gui-gtk/Widgets.py', line 605 #, fuzzy msgid "beepers" msgstr "posa_sirena" #. file 'gvrparser.py', line 81 msgid "cheat" msgstr "" #. file 'gvrparser.py', line 89 msgid "define" msgstr "definisci" #. file 'gvrparser.py', line 95 msgid "do" msgstr "ripeti" #. file 'gvrparser.py', line 92 msgid "elif" msgstr "se_altrimenti" #. file 'gvrparser.py', line 93 msgid "else" msgstr "altrimenti" #. file 'gvrparser.py', line 90 #. file 'gvrparser.py', line 96 msgid "end" msgstr "fine" #. file 'gvrparser.py', line 57 msgid "facing_east" msgstr "faccia_est" #. file 'gvrparser.py', line 56 msgid "facing_north" msgstr "faccia_nord" #. file 'gvrparser.py', line 58 msgid "facing_south" msgstr "faccia_sud" #. file 'gvrparser.py', line 59 msgid "facing_west" msgstr "faccia_ovest" #. file 'gvrparser.py', line 60 msgid "front_is_blocked" msgstr "chiuso_davanti" #. file 'gvrparser.py', line 61 msgid "front_is_clear" msgstr "libero_davanti" #. file 'gvrparser.py', line 91 msgid "if" msgstr "se" #. file 'gvrparser.py', line 69 msgid "left_is_blocked" msgstr "chiuso_a_sinistra" #. file 'gvrparser.py', line 70 msgid "left_is_clear" msgstr "libero_a_sinistra" #. file 'gvrparser.py', line 76 msgid "move" msgstr "muovi" #. file 'gvrparser.py', line 63 msgid "next_to_a_beeper" msgstr "vicino_sirena" #. file 'gvrparser.py', line 62 msgid "no_beepers_in_beeper_bag" msgstr "nessuna_sirena_in_borsa" #. file 'gvrparser.py', line 66 msgid "not_facing_east" msgstr "non_faccia_est" #. file 'gvrparser.py', line 65 msgid "not_facing_north" msgstr "non_faccia_nord" #. file 'gvrparser.py', line 67 msgid "not_facing_south" msgstr "non_faccia_sud" #. file 'gvrparser.py', line 68 msgid "not_facing_west" msgstr "non_faccia_ovest" #. file 'gvrparser.py', line 64 msgid "not_next_to_a_beeper" msgstr "non_vicino_sirena" #. file 'gvrparser.py', line 77 msgid "pickbeeper" msgstr "prendi_sirena" #. file 'gvrparser.py', line 78 msgid "putbeeper" msgstr "posa_sirena" #. file 'gvrparser.py', line 71 msgid "right_is_blocked" msgstr "chiuso_a_destra" #. file 'gvrparser.py', line 72 msgid "right_is_clear" msgstr "libero_a_destra" #. file 'gui-gtk/Widgets.py', line 558 #. file 'gui-gtk/gvr_gtk.py', line 298 #, fuzzy msgid "robot" msgstr "&A proposito" #. file 'gvrparser.py', line 79 msgid "turnleft" msgstr "gira_sinistra" #. file 'gvrparser.py', line 80 msgid "turnoff" msgstr "spento" #. file 'gui-gtk/Widgets.py', line 533 msgid "wall" msgstr "" #. file 'gvrparser.py', line 94 msgid "while" msgstr "mentre" #~ msgid "&About" #~ msgstr "&A proposito" #~ msgid "&Help" #~ msgstr "&Aiuto" #~ msgid "&Open Program for Editing..." #~ msgstr "&Apri programma per modifica..." #~ msgid "&Open World for Editing..." #~ msgstr "&Apri mondo per modifica..." #~ msgid "&Program Window" #~ msgstr "Finestra &programma" #~ msgid "&Save Program" #~ msgstr "&Salva programma" #~ msgid "&Save World" #~ msgstr "&Salva mondo" #~ msgid "&World Window" #~ msgstr "Finestra &mondo" #~ msgid "About this program" #~ msgstr "A proposito del programma" #~ msgid "Can't make the default directory.\n" #~ " The error message was: %s" #~ msgstr "Impossibile creare la cartella.\n" #~ "Messaggio di errore: %s" #~ msgid "Can't save the file to chosen location,\n" #~ "make sure you have the proper permissions." #~ msgstr "Impossibile salvare il file.\n" #~ "Controllare i permessi." #~ msgid "Cannot understand: %s" #~ msgstr "Non capisco: %s" #~ msgid "Change the time Guido pauses between moves" #~ msgstr "Cambia la durata delle pause tra una mossa e l'altra" #~ msgid "Choose a filename for your program" #~ msgstr "Scegli un nome per il tuo programma" #~ msgid "Choose a program to open" #~ msgstr "Scegli un programma da aprire" #~ msgid "Close Program Window" #~ msgstr "Chiude la finestra programma" #~ msgid "Close World Window" #~ msgstr "Chiude la finestra mondo" #~ msgid "Code window" #~ msgstr "Finestra codice" #~ msgid "Create a new blank program" #~ msgstr "Crea nuovo programma vuoto" #~ msgid "Create a new blank world" #~ msgstr "Crea nuovo mondo vuoto" #~ msgid "Execute the GvR program" #~ msgstr "Esegui il programma GvR" #~ msgid "GvR Lessons in HTML format" #~ msgstr "Lezioni GvR in formato HTML" #~ msgid "Hides the Program Window" #~ msgstr "Nasconde la finestra programma" #~ msgid "Hides the World Window" #~ msgstr "Nasconde la finestra mondo" #~ msgid "Hit execute to resume" #~ msgstr "Clic su Esegui per riprendere" #~ msgid "In line %d:\n" #~ "%s is not a valid direction -- use N, S, E, or W" #~ msgstr "Riga %d: \n" #~ "%s non è una direzione valida -- usa N, S, E o O" #~ msgid "Invalid input" #~ msgstr "Valore non valido" #~ msgid "Modified " #~ msgstr "Modificata " #~ msgid "New %s" #~ msgstr "Nuova %s" # #~ msgid "New program" #~ msgstr "Nuovo programma" #~ msgid "New world" #~ msgstr "Nuovo mondo" #~ msgid "Open Program..." #~ msgstr "Apri programma..." #~ msgid "Open World..." #~ msgstr "Apri mondo..." #~ msgid "Open a Guido program" #~ msgstr "Apri un programma per Guido" #~ msgid "Open a file in the %s" #~ msgstr "Apre un file nel %s" #~ msgid "Open a program and edit it" #~ msgstr "Apre un programma per le modifiche" #~ msgid "Open a world and edit it" #~ msgstr "Apre un mondo per la modifica" #~ msgid "Open a world for Guido to explore" #~ msgstr "Apri un mondo da esplorare per Guido" #~ msgid "Please open a 'world' file first.\n" #~ "The world will now be reset to a empty world." #~ msgstr "Prima devi aprire un file 'mondo'.\n" #~ "Ora il mondo verrà riportato a vuoto." #~ msgid "Quit the WorldBuilder" #~ msgstr "Nasconde la finestra mondo" #~ msgid "Reset" #~ msgstr "Riavvia" #~ msgid "Reset World" #~ msgstr "Riavvia mondo" #~ msgid "Robot has %d beepers" #~ msgstr "Il robot ha %d sirene" #~ msgid "Robot has unlimited beepers" #~ msgstr "Il robot ha infinite sirene" #~ msgid "S&ave Program As..." #~ msgstr "Sal&va con nome..." #~ msgid "S&ave World As..." #~ msgstr "Sal&va mondo come..." #~ msgid "Save the program you are currently editing" #~ msgstr "Salva il programma attuale" #~ msgid "Save the program you are currently editing to a specific " #~ "file name" #~ msgstr "Salva il programma attuale in un file" #~ msgid "Save the world you are currently editing" #~ msgstr "Salva il mondo attuale" #~ msgid "Save the world you are currently editing under another file " #~ "name" #~ msgstr "Salva il mondo attuale con un altro nome" #~ msgid "Show/Hide the Program Window" #~ msgstr "Mostra/nasconde la finestra programma" #~ msgid "Show/Hide the World Builder" #~ msgstr "Mostra/nasconde la finestra mondo" #~ msgid "Show/Hide the World Window" #~ msgstr "Mostra/nasconde la finestra mondo" #~ msgid "Step through one instruction" #~ msgstr "Avanza di un'istruzione" #~ msgid "Terminate the program" #~ msgstr "Termina il programma" #~ msgid "The %s file has been modified. Would you like to save it " #~ "before exiting?" #~ msgstr "Il %s è stato modificato. Salvare prima di uscire?" #~ msgid "The world file, %s, is not readable." #~ msgstr "Il file %s non è leggibile." #~ msgid "The world map seems to be missing information." #~ msgstr "La definizione del mondo manca di alcune informazioni." #, fuzzy #~ msgid "Turn off" #~ msgstr "spento" #~ msgid "User aborted program" #~ msgstr "Programma fermato dall'utente" #~ msgid "World window" #~ msgstr "Finestra mondo" #~ msgid "Would you like to create default directories for your worlds " #~ "and programs? " #~ msgstr "Creare le cartelle per i tuoi mondi e programmi?" #~ msgid "You may only have one robot definition." #~ msgstr "E' permessa una sola definizione del robot." #, fuzzy #~ msgid "You may only have one size statement" #~ msgstr "E' permessa una sola definizione del robot." #, fuzzy #~ msgid "pick_beeper failed.\n" #~ msgstr "prendi_sirena" #, fuzzy #~ msgid "window-xo" #~ msgstr "Fi&nestra" GvRng_4.4/po/it/Summary-it.sxw0000644000175000017500000002102111326063743015041 0ustar stasstasPK5P"419mimetypeapplication/vnd.sun.xml.writerPK5P"4Configurations2/PK5P"4 Pictures/PK5P"4 layout-cachecd`d(c``d``2PK~#PK5P"4 content.xmlZn6S(Z Iں(u(nCn Zmbiv;$MlҥyxC^\ cV{hDŽJt*yQgz28IuRB~7jeO̹$u!T{qxU m5n#54|S/6RQOtC}qq]{q4~M,T +Jy4E&H6Dͅ1AM|,f+ Me.7 )Oz?mdnFsG;Lw |#s"hK,6#$ꃯԛ| 0 Dl$Ox4J bPŜܥq@ڮYئkY|wzDr;q_*"Td5TI-@(ֹ& n'H9T$>κaYg:@1>;Ld-Wv=O;P'^3AIdDޝ^+]) U\\GX,T<@۟ %kݨB1"݆KqI5|cRAwۀ_`:C|E/a'gx\AMO /f~ʈ/BN#'V|*!ڪJ-2K2/s秃"fYiZ[1;v\eHV%[L9"K3|WЖ`d2lw]W-or*!TS`kkC Q̥sQ7 ?iQEfڇ4奞El* YH0*`k͜2gJgL'ɬ 12R("jC:GJřSV{ Z4 Eq'үDpk,{bh2;p a4 Q+ȯb2c,C8/y;K82H!jyz8P;a)D8nYNҢDߖ pi'(|ضn +I5i.!( _"Yx7 QDK0^VvRULpNK ^i`vKC>%~9_鮋QFw8b,HX{< @NxH>Rڤ ʿ f[v`rĈ>^A)' b= ̷<8WǾh%ϡbhC^D/Q}q('8[mjq*>hXѺq޲-΢5usW2*8YP_n=z v?`t%6:bj?uYnPE]aM q``LJ^Xf7'bp tߠ} 7JP. =iWٗRA+zӳt/k^-T}oE]St-77yrr'}FAtҾConf9N6wpkо? yfK|p~ičd9[e(x՛dauiJ颕@ؤop-=#]8=~+99i"g ǻ_h8bG bU ĎZW((b4E{J5EBɹ,m3G̥ @`譀4w+wD rAchvf0p_ PK.f'PK5P"4 styles.xmlYmo6_!h>U$m5)bðmqH_^lIv|xܑT޾ە4`! ga:K焭OojE2|.1ST{eLY}X(U10x$IlXO ީI4`< <<h;HǯxnA"1EXvϣxm\U jPycuecKd.XLo)Kܬ4 $ cmʛ="Ud6JǶ.t2A-p' 4'lh̤OhH&nHZ}Ȑl|%jͼvx8cnxF8~e#иRCxeo(ˋP%`oz$Ÿ(tt0[tvpG x3[\nʻ%09ufKrW,S#שNˑPƞ_O,C!%f34l9 OpenOffice.org/1.9.79$Linux OpenOffice.org_project/680m79$Build-8876$CWS-ooo20beta2005-02-03T09:10:432006-01-02T11:01:43it-IT3PT1M2SPK5P"4Thumbnails/thumbnail.pngu{8z=C*OTkT"LRr9jҖ0FgQmDSKVE=u=W)ꏶ8`_2-5ͣ]ZXX^''5sU!Er$з'PXnq"rP4d?C|{+< D>CT/!#) j[q@AQŐ>+-J7UflioD`+ s %@ZX>?g@v}8U@'ꉌ{t-`y,;$!{CSf/!&fq |*t[ub^^.&6aɇ&<«2ȖϾI$Pyy\H%bJ2XSo&5䯻Ux:h"0AG'2/U ۚR+vOh ׈++_a4Euyv1rZ˹u=/b q}!('d,!"_Puc\seL'y `boL:ݣo˗ȕ5.ٕ^glNq.ĝL(#u_ayތl&,`8{-UP瞀lA"NR!fZuV]4mRzJ_bB~yYyǜ(:`J_?)Rѣ8s^) y#zycyXpdE2F!^Z8W-1ib59uyYPLW muo(6 ;ɷIFkRQx. Nc?>K/2_+bWD&w;Jw.S/pF®:O$I0m+V!|BGDLᓳ|tQgceBu,;ˡE>93B@BN VCZڬnla,NW{"" p-Ґw I@sX&wQىPzɃ6WW=u o'uAyMһfO'F./L7a/bjjY+f/ȭ?Ex ]1؛6.Ebʑf` mH~zW ~/L&h]Arըo=-]InçJ[` Hi2U]6+6x/C\FGJDe0-qhyNcJA(ԓ~84PK8PK5P"4 settings.xmlYS8߿uG[@݋)( R-I'I-b{-tf}@ڜGgrvS(`6w\6)< ? ?]̵vSByۙZ/JW}`Wg\̵ٰ.{,,ǴJū[R;vQ[l7p@}!F/Wn^7b HkF<ͅ&=_Ho +jT_kGmL;rH-]/|(t|^n-x as; S PU"l*̓.lb=#t '”u].DyeD ڞ"QQ (#P|EgKor̔  "!?۹:[ >8||z[O>u:q$ c̓¯ ?,o2&B<*V֘Oq驂s}Z\499= Ƹgz ɘۜ8} g['F%|S<&H:YcmJ ՓQ'?4]N"o0\)<0rGR>%<μ%  8L8w͉抜+Jx }r؎տzuw.T,ә!(X: T#A0}ASGCkN]TK>?YB FֿMGH e)lTi~.:' n^u/\;2(a10h]4G0[ryqx۬ߡh1|HdŃߦD4)ԜD{N7 r2XدszqlW8 K|ιFMٲԎԻ.o/ZNPK0zPK5P"4META-INF/manifest.xml1o0 {|T!RJ&$;/UC6~7x:WyeM̧bf1?$O_-:yoY%Ӽ+f<hvyRd^;]`l8ݕ(2ryITl۞?LЉ\iАk&LɈc.ZTRN&1"F먖T8(Zqߏnkj> ݫ?kچT%hAx& C`GVHaXR6H=PWc rv=X~PKoUy8}PK5P"419mimetypePK5P"4GvRng_4.4/po/it/Summary-it.txt0000644000175000017500000000441611326063743015050 0ustar stasstasSommario programmazione di Guido van Robot Le 5 istruzioni primitive di Guido van Robot: 1. muovi 2. gira_sinistra 3. prendi_sirena 4. posa_sirena 5. spento Struttura a blocchi Ogni istruzione di GvR deve stare da sola su una riga. Diverse istruzioni possono essere trattate come una singola istruzione se sono spostate a destra dello stesso numero di spazi. Con il nome istruzione si intende una delle 5 primitive, una delle condizioni o delle iterazioni (vedi sotto) o una nuova istruzione creata dall'utente. ... Condizioni GvR ha diciotto test divisi in tre gruppi: sei per i muri,quattro per le sirene e otto test di direzione: 1. libero_davanti 2. chiuso_davanti 3. libero_a_sinistra 4. chiuso_a_sinistra 5. libero_a_destra 6. chiuso_a_destra 7. vicino_sirena 8. non_vicino_sirena 9. qualche_sirena_in_borsa 10. nessuna_sirena_in_borsa 11. faccia_nord 12. non_faccia_nord 13. faccia_sud 14. non_faccia_sud 15. faccia_est 16. non_faccia_est 17. faccia_ovest 18. non_faccia_ovest Ramificazione condizionale E' la capacità di alterare il flusso di un programma in base alla valutazione di una condizione. Ci sono tre tipi di istruzioni in GvR: se, se/altrimenti e se/se_altrimenti si riferisce ad una delle 18 condizioni di cui sopra. se : se : altrimenti: se : se_altrimenti : ... se_altrimenti : altrimenti: Iterazione Iterazione è la capacità di un programma di ripetere un'istruzione (o un blocco di istruzioni) fino al verificarsi di una condizione. Le due istruzioni di iterazione sono ripeti e mentre. è un intero maggiore di zero. ripeti : mentre : Definire una nuova istruzione: Si possono creare nuove istruzioni per GvR usando definisci. è una qualsiasi sequenza di lettere o numeri che inizia con una lettera e non è ancora usata come istruzione. Le lettere sono A..Z a..z e il carattere _ . Guido distingue maiuscole e minuscole, quindi GiraDestra, giradestra e giraDestra sono nomi diversi. definisci : GvRng_4.4/po/GvRng_2.7.pot0000644000175000017500000002360311326063743013760 0ustar stasstas# # GvRng Language File # msgid "" msgstr "" "Project-Id-Version: GvRng 2.7\n" "POT-Creation-Date: 2008-03-18 09:46:55.092971\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: utf-8\n" "Generated-By: generate_pot.py\n" #. file 'GvrModel.py', line 91 msgid "Please load a world and program before executing." msgstr "" #. file 'GvrModel.py', line 146 msgid "Robot turned off" msgstr "" #. file 'utils.py', line 246 msgid "" "Failed to save the file.\n" "" msgstr "" #. file 'utils.py', line 264 msgid "" "Written the new configuration to disk\n" "You have to restart GvRng to see the effect" msgstr "" #. file 'guiWorld.py', line 31 msgid "Ran into a wall" msgstr "" #. file 'guiWorld.py', line 43 msgid "No beepers to put down." msgstr "" #. file 'guiWorld.py', line 47 msgid "No beepers to pick up." msgstr "" #. file 'gvrparser.py', line 55 msgid "any_beepers_in_beeper_bag" msgstr "" #. file 'gvrparser.py', line 56 msgid "facing_north" msgstr "" #. file 'gvrparser.py', line 57 msgid "facing_east" msgstr "" #. file 'gvrparser.py', line 58 msgid "facing_south" msgstr "" #. file 'gvrparser.py', line 59 msgid "facing_west" msgstr "" #. file 'gvrparser.py', line 60 msgid "front_is_blocked" msgstr "" #. file 'gvrparser.py', line 61 msgid "front_is_clear" msgstr "" #. file 'gvrparser.py', line 62 msgid "no_beepers_in_beeper_bag" msgstr "" #. file 'gvrparser.py', line 63 msgid "next_to_a_beeper" msgstr "" #. file 'gvrparser.py', line 64 msgid "not_next_to_a_beeper" msgstr "" #. file 'gvrparser.py', line 65 msgid "not_facing_north" msgstr "" #. file 'gvrparser.py', line 66 msgid "not_facing_east" msgstr "" #. file 'gvrparser.py', line 67 msgid "not_facing_south" msgstr "" #. file 'gvrparser.py', line 68 msgid "not_facing_west" msgstr "" #. file 'gvrparser.py', line 69 msgid "left_is_blocked" msgstr "" #. file 'gvrparser.py', line 70 msgid "left_is_clear" msgstr "" #. file 'gvrparser.py', line 71 msgid "right_is_blocked" msgstr "" #. file 'gvrparser.py', line 72 msgid "right_is_clear" msgstr "" #. file 'gvrparser.py', line 76 msgid "move" msgstr "" #. file 'gvrparser.py', line 77 msgid "pickbeeper" msgstr "" #. file 'gvrparser.py', line 78 msgid "putbeeper" msgstr "" #. file 'gvrparser.py', line 79 msgid "turnleft" msgstr "" #. file 'gvrparser.py', line 80 msgid "turnoff" msgstr "" #. file 'gvrparser.py', line 81 msgid "cheat" msgstr "" #. file 'gvrparser.py', line 89 msgid "define" msgstr "" #. file 'gvrparser.py', line 90 #. file 'gvrparser.py', line 96 msgid "end" msgstr "" #. file 'gvrparser.py', line 91 msgid "if" msgstr "" #. file 'gvrparser.py', line 92 msgid "elif" msgstr "" #. file 'gvrparser.py', line 93 msgid "else" msgstr "" #. file 'gvrparser.py', line 94 msgid "while" msgstr "" #. file 'gvrparser.py', line 95 msgid "do" msgstr "" #. file 'gvrparser.py', line 331 msgid "Your program must have commands." msgstr "" #. file 'gvrparser.py', line 338 msgid "" "Line %i:\n" "%s" msgstr "" #. file 'gvrparser.py', line 342 msgid "" "Expected positive integer\n" "Got: %s" msgstr "" #. file 'gvrparser.py', line 348 msgid "Indentation error" msgstr "" #. file 'gvrparser.py', line 354 msgid "Expected code to be indented here" msgstr "" #. file 'gvrparser.py', line 358 msgid "'%s' statement is incomplete" msgstr "" #. file 'gvrparser.py', line 362 msgid "Expected '%s' statement to end in ':'" msgstr "" #. file 'gvrparser.py', line 366 msgid "\"%s\" not defined" msgstr "" #. file 'gvrparser.py', line 370 msgid "\"%s\" is not a valid test" msgstr "" #. file 'gvrparser.py', line 374 msgid "\"%s\" is not a valid name" msgstr "" #. file 'gvrparser.py', line 378 msgid "\"%s\" has already been defined" msgstr "" #. file 'world.py', line 179 msgid "Bad x value for positioning robot: %s" msgstr "" #. file 'world.py', line 181 msgid "Bad y value for positioning robot: %s" msgstr "" #. file 'worldMap.py', line 20 #. file 'worldMap.py', line 98 msgid "ROBOT" msgstr "" #. file 'worldMap.py', line 21 #. file 'worldMap.py', line 92 msgid "WALL" msgstr "" #. file 'worldMap.py', line 22 #. file 'worldMap.py', line 114 msgid "BEEPERS" msgstr "" #. file 'worldMap.py', line 23 #. file 'worldMap.py', line 119 msgid "SIZE" msgstr "" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 544 #. file 'gui-gtk/Widgets.py', line 547 msgid "N" msgstr "" #. file 'worldMap.py', line 46 msgid "S" msgstr "" #. file 'worldMap.py', line 46 #. file 'gui-gtk/Widgets.py', line 537 #. file 'gui-gtk/Widgets.py', line 540 #. file 'gui-gtk/gvr_gtk.py', line 298 msgid "E" msgstr "" #. file 'worldMap.py', line 46 msgid "W" msgstr "" #. file 'worldMap.py', line 135 msgid "" "Error in line %s:\n" "%s\n" "Check your world file for syntax errors" msgstr "" #. file 'gui-gtk/Widgets.py', line 102 #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Number of beepers:" msgstr "" #. file 'gui-gtk/Widgets.py', line 533 msgid "wall" msgstr "" #. file 'gui-gtk/Widgets.py', line 558 #. file 'gui-gtk/gvr_gtk.py', line 298 msgid "robot" msgstr "" #. file 'gui-gtk/Widgets.py', line 592 msgid "" "Please give the number of beepers\n" "to place on %d,%d" msgstr "" #. file 'gui-gtk/Widgets.py', line 593 #. file 'gui-gtk/Widgets.py', line 605 msgid "beepers" msgstr "" #. file 'gui-gtk/Widgets.py', line 702 msgid "Robots position is %s %s %s and carrying %s beepers" msgstr "" #. file 'gui-gtk/Widgets.py', line 737 msgid "Go back one page" msgstr "" #. file 'gui-gtk/Widgets.py', line 743 msgid "Go one page forward" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 67 #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Medium" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 224 msgid "You don't have a world file loaded." msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 231 msgid "You don't have a program file loaded." msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 285 msgid "GvR - Worldbuilder" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 323 msgid "Running Worldbuilder" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 363 msgid "" "Can't find the lessons.\n" "Make sure you have installed the GvR-Lessons package.\n" "Check the GvR website for the lessons package.\n" "http://gvr.sf.net" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 528 msgid "Worlds" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 533 msgid "Programs" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 612 msgid "No content to save" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 643 msgid "" "The editor's content is changed.\n" "Do you want to save it?" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 718 msgid "Selected path is not a program file" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 765 msgid "Selected path is not a world file" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Instant" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Fast" msgstr "" #. file 'gui-gtk/gvr_gtk.py', line 811 msgid "Slow" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Quit ?" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Do you really want to quit ?" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "About GvR" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Choose a file" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "GvR - Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_File" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_Edit" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set language" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "" "Change the language used\n" "(After you restart GvR)" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "" "Catalan\n" "Dutch\n" "English\n" "French\n" "Norwegian\n" "Romenian\n" "Spanish\n" "Italian" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robot Speed" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set Robot Speed" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "" "Instant\n" "Fast\n" "Medium\n" "Slow" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot Programming Summary" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido van Robot - Robot arguments" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Alter the arguments for the 'robot' statement." msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Direction robot is facing (N,E,S,W)" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the y-axes:" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Robots position on the x-axes:" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "World Editor" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_GvR" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Open worldbuilder" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_Setup" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Set speed..." msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_Help" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Gvr Lessons" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "GvR Worldbuilder" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "_About" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Reload" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Step" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Execute" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Abort" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Guido's World" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Language reference" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Lessons" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Introduction" msgstr "" #. file 'gui-gtk/gvr_gtk.glade', line ? msgid "Code Editor" msgstr "" GvRng_4.4/po/gvr_nl.lang0000644000175000017500000000570711326063743013762 0ustar stasstas \ [uUrR]?""" """ [uUrR]?''' ''' [uUrR]?" " [uUrR]?' ' # robot muur formaat beeper beweeg linksaf pak_pieper plaats_pieper zetuit definieer voorkant_is_vrij voorkant_is_versperd link_is_vrij links_is_versperd rechts_is_vrij rechts_is_versperd naast_een_pieper niet_naast_een_pieper enige_piepers_in_piepertas geen_piepers_in_piepertas naar_noord niet_naar_noord naar_zuid niet_naar_zuid naar_oost niet_naar_oost naar_west niet_naar_west als anders andersals doe terwijl \b([1-9][0-9]*|0)([Uu]([Ll]|LL|ll)?|([Ll]|LL|ll)[Uu]?)?\b GvRng_4.4/version.py0000644000175000017500000000147411326063737013251 0ustar stasstas# This is the GvR version number. # By putting it in a seperate file we don't have to import # gvr to get a version number VERSION = "4.4" #last changed on 21-01-2010 --sz-- # The %s formatters are set by gvr.py ABOUT_TEXT = """ Program: GvRng\n A implementation of the Guido van Robot programming language based on Karel the Robot\n This version is specially designed for the OLPC XO laptop.\n Core Programmers: Stas Zytkiewicz - stas.zytkiewicz@gmail.com Waseem Daher - wdaher@mit.edu Steve Howell - showell@zipcon.net\n Paul Carduner - paulcarduner@ibiblio.org Donald Oellerich - trelf@ibiblio.org GvRng-OLPC version: %s\n Contributors: Andre Roberge - andre.roberge@gmail.com Michele Moore - mm@metaslash.com Lex Berezhny - lex@berezhny.net Jeff Elkner - jeff@elkner.net """ GvRng_4.4/Text.py0000644000175000017500000002057711326063737012515 0ustar stasstas## This module holds the different help text used by gvr in the menu DEBUG = 0 import os from utils import get_rootdir import logging module_logger = logging.getLogger("gvr.Text") OnRefText = ''# this will be set to some text in set_summary() InfoFooter = "For more info, http://gvr.sf.net" OnRefTitle = "Guido van Robot Programming Summary" OnWBText = ''# this will be set to some text in set_summary() OnIntroText = '' # Builtin summary text, we use it in case of IO trouble. BuiltinOnRefText = \ """Guido van Robot Programming Summary The Five Primitive Guido van Robot Instructions: 1. move 2. turnleft 3. pickbeeper 4. putbeeper 5. turnoff Block Structuring Each Guido van Robot instruction must be on a separate line. A sequence of Guido van Robot instructions can be treated as a single instruction by indenting the same number of spaces. refers to any of the five primitive instructions above, the conditional branching or iteration instructions below, or a user defined instruction. ... Conditionals GvR has eighteen built-in tests that are divided into three groups: the first six are wall tests, the next four are beeper tests, and the last eight are compass tests: 1. front_is_clear 2. front_is_blocked 3. left_is_clear 4. left_is_blocked 5. right_is_clear 6. right_is_blocked 7. next_to_a_beeper 8. not_next_to_a_beeper 9. any_beepers_in_beeper_bag 10. no_beepers_in_beeper_bag 11. facing_north 12. not_facing_north 13. facing_south 14. not_facing_south 15. facing_east 16. not_facing_east 17. facing_west 18. not_facing_west Conditional Branching Conditional branching refers to the ability of a program to alter it's flow of execution based on the result of the evaluation of a conditional. The three types of conditional branching instructions in Guido van Robot are if and if/else and if/elif/else. refers to one of the eighteen conditionals above. if : if : else: if : elif : ... elif : else: Iteration Iteration refers to the ability of a program to repeate an instruction (or block of instructions) over and over until some condition is met. The two types of iteration instructions are the do and while instructions. must be an integer greater than 0. do : while : Defining a New Instruction: New instructions can be created for Guido van Robot using the define statement. can be any sequence of letters or digits as long as it begins with a letter and is not already used as an instruction. Letters for Guido van Robot are A..Z, a..z, and the underscore (_) character. Guido van Robot is case sensitive, so TurnRight, turnright, and turnRight are all different names. define : """ BuiltinOnWBText = \ """Guido van Robot Worldbuilder Summary Editing world: Left mouse button : Add or remove walls Middle mouse button: Set arguments for the robot statement Right mouse button: Set arguments for the beeper statement It's possible to alter the number of beepers by clicking the right mouse button when the mouse pointer is at a beepers location. Give another number of beepers in the beeper dialog. When you give 0 (zero) the beeper is removed from the world. Buttons: Reload : Reload the world from the editor window into the worldbuilder. Abort : Quit the worldbuilder, *not* GvRng. """ BuiltinOnIntroText=\ """Welcome to the Guido van Robot world. Guido van Robot, or GvR for short, is a programming language and free software application designed to introduce beginners to the fundamentals of programming. GvR runs on GNU/Linux, XO, Windows, and Macintosh, in a variety of languages! It's great in both the classroom and the home as a way of introducing people to the basic concepts of programming. At this point, you are probably asking yourself, What is GvR, specifically? The gist of it is that it is a robot represented by a triangle on the screen that moves around in a world made up of streets and avenues, walls and beepers, which Guido can collect or set. His actions are completely guided by a program written by the user. GvR comes with 18 lessons and assignments and a language reference. See the "Lessons" tab and start with lesson 1. Use the "Language reference" tab to get a overview of the GvR language. Additional help and information: OLPC: http://wiki.laptop.org/go/Guido_van_Robot GvR web page: http://gvr.sourceforge.net/index.php GvR contact: http://gvr.sourceforge.net/contact/ GvR project page: http://sourceforge.net/projects/gvr/ """ def set_summary(olang): """Get the proper summary file for the current locale""" global OnRefText # Quick hack to fix the loading of Summary.txt, should be done trying all # components of the locale, probably removing the -LANG suffix, as the # language is already on the locale dir and putting it in two places makes # things harder; is best to use the directory to choose the language or # put all the Summaries on the same dir. try: lang = olang.split('@')[0].split('.')[0].split('_')[0] except Exception,info: print info print "Can't load Summary for language '%s'" % lang print "Using default English file" lang = 'en' sumfile = "Summary-%s.txt" % lang if lang == 'en': path = os.path.join(get_rootdir(),'po',sumfile) else: path = os.path.join(get_rootdir(),'po',lang,sumfile) if DEBUG: print "trying to read",path try: lines = open(path,'r').read() except IOError,info: print info print "Can't load Summary for language '%s'" % lang print "Using default English file" OnRefText = BuiltinOnRefText else: OnRefText = lines def set_WBsummary(olang): """Get the proper Worldbuilder summary file for the current locale""" global OnWBText # Quick hack to fix the loading of Summary.txt, should be done trying all # components of the locale, probably removing the -LANG suffix, as the # language is already on the locale dir and putting it in two places makes # things harder; is best to use the directory to choose the language or # put all the Summaries on the same dir. try: lang = olang.split('@')[0].split('.')[0].split('_')[0] except Exception,info: print info print "Can't load Worldbuilder Summary for language '%s'" % lang print "Using default English file" lang = 'en' sumfile = "WBSummary-%s.txt" % lang if lang == 'en': path = os.path.join(get_rootdir(),'po',sumfile) else: path = os.path.join(get_rootdir(),'po',lang,sumfile) if DEBUG: print "trying to read",path try: lines = open(path,'r').read() except IOError,info: print info print "Can't load Worldbuilder Summary for language '%s'" % lang print "Using default English file" OnWBText = BuiltinOnWBText else: OnWBText = lines def set_Intro(olang): """Get the proper intro text file for the current locale""" global OnIntroText # Quick hack to fix the loading of Summary.txt, should be done trying all # components of the locale, probably removing the -LANG suffix, as the # language is already on the locale dir and putting it in two places makes # things harder; is best to use the directory to choose the language or # put all the Summaries on the same dir. try: lang = olang.split('@')[0].split('.')[0].split('_')[0] except Exception,info: print info print "Can't load Intro text for language '%s'" % lang print "Using default English file" lang = 'en' sumfile = "Intro-%s.txt" % lang if lang == 'en': path = os.path.join(get_rootdir(),'po',sumfile) else: path = os.path.join(get_rootdir(),'po',lang,sumfile) if DEBUG: print "trying to read",path try: lines = open(path,'r').read() except IOError,info: print info print "Can't load intro for language '%s'" % lang print "Using default English file" OnIntroText = BuiltinOnIntroText else: OnIntroText = lines GvRng_4.4/world.py0000644000175000017500000002413411326063737012711 0ustar stasstas# Copyright (C) 2001 Steve Howell # Copyright (C) 2007-2010 Stas Zytkiewicz # You must read the file called INFO.txt before distributing this code. ## Added a few abstraction methods in World to be used in the new MVC design ## The addition is also needed to prevent frontends importing WEST and SOUTH ## constants needed to get the wall positions. ## Nothing else was changed. Stas import os,sys,time ##NORTH = _('N') ##WEST = _('W') ##SOUTH = _('S') ##EAST = _('E') NORTH = 'N' WEST = 'W' SOUTH = 'S' EAST = 'E' class WorldMapException(Exception): """We use this because stuff in here is related to stuff in the worldMap module. So we can cache this exception when doing world/worldMap things.""" pass #def __init__(self, str): self.str = str #def __str__(self): return self.str class World: ''' A World is an abstract environment for Guido to move around it. positionRobot, setWall, setBeepers, setRobotBeepers set up the intial environment MOVE, TURNLEFT, PICKBEEPER, and PUTBEEPER change the environment methods corresponding to the GvR conditionals such as FACING_NORTH, RIGHT_IS_CLEAR, etc. allow you to check the environment from the robot's perspective self.robot, self.robotBeepers, self.beepers, and self.walls are considered public attributes ''' wall = {} """ The offsets here are due to the fact we only want to think of walls as being south or west of current squares, so that there's no ambiguity about how a wall is named. For example, the wall to the right of 1,1 is east of 1,1, but it's also to the west of 2,1. We only want to think of it as being the wall to the west of 2,1. Therefore, when we go to put a wall to the east of (1,1), we see that the offset for wall[EAST] is (1,0), and then we know that the wall is really west of (2,1) for our purposes. """ wall[NORTH] = (0,1) wall[EAST] = (1,0) wall[SOUTH] = (0,0) wall[WEST] = (0,0) """ Continuing the thought above, we treat E/W walls only as being westerly walls, and we treat N/S walls only as being southerly walls. """ direction = {} direction[NORTH] = SOUTH direction[EAST] = WEST direction[SOUTH] = SOUTH direction[WEST] = WEST delta = {} delta[NORTH] = (0,1) delta[EAST] = (1,0) delta[SOUTH] = (0,-1) delta[WEST] = (-1,0) left = {} left[NORTH] = WEST left[EAST] = NORTH left[SOUTH] = EAST left[WEST] = SOUTH right = {} right[NORTH] = EAST right[EAST] = SOUTH right[SOUTH] = WEST right[WEST] = NORTH def __init__(self): self.robot = (0,0) self.dir = '' self.robotBeepers = 0 self.beepers = {} self.unlimitedBeepers = False self.walls = {WEST:{},SOUTH:{}} self.useGuido = False #----- abstraction methods def get_robots_position(self): return self.robot def get_robots_direction(self): return self.dir def get_robots_beepers(self): return self.robotBeepers def get_walls_position(self): return {'west_wall':self.walls[WEST], 'south_wall':self.walls[SOUTH]} def get_beepers(self): return self.beepers #---- utility method def _adjust(self, coords, adj): (x,y) = coords (adjX, adjY) = adj return (x+adjX, y+adjY) #----- walls def setWall_wb(self, x, y, dir): """Same as setWall but used by the worldbuilder to determine if a wall should be removed""" x = int(x) y = int(y) #print "setWall_wb",dir,NORTH,SOUTH if dir in(NORTH, SOUTH): coords = (x,y) else: coords = (x,y) return self.setSingleWall(coords, dir) def setWall(self, x, y, dir, length = 1): x = int(x) y = int(y) length = int(length) for offset in range(length): if dir in(NORTH, SOUTH): coords = (x+offset,y) else: coords = (x,y+offset) self.setSingleWall(coords, dir) def buildWallOnLeft(self): ''' This method builds a wall to the left of the robot's current ##location. ''' dir = World.left[self.dir] return self.setSingleWall(self.robot, dir) def buildWallOnRight(self): ''' This method builds a wall to the right of the robot's current location. ''' dir = World.right[self.dir] return self.setSingleWall(self.robot, dir) def setSingleWall(self, coords, dir): coords = self._adjust(coords, World.wall[dir]) dir = World.direction[dir] try: # this test is needed as the worldbuilder also removes walls if self.walls[dir][coords] == 1: del self.walls[dir][coords] return (dir, coords,0) except KeyError: self.walls[dir][coords] = 1 return (dir, coords,1) #----- beepers def setBeepers(self, x, y, numBeepers): self.beepers[(x,y)] = numBeepers def setRobotBeepers(self, numBeepers): self.robotBeepers = numBeepers #----- robot def positionRobot(self, x, y, dir): if x < 1: raise WorldMapException (_("Bad x value for positioning robot: %s") % x) if y < 1: raise WorldMapException (_("Bad y value for positioning robot: %s") % y) self.robot = (x,y) self.dir = dir #----- builtin commands def MOVE(self): if self.front_is_blocked(): return 0 self.robot = self._adjust(self.robot, World.delta[self.dir]) return 1 def TURNLEFT(self): self.dir = World.left[self.dir] def PICKBEEPER(self): (x,y) = self.robot if self.beepers.has_key((x,y)) and self.beepers[(x,y)] >= 1: self.robotBeepers += 1 self.beepers[(x,y)] -= 1 if self.beepers[(x,y)] == 0: del self.beepers[(x,y)] return 1 else: return 0 def PUTBEEPER(self): (x,y) = self.robot if self.unlimitedBeepers: self.beepers[(x,y)] = self.beepers.get((x,y), 0) + 1 return 1 if self.robotBeepers == 0: return 0 self.robotBeepers -= 1 self.beepers[(x,y)] = self.beepers.get((x,y), 0) + 1 return 1 #------ test conditions def _is_blocked(self, dir): (x,y) = self._adjust(self.robot, World.wall[dir]) dir=World.direction[dir] if y<=1 and dir==SOUTH: return 1 if x<=1 and dir==WEST: return 1 return self.walls[dir].get((x,y), 0) def facing_north(self): return self.dir == NORTH def facing_east(self): return self.dir == EAST def facing_south(self): return self.dir == SOUTH def facing_west(self): return self.dir == WEST def front_is_blocked(self): return self._is_blocked(self.dir) def front_is_clear(self): return not World.front_is_blocked(self) def not_facing_north(self): return self.dir != NORTH def not_facing_east(self): return self.dir != EAST def not_facing_south(self): return self.dir != SOUTH def not_facing_west(self): return self.dir != WEST def left_is_blocked(self): return self._is_blocked(World.left[self.dir]) def left_is_clear(self): return not World.left_is_blocked(self) def right_is_blocked(self): return self._is_blocked(World.right[self.dir]) def right_is_clear(self): return not World.right_is_blocked(self) def any_beepers_in_beeper_bag(self): return self.robotBeepers > 0 def no_beepers_in_beeper_bag(self): return self.robotBeepers == 0 def next_to_a_beeper(self): try: (x,y) = self.robot return self.beepers[(x,y)] > 0 except: return 0 def not_next_to_a_beeper(self): return not World.next_to_a_beeper(self) def furthestCoordinate(self): westKeys = [(x, y+1) for x,y in self.walls[WEST].keys()] southKeys = [(x+1, y) for x,y in self.walls[SOUTH].keys()] beeperKeys = [(x+1, y+1) for x,y in self.beepers.keys()] objectLocations = beeperKeys + westKeys + southKeys x,y = self.robot objectLocations.append((x+1,y+1)) greatestX = 0 greatestY = 0 for x,y in objectLocations: if greatestX < x: greatestX = x if greatestY < y: greatestY = y return greatestX, greatestY def nearestCoordinate(self): beeperKeys = [(x-1, y-1) for x,y in self.beepers.keys()] westKeys = [(x, y+1) for x,y in self.walls[WEST].keys()] southKeys = [(x+1, y) for x,y in self.walls[SOUTH].keys()] objectLocations = beeperKeys + westKeys + southKeys x,y = self.robot objectLocations.append((x-1,y-1)) leastX, leastY = objectLocations[0] x,y = self.robot for x,y in objectLocations: if leastX > x: leastX = x if leastY > y: leastY = y return leastX, leastY ## def newOffset(self, (offsetX, offsetY), (width, height)): ## def recenter(robot, offset, size): ## shift = 0 ## if robot >= size: ## offset = robot - int(size/2) ## if offset < 0: offset = 0 ## shift = 1 ## else: ## offset = 0 ## return shift, offset ## x,y = self.robot ## shiftX, offsetX = recenter(x, offsetX, width) ## shiftY, offsetY = recenter(y, offsetY, height) ## return (shiftX or shiftY, (offsetX, offsetY)) def newOffset(self, (offsetX, offsetY), (width, height)): x,y = self.robot newoffset = [0,0] scroll = 0 if x == width: scroll = 1 newoffset[0] += 6 if y == height: scroll = 1 newoffset[1] += 6 return (scroll,tuple(newoffset)) GvRng_4.4/build.py0000644000175000017500000000452111326063737012657 0ustar stasstas# read INFO for licensing information import re from gvrparser import TESTS, COMMANDS def PySyntax(str): if str in TESTS or str in COMMANDS: return re.sub("_", "_", str).upper() else: return str def build(obj, indent=''): return eval('build'+obj.__class__.__name__+'(obj,indent)') def buildStatement(self, indent): return "%sself.%s(%i)\n" % (indent, PySyntax(self.statement), self.line) def buildCheat(self, indent): return "%sself.cheat('%s', %i)\n" % (indent, PySyntax(self.statement), self.line) def buildTestCondition(self, indent=''): return "self.%s(%i)" % (PySyntax(self.statement), self.line) def buildIfStatement(self, indent): code = "%sif %s:\n%s" % (indent, buildTestCondition(self.condition), build(self.block, indent+' ')) for elifObj in self.elifs: code += buildElifStatement(elifObj, indent) if self.elseObj: code += buildElseStatement(self.elseObj, indent) return code def buildElseStatement(self, indent): return "%selse:\n%s" % (indent, build(self, indent+ ' ')) def buildElifStatement(self, indent): return "%selif %s:\n%s" % (indent, buildTestCondition(self.condition), build(self.block, indent+' ')) def buildWhileLoop(self, indent): return "%swhile %s:\n%s" % (indent, buildTestCondition(self.condition), build(self.block, indent+' ')) def buildDoLoop(self, indent): return "%sfor i in range(%s):\n%s" % (indent, self.iterator, build(self.block, indent+' ')) def buildBlock(self, indent=''): code = "" for statement in self.statements: code += build(statement, indent) return code def buildDefine(self, indent=''): return '''\ %sdef %s(self, line): %s self._enter('%s', line) %s%s self._exit() ''' % ( indent, self.name, indent, self.name, build(self.block, indent+' '), indent) def buildProgram(self, indent=''): definitions = "" for func in self.functions: definitions += build(func, indent+' ') return "class StudentRobot(Robot):\n%s def execute(self):\n%s" % (definitions, build(self.block, indent+' '+' ')) GvRng_4.4/gui-gtk/0000755000175000017500000000000011326063743012550 5ustar stasstasGvRng_4.4/gui-gtk/gvr_gtk.glade.bak0000644000175000017500000025057411326063740015757 0ustar stasstas Quit ? GTK_WINDOW_TOPLEVEL GTK_WIN_POS_CENTER True False False True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-cancel True GTK_RELIEF_NORMAL True -6 True True True gtk-ok True GTK_RELIEF_NORMAL True -5 0 False True GTK_PACK_END True False 0 True gtk-dialog-question 6 0.5 0.5 0 0 0 True True True Do you really want to quit ? False True GTK_JUSTIFY_CENTER False False 0.5 0.5 8 27 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False 0 False False About GvR GTK_WINDOW_TOPLEVEL GTK_WIN_POS_CENTER False True False True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-ok True GTK_RELIEF_NORMAL True -5 0 False True GTK_PACK_END True False 0 True False 0 True gvrIcon-big.png 0.5 0.5 18 8 0 True True True Xo_s.png 0.5 0.5 18 8 0 True True 0 True True 0 True True True False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False 5 GTK_FILE_CHOOSER_ACTION_OPEN True False False False Choose a file GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False True False 24 True GTK_BUTTONBOX_END True True True gtk-cancel True GTK_RELIEF_NORMAL True -6 True True True True gtk-open True GTK_RELIEF_NORMAL True -5 0 False True GTK_PACK_END 300 500 GvR - Editor GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False True False False GDK_WINDOW_TYPE_HINT_NORMAL GDK_GRAVITY_NORTH_WEST True False True False 0 True GTK_PACK_DIRECTION_LTR GTK_PACK_DIRECTION_LTR True _File True True gtk-new True True gtk-open True True gtk-save True True gtk-save-as True True True gtk-print True True _Edit True True gtk-cut True True gtk-copy True True gtk-paste True True gtk-delete True 0 False False True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN GTK_CORNER_TOP_LEFT 0 True True True True 0 False False True Set language GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE True True False True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-cancel True GTK_RELIEF_NORMAL True -6 True True True gtk-ok True GTK_RELIEF_NORMAL True -5 4 False True GTK_PACK_END True False 0 True Change the language used (After you restart GvR) False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 4 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True Catalan Dutch English French Norwegian Romenian Spanish Italian False True True True True 0 True False 4 False False 0 True True True Robot Speed GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE True True False True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-cancel True GTK_RELIEF_NORMAL True -6 True True True gtk-ok True GTK_RELIEF_NORMAL True -5 0 False True GTK_PACK_END True False 0 True Set Robot Speed False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 4 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True Instant Fast Medium Slow False True True True True 0 True False 4 True True 0 True True 400 400 True Guido van Robot Programming Summary GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-close True GTK_RELIEF_NORMAL True -7 0 False True GTK_PACK_END 4 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN GTK_CORNER_TOP_LEFT True True True False True GTK_JUSTIFY_LEFT GTK_WRAP_NONE True 0 0 0 0 0 0 0 True True 450 200 True Guido van Robot - Robot arguments GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE True 450 200 True False True False False GDK_WINDOW_TYPE_HINT_DIALOG GDK_GRAVITY_NORTH_WEST True False True True False 0 True GTK_BUTTONBOX_END True True True gtk-cancel True GTK_RELIEF_NORMAL True -6 True True True gtk-ok True GTK_RELIEF_NORMAL True -5 0 False True GTK_PACK_END 7 True 5 2 True 8 0 True <b>Alter the arguments for the 'robot' statement.</b> False True GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 2 0 1 True Number of beepers: False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 1 4 5 True Direction robot is facing (N,E,S,W) False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 1 3 4 True Robots position on the y-axes: False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 1 2 3 True Robots position on the x-axes: False False GTK_JUSTIFY_LEFT False False 0 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 1 1 2 True True True True 2 True * False 1 2 1 2 True True True True 2 True * False 1 2 2 3 True True True True 1 True * False 1 2 3 4 True True True True 3 True * False 1 2 4 5 0 True True GTK_WINDOW_TOPLEVEL GTK_WIN_POS_NONE False True False True False False GDK_WINDOW_TYPE_HINT_NORMAL GDK_GRAVITY_NORTH_WEST True False 8 True 0 0.5 GTK_SHADOW_NONE True 0.5 0.5 1 1 0 0 0 0 True False 0 True False 0 True True True True GTK_POS_TOP False False 6 400 True 0 0.5 GTK_SHADOW_ETCHED_IN True 0.5 0.5 1 1 0 0 0 0 True False 0 True GTK_PACK_DIRECTION_LTR GTK_PACK_DIRECTION_LTR True _GvR True True Open worldbuilder True True gtk-leave-fullscreen 1 0.5 0.5 0 0 True True gtk-quit True True _Setup True True Set speed... True True gtk-refresh 1 0.5 0.5 0 0 True Set language True True gtk-spell-check 1 0.5 0.5 0 0 True _Help True True Gvr Lessons True True gtk-dnd-multiple 1 0.5 0.5 0 0 True GvR Worldbuilder True True gtk-leave-fullscreen 1 0.5 0.5 0 0 True True _About True True gtk-dialog-question 1 0.5 0.5 0 0 0 False False 2 True 0 0 GTK_SHADOW_ETCHED_IN True 0.5 0.5 1 1 0 0 4 4 True GTK_BUTTONBOX_START 0 True True True GTK_RELIEF_NORMAL True True 0.5 0.5 0 0 0 0 0 0 True False 2 True gtk-refresh 4 0.5 0.5 0 0 0 False False True Reload True False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True True True GTK_RELIEF_NORMAL True True 0.5 0.5 0 0 0 0 0 0 True False 2 True gtk-redo 4 0.5 0.5 0 0 0 False False True Step True False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True True True GTK_RELIEF_NORMAL True True 0.5 0.5 0 0 0 0 0 0 True False 2 True gtk-execute 4 0.5 0.5 0 0 0 False False True Execute True False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False True True True GTK_RELIEF_NORMAL True True 0.5 0.5 0 0 0 0 0 0 True False 2 True gtk-cancel 4 0.5 0.5 0 0 0 False False True Abort True False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 0 False False 0 False False 400 500 True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_NONE GTK_CORNER_TOP_LEFT 0 False False True False 0 False False True <b>Guido's World</b> False True GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 label_item False True True Guido's World False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 tab True True False True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN GTK_CORNER_TOP_LEFT 8 410 True True False False True GTK_JUSTIFY_LEFT GTK_WRAP_NONE False 0 0 0 0 0 0 False True True Language reference False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 tab 4 True True False False True True Lessons False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 tab 4 True True False True True GTK_POLICY_AUTOMATIC GTK_POLICY_AUTOMATIC GTK_SHADOW_IN GTK_CORNER_TOP_LEFT True True False False True GTK_JUSTIFY_LEFT GTK_WRAP_NONE False 0 0 0 0 0 0 False True True Introduction False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 tab 0 False True 0 True True True True True True GTK_POS_TOP False False 1 340 True 0 0.5 GTK_SHADOW_ETCHED_IN True 0.5 0.5 1 1 0 0 0 0 False True True Code editor False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 tab 1 120 True 0 0.5 GTK_SHADOW_ETCHED_IN True 0.5 0.5 1 1 0 0 0 0 False True True World editor False False GTK_JUSTIFY_LEFT False False 0.5 0.5 0 0 PANGO_ELLIPSIZE_NONE -1 False 0 tab 0 True True GvRng_4.4/gui-gtk/gvr_gtk.gladep0000644000175000017500000000042311326063740015365 0ustar stasstas gvr_gtk gvr_gtk FALSE GvRng_4.4/gui-gtk/gvr_gtk.glade.org0000644000175000017500000022765411326063740016014 0ustar stasstas Quit ? False True center dialog True True True gtk-dialog-question 6 0 True 8 27 Do you really want to quit ? True center False False 1 False False 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False end 0 About GvR center dialog True True True True 18 8 gvrIcon-big.png 0 True 18 8 Xo_s.png 1 0 2 True False False 3 True end gtk-ok -5 True True True False True False False 0 False end 0 5 Choose a file dialog True 24 True end gtk-cancel -6 True True True False True False False 0 gtk-open -5 True True True True False True False False 1 False end 0 300 500 GvR - Editor True True True _File True gtk-new True True True gtk-open True True True gtk-save True True True gtk-save-as True True True True gtk-print True True True True _Edit True gtk-cut True True True gtk-copy True True True gtk-paste True True True gtk-delete True True True False False 0 True True automatic automatic in 1 True False False 2 True Set language True dialog True True True 4 Change the language used (After you restart GvR) False False 0 True Catalan Dutch English French Norwegian Romenian Spanish Italian False False 4 1 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False 4 end 0 True Robot Speed True dialog True True True 4 Set Robot Speed False False 0 True Instant Fast Medium Slow 4 1 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False end 0 400 400 True Guido van Robot Programming Summary dialog True True True 4 automatic automatic in True True 2 True end gtk-close -7 True True True False True False False 0 False end 0 450 200 True Guido van Robot - Robot arguments True 450 200 dialog True True 7 5 2 8 True True True 3 1 2 4 5 True True 1 1 2 3 4 True True 2 1 2 2 3 True True 2 1 2 1 2 True 0 Robots position on the x-axes: 1 2 True 0 Robots position on the y-axes: 2 3 True 0 Direction robot is facing (N,E,S,W) 3 4 True 0 Number of beepers: 4 5 True <b>Alter the arguments for the 'robot' statement.</b> True 2 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False end 0 True 8 0 none True True True True True 400 True 6 0 True True True True _GvR True Open worldbuilder True True True True gtk-quit True True True True _Setup True Set speed... True True True Set language True True True True _Help True Gvr Lessons True True True GvR Worldbuilder True True True True _About True True True False False 0 True 2 0 0 True 4 4 True start True True True False True 0 0 True 2 True gtk-refresh False False 0 True Reload True False False 1 False False 0 True True True False True 0 0 True 2 True gtk-redo False False 0 True Step True False False 1 False False 1 True True True False True 0 0 True 2 True gtk-execute False False 0 True Execute True False False 1 False False 2 True True True False True 0 0 True 2 True gtk-cancel False False 0 True Abort True False False 1 False False 3 False False 1 400 500 True True automatic automatic 2 True False False False 3 True <b>Guido's World</b> True label_item True Guido's World False tab True True True automatic automatic in 410 True True 8 False False 1 True Language reference 1 False tab True 4 2 True Lessons 2 False tab True 4 True True automatic automatic in True True False False 3 True Introduction 3 False tab False True True True 240 True 1 0 True True Code editor False tab 120 True 1 0 True 1 True World editor 1 False tab True True GvRng_4.4/gui-gtk/Editors.py0000644000175000017500000001731611326063740014540 0ustar stasstas# -*- coding: utf-8 -*- # Copyright (c) 2006-2007 Stas Zykiewicz # # Editors.py # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Wraps the gtksourceview2 import logging module_logger = logging.getLogger("gvr.Editors") import os import utils import pygtk pygtk.require('2.0') import gtk import re # try to get the proper gtksourceview bindings if utils.platform == 'XO': import gtksourceview2 module_logger.debug("gtksourceview2 found, %s" % gtksourceview2 ) SRCVIEW = 2 else: try: # first we try if version 2 is available import gtksourceview2 except ImportError,info: module_logger.info("%s" % info) module_logger.info("No gtksourceview2, trying version 1") import gtksourceview SRCVIEW = 1 else: module_logger.debug("gtksourceview2 found, %s" % gtksourceview2 ) SRCVIEW = 2 class Editor: """Wraps a gtrksourceview widget and adds a few abstraction methods.""" def __init__(self,parent,title=''): self.parent = parent self.logger = logging.getLogger("gvr.Editors.Editor") self.logger.debug("Using gtksourceview version %s" % SRCVIEW) # remove any children from previous sessions for child in self.parent.get_children(): self.parent.remove(child) # Look for the locale to which the syntax highlighting should be set # We assume the locale is available, if not there won't be any higlighting. try: loc = utils.get_locale()[:2] except Exception,info: self.logger.exception("Error in checking locale") loc = '' if loc: mime = 'gvr_%s' % loc else: mime = 'gvr_en' if SRCVIEW == 1: srctagtable = gtksourceview.SourceTagTable() self.srcbuffer = gtksourceview.SourceBuffer(table=srctagtable) man = gtksourceview.SourceLanguagesManager() lang = man.get_language_from_mime_type('text/x-'+mime) self.logger.debug("gtksourceview buffer syntax higlight set to %s" % mime) self.srcbuffer.set_language(lang) self.srcbuffer.set_highlight(True) self.srcview = gtksourceview.SourceView(buffer=self.srcbuffer) self.srcview.set_tabs_width(4) else: self.srcbuffer = gtksourceview2.Buffer() self.srcview = gtksourceview2.View(buffer=self.srcbuffer) man = gtksourceview2.LanguageManager() self.logger.debug("set search path to %s" % utils.GTKSOURCEVIEWPATH) man.set_search_path([utils.GTKSOURCEVIEWPATH]) #man.set_search_path(["/tmp/language-specs"]) #print dir(man) # Horrible hacks, gtksourceview2 on XO differs from Ubuntu :-( # Reminder, if XO changes their gtksourceview2 again it will probably # break GvRng here. # And of course the 767 version changes gtksourceview2 again :-( # You should never change existing programs and leave the original name unchanged. # I commented out the XO bit in case we need it when there's another change. ## if utils.platform == 'XO': ## langs = man.list_languages() ## self.srcbuffer.set_highlight(True) ## for lang in langs: ## for m in lang.get_mime_types(): ## if m == 'text/x-'+mime: ## self.logger.debug("XO gtksourceview buffer syntax higlight set to %s" % lang) ## self.srcbuffer.set_language(lang) ## else: langs = man.get_language_ids() self.srcbuffer.set_highlight_syntax(True) self.logger.debug("Found language files:%s" % langs) for id in langs: if id == mime: self.logger.debug("gtksourceview buffer syntax higlight set to %s" % mime) self.srcbuffer.set_language(man.get_language(id)) break self.srcview.set_tab_width(4) # some methods that are the same on version 1 and 2 self.tag_h = self.srcbuffer.create_tag(background='lightblue') self.srcbuffer.set_max_undo_levels(10) self.srcview.set_show_line_numbers(True) self.srcview.set_insert_spaces_instead_of_tabs(True) self.srcview.set_auto_indent(True) #self.srcview.set_wrap_mode(gtk.WRAP_CHAR) self.parent.add(self.srcview) self.parent.show_all() self.srcbuffer.connect("delete-range",self.delete_tabs) # self.format results in a "Invalid text buffer iterator" warning self.srcbuffer.connect("insert-text", self.format) self.old_start_iter = None def get_all_text(self): """Return all text from the widget""" startiter = self.srcbuffer.get_start_iter() enditer = self.srcbuffer.get_end_iter() txt = self.srcbuffer.get_text(startiter,enditer) if not txt: return [] if '\n' in txt: txt = txt.split('\n') else:# assuming a line without a end of line txt = [txt] return txt def set_text(self,txt): """Load a text in the widget""" #print self.__class__,'set_text',txt try: txt = ''.join(txt) utxt = unicode(txt) except Exception,info: print "Failed to set text in source buffer" print info return self.srcbuffer.set_text(utxt) def set_highlight(self,line): """Highlight the line in the editor""" if self.old_start_iter: self.srcbuffer.remove_tag(self.tag_h,self.old_start_iter,self.old_end_iter) end_iter = self.srcbuffer.get_iter_at_line(line) end_iter.forward_to_line_end() start_iter = self.srcbuffer.get_iter_at_line(line) self.srcbuffer.apply_tag(self.tag_h,start_iter,end_iter) self.old_start_iter,self.old_end_iter = start_iter,end_iter def reset_highlight(self): self.set_highlight(0) def format(self,srcview,iter,text,leng): startiter = self.srcbuffer.get_start_iter() enditer = self.srcbuffer.get_iter_at_mark(self.srcbuffer.get_insert()) code = self.srcbuffer.get_text(startiter,enditer) if len(code) > 0 and code[-1] == ":" and text == "\n": line = code.split('\n')[-1] indent = re.match("^\s*", line).group() self.srcbuffer.insert_interactive_at_cursor("\n"+indent + " ", True) def delete_tabs(self,srcview,start,end): startiter = self.srcbuffer.get_start_iter() code = self.srcbuffer.get_text(startiter,end) cursor = self.srcbuffer.get_iter_at_mark(self.srcbuffer.get_insert()) line = code.split('\n')[-1] spaces = re.match("^\s*", line).group() if self.srcbuffer.get_text(start,end) == " " and len(line) == len(spaces): if len(spaces) >= 4: cursor.backward_chars(4) self.srcbuffer.delete(cursor, end) GvRng_4.4/gui-gtk/Widgets.py0000644000175000017500000007764011326063740014543 0ustar stasstas# -*- coding: utf-8 -*- # Copyright (c) 2006 Stas Zykiewicz # # Widgets.py # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # additional non-glade widgets and misc stuff _WDEBUG = 0 import os,sys import pygtk #this is needed for py2exe if sys.platform == 'win32': pass else: #not win32, ensure version 2.0 of pygtk is imported pygtk.require('2.0') import gtk import pango import gobject import logging from SimpleGladeApp import bindtextdomain from SimpleGladeApp import SimpleGladeApp app_name = "gvr_gtk" import utils from worldMap import lookup_dir_dict ##locale_dir = utils.LOCALEDIR ##bindtextdomain(app_name, locale_dir) #utils.set_locale() glade_dir = utils.FRONTENDDIR class WarningDialog(gtk.MessageDialog): def __init__(self,parent=None,flags=gtk.DIALOG_MODAL,type=gtk.MESSAGE_WARNING, buttons=gtk.BUTTONS_CLOSE,message_format='',txt=''): gtk.MessageDialog.__init__(self,parent=parent, flags=flags, type=type, buttons=buttons, message_format=message_format) self.connect("response", self.response) self.set_markup('%s%s%s' % ('',txt,'')) self.set_title(_('Warning')) self.show() def response(self,*args): """destroys itself on a respons, we don't care about the response value""" self.destroy() class ErrorDialog(WarningDialog): def __init__(self,txt): WarningDialog.__init__(self,parent=None, flags=gtk.DIALOG_MODAL, type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_CLOSE, message_format='', txt=txt) self.set_title(_('Error')) class InfoDialog(WarningDialog): def __init__(self,txt): WarningDialog.__init__(self,parent=None, flags=gtk.DIALOG_MODAL, type=gtk.MESSAGE_INFO, buttons=gtk.BUTTONS_CLOSE, message_format='', txt=txt) self.set_title(_('Information')) class YesNoDialog(gtk.MessageDialog): def __init__(self,parent=None,flags=gtk.DIALOG_MODAL,type=gtk.MESSAGE_INFO, buttons=gtk.BUTTONS_YES_NO,message_format='',txt=''): gtk.MessageDialog.__init__(self,parent=parent, flags=flags, type=type, buttons=buttons, message_format=message_format) #self.connect("response", self.response) self.set_markup('%s%s%s' % ('',txt,'')) self.set_title(_('Question ?')) self.show() class BeeperDialog(YesNoDialog): def __init__(self,parent=None,flags=gtk.DIALOG_MODAL,type=gtk.MESSAGE_QUESTION, buttons=gtk.BUTTONS_OK_CANCEL,message_format='',txt=''): YesNoDialog.__init__(self,parent=parent, flags=flags, type=type, buttons=buttons, message_format=message_format, txt=txt) hbox = gtk.HBox(homogeneous=False, spacing=4) label = gtk.Label(_("Number of beepers:")) self.entrybox = gtk.Entry(3) self.entrybox.set_flags(gtk.CAN_FOCUS) hbox.pack_start(label,False,False,0) hbox.pack_start(self.entrybox,False,False,0) self.vbox.pack_start(hbox, True, True, 0) self.entrybox.grab_focus() self.vbox.show_all() def get_choice(self): choice = self.entrybox.get_text() try: beepers = int(choice) except ValueError,info: print info beepers = 0 if beepers < 0: beepers = 0 return beepers # As a reminder: # The toplevel window on the XO is always fullscreen with a size of 1200x900 # and the canvas widget has a size of 638x737 (x,y) class Canvas(gtk.DrawingArea): """Wraps a gtk.DrawingArea and a adds a few abstraction methods. Based on the example from the pygtk FAQ.""" def __init__(self,parent=None): self.logger = logging.getLogger("gvr.Widgets.Canvas") self.logger.debug("start canvas creation") gtk.DrawingArea.__init__(self) self.gvrparent = parent self.gc = None # initialized in realize-event handler self.width = 0 # updated in size-allocate handler self.height = 0 # idem self.connect('size-allocate', self._on_size_allocate) self.connect('expose-event', self._on_expose_event) self.connect('realize', self._on_realize) self._load_images() # image sizes self.spi_x = self.splash_pixbuf.get_width() self.spi_y = self.splash_pixbuf.get_height() # all guidos are the same size and square self.guido_x = self.robot_n_pixbuf.get_width() self.guido_y = self.guido_x # size of the matrix cells self.square = 40 self.offset = (0,0) # 'stuff_to_draw' will hold references to the drawing methods. # They are set by the method draw_world and draw_splash. # The 'on_expose_event' callback just # calls all the methods that are in the list. # For example, when theres no world loaded the gvr splash screen # should be drawn and the list only holds '_draw_splash'. # When there's a world loaded the list could contain: # '_draw_empty_world','_draw_wal,sysls','_draw_beepers','_draw_robot' # The gui should call draw_world. The list # is parsed from item 0 upwards. self.stuff_to_draw = [self._draw_splash] def __repr__(self): return "Canvas" def _load_images(self): """Put loading in a seperate method which can be overridden by WBCanvas to load different images""" self.dot_pixbuf = gtk.gdk.pixbuf_new_from_file( os.path.join(utils.PIXMAPSDIR,'dot.png')) self.splash_pixbuf = gtk.gdk.pixbuf_new_from_file( os.path.join(utils.PIXMAPSDIR,'gvr-splash.png')) self.robot_n_pixbuf = gtk.gdk.pixbuf_new_from_file( os.path.join(utils.PIXMAPSDIR,'guido_n.png')) self.robot_e_pixbuf = gtk.gdk.pixbuf_new_from_file( os.path.join(utils.PIXMAPSDIR,'guido_e.png')) self.robot_s_pixbuf = gtk.gdk.pixbuf_new_from_file( os.path.join(utils.PIXMAPSDIR,'guido_s.png')) self.robot_w_pixbuf = gtk.gdk.pixbuf_new_from_file( os.path.join(utils.PIXMAPSDIR,'guido_w.png')) def _on_realize(self, widget): cmap = widget.get_colormap() self.WHITE = cmap.alloc_color('white') self.BLACK = cmap.alloc_color('black') self.RED = cmap.alloc_color('red') self.BLUE = cmap.alloc_color('blue') self.gc = widget.window.new_gc() self.pangolayout = widget.create_pango_layout('') self.pangolayout_beeper = widget.create_pango_layout('') # create a font description font_desc = pango.FontDescription('Serif 8') # tell the layout which font description to use self.pangolayout.set_font_description(font_desc) # and one for the beepers if utils.platform == 'XO': fn_size = '8' else: fn_size = '12' font_desc = pango.FontDescription('Serif '+fn_size) self.pangolayout_beeper.set_font_description(font_desc) return True def _on_size_allocate(self, widget, allocation): self.width = allocation.width self.height = allocation.height #print 'x,y', self.width,self.height self.screenX = self.width/self.square self.screenY = self.height/self.square return True def _on_expose_event(self, widget, event): # This is where the drawing takes place for func in self.stuff_to_draw: apply(func,(widget,)) return True def _fill_background(self,widget,col=''): if not col: col = self.WHITE self.gc.set_foreground(col) filled = 1 widget.window.draw_rectangle(self.gc, filled, 0, 0, self.width,self.height) def _draw_splash(self,widget): """Draws the GvR splash screen onto the canvas.""" self.world_size = (10,10) x = self.world_size[0] * self.square y = self.world_size[1] * self.square self.set_size_request(x,y) self._fill_background(widget) ## offset_x = (self.width - self.spi_x)/2 ## offset_y = (self.height - self.spi_y)/2 widget.window.draw_pixbuf( self.gc,self.splash_pixbuf,0,0,8,8,-1,-1) # these methods are used to blit the world for the first time def _reset_offset(self): self.offset = (0,0) self.screenX = self.width/self.square self.screenY = self.height/self.square def _draw_empty_world(self,widget): if repr(self) == "WBCanvas": col = self.BLUE else: col = self.RED #self.logger.debug("_draw_empty_world called") self._fill_background(widget) self.gc.set_line_attributes(line_width=2, line_style=gtk.gdk.LINE_SOLID, cap_style=gtk.gdk.CAP_NOT_LAST, join_style=gtk.gdk.JOIN_MITER) # create a font description font_desc = pango.FontDescription('Serif 8') # tell the layout which font description to use self.pangolayout.set_font_description(font_desc) # set numbers and outer walls y = self.height - self.square + 4 step = self.square # self.orig_x, self.orig_y are the coords of the upper left corner of # guido at the first square in the matrix. # Used as starting point to calculate the robots and beepers position. self.orig_x, self.orig_y = step+9,y-self.square+6 #print self.orig_x,self.orig_y #widget.window.draw_pixbuf(self.gc,self.dot_pixbuf,0,0,self.orig_x,self.orig_y,-1,-1) end = self.width/self.square # draw horizontal outer red wall self.gc.set_foreground(col) widget.window.draw_line(self.gc,step+4,y,self.width,y) step = self.height- self.square*2 # draw vertical outer red wall self.gc.set_foreground(col) widget.window.draw_line(self.gc,self.square+4,step+self.square+4,self.square+4,0) #draw vertical labels self.gc.set_foreground(self.BLACK) x_range_dots = range(int(self.square*2),self.width,self.square) for y in range(1,self.height): # draw dots on x-axes for x in x_range_dots: widget.window.draw_pixbuf(self.gc,self.dot_pixbuf,0,0,x,step,-1,-1) step -= self.square return True def _draw_labels(self,widget=None): # used to determine the amount the world must shift as the robot moves # off screen offset_x,offset_y = self.offset # create a font description font_desc = pango.FontDescription('Serif 8') # tell the layout which font description to use self.pangolayout.set_font_description(font_desc) # draw horizontal labels self.gc.set_foreground(self.BLACK) end = self.width/self.square y = self.height - self.square + 8 step = self.square for x in range(1+offset_x,end+offset_x+1): self.pangolayout.set_text('%d' % x) self.window.draw_layout(self.gc, step, y, self.pangolayout) step += self.square # vertical labels step = self.height- self.square*2 for y in range(1+offset_y,self.height+offset_y): self.pangolayout.set_text('%d' % y) self.window.draw_layout(self.gc, self.square/2, step+self.square/2, self.pangolayout) step -= self.square def _draw_walls(self,widget): #self.logger.debug("_draw_walls called") self.gc.set_foreground(self.RED) self.gc.line_width = 3 walls = self.world.get_walls_position() # used to determine the amount the world must shift as the robot moves # off screen offset_x,offset_y = self.offset for x,y in walls['west_wall']: x = x * self.square + 4 y = self.height - self.square - y*self.square + 8 widget.window.draw_line(self.gc,x,y,x,y+(self.square-8)) for x,y in walls['south_wall']: x = x * self.square + 8 y = self.height - y*self.square + 4 widget.window.draw_line(self.gc,x,y,x+(self.square-8),y) # Used by the worldbuilder def _remove_wall(self,d,x,y): self.gc.set_foreground(self.WHITE) self.gc.line_width = 3 if d == 'W': x = x * self.square + 4 y = self.height - self.square - y*self.square + 8 self.window.draw_line(self.gc,x,y,x,y+(self.square-8)) elif d == 'S': x = x * self.square + 8 y = self.height - y*self.square + 4 self.window.draw_line(self.gc,x,y,x+(self.square-8),y) def _draw_beepers(self,widget): #self.logger.debug("_draw_beepers called") self.gc.set_foreground(self.BLUE) self.gc.line_width = 4 for key,value in self.world.get_beepers().items(): self._draw_beeper(key,value) self.gc.line_width = 2 #self.queue_draw() def _draw_beeper(self,pos,value): #self.logger.debug("_draw_beeper called") pos_x = self.orig_x + self.square*(pos[0]-1) pos_y = self.orig_y - self.square*(pos[1]-1) # used to determine the amount the world must shift as the robot moves # off screen offset_x,offset_y = self.offset self.window.draw_arc(self.gc,False,pos_x+2,pos_y+2,22,24,0,360*64) self.pangolayout_beeper.set_text('%d' % value) if value < 10: pos_x += 8 else: pos_x += 4 self.window.draw_layout(self.gc, pos_x,pos_y+4, self.pangolayout_beeper) def _draw_robot(self,widget): #self.logger.debug("_draw_robot called") pos = self.world.get_robots_position() dir = self.world.get_robots_direction() ## # used to determine the amount the world must shift as the robot moves ## # off screen ## offset_x,offset_y = self.offset pos_x = self.orig_x + self.square*(pos[0]-1) pos_y = self.orig_y - self.square*(pos[1]-1) pixbuf = self._get_direction_pixbuf() widget.window.draw_pixbuf(self.gc,pixbuf,0,0,pos_x,pos_y,-1,-1) def _get_direction_pixbuf(self): return {'E':self.robot_e_pixbuf,'W':self.robot_w_pixbuf, 'N':self.robot_n_pixbuf,'S':self.robot_s_pixbuf}\ [self.world.get_robots_direction()] # abstraction methods called by the parent def draw_splash(self): self.stuff_to_draw = [self._draw_splash] self.queue_draw() def draw_world(self,world): """Draws the complete world represented in @world""" self.world = world self.stuff_to_draw = [self._draw_empty_world, self._draw_labels, self._draw_walls, self._draw_robot, self._draw_beepers] self.queue_draw() ########################## work in progress def draw_scrolling_world(self,offset): self.logger.debug("draw_scrolling_world called") self.stuff_to_draw = [self._draw_empty_world,\ self._draw_walls,\ self._draw_beepers,\ self._draw_labels] self.queue_draw() ######################################################### def draw_robot(self,obj,oldcoords): """Draws the robot and clears the old position of the robot. This is more efficient then redraw the whole world every time.""" #self.logger.debug("draw_robot called") # we don't queue the drawing as the robot should move as fast as the user # intended, or the hardware allow pos = self.world.get_robots_position() dir = self.world.get_robots_direction() # we don't use a function for calculating the positions because # of the overhead of function calling. Speed is important in this case. pos_x = self.orig_x + self.square*(pos[0] + self.offset[0] - 1) pos_y = self.orig_y - self.square*(pos[1] - self.offset[1] - 1) ############### Scrolling is work in progress #print #print 'draw_robot',pos,oldcoords scrolling, self.offset = self.world.newOffset(self.offset, (self.screenX,self.screenY)) #print 'scrolling',scrolling,'self.offset',self.offset if scrolling: self.screenX += self.offset[0] self.screenY += self.offset[1] self.draw_scrolling_world(self.offset) # recalculate the robot's position ## pos_x = self.orig_x + self.square*(pos[0] + self.offset[0] - 1) ## pos_y = self.orig_y - self.square*(pos[1] - self.offset[1] - 1) ########################################### pixbuf = self._get_direction_pixbuf() self.gc.set_foreground(self.WHITE) if oldcoords: y = self.orig_y - self.square*(oldcoords[1]- self.offset[1] -1) x = self.orig_x + self.square*(oldcoords[0]+ self.offset[0] -1) self.window.draw_rectangle(self.gc,True,x,y, self.guido_x,self.guido_y) beepersdict = self.world.get_beepers() if beepersdict.has_key(pos): self.draw_beepers(None) # make sure all the previous events are processed before drawing the robot #while gtk.events_pending(): gtk.main_iteration() self.window.draw_pixbuf(self.gc,pixbuf,0,0,pos_x,pos_y,-1,-1) ##self.queue_draw() def draw_beeper(self,pos,value): """Draws the beepers and clears the old positions of the beepers. This is more efficient then redraw the whole world every time.""" # XXX beepers are only picked up (cleared) when guido is on top #print pos,value #self.logger.debug("draw_beeper called") self._draw_beeper(pos,value) def draw_beepers(self,obj): #self.logger.debug("draw_beepers called") self._draw_beepers(None) class WBCanvas(Canvas): """Canvas used for the worldbuilder. It extends the canvas object used by the GUI. """ def __init__(self,parent=None,wcode=[]): Canvas.__init__(self,parent=parent) if wcode: # code comes from a editor widget and lacks \n tokens # we need those when we procces them in a worldbuilder. n_wcode = [] for line in wcode: n_wcode.append(line+'\n') wcode = n_wcode self.wcode = wcode # connect mouse events self.set_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.POINTER_MOTION_MASK) self.connect('button-press-event', self.on_button_press_event_cb) # grab the focus needed to receive the key events. self.grab_focus() def __repr__(self): return "WBCanvas" def _load_images(self): """Override the Canvas._load_images method to provide different world dots.""" self.dot_pixbuf = gtk.gdk.pixbuf_new_from_file( os.path.join(utils.PIXMAPSDIR,'dot_wb.png')) # The rest is the same self.splash_pixbuf = gtk.gdk.pixbuf_new_from_file( os.path.join(utils.PIXMAPSDIR,'gvr-splash.png')) self.robot_n_pixbuf = gtk.gdk.pixbuf_new_from_file( os.path.join(utils.PIXMAPSDIR,'guido_n.png')) self.robot_e_pixbuf = gtk.gdk.pixbuf_new_from_file( os.path.join(utils.PIXMAPSDIR,'guido_e.png')) self.robot_s_pixbuf = gtk.gdk.pixbuf_new_from_file( os.path.join(utils.PIXMAPSDIR,'guido_s.png')) self.robot_w_pixbuf = gtk.gdk.pixbuf_new_from_file( os.path.join(utils.PIXMAPSDIR,'guido_w.png')) def _calculate_position(self,mx,my): """Turn mouse positions into grid positions. x,y is the gvr robot position. xx,yy are the remainders. Remaiders are used to determine walls orientation.""" # adjustments to get it pixel perfect. height = self.height + 4 mx -= 4 x = int(mx) / self.square rx = max(1,int(mx) % self.square) y = (height - int(my)) / self.square ry = max(1,(height - int(my)) % self.square) if _WDEBUG: print "mouse x,y",mx,my print "grid x,rx,y,ry",x,rx,y,ry return (x,rx,y,ry) def reload_button_activated(self, wcode): n_wcode = [] for line in wcode: n_wcode.append(line+'\n') self.wcode = n_wcode def on_button_press_event_cb(self,widget, event): # add the wall to the editor and worldobject then call draw_wall # which uses the world object. wline,bline = '', '' if event.button == 1: # valid is set hen we have a orientation and it's checked after # remainder checking valid = False x,rx,y,ry = self._calculate_position(event.x,event.y) if x < 1 or y < 1: return # first set the square we are in wline = "%s " % _('wall') # now we check the remainders to determine the walls orientation # first we look for x if 30 <= rx <= 39: wline += "%s %s %s\n" % (x,y,_('E')) valid = True elif 1 <= rx <= 10 and x > 1: wline += "%s %s %s\n" % (x-1,y,_('E')) valid = True # now for y elif 30 <= ry <= 39 : wline += "%s %s %s\n" % (x,y,_('N')) valid = True elif 1 <= ry <= 10 and y > 1: wline += "%s %s %s\n" % (x,y-1,_('N')) valid = True if not valid: return True if _WDEBUG: print wline elif event.button == 2: # As it's mandatory that the first line is the robot statement # we assume the first line is the one to change. line = self.wcode[0].split(' ') if not _('robot') in line[0]: print "no robot statement found in the first line" return True dlg = RobotDialog() dlg.entry_x.set_text(line[1]) dlg.entry_y.set_text(line[2]) dlg.entry_dir.set_text(line[3]) dlg.entry_beepers.set_text(line[4][:-1])# loose the EOL response = dlg.RobotDialog.run() if response == gtk.RESPONSE_OK: choice = dlg.get_choice() dlg.RobotDialog.destroy() else: dlg.RobotDialog.destroy() return True line[1] = choice[0] line[2] = choice[1] line[3] = choice[2] line[4] = choice[3] self.wcode[0]=' '.join(line)+'\n' self.gvrparent.world_editor.editor.set_text(self.wcode) self.gvrparent.on_button_reload() return True elif event.button == 3: x,xx,y,yy = self._calculate_position(event.x,event.y) if x < 1 or y < 1: return True # TODO: check code for beepers on this position # and fill the dialog if true #print self.wcode dlg = BeeperDialog(txt=_("Please give the number of beepers\nto place on %d,%d\n (Number must be > 0)") % (x,y)) beepersline = '%s %s %s' % (_('beepers'),x,y) for line in self.wcode: if line.find(beepersline) != -1: self.wcode.remove(line) dlg.entrybox.set_text(line.split(' ')[3][:-1]) break response = dlg.run() if response == gtk.RESPONSE_OK: num_beepers = dlg.get_choice() if not num_beepers: self.gvrparent.world_editor.editor.set_text(self.wcode) self.gvrparent.on_button_reload() dlg.destroy() WarningDialog(txt=_('Beeper values must be zero or more.\nUse zero as the value to remove beeper(s)')) return True bline = "%s %d %d %d\n" % (_('beepers'),x,y,num_beepers) dlg.destroy() # code used by button 1 and 3 wcode = filter(None,[wline,bline]) if wcode: if event.button == 1: # t isn't used t,x,y,d = wline.split(' ') result = self.world.setWall_wb(x,y,lookup_dir_dict[d[:-1]]) if result[2] == 0: # remove wall self._remove_wall(result[0],result[1][0],result[1][1]) self.wcode.remove(wcode[0]) else: self._draw_walls(self) if wcode[0] not in self.wcode: self.wcode = self.wcode + wcode if event.button == 3: if wcode[0] not in self.wcode: self.wcode = self.wcode + wcode self.gvrparent.world_editor.editor.set_text(self.wcode) if event.button == 3: self.gvrparent.on_button_reload() return True # setup the timer object the model can use # The timer must provide the following methods: # start, stop, set_func and set_interval # see the methods for more info class Timer: def __init__(self): """The timer register a function in the atexit module to cleanup any threads still running when the main application exits. Be aware that if your application doesn't exit in a 'normal' way the atexit function might not work. (not normal ways are exceptions that are not cached by your app and terminates the program.) """ self.timer_id = None import atexit atexit.register(self.stop) def wakeup(self): """This is the actual 'worker' function.""" if self.timer_id: apply(self.func) return True # run again after interval return False # stop running again # mandatory methods for any timer object def start(self): """Start the gtk timer""" print "Starting timer..." self.timer_id = gobject.timeout_add(self.interval, self.wakeup) def stop(self): """Stop the gtk timer""" #print "Stopping timer...", try: gobject.source_remove(self.timer_id) self.timer_id = None except: pass #print " done" def set_func(self,func): """This will set the function that needs to be called by the timer. Because this timer object is passed to the gvr model by the controller we let the model set the function.""" self.func = func def set_interval(self,interval): """Set the interval by which the function should be called. Like the set_func method, we don't know the interval when we pass this object""" self.interval = interval class RobotDialog(SimpleGladeApp): def __init__(self, path="gvr_gtk.glade", root="RobotDialog", domain=app_name, **kwargs): path = os.path.join(glade_dir, path) SimpleGladeApp.__init__(self, path, root, domain, **kwargs) def new(self): pass def get_choice(self): return (self.entry_x.get_text(), self.entry_y.get_text(), self.entry_dir.get_text(), self.entry_beepers.get_text()) def on_RobotDialog_delete_event(self, widget, *args): self.RobotDialog.destroy() class StatusBar: def __init__(self, glade_obj): self.logger = logging.getLogger("gvr.Widgets.StatusBar") self.statusbar = glade_obj self.context_id = self.statusbar.get_context_id('gvr_gtk') self.barmesg = _("Robots position is %s %s %s and carrying %s beepers") self.beep = 0 self.pos = ((1,1),'N') self.data = [self.pos[0][0],self.pos[0][1],self.pos[1],self.beep] def update_robotposition(self,pos): self.data[0],self.data[1],self.data[2] = pos[0][0],pos[0][1],pos[1] #First we remove any message from the stack self.statusbar.pop(self.context_id) # Then we push a new one which is also displayed #self.logger.debug("statusbar update_robotposition %s" % self.data) self.statusbar.push(self.context_id,self.barmesg % tuple(self.data)) def update_robotbeepers(self,beep): self.data[3] = beep self.statusbar.pop(self.context_id) #self.logger.debug("statusbar update_robotbeepers %s" % self.data) self.statusbar.push(self.context_id,self.barmesg % tuple(self.data)) def set_text(self,text): self.statusbar.pop(self.context_id) #self.logger.debug("statusbar set_text: %s" % text) self.statusbar.push(self.context_id,text) def clear(self): self.statusbar.pop(self.context_id) class WebToolbar(gtk.Toolbar): def __init__(self,browser): from sugar.graphics.toolbutton import ToolButton self.logger = logging.getLogger("gvr.Widgets.WebToolbar") gtk.Toolbar.__init__(self) self._browser = browser self._back = ToolButton('go-previous') self._back.set_tooltip(_('Go back one page')) self._back.connect('clicked', self._go_back_cb) self.insert(self._back, -1) self._back.show() self._forw = ToolButton('go-next') self._forw.set_tooltip(_('Go one page forward')) self._forw.connect('clicked', self._go_forward_cb) self.insert(self._forw, -1) self._forw.show() def _go_forward_cb(self,button): self._browser.web_navigation.goForward() def _go_back_cb(self,button): self._browser.web_navigation.goBack() def get_active_text(combobox): """Unfortunately, the GTK+ developers did not provide a convenience method to retrieve the active text. That would seem to be a useful method. You'll have to create your own.""" model = combobox.get_model() active = combobox.get_active() if active < 0: return None return model[active][0] GvRng_4.4/gui-gtk/gvr_gtk.gladep.bak0000644000175000017500000000042311326063740016121 0ustar stasstas gvr_gtk gvr_gtk FALSE GvRng_4.4/gui-gtk/fake_sugar_activity.py0000644000175000017500000000173611326063740017151 0ustar stasstas# -*- coding: utf-8 -*- # Copyright (c) 2007 Stas Zykiewicz # # XO.py # This program is free software; you can redistribute it and/or # modify it under the terms of version 3 of the GNU General Public License # as published by the Free Software Foundation. A copy of this license should # be included in the file GPL-3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # fake sugar activity module used when running on non-sugar systems to prevent # error messages class Activity: def __init__(self,*args): pass GvRng_4.4/gui-gtk/gvr_gtk.py0000644000175000017500000010143711326063740014570 0ustar stasstas#!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (c) 2007 Stas Zykiewicz # # gvr_gtk.py # This program is free software; you can redistribute it and/or # modify it under the terms of version 3 of the GNU General Public License # as published by the Free Software Foundation. A copy of this license should # be included in the file GPL-3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Reminder: # "widgets in classes derivated from SimpleGladeApp is easy and intuitive. # So, a widget created with glade you named 'bogus_widget' will be used in # your code as 'self.bogus_widget'." import version app_name = "gvrng"# used to set gettext app_version = version.VERSION import sys,os,logging import utils,Text glade_dir = utils.FRONTENDDIR locale_dir = utils.LOCALEDIR from SimpleGladeApp import SimpleGladeApp from SimpleGladeApp import bindtextdomain import pygtk # ensure version >= 2.0 of pygtk is imported pygtk.require('2.0') import gtk # tell gtk we gonna use threads import gobject gobject.threads_init() module_logger = logging.getLogger("gvr.gvr_gtk") PLATFORM = utils.platform if PLATFORM == 'XO': from sugar.activity import activity as sgactivity else: import fake_sugar_activity as sgactivity module_logger.debug("Using sugar activity module: %s" % sgactivity) if sys.platform == 'win32': import Win_Editors as Editors else: import Editors import Widgets bindtextdomain(app_name, utils.get_locale(),locale_dir) class Globals(super): speed = _('Medium') class Window(SimpleGladeApp): def __init__(self, parent=None, path="gvr_gtk.glade", root="window_main", domain=app_name, **kwargs): path = os.path.join(glade_dir, path) SimpleGladeApp.__init__(self, path, root, domain, **kwargs) self.logger = logging.getLogger("gvr.gvr_gtk.Window") if PLATFORM != 'XO': #self.parentGUI = gtk.Window(gtk.WINDOW_TOPLEVEL) self.parentGUI = self.window_main self.windowtitle = "GvRng" self.parentGUI.set_title(self.windowtitle) file = os.path.join(os.getcwd(),'gui-gtk','pixmaps','gvrIcon.bmp') try: self.parentGUI.set_icon_from_file(file) except gobject.GError: self.logger.exception("Can't load window icon") #self.parentGUI.set_size_request(800,600) self.parentGUI.connect('delete_event',self.stop) # We setup key event callback here as WBCanvas can't recieve them ?? XXX self.parentGUI.add_events( gtk.gdk.KEY_PRESS_MASK ) # delete lessons tab as we don't have an embedded browser self.eventboxlessons.destroy() self.lessons.destroy() # set the localized language summary in the language reference tab # first line is also used as the title txt = Text.OnRefText #title = txt.split('\n')[0] buffer = gtk.TextBuffer(table=None) try: txt = ''.join(txt) utxt = unicode(txt) except Exception,info: self.logger.exception("Failed to set reference text in source buffer") return buffer.set_text(utxt) self.textview_languagereference.set_buffer(buffer) self.textview_languagereference.show_all() # and set the intro text txt = Text.OnIntroText buffer = gtk.TextBuffer(table=None) try: txt = ''.join(txt) utxt = unicode(txt) except Exception,info: self.logger.exception("Failed to set intro text in source buffer") return buffer.set_text(utxt) self.textview_intro.set_buffer(buffer) self.textview_intro.show_all() # check if we should show the intro text on startup. try: if utils.RCDICT['default']['intro'].lower() == 'yes': self.notebook1.set_current_page(-1) utils.setRcEntry('intro','no') except KeyError: # versions < 2.9 don't have 'intro', but those users already know gvr :-) pass # only needed for debugging #self.parentGUI.connect('size-allocate', self._on_size_allocate) # Only used for debugging ## def _on_size_allocate(self, widget, allocation): ## self.width = allocation.width ## self.height = allocation.height ## self.logger.debug("parentGUI x,y: %s" % (self.width,self.height)) ## return True def new(self): # called by SimpleGladeApp self.statusbar = Widgets.StatusBar(self.statusbar7) self._setup_canvas() # these calls will add the editors to the GUI self.new_world_editor() self.new_program_editor() self._set_sensitive_button('all',True) self.timerinterval = 150 def new_world_editor(self): self.world_editor = WorldTextEditorWin(parent=self) def new_program_editor(self): self.program_editor = CodeTextEditorWin(parent=self) def _setup_canvas(self): # setup the canvas self._canvas = Widgets.Canvas() self.align = gtk.Alignment() self.viewport = gtk.Viewport() self.scrolledwindow8.add(self.viewport) self.viewport.add(self._canvas) self.scrolledwindow8.show_all() self._set_sensitive_button('all',False) self.WB_ACTIVATED = False def _set_sensitive_button(self,button,value): """used to 'grey out' buttons. When the @button is 'all', all the buttons are handled. We also clear the statusbar if the buttons are disabled.""" if button == 'all': for b in (self.button_abort,self.button_execute, self.button_reload,self.button_step): b.set_sensitive(value) else: but = {'abort':self.button_abort, 'reload':self.button_reload, 'execute':self.button_execute, 'step':self.button_step}[button] but.set_sensitive(value) if button == 'all' or button in ('reload','step') and value == False: self.statusbar.clear() def _worldeditor_observer_callback(self): self.world_editor = None def _programeditor_observer_callback(self): self.program_editor = None ## These are the callbacks mandatory for the controller def start(self,*args): """This will start the GUI.""" self.logger.debug("start called with args: %s" % args) # there are only args when gvr is started by gvrng.py (non-XO systems) if args[0] and args[1]: wfile, pfile = args[0], args[1] self.world_editor.on_new1_activate(file=wfile) self.program_editor.on_new1_activate(file=pfile) # Sugar runs the gtk loop on XO if PLATFORM != 'XO': self.parentGUI.show() self.run() def get_timer(self): """The controller will call this and expect to get a timer object. The timer must provide the following methods: start, stop, set_func and set_interval see the timer docstrings for more info""" return Widgets.Timer() def get_timer_interval(self): return self.timerinterval def stop(self,*args): """Stops the gui, when running in non-XO""" gtk.main_quit() def set_controller(self,contr): self.logger.debug("controller set in %s" % self) self.controller = contr def worldwin_gettext(self): if self.world_editor: wcode = self.world_editor.get_all_text() if wcode: return wcode self.show_warning(_("You don't have a world file loaded.")) def codewin_gettext(self): if self.program_editor: wcode = self.program_editor.get_all_text() if wcode: return wcode self.show_warning(_("You don't have a program file loaded.")) def highlight_line_code_editor(self,line): """ Controller calls this with the current line of code that's been executed after the execute button is pressed.""" try: self.program_editor.editor.set_highlight(line) except Exception,info: print info def show_warning(self,txt): Widgets.WarningDialog(txt=txt) def show_error(self,txt): Widgets.ErrorDialog(txt=txt) def show_info(self,txt): Widgets.InfoDialog(txt=txt) def update_world(self,obj): """Called by the controller when the world is changed.""" # canvas is the drawable from Widgets.Canvas self._canvas.draw_world(obj) pos = self.controller.get_robot_position() self.logger.debug("received from controller robot position %s,%s" % pos) self.statusbar.update_robotposition(pos) beep = self.controller.get_robot_beepers() self.logger.debug("received from controller number of beepers %s" % beep) self.statusbar.update_robotbeepers(beep) def update_robot_world(self,obj,oldcoords=None): """Called by the controller when the robots position is changed.""" self._canvas.draw_robot(obj,oldcoords) pos = self.controller.get_robot_position() #self.logger.debug("received from controller robot position %s,%s" % pos) self.statusbar.update_robotposition(pos) def update_beepers_world(self,obj): """Called by the controller when the beepers states are changed.""" self._canvas.draw_beepers(obj) beep = self.controller.get_robot_beepers() #self.logger.debug("received from controller number of beepers %s" % beep) self.statusbar.update_robotbeepers(beep) ### end of mcv methods def on_MainWin_delete_event(self, widget, *args): self.on_quit1_activate(widget) return True # Don't send the signal further def on_open_worldbuilder1_activate(self, widget, *args): self.logger.debug("worldbuilder_activate") self.WB_ACTIVATED = True if PLATFORM != 'XO': self.windowtitle = self.parentGUI.get_title() self.parentGUI.set_title(_("GvR - Worldbuilder")) # first we disable all the buttons. self._set_sensitive_button('all',False) # We (re)activate the buttons reload and abort as they are used by # the WB. The reload button reacts by reloading the canvas, just as # in a normal session. For the abort button we set a flag which is checked # by the on_button_abort callback to act as a WB 'quit' button. self._set_sensitive_button('reload',True) self._set_sensitive_button('abort',True) # As we might not have a world when we start WB we start with a empty world # with Guido in the bottom left corner facing east, no beepers. # We start with a localized statement. wcode = ["%s 1 1 %s 0" % (_("robot"),_("E"))] if self.world_editor.get_all_text(): # if there's an open world editor we use it's contents wcode = self.world_editor.get_all_text() else: self.world_editor.editor.set_text(wcode) # When the world_editor is destroyed it will call the observer. # By doing this it will simulate a abort button event. # TODO: check this whole destroy stuff, do we use it ? self.world_editor.register_observer(self.on_button_abort) # store the canvas so we can restore it later # It's also to add a reference to it to make sure the Python GC don't # free it from memory # TODO: Do we need to keep it ??? self.oldcanvas = self._canvas self.viewport.remove(self._canvas) # setup the wb canvas self._canvas = Widgets.WBCanvas(parent=self,wcode=wcode) self.viewport.add(self._canvas) self.scrolledwindow8.show_all() # reload an empty world into the canvas which is now the WB canvas. # The wb canvas 'is a' normal canvas so all the methods and logic we # use in a normal grv session apply also in a WB session. self.on_button_reload() #self.on_gvr_worldbuilder1_activate() self.statusbar.set_text(_("Running Worldbuilder")) def on_quit1_activate(self, widget, *args): self.logger.debug("on_quit1_activate called") try: self.program_editor.on_quit2_activate() except Exception, info: pass #print info try: self.world_editor.on_quit2_activate() except Exception,info: pass #print info dlg = QuitDialog() dlg.QuitDialog.show() def on_set_speed1_activate(self, widget, *args): dlg = SetSpeedDialog() response = dlg.SetSpeedDialog.run() if response == gtk.RESPONSE_OK: self.timerinterval = dlg.get_choice() dlg.SetSpeedDialog.destroy() def on_gvr_lessons1_activate(self, widget, *args): """Display the GvR lessons in the default browser. This only works if the gvr lessons package version 0.2 is installed.""" import webbrowser file = os.path.join(utils.get_rootdir(),'docs','lessons',utils.get_locale()[:2],'html','index.html') self.logger.debug("Looking for the lessons in %s" % file) if not os.path.exists(file) and utils.get_locale()[:2] != 'en': file = os.path.join(utils.get_rootdir(),'docs','lessons','en','html','index.html') self.logger.debug("Looking for the lessons in %s" % file) if os.path.exists(file): try: webbrowser.open(file,new=0) except webbrowser.Error,info: txt = str(info)+ '\n'+ "Be sure to set your env. variable 'BROWSER' to your preffered browser." self.show_warning(txt) else: self.show_warning(_("Can't find the lessons.\nMake sure you have installed the GvR-Lessons package.\nCheck the GvR website for the lessons package.\nhttp://gvr.sf.net")) ## def on_set_language1_activate(self, widget, *args): ## dlg = SetLanguageDialog() ## response = dlg.SetLanguageDialog.run() ## if response == gtk.RESPONSE_OK: ## languagechoice = dlg.get_choice() ## dlg.SetLanguageDialog.destroy() ## #print "languagechoice",languagechoice ## utils.setRcEntry('lang',languagechoice) ## def on_gvr_reference1_activate(self, widget, *args): ## dlg = SummaryDialog() ## dlg.set_text(Text.OnRefText) def on_gvr_worldbuilder1_activate(self,*args): dlg = SummaryDialog() dlg.set_text(Text.OnWBText) def on_about1_activate(self, widget, *args): #testing #self.button_abort.set_sensitive(False) dlg = AboutDialog() def on_button_reload(self, *args): wcode = self.worldwin_gettext() if wcode: self.controller.on_button_reload(wcode) self.program_editor.reset_highlight() self._canvas._reset_offset() # notify wbuilder that possibly the world editor code is changed. if self.WB_ACTIVATED and wcode: self._canvas.reload_button_activated(wcode) return True def on_button_step(self, widget, *args): self.controller.on_button_step() return True def on_button_execute(self, widget, *args): self.controller.on_button_execute() return True def on_button_abort(self, widget=None, *args): if self.WB_ACTIVATED: # we act now as a 'quit button for the WB # canvas is now a WBCanvas object # Reset everything for the 'normal' canvas if PLATFORM != 'XO': self.parentGUI.set_title(self.windowtitle) self._set_sensitive_button('all',False) self.scrolledwindow8.remove(self.viewport) # put back the gvr world canvas self._setup_canvas() if not widget: # If widget is None we are called by the WB in a situation # the user has destroyed the worldeditor. self.world_editor = None if self.world_editor: self._set_sensitive_button('reload',True) self.on_button_reload() if self.program_editor: for b in ('execute','step','abort'): self._set_sensitive_button(b,True) else: self.controller.on_button_abort() def on_statusbar1_text_popped(self, widget, *args): pass def on_statusbar1_text_pushed(self, widget, *args): pass class WindowXO(Window): def __init__(self, handle,parent=None, path="gvr_gtk.glade", root="window_main", domain=app_name, **kwargs): Window.__init__(self,parent=parent, path=path, root=root, domain=domain) self._parent = parent self.logger = logging.getLogger("gvr.gvr_gtk.WindowXO") # Get and set the sugar toolbar toolbox = sgactivity.ActivityToolbox(self._parent) self._parent.set_toolbox(toolbox) toolbox.show() # then we remove the main frame from parent self._frame = self.frame5 self.window_main.remove(self._frame) # set as main window below the toolbox self._parent.set_canvas(self._frame) self._frame.show() # remove seperator and 'quit' menu items as we have the sugar toolbox self.separatormenuitem14.destroy() self.imagemenuitem49.destroy() # Embed webview as the lessons display self.logger.debug("import webview") import hulahop from sugar import env hulahop.startup(os.path.join(env.get_profile_path(), 'gecko')) from hulahop.webview import WebView self.WV = WebView() file = os.path.join(utils.get_rootdir(),'docs','lessons',utils.get_locale()[:2],'html','index.html') self.logger.debug("Looking for the lessons in %s" % file) if not os.path.exists(file): self.logger.debug("%s not found, loading default English lessons" % file) file = os.path.join(utils.get_rootdir(),'docs','lessons','en','html','index.html') self.WV.load_uri('file:///%s' % file) self.WV.show() vbox = gtk.VBox(False,4) vbox.pack_start(Widgets.WebToolbar(self.WV),False,False,2) vbox.pack_start(self.WV,True,True,2) vbox.show_all() self.eventboxlessons.add(vbox) class QuitDialog(SimpleGladeApp): def __init__(self, path="gvr_gtk.glade", root="QuitDialog", domain=app_name, **kwargs): path = os.path.join(glade_dir, path) SimpleGladeApp.__init__(self, path, root, domain, **kwargs) def new(self): #print "A new QuitDialog has been created" pass def on_QuitDialog_delete_event(self, widget, *args): self.QuitDialog.destroy() def on_dialog_okbutton1_clicked(self, widget, *args): self.quit() class AboutDialog(SimpleGladeApp): def __init__(self, path="gvr_gtk.glade", root="AboutDialog", domain=app_name, **kwargs): path = os.path.join(glade_dir, path) SimpleGladeApp.__init__(self, path, root, domain, **kwargs) def new(self): # label = self.text_label txt = version.ABOUT_TEXT % app_version self.text_label.set_text(txt) self.text_label.show() self.AboutDialog.show() def on_AboutDialog_delete_event(self, widget, *args): self.AboutDialog.destroy() class FileDialog(gtk.FileChooserDialog): def __init__(self,action='open',title='',path=os.path.expanduser('~'),ext='wld'): #print "FileChooserDialog called",action,title,path,ext if action == 'open': act = gtk.FILE_CHOOSER_ACTION_OPEN but = gtk.STOCK_OPEN else: act = gtk.FILE_CHOOSER_ACTION_SAVE but = gtk.STOCK_SAVE gtk.FileChooserDialog.__init__(self,title=title,action=act, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, but, gtk.RESPONSE_OK)) try: startpath = utils.PROGRAMSDIR except: startpath = os.path.join(utils.get_rootdir()) self.set_current_folder(startpath) wfilter = gtk.FileFilter() wfilter.set_name(_("Worlds")) wfilter.add_pattern('*.wld') self.add_filter(wfilter) pfilter = gtk.FileFilter() pfilter.set_name(_("Programs")) pfilter.add_pattern('*.gvr') self.add_filter(pfilter) if ext == 'wld': self.set_filter(wfilter) else: self.set_filter(pfilter) class TextEditorWin(SimpleGladeApp): def __init__(self, path="gvr_gtk.glade", root="EditorWin", domain=app_name,parent=None, **kwargs): path = os.path.join(glade_dir, path) self.logger = logging.getLogger("gvr_gtk.TextEditorWin") self.parent = parent SimpleGladeApp.__init__(self, path, root, domain, **kwargs) # loaded_file_path is used to determine the path to save to # It's set by set_text and save_as* methods. self.loaded_file_path = '' self.loaded_txt = [] def new(self): """This implements a gtksourceview widget from Editors.py""" #Called by SimpleGladeApp # We use different editors on win32 as gtksourceview isn't available # Editors can be Editors.py or Win_Editors.py, see import statement above self.editor = Editors.Editor(self.scrolledwindow1) self.observers = [] def set_title(self,title): self.EditorWin.set_title(title) def get_all_text(self): try: txt = self.editor.get_all_text() except: txt = [] return txt def set_text(self,path,txt): # path is the path from which the txt comes, we use it to determine # the path to save to. self.loaded_file_path = path self.editor.set_text(txt) # used to compare the contents of the editor when quiting # We first set the text and then get it again because we compare it # against the text returnt by a call to get_all_text self.loaded_txt = self.get_all_text() def register_observer(self,obs): """Register a observer. Observer object must be a callable function which takes no arguments. Observer will be notified when this object gets destroyed. Needed by the worldbuilder and MainWin.""" self.observers.append(obs) def _notify_observers(self): try: for obs in self.observers: apply(obs) except Exception,info: self.logger.exception("Error in notify observers") def show_info(self): txt = "Sorry, not yet implemented\nUse the right mousebutton" Widgets.InfoDialog(txt=txt) ## def on_TextEditorWin_delete_event(self, widget, *args): ## self.on_quit2_activate(widget) # These two methods will be overridden by the child class. # It's only needed to connect the methods to the events in SimpleGladeApp def on_new1_activate(self,widget,*args): pass def on_open1_activate(self,widget,*args): pass def on_save1_activate(self, widget=None, txt=[]): if txt == []: txt = self.get_all_text() # used to compare the contents of the editor when quiting # We first set the text and then get it again because we compare it # against the text returnt by a call to get_all_text self.loaded_txt = txt if txt == []: Widgets.WarningDialog(txt=_("No content to save")) return if self.loaded_file_path: ext = '.'+str(self) if not self.loaded_file_path.endswith(ext): self.loaded_file_path = self.loaded_file_path+ext status = utils.save_file(self.loaded_file_path,txt) if status: Widgets.ErrorDialog(txt=status) else: return True else: self.on_save_as1_activate(txt=txt) def on_save_as1_activate(self, widget=None, txt=[]): #print "save_as1_activate", txt dlg = FileDialog(action='save',title=_('Choose a file'),ext=str(self)) response = dlg.run() if response == gtk.RESPONSE_OK: path = dlg.get_filename() elif response == gtk.RESPONSE_CANCEL: self.logger.debug('Closed, no files selected') dlg.destroy() return True dlg.destroy() self.loaded_file_path=path if self.on_save1_activate(txt=txt): self.set_title(path) def on_quit2_activate(self, widget=None, *args): edittxt = self.get_all_text() #print 'edittxt',edittxt #print 'loaded_txt',self.loaded_txt if edittxt != self.loaded_txt: dlg = Widgets.YesNoDialog(txt=_("The %s editor's content is changed.\nDo you want to save it?" % self.name())) response = dlg.run() dlg.destroy() if response == gtk.RESPONSE_YES: self.on_save_as1_activate(txt=edittxt) else: return True def on_cut1_activate(self, widget, *args): self.editor.srcview.emit('cut-clipboard') def on_copy1_activate(self, widget, *args): self.editor.srcview.emit('copy-clipboard') def on_paste1_activate(self, widget, *args): self.editor.srcview.emit('paste-clipboard') def on_delete1_activate(self, widget, *args): self.editor.srcview.emit('delete-from-cursor',gtk.DELETE_CHARS,1) def on_print1_activate(self, widget, *args): import time,tempfile head = '\nfile: %s\ndate: %s\n' % \ (self.EditorWin.get_title().split(' ')[0],time.asctime()) txt = '\n'.join(self.get_all_text()) text = '-'*79 + '\n' + head + '-'*79 + '\n' + txt # create a secure tempfile, not really needed but I think you should # always try to avoid race conditions in any app. fd,fn = tempfile.mkstemp() fo = os.fdopen(fd,'w') try: fo.write(text) fo.close() except Exception,info: print info return utils.send_to_printer(fn) os.remove(fn) def on_about2_activate(self,*args): pass def reset_highlight(self): self.editor.reset_highlight() class CodeTextEditorWin(TextEditorWin): def __init__(self, path="gvr_gtk.glade", root="EditorWin", domain=app_name,parent=None, **kwargs): TextEditorWin.__init__(self,path,root,domain,parent,**kwargs) self.parent = parent self.EditorWin.remove(self.vbox4) # make sure we don't add > 1 children for child in self.parent.alignment19.get_children(): self.parent.alignment19.remove(child) self.parent.alignment19.add(self.vbox4) def __str__(self): return 'gvr' def name(self): return 'Code' def on_new1_activate(self, widget=None, file=''): self.on_quit2_activate() self.parent.new_program_editor() def on_open1_activate(self, widget=None,file=''): if not file: dlg = FileDialog(action='open',title=_("Open GvR program"),ext='gvr') response = dlg.run() if response == gtk.RESPONSE_OK: file = dlg.get_filename() if os.path.splitext(file)[1] != '.gvr': self.show_error(_("Selected path is not a program file")) dlg.destroy() return elif response == gtk.RESPONSE_CANCEL: self.logger.debug('Closed, no files selected') dlg.destroy() return dlg.destroy() txt = utils.load_file(file) if txt: self.set_text(file,txt) for b in ('execute','step','abort'): self.parent._set_sensitive_button(b,True) return class WorldTextEditorWin(TextEditorWin): def __init__(self, path="gvr_gtk.glade", root="EditorWin", domain=app_name,parent=None, **kwargs): TextEditorWin.__init__(self,path,root,domain,parent,**kwargs) self.parent = parent self.EditorWin.remove(self.vbox4) # make sure we don't add > 1 children for child in self.parent.alignment18.get_children(): self.parent.alignment18.remove(child) self.parent.alignment18.add(self.vbox4) def __str__(self): return 'wld' def name(self): return 'World' def on_new1_activate(self,widget=None,file=''): self.on_quit2_activate() self.parent.new_world_editor() def on_open1_activate(self,widget=None,file=''): self.on_quit2_activate()# this takes care of saving content yes/no if not file: dlg = FileDialog(action='open',title=_("Open GvR world"),ext='wld') response = dlg.run() if response == gtk.RESPONSE_OK: file = dlg.get_filename() if os.path.splitext(file)[1] != '.wld': self.show_error(_("Selected path is not a world file")) dlg.destroy() return elif response == gtk.RESPONSE_CANCEL: self.logger.debug('Closed, no files selected') dlg.destroy() return dlg.destroy() txt = utils.load_file(file) if txt: self.set_text(file,txt) self.parent.on_button_reload() return class SetLanguageDialog(SimpleGladeApp): def __init__(self, path="gvr_gtk.glade", root="SetLanguageDialog", domain=app_name, **kwargs): path = os.path.join(glade_dir, path) SimpleGladeApp.__init__(self, path, root, domain, **kwargs) def new(self): #print "A new SetLanguageDialog has been created" pass def get_choice(self): try: choice = {'Catalan':'ca','Dutch':'nl','English':'en','French':'fr',\ 'Norwegian':'no','Romenian':'ro','Spanish':'es','Italian':'it'}\ [Widgets.get_active_text(self.comboboxentry_language)] except Exception,info: print info choice = 'en' return choice def on_SetLanguageDialog_delete_event(self, widget, *args): self.SetLanguageDialog.destroy() def on_okbutton3_clicked(self, widget, *args): pass class SetSpeedDialog(SimpleGladeApp): def __init__(self, path="gvr_gtk.glade", root="SetSpeedDialog", domain=app_name, **kwargs): path = os.path.join(glade_dir, path) SimpleGladeApp.__init__(self, path, root, domain, **kwargs) def new(self): choice = {_('Instant'):0,_('Fast'):1,_('Medium'):2,_('Slow'):3}[Globals.speed] self.comboboxentry_speed.set_active(choice) def get_choice(self): try: txt = Widgets.get_active_text(self.comboboxentry_speed) choice = {'Instant':5,'Fast':50,'Medium':150,'Slow':500}[txt] except Exception,info: print info choice = 150 Globals.speed = _(txt) return choice def on_SetSpeedDialog_delete_event(self, widget, *args): self.SetSpeedDialog.destroy() def on_okbutton4_clicked(self, widget, *args): pass class SummaryDialog(SimpleGladeApp): def __init__(self, path="gvr_gtk.glade", root="SummaryDialog", domain=app_name, **kwargs): path = os.path.join(glade_dir, path) SimpleGladeApp.__init__(self, path, root, domain, **kwargs) def new(self): pass def set_text(self,txt): # first line is also used as the title title = txt.split('\n')[0] buffer = gtk.TextBuffer(table=None) try: txt = ''.join(txt) utxt = unicode(txt) except Exception,info: print "Failed to set text in source buffer" print info return self.SummaryDialog.set_title(title) buffer.set_text(utxt) self.textview1.set_buffer(buffer) def on_SummaryDialog_delete_event(self, widget, *args): self.SummaryDialog.destroy() def main(): main_win = WindowXO() # SimpleGladeApp.run() must be called just once per program main_win.run() if __name__ == "__main__": main() GvRng_4.4/gui-gtk/Xo_s.png0000644000175000017500000000207411326063740014166 0ustar stasstasPNG  IHDR&5- pHYs  gAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxڼ=Ag S], \be !+v F0 9I  8sp.w۝;L{}CZw>5X/^}D~н}ώ!iԦq'ReGg1PEB. ٩@ȏɓ'yj;.Lar08h|,̭3]f 8:5>cBv+o4ky يzq 3$/jPe~WF`g @&ڗ0/m`NE/h?A+vkM:2aZPU 8>vh 3]υ:S$Ȕ?Cl\׵Y11_-1/`~m3C`uM,J}^ LA|哴7PP޴em&XH@Z&ggp K_g Eܺ`6Plq-!YBY!@ef*.m ffgÝBex|`hN39V( *2ɔ fH_k¹hPg%2"CpnlmAy!)^ATp,[LW..> MVqV*ANf-\"n?]Rg?iWIZ8lYa*N;0/gӜ^dUևLqvLN"*0? "THIENDB`GvRng_4.4/gui-gtk/gvrIcon-big.png0000644000175000017500000001111711326063740015422 0ustar stasstasPNG  IHDR9;"bKGD pHYs  ZtIME  ԡtEXtCommentCreated with The GIMPd%nIDATh՛Yy_w}4iF;` $̎m@ 8)`yHRyICTޒSE^RqbboEHHwfwh,`#@SSw;?Ub739d&f& @jdZ3npVZyDeBϚb;yR3LN7 3ګ_hϡ 'Z*ג @~ц ݷwd SnCkʁ7L< e}0bU_ 2uO:(088Bc=~Lr5%4GtmN6a/%q;A@Dg'\KhrYLck=^/ˇKͲXKm0r4HyKߒc~VS56b't_w-͑H(2LO6 ;|[/Yɝ:>z7n$L"$֯F? '{'ozAŠܱX J E.R9tn s!@{J:/ !G׵;H(ѧOMPsd ccy{/YINJ j[q#d##n M1?=QtjL/ QˈgT,A[[.L:~';Va _4,9` EGЊBS]>B*C昹@JS \!Uwp(lcn/[DH`mzNi?WnƮçk_P;%GyS.OD槣T1BP]+1"Y`xck oY;~ XVRQc qwhXJztyٔ>6Dў.jJ _z(jxR*DPXct<(mmaJ)\dž.!'_} 4+M JōBā?rD$l='~mi݀WkG] J.tY'ʞs\u#Z:DUF\@ .J=c]_xl5c}8mVq")k#մѢ%̻P. PA3=xq})LfYv>{{ _R]#*ܑ#ph(3j@&x+{z͊EƔxD&PL\ ]G:>~`zmu`yAC}xu'TBD&Gj"ݺMvq"*DB* }]pEE{8 55>EVb~jqz65 CU]. ;1sW\M6=Le%>**ъWd( зpa* !+]<7C,[E4;w*x]X2[T@F^")TATQk<5j,d+^`szRf)q'1_)P<9ƚ_xǎhdUrѣ+ARK2D 䜁嬤 ۼ;m~ȍ1\>'B#ơcgUÉ*aJÚ>űfahb*cQ. 0X;kOf)K[oZw5yhS/V %u%Hzz 7ݪlZga<\T%b][#Ͻlس&_1Zl Wr(P6 G49oNCm8bw-MMiv>!Q뾷ڝe0k /N,Kv%DmٌpfP-⦫nQVVڗ.]OXĿȖmDç19ү`y7jZRoSI'T1~@, f[ hYlZi;m$>J W|L:m[ڹŬ޶s^=hR@  FT"`rFGEYhiWV,lI/ =7t UywrbN]f۶:w?!ae#zݰWO"ܼp-(Aj%)0٭hoZUv%#N8Pe MFKv%vT* <SUiw *z"< ҿ*w 6J†yb8jAMI!W"Q!S"1 SK;$WqvpiV$?w=j_^S q]8x{e_O[GENi\iI%eAB crϨ0;g3oÅuq Ӕ<$B6%޳ \ .ۺ~1*,M?Gyn7?}ڙ9հA*TrԸwlq[qT D0}ATJ͢Z ӳ65O|O~HD"D~pb>Lm4 2kXFA/R6Nnj q],a%e)eyLpEYB`FD`ۦತg|WpGS+6'"UjI@dׯKy[kUYLޥR):U plo7!" ][;o-_U[ԁ|PQtv$I8dag2B$;A'cK N*NBV"Hb<2 ]X^q%x ۄ͛l{-RM ]Yl.\ߧTg =Ɗo 9U|o 뮕MTW+O;/z~Xeb* } Vpmn' MQq;x?v#2.$ARV]f1x(t5`ibXȊ'%|26~% [/uXC^3`J  &6>QS#T $--]X߄Dbך ^|-U,.ֵY!i ?\[W$1Z bvȼ.G܇J"{o%N[/n{R3$0X(Ql"jوw8Nggɔ grE "~9ǶlB\Ϧ92쬰e HeUEe[-@˭X2VRJ$SI2qJ*8]= `c])dx33Tc8)]ըz>9xu b)IV'9`$㬦`PDU+-].[+MZmJ"̚#H{κ!;pj`,s'X!dmWIqȅ^vt4q1jSSx(61ѰjTQUb@- WK5_.~NbO"RÊB鉀Lxe}bՉ: Lпn57ܲj ](G#;auc1㔦3T2*ss`*BJDR +0L7){qXk+EgxkC1Hֶ8dώu>㔁U+qۈFߑ_< 9cTFG)R.JHBjfq^oTKp"0_,kmWfm׹e8:G\73Cmjwd3CӣTs>^kõ,? y׵45)tϣ yfGswwtB:Mil7=F~|jQ2ׁ`.b ۯ KO }\r'OjqxQSf2s8&{o"7}eI| zF&CttdPQ3F"VcON\, 08ݮ+n77<4TkJ&sES,IUU$ɱCފbDQ"ah_;/j'FynZ,ZS]}~Z?z6ufY/GIENDB`GvRng_4.4/gui-gtk/pixmaps/guido_e.svg0000644000175000017500000000533711326063740016372 0ustar stasstas image/svg+xml G GvRng_4.4/gui-gtk/pixmaps/guido_n.png0000644000175000017500000000142011326063740016355 0ustar stasstasPNG  IHDR;0sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<IDATH?KpOkH$I ".S,: *xn>tҊ"OBA\j.E$͟iAy7SVEY)2[VKiT, X,'jpZ~gc4yvzzZ8vvᰖ$Ejup U' JXmT*}Mx3Qڴ$ڴ4 I"fYEz=hGȲF lfgUbm7m,lb~~>(u=\Z"2u}Gmf`o/.ss''>i#{mfps9?Cv:^RG¦iRQO[9^tjpEQbq!e2038; T0vnmy{^tdꀸZP?<oz}88ZƋ㴤$wţ^\.~/ˑ4onƇ^.a˲baۂBt?''l6~-ÃLJ`>O*J0͒++d&21J;&on{-ˢJݟ%I7a ( w-EQg/[m0.4IENDB`GvRng_4.4/gui-gtk/pixmaps/guido_s.svg0000644000175000017500000000533411326063740016405 0ustar stasstas image/svg+xml G GvRng_4.4/gui-gtk/pixmaps/dot_wb.png0000644000175000017500000000046311326063740016215 0ustar stasstasPNG  IHDRbKGD pHYs  tIME:4 wtEXtCommentCreated with The GIMPd%nIDATӅ @F_oH\uP1 t;UOc"@RK>ihvcޤTW"~j;ܕB {!Ęw bU#mJʨ 0z`xTJ PG z=+IENDB`GvRng_4.4/gui-gtk/pixmaps/dot.png0000644000175000017500000000047711326063740015532 0ustar stasstasPNG  IHDRbKGD pHYs  tIME TtEXtCommentCreated with The GIMPd%nIDATӅ1 0@? dXs!=C=E`{.K $H@|+aT}J銈m{?C!^BhJfcG!Ė[(( kmGDkhv~uJ逈O9w6<Ck>/IENDB`GvRng_4.4/gui-gtk/pixmaps/guido_e.png0000644000175000017500000000126711326063740016355 0ustar stasstasPNG  IHDR;0sBIT|d pHYs B(xtEXtSoftwarewww.inkscape.org<4IDATHŗOP)11 !888?8R> Mܜń.:99qs6>\ Ƅ綵| 79yӷ=y9B!yv]e@)*|?81&R)i?=r pIAR"጗J>;FT*P((4 Fk_F|YpdjZ)X` f4t]G"V{=`{>=ɺ=? 2,i9X&D^pcX$ܔP qu zL&]5b3wإ- g%oz}YOtnj{̌.IENDB`GvRng_4.4/gui-gtk/pixmaps/gvr-splash.png0000644000175000017500000014360411326063740017032 0ustar stasstasPNG  IHDRdb pHYs  ~tIME,) " IDATxidqE^f^wW;DwYcYBɖlɣsffG:[}4eђK2@ W{WuUeVe{F̏fU5 #tWgfʺˈ/" UE@@@[ނ@I%J () PR@@@@@IY2o5Pj4k(@I'{uEң45Iz[l ~iqo>pzp; `K]{>m: ful*^UH"$B*+0Dߋ6Mü9鹏&=yyLLL  l@z> bw>u/=>%}#"Yk1ƀD R"$C63uF8@^?noHfQ/XQ@@o I3_41˰\P,ʼΈ NK( P7[^q"zKd`/$Hy%MN+NR?9ߞ') P7<+Qt.-I?ؠחI Z;nӟf#R5O_2k%-֭T|Q?)3;"̈́(5stm(JD*8s,#rVBQ(T< / PҫC[/h"K4 PF+֚g\ ;ŮZ**w!kquy *9@JAUO9Tc$&+;fn//FՇ#(p8iw!kͭk7.ބjgZw(T+3{99{2@Iw矿/5ͪ HE܁6)Z[UMDV<@IwĕO}:m3GAJ\piHT! |PXpZS(inwfKQ1 1J)>w;oUQ5^xZTUkU7ʓ)C$Hk9ę.\5X&9ԸV ͉2{3@Iо~ҧ>c:%j]VҞDP~湃NLDPhW2h"$I%=}DQIFȍ+~M&@UٙVzVtrt8atJ޼ySv %c%zeۤ(H0/\T.lf{]y()idf%H@ˊ6d -Y<$TrRݺ;{cԑzY@;ǎ]}ihbQ>ڦQHmJb an/M8fZ:R 0UTT&k͵K C)i>H#AS`y T]lV)`3؞?pUSt+H-KjWL G- GIm6ZS]Ժua)#ŢXqdi&(77_(rZ8pJ/P S+ UBu')nQ!%h%!}rkKYM98MSMw}*a7 ;@zkfQӈ'xG!K쎭 Gr<2R6ܙiOt++[VPrrAcps[[U'z]wjMgD4/{m1k߸ ZdE՟|s9MIԟ=gGѪf!Hoں4}{t~-- **b_8rr`%Y(Z{hW%>z\.^$kW)ABHTw߳]% ڸ^mF"6[͖Tn,m6/jZA8{*q]Ƙ}f_+VM*umG[i &o[J~OldSu5j6QUչ֞]#=VumDkFD*iVfpmHI` lėϥG_ 0 m%~}‹ȴ>j%xUG2 K}7[7}\/S& E~c+݆\^#ÊvJڗ 1 mHI5;/JD<R];AB₅V(zfC:"F&yQ?gn wH9$X]1-9wr 0 Pۗ6Vk#_Fg޹g7s:*!RPhq5hMEEY9 `|+f,X=-vՒ?'m*%!)56y,D[#&8"ja(eS"3)O|w{`ֺ~Ӷ:0WBnk[W.̽%~V #@(#E>@cdŚ[,G%AU GyF?%⬫@3O} ~G|S,UE8u oC-w)nxF8#=y]z{ٹchc#7S܆yC)střy2> dpն!.0aJz_|2uK:]?孾MCE >8 $E}d"Y `G~~2 *3r~i f4r(3>*F%/T7kȋp"%?}?.Q$DEVK@*P|{alPY1[M ћe R-S"|੹ 7`M98WW`TMabuV@IoQ'Eyp˺A@ץ;yI~ ࣲgPu֚G!ok5?V@`gS7H"Om3Y*)utPS"Srt@Io(0s萩m8yLb탏>ȑbmj=ˊn&ޱL_];FT j[sʭέs{QsSM 2IǽK|R-?q|P56LmBw;Lٖ4$q#kG\?]Zܤ]AͶ6M)'-ċ`Fѥ\JzˇHΝÏ%b^ #m޶FoeLTHEt|7n\WG 'xJT&cg:w4(S䎑^}$k 2Yf:~P~8Ҙ>;BZx!@hHp{RU{];~MLl.ʩLB_̕潕NiLT$0n^u(-^Nz瞻L@<@Y|`ʋbAyёhϞ=9޽|돢p -Alxqa3`S8H-#%Ufcp:%EW[S}jvBT+dђ8Lmfa7?9`G( K'f ./IuEELy=r8ޢ8O,>qc:Qmزe./JIR74Dw549(oS-$z.\J┖]d|.Ѐ@Io9Kc~iU54]3ZHB5%`opǙkQuHT]Jfko(A|MTXmf]Fg=hp Cbp[~ŵ-X H@~d>xζ:e_mV5-^+&b;,W[X=1oMZ>h@nۯn%l?m ;SscH,ʦlH+X'_ >0$Ě.J9=1 7Uw:@3xD?; Pҷ+2K̚+ֵx[?Ty |ʄ;Wh6~D0 ZwU"w)I|aJyh*(ph1 Vs[eA BH C-I֥ a}$"TB˦kCr+M1 (JfI1nwnUgU@Io>n=5OeEd 2ݞq~ lQapD _( m5kzmh0Y3g.(5uşW+7]fp{^O '5 Pҷ'OO6Q\pr*HzcfIxfx˞B|?26~C_I1U@j Y 1 OͿ+g˻ɝu cܡ- Pҷ Ï٬Ci&4EE2ř M HFeq%U{7F^5:b"r5eW9N|[Nwйsclg@tƍ+鐶Jl\vWcYm] o-V28uk_WSR- I U&[ &NErvKjm  D :sLf(ۆ_ -M>V/ 3PS Ii]1Vxk7 #`Ago]Rb%"?tw̜Jtu|gVS`B':'%}{6f2V ץ {j'\~>_+Wj#[ :K$`@l2X[<6zbD, -~+ϑ;v ـ@I\o_LOsf]?@C}iE%nPqŹ^e#P㨢~so{PXkkJ !Xxi.V*m4b)2Nm@7ONlecQįxQxUU h٤.q[0íֆ_IU}Qso5kǽ3w'i Xc/ =W/ o P@s'Ţ/u_ 6 PқۧNwϞQTO}uoㅾ]9BdyqsYb ޡMrc,껋Jzpk_j+dU"!3l3.Wv"Haj-?m};|ͿvfB;|Dtf߉^q@}r>LԼ~g,n@7 ǿhTw`}R+cq7)q!`P%b3vJnZڶ޽#+$yiVvI@Jw5)"24k @WČ_(Jzs0?Aʳ*@#{dIo"1,sD0V^Hs[B Lh~Y:I|s q+K❢|3/$O}Ꭳ(to:O6"[nUU\LUH&ݹ3z͢mʬD4M,ѵkmǷ;F? 뉸k"zSpI>n; РWL|Eb8X8u:yC{ԃMHɔJC!_Ror&^dY~W|?P1hNkn_>[Y)1ةPfGiNaR@o-Ǒ:FB*~l& ؉B&qR0j0?6Lwdc>#b_wl։)fE/7I8-+뇫sSPRe#jK_3G ̱㗾dEBmn T#ˆbXDggIl`4EHp=fl5pPE"Rwmiy0ig>]n޹D6~pҟ$)1f$2h;6EE9,طΥ\۷abDF{H CHv#%JzYCS{{W.BՑ$x;VUxe+A+ d)Q#mLbKnj^2H9 ܗ^q|$ۚD|7Uyl@;^<oq@7s8RGZ6D)"e&frAU%)p_ov.&ިd;G='@/\@^wׇ6i.;x%p \$$4!K R3vRPfb@5=pVgfnP +ݔ (܉) zKKO(Iʹ3]~OCٍRQ, U^x.!bTPc Fx޹V{]?;\k״ݶ%Jt'48\~w[^W{]4Qڧ4KUH ŒYJ*μtdS~+Dʧ&2,( >~n65J5!R Qp{ ovgl(i3 IDATM9=hj+-_u]N1.%}$}JSHJ ὺvr>evl-*B\%v$`ت5Wn.jueOJɚ[ד/* PǿhCmd^q#PBQ۹K@K!\~..yG"$B JEdZ$H#soQ1ey8_tٷjI>C5u}5W%T@ "L%' 9r*(b;ҹFdpEFfmF%x%hft"+w3@)ʃ7UURtW6m͡XFca|s p$UNr_9̹yp%}8O/^-g=)52&D <)9&'أٴ 3/lċ֙H}/HS8^7b/P x@ ^=RD+Zj#fA52n:$t*wA#g'6{rqQUыilt@ׁJK_HѨ 쳧٢Y *$[Yj Cxtlqۙ6}mΩxJ3x8AwOē T #BT@)K(׏|(s?4'}u6f΢qN_iz# *Pp-<ʚH%6 OC6 : PcK`֖$e^"ߪ~l.Dʤ beF՚K;Oo%Zv-:y C)b5b )^77C[nZ+8xJ ' |H5{]"؇y'qc{LL 26b=[) ]#Admt8mwݻbn@@WA~zy)EQr )RXڨW S^d fd%~\Wq?`(3'7oCg9hM(챴g"ڍ/׷=r5d\u.QW9T;濩 ? 0 #qh.^[6 WfZdy7N9-lr!"Rl+o\k5e-D7ZN1ļs|(Wy&j6eIEEѐK{oYY=RsQW%d^JO߯T1j-1UgL '5- Z# 8(^V}SM _8~+2b-2/r9ϗ_ac2w3@II xu $ZM-OkG%Y"o:Um%p UyⲄV">(Bq;A?ԁckA "0IML{vؽ7^8e (Aa̶N_B[2Rib6˦NI8^gekDIb7غ؃WS{!6-. HKkղ;8 #c{g Ϸ]jkIE=M,Ol]&@ ./+k '~{\uzhZXHYq|0W'|+Oqd;{@QJHk6=x1=4f+5xBTӋn,APU2w-PA)U\Ra 9 ͑sj+?N_>oY6z>XnkYW9+fH{uɓGr ]"t;ཪzԢ~}Iy1)v rk?ջzBNc~jwmmc3?_,un-8bcge5002pI^ıDk(Lf3y2%?ܯ &^|ju- XC{|b":B"A*tq/7>=/`ϜA܈űFbm4h(G`"p l*x.} #Gft· ^蓦.Zy5=>E}V1QՋT(H(ר$=*-?T[V sMQu,jU&uEG3gFLplzq҆9k=ee H(@l7=ǘx;RmgI{;اomFY#P/\`|:[I(Z# 5Dd-QcXgg#Q(9F̌w8kٔtF͡ HK_yMQق%DrnY .۸j0ɧJ ڪ٨";txuf-ns*^&q=yHO~vptc ?ͯWxogwe,yTcZ.Q^GM DrѬ2*,bsjzڴQ0vlsĎ2%ͮ\D Nl@%ڬoRPfD\+]J;^EX_9ƘbK[RC(7Cw[!#_AHP4Ycw;o*RЌ݊[s{K41vqBze.V2d 0燶6TS OD uP=B II*rSUX$l79jp#QlcXe#&8 2-JSM?w?E %RU:3>`j$EP5HwΓV49޵=>֏" ϧ.%u<}vu,&L [Wq9\\7+@Z cEA;$K%D`2yĥ`k4ܯVM7wlܧ}-UZIkO<#X!A@VrdkЖa=n!\ ?: v->?T. ?p埕EfZsR#Fd1w~:6\_Fv$jH1!K$ėNjf!"(좙vM~ Fteo`6J4F+ k&p)4JMԖtێwMn]\<>K]l_z=L[8zlUsK97d69 Fll%; r"42?f*Mc'~&?Q?s3Ko^ѻ^U 5{[]ꏾD[v7ݾ)I@Wn۫EA6g , jmEUDZ aEz@EQ~jBC*Ss.JC544,k|sZ&njR6mz(Is_oe AT]MwPKoTӀ9MMlȏsod7[#;9#.ԑK"Yhx`{T)'{_ҵ6/-Y6z#*i#/jOL8ܻ:4"S 5Klu+& '7lԜh/!^}0PwIYK{vyHzrSXì4v2 w g-uuE7@1\1_%lVn\4pQKaa1MC~bMslG&a[HI9uDve# Iԃ~c٠fQ~%98'k7 YQ0IBOեHS3ySce[~>~>_>25D+NzPU4<1%IإH6nNp Y/?37(/yd[ŵ֐>QQ֘׍ 3[EbXܵf#ADXF?TJȆE59˚O*W3u(,תQ{!,nZtt 7M7M~3GN'ui βfrzTf둋#6w:wnKSY"'2 IH!R}Xeߥz랑~*eM}j ߼p=]\*FLw.4_>x'3׉9_ Z?c@oM5ZGD|ށHZvlɝN9ZnL V)1'=;{\<]%x?q#-1^]BKi\%Hw2e*ƆtϞџatΝow $TMԟ'ߵq/I+O[ TSDJ`J{Ioq@>(T${޼{(Źcֵ镎% geVHTuտR?\Zօ$&kF)Sh9zԎ01H7iqVRoUfDIvl*uC2ڈ64︬`+r\ꧦ=u҉QjqN%kG҇#M(I![;0>f⟎oեn?Muz1M1pG,J:4"cFV?N\¶);+'/]=shZ'9boݎ\3&EYwkag5άRV$k/ϳrs|veUqw:Wd[.}ˣ$7wV,^dmTdb&TM4}H2|'FCSM)&udDGyfN*J*x܆)߉:<.\pK #/.& "j@t{F]o㚡yݾ7i%(gWy;M=܈Ӻ7~ϝ:d>n^% zyؒ%7F(cE/eH!DmQ64i#7m|nrdr,mDطpCMc#CqE!mUZE!OVBf/<8hS6`!؃ ʪtYFҥHJZ$1⋾۵CÙBYFMejɩ'Ovɲ2{Š6XJ 'y5 {xRO t2;zNΞئG߻KRwbY"4uMՈe"mX/hGnߌ`R䟑Lg^\/>,Ϩ3' yD kOir4XmK?&@@F, u]̤\l Jk}^urR{m "Sq^s(<)>[C%x>)\s7 ]F)[֯fqI׎{[+7OD.098AR6αg^~?@\*wѲ@ 5<6D~ԏ*5BC 2~>~Ḉ*Y\$߬ _swl:h F#Wno1#`mjvtHc뇚nC-jD͆i5yr11Ĉ"G܈X" ?S1V zu]P'd=&h ("%-å'쟻 ۮI['֮=7 6J +]{x8>!"$\g V#u<ojdzw5i¢.9"Y8N͆ݻ;w7n|}'Nُ?Dsx IDATo UehqpRu箒u6@l(5.y }DxOG~32]4i$B:ڐj3s*d!hy"V*W.6~36l26ܰvhb,6:6D qD(D }夘Ŷ/U+N %8 z~ J/j6 HA@N0m 8|+oOLm&6R4mK]D{xQ7D%o!-?h{,ܹ9ͷdQh#bͲӬbū^uc䎸;~쩠nKQ[[}B0@49s枷#Gۏ>C}}MXjqP?zï5̬Y\T{ޱGT%ph첵 ?}h7ˡ6&Z-T(X*޸4֝z qPsMn=ߤX_X$ltC[[^#9}YR58ZPJSܜzg?v,!˪Ī=a03r o+Ȏfj>@'p.U_. 2Hr qZ@~B[b lLO"vXH-BˑF^sIbH82U[$ӹĊk ݐ8W$?Wq"ǟN+kۤNLLk%C™ni|RcPyDj<egz >EÖ@ ѳL ^Ed8:1mo{o28{YVa Qad <_Q;zZٜ U&!F2;gja*p6-'F2[{kfb `Ӳ$qzEx{twm~$l`q* U{Ș8pkoHHZ>yI/==[o4dzyCgnPE!mˊRKr6Z%43E*n ;qKNgl򤏨nL=@6{CZk)ΝTk:  +5A=Kq`9{ NIR]N#Dۦ\_ ,YXҵs ;oSjNnnDƚ+Oڻ:w._xE8md*lV'PE*F@F ow|}Qk4k9b$8VOT˰ 3q PEBU4㎈ٷ֊Z[͉3ֹx}.[cMrI&"f"껆0o ?%hV.cw`.[Ch"|3 fyd qꨄn4öӋ_ 8^D g;"`=AgsD}bt {ZC'ۡ;CSIdkCW((Sddk|9g\{ϙmoIJe#%89A3L41)Y*pwX5ycnn-wA:gNEG3im Abњ/'il‚0@+yCpՊI1%X{4|&>sVb8PƘz7,mɓ&T+*cn=~ ¹?rU=_nFS6(^y-/Eg|=kfo}*8wGzSQ?@}SufG$@ZAOܣIIu1ZacӤoc[ng=~;"іidd3w >״Ο>aT^۪xb".iDx͖*./3׌lP5h]P iZ:y8k[xYx;ijz}gia6*0eT٥S kХJW8^ mP*QI\(+Ҙ {XA6JLF/7Ow޽'|x~o|H\4x}b&vNsb Ca3]9(E:~fDEV·JHUH g{QoʀД=L&|j)rNOD)"j Q {UZ*"'~2"w1sNz`V ak+M.yCsnIEng(Q%9ްemBrqCk}:Gc3q5Ɖ|Iđ6!(%dAiߋ5Avu(v{.qpvp$H-+ͭ"UlڒD`[aVN 2U{i~&|WƐYm'Ð:z(v1`huI>AI.;Y%N ԑs$p ITHv X5TZF?Ho #KG CiRڬ}y|QV1ȳ4-J+`ѴjD"Zm)H1_:h^&3ә`Jt*V5w l; iNğtQt|Ln"Bµ!"h ƠattOfDd8 I%G f+2cnnWf& WSz(Eҡj/czJnB /?.ƊF"7zs}z N2V; We7M;t3 ;~2Zp6/5+IʓfzMpl||y`#i (! C2! ypAJvFRWⓚ\V+0C+vGE1N~x適r4~t7^Q0X\Xf-;+\zǐkӉn:xҸ+^ၛs˧ ,:82t1O94Iw7NJ8R7,ۼjQE&0q{ٛ)[' iqtWnNTiit}C _/YRj|A{JMfA Xl-zB M- u1C;tYiwpR/h.0`8`@Q84 KU{uٙv ON11 ڰ50*rB"kgT|T\6Q:V²6Bwwq4EWAݥK`,qBs%д;m}ٗf܉9jA7*j>UhQbvh8E2зqUu@O_V3&|S6ܐP I9GB NE7f("Iv#SFmnb$)*B,UkQ0@H"@Jt4)ojk~>H*+0p K^FEX)q`փheŞz.v"1dy9@5 "%yl9Nz]YDX愎l MÁ̙AlQKpϏ2-Lהr!PݢC}Lhz rOo¶7lJJ̤/|{wz jk"!EꙔ|>c7ܠ~օVhʛϓB4d5| Cr=L 2X31(rWI+O U qntdjyy'u nMcxDhq܎KMwݦojE6QO RV *SqÍoچ (%[F/UUaf|aa#:[mɯjobE&ǟⷽ8G)aInw9~FZ*r}T%Kjyk"_3QDQTJ)fX2H@uee"iYS.Q& &f̈́aI 0p+Vnw^QPe jZkn镳ܞ3 BѭLl ZO񭷖ghmH(~hV7kKGw_GWԤ|SgZXjgl-A 7Jr(e+CڋҜ}WOݞMn@ggK2!ܷW^7Wͅve5Y[ ne^lLGt{NE1&:ߡ\+bt.\lx_xL/~GBR}u_ ETvbX}ox+MU=<>4{Qʱ-w)WsW3SsLXYO I@R0:2U%5qZNy"^ohpi ,[bìDir<LO &D8=c Ɛa""&]( H%4>{ujVYapթg?ڥfeHayKD2Qy&E&&6v+o]#A- 4jDcs&M;&#Zb"cH 03n⍳> [_ľ6|>™ 3}cY%|״ߚUt9bD@x 1n8VnSm$l=s⦧l4kؽ@E8I‰~O_^[o]Yг&^Ҽ4I9MJbV5ƀ drH~f`~8jT50_䛿w@$KɅ}\-RT $z]VI׹> sђ&qW`2ԝ͖Dmr~.჆@R"$ "0 ,Li12PٺVE2U;"1d-[ˁՂ$xCL丛ߚca}C|fqQwՋt9%.gw );EK7_xrZXaybJ"yZ(Ad6;,}su9,[˞0zQzhCk?3c w k\ʓд hLKi=T`^bW]"Eٔ]T!-YAŸ`a촼"Kʖ·ll72! 2"@N33d%E`N'YY뷻IoF\ܞX]]:S1{֖8Ti|}RYO¨ <|uQ)Z'O[5@# ]"%IcO#w#;!Ɂi(J4L+絠`K֪F$*LWhnx&aAB:M`e,U<\rJ!1,/D;3T*BO-VRQdķo7 &1^$jc٭{̌)!ݫGe߉j9/13gw94XSZ6LV;In?{n֘l;:JE5VՉ@&~@?ڼЀr.Ѫ{7^֧OJAJ>שՌr?s=|Xm!^i.KIA*H*bySYL40^ "Vc(M=ƚv\sns.z̙\l^1s NUEQwoz9Qv=>K"N^8˞W K&x܌hjL&n*Θrtziz}IHijJ=|C  bZ^Nv!"8Z'LMPbWY Jn}ѐwC2 Jbc<QlJ"]@h'hf`r'Y_? AJ a"޷\£s.qRG!9I.87s`Wn趩Ѫ?02=n/y IU=OoO SL&A'aW_L: ɀT+ 崷J~cO1x9` ?CQEe X*F0ٳ !3oF^@Z cێ-`tR³|y~qi$xx&$ }/ uؘs0>'p7y+kp[\sk'5mnd&bNo)=L+OSNke5{9*"}U&?SzaEnՁRMCn0k;X4dJ.SFq>'щOQQ )|af1wKHk #*AIZ-BAdL$&= hę)/fic6HC04DwR1 p IDATl|鴷=/SN>٠^#R4=c~9ݹ[7LkEY) 2hrW0x\0!#ʓJ̪sG!?'|J}4s j[-jN>|4S S ;ʲ4_AW @ ]QhNH':FDDjm@C }J*P^|O5+t"ITS]S1m& %NPO&/_x^GͥI@LMඃy1VD1n82imȩT\%Pt iN省'ĩև~uA'1bouzZ% LQ2Zepcɝ]iu쯚m_Cm bg&%Ֆ"l"@"BTT` iZ5~f ;0fMZ&2e)/~޾co_ƥZXw\1h11)#kOhN"tRW,PcxDb77E'_#SǓX,s 6S:A4@N2 Tׁ% ab A:)^c@€wzōP%*U B2Um#QD*j͇@%>ؔp [EҢ}o>2KZ!œvsrI/FmH`` *PQ>jIg&/y#@ڦ~˜ЊT/)a5\Y[beo[14\uo|΍% ],.8Cl԰&"v\Xw ؚ͚ٺ9N6wզ" X* }"!s}K4Oi9% tM*XɵLF[n>?'O}TI^':ryWK^k(OD_H2B.'  -jsjDf}j?|L7`s7ZN -J y@NT <1Ӥ-0@/W`€A)0 9"k(%|-7OF϶윕>kbNy4R6sZ&D4~--jUs| -'=ꯋ 4PaRT<]-G0?oW%=HT"f>D&k\9{={n<п޹'43 X Z}0&1 .:6}8ID$:\aJHPe`o ) U'}iBHhjZ@*1GwAoPQ+fKuXT AjoH"¬N5 r&y/^.SmYeyX+ˌ1#%IIUn %$mL䏎{N 䂥$ U") Cԏcq-;&^b;qS\5q(Tg)!< _xf|[pp8̢IrBn|O+$EF_ `-z==xX'TIMՙ('{I=^]w_s+ $hGsp )SI.W^u&ʣc!*/|PEdtLc#Dl\W@ !XRb mh2+K9<`Li-D5F%NE G!ݾBBXseMo$"đI\)R,zA3\,N]R,)[~^w8(1(dr'|I7k'n( 3y$8 յ􈥌*Vp0kK̹gtG}Ƣ+ f8/YnwםgNUzaÝ_tʬGɘ9[Y/_,f $$wT+9^~{$?\EAALW!uѯJp*ay-읆S*ClijFO1挱)+#T"T( avV4ŋ(1 mdVk/^Z`I_m2TNL@kK9I%T+Ce5Cfn(Nb^/O_~2RL9XR%2@DK]Z! &#! 40 BYRK0l`dTkyP*T7 *j7I&żFz|D qO#8Î'gg@4BZe5k+OIFT@ХY$5:`z99V}8rCp=A$?GIJr B6+6o<1x˵0ʶq>U@h=OO|>~970<>y}(ozM6YIv{i/XZAd2` 0Q՞BUWjBTfx:dC_9\3>zj5Ww 'JPj"{y*ѨYnR71_ I?~/0@E~8֗m1qV>'+m|=t2Ҩˮ XhʭO5ʼ8` kkt&Y!K b0 7M1# !z` 2i$kRcrcęit~EB%:8Y$.YPf7F݇;1^`&5׿ WDKk'}H@ '@ dP=H 0P؀..O}ykvCxӝ޻-irTK\ sc$_|r c*!}Ȇ..a(_u\K.i3{9b'ۼW|C{Ll5[^4–EH02ʤ.ZL]H  5tI5lE\bGA[z";Ɔ$z#k]5& zy.mM8% cuzk\)H/Iд1spOuE:ƙ7VYEeTлA5WIw6J eA0A*V#~mcMۉ-A##9rbj5.ػO{R|%@H{p://uXHU_K; (xmQ$U!mS N?s3/*֪ ֛ / QxlUi"_+6&XljKh:0@&ET|+OAϒ uK"U" DuaH9њNSDe$ R;I~YY^ic_ j^8:vazm!iiZDZ6 "PϢfo6Bry[ {zgϘՂ*QI UJZ=U˿ $חK ^@_|4~3jtI6@U*$9?sxF*&L;u IէvG0dSLc@=F UPQ=TdbL I)[' `8pD1nmܠ*,(i6Z5L7x~ ol7#K7U UeW eZD9w MLD7ƸgmV@6E&gexDd UðS:[,"Yj賈#MAN6E=]YuÞz!ν.9gp?0sR=hO[h=J.v>w~<\wu pb9p[i>W(:d{w >yڦJ[6NQ֧N/ͧxt "f:3fl*$JC$cfuz1OYMS: \=zpZ/h0ҲpnLj-sDa3Snzb09!Sӵ`j"B6&-$UNK% >~{ݺ˶&YT)a-]#Moyo`c틗jֳD-}@vGcJ¤͑>4z 9ՐipCxP̚o}X9hRdPا19ub4.&(!6)/L IDAT))&2sq5$Ņ?9}>9r;(>jz*IXy e=$2ФLdˠ||v2 3ɷfhspNeyET-)[u?ĘI!m'"&'S'⥥sr8% [[(Ǣ6/pWZx BCDc5(͕(&jF]k+w&7KC(WѬeR[@,>pwo0: 7x_ȕ Boq-\G0UˋV7j<3br2##c@ 60ѤJd*lt9ƗzIK)ʓ%Ԕ"woT5&\ X(nnޥkv;$זy@ c)p;I%*mozD)-,ش_B~o/?.U&[2geYu&}5υ͌Җ* % Z$$C%M,I-?r5VLw3HHAB .232Dċx5qIQY(UEd3Ϸ?30R b ,^r]pGbHԳ b2.)\rhLoB4ω$h4xl@XpL%IzݵgE!")0[)<[yJSL׏8P |_k],¥"ted_>$8}cJ ͒w7q b!`Ϸ ;qW\,$5xZp~V\iC}2~(OTPb*Ss(E(181y^TJPUB+`, Q mVV~EPC"An<=/v晴A%mV(CЃʹ/홳ZfÚd[-%3F`޶{ZmŖKOfus;7&'Q:"۱VԠL7k>`v̜;[:[qix,D̫Ĭ +0-,%O܅'XYI CiޚD1؞ !Fx<_BX/7tHADTPeH ,kxyl8@|q$[06T!gE8ʸw!:t(w6d}o[f38#?ϟ7mD$DF$eY8W8[N Zz XL9`pvS>>ME,iڟx؍H"3AkBhHIʃ!y䢥a ,D0caJ!$K"}9(vӞ9Lo>ӬGci[ըDL$!g("N9OPD d`iPg(dJ{3_O<|'7Q$9Lh&eS,_HF&DCsj إF7Q ƪJlg7E JToRaJ[CP'ԁ >sKJTFz/ٞR=*&t#xk6p %*jE`,/{qo 0^ѮBIʞG.HG2 |"EL1V8z%bW1P s7!"70`J'A+#Ҳ 7y}|R)v HPՆ|({m@h.⹋oڙ?~NOD=/7}mSa@IyaR"Ԕ7Y)vKqUV^Ԫ<j-Cu|&VvEYslM,=Y[VQB"Ycڤ@QS~߼׽P$ Z6a^֨4ta!TH)ϑ' |`B9]}fm<' !' +ɐej3$=&} 5sB 8]$" sijW +i\Ax,ehM(g0hF4mbdZJ/sl$^$oG&~_4鑓a4 w-56xGFt5RPD=2аVX\D;J]7|-'$#_s%Ե*!մZu[&'-VO;Q?yI!X"Lj揝}ˬ'x o$J!Y[+`a~%MOz{T%l{Q&]Tr,6hXLnl;h۸cƉe4Z-!2Q-"u[4v4$̆h=TH}0fC=34bVDdٞ&5K6pd)[zP.-Q0Hi#Wﳾt|Ҝ8<Pd59dI k&gZN%"l TҨ&C}2 ƷFQ 1CX ;`)@ şz\d+<rcW-O:}?=^|_ {z p1h1*8ح3! " ˈi*]aA k>6:y}$>jKVtRgW:QyKu^-4Uk^SZ81-o< R;%V|iҜYOL@d)K!-Q8;T ʝ_CƦJ^#`"y)@ªLNi21 %BJ9o`@ !e%0(T2"d=;5GAynx` M zaόAϦvԮzItH3UFȨ$V,AUmgm@ S[l!ڮC%4P0ɀ/p`G1> |ݫϮ s49䎜#s8R$1CEagX? xυk+FO7!rai@bs1M4)x !S}L?;#n#uARI>ܯ Cx)#P ɤOXK# _͗g"==5hw*.m 9/u//^E4 -Xw4G@a%$a3?60 uXɒ. )oqBQ'( WRuGe]#wGZgR g.<,i\OT.Oex{QnԔ Jb3ruu}ߙIԥ~ ӛfZ9?t/cfay 8*/a׫{Wo^Gհ_:5`wD LqN41 l"{ 0 pGH8`,,,@93=o9|qdpyd$b^;sFڧ=I)(2R#Bʸ!'Adҏ|_\V1\`"1 nwa| <"z>;U4Ql22uXJ,ӐIF>#>GRqLIM#ea7}s$4 :{ /Iԣ+tI`/t' h*&љ3t6DRGfHZcI(tS!LF#oZ{t؊zmz#ZP Z6㩊2V i+} Q&cdmf"m#[uzXP gdnlI C~sx/\J[/[kDjl)XL 8=FwlK[S۶jy|͟I~ 3 #MR90{}y y؆rA%pikFpRfw5&fdӎ h7DvՋ{ǙYmy> EX<b mcԗY-f׏_vܧpUں1FSyb3)QS&1%I !5k"歈ҵ_w\+~u"=y|䙉I'HSevnĔG_dG?s>&[!`NJ*9>9nW:]%zLLCBYfm(* ,"I·AD  ibX.b32ad4,}X #1# 5`K'ةY[jUfZޞ0f:Dܞ-kA:X/ՒX@ifER᪰U/:@Uf;6iBWkv׾Gv? $>M Adlǀǽ?DTyJ%ͤfv߫Tԣ*C'C(+ؗX?l+=TX iH"b@qu6Prms9@jVF0&]6Et$yyVf8 l.S&F62ޭeOn'hu-jz;\ncV-v..S?LZl_  S9g*%|W \G(Abޝ ګ_/zDϒZ4$٤ C/ -AΞME+*:pe%]kJ1WgM0)kja_RS Y $B )s8r"OU"92r֜@D*d;fMe ӗLcIXy:SLFTIKHK ulS4& ҁWKR-ZȀH1JAK騯"dafjDu|AzVGcM[ΣGf z[ɪn<3I~B&VDݸW@6W8 [RRˋnt{a7nyQЛD;]te6J^_ g7@D8IzS8y?9.oZ܏]E)>BD HHBl݅]! ʑ +Q sa hq'YPb|XX8lVi!Ih`-NEi5LI-L&i݊p T.)MYCP@Xnܮ!0λ7#ڀ;Z%&{ϣV[oɴ:70:P`hZuMK{9>l?Pԣ(zۜ"%-->^zZ/YN;m6Xr%D&5`P̃l<%7 T DĞĒXaJfhC3CʓXbBk UbU5 IDATu"U[fYBَaLLV=.roCV4jAx;ZURKrҔT FX5iR;yZJ7.7Wӗh#  ܧ`voutO5Ϟ.juq3$ҞJA!($x(Y3o)H󳴳ݰgrvl1ɜH]$ QJJbZNJUmҐ4LJzzl=?d`Hh ҪN , `A!@īgI$dqFbR  rPjbS7}ByiqtzȌXիoiᣟY*[H`՚WN;q~;-\$#l׭Z=dߨvܰ:[~7$)x>H66MכⴡX\wcu j,wna&1{xf1Q7|!i9Y'URؐ8mX*$GZٽ|F?/{K_&2Co~QOc2ERyyn8, LO7T[2P@_@Uµ_"ŪVSq ibu-Yk Vjt9vl}\1U#)@ = '`s{^ sPԍyt#C*Ccjj*Ձ^G`n I}:mkqZ!Q")@>)DusYZ[:櫞F@$T\Do Sk: U|/%s7Z9v*Oyάxy JVH5H6$pސBd XUnmb"#@یf]%04mسsjaBQ2vg^"#NܷkD8=g+jeĶ6~tY۪v/йk , Y&C"_ɧ-<Оr#*U"90/oU&^(bG$#V038YjE>HqU8?Z} )[?W׿~0bӜYܣ6ȐtS_}]=3RV馹n^c^\Ii[KWN^>9ϭ5P0+,1i3@67R-r̂(5h@YȦZZ%PL5cY!-2Lз3dÄkݛ-V)1&߳bP u 2;&OCPHH+x߽w<Ԭ}M%cumIǾ;a\A?5E-FJN}o~7y*m`X%)spq"F>Ouȁ UXkKj 9{J}{B(CgՎ6He9^t~˛Z=ՉzqnE.cs#sq [CGd%7i?ԥ'g.:e.^6(uDFc =j,Ҵ4sৃFg>J`KߓACɿ!$J;߶.&0jDcbr1995==*u|V[m=vjpSBr%g*D7٧(eC87 :H$=\n3y˧<+Q7F~<կյwnQXA{`գk bfY[Gެ\_|M"8VlL1DDQWѬ,cRؑ{>H&_Go&-EΨdW M+=gR|L4='q- '^)Ӊ:gVZ9r怗XG /cɹE0 %QTSL`!) S%p$bZ#.6EDko"A@VllҨ{~fŤ=5N۵pb%5G·YG7Qk9툀^0%gIb_|WO}HiU!E6*Hx[ !f#;DW(~%p>?Wm`.cbmj_lBQ"33Uy~B}ӫm R2e&Y.BhJ[W=2!I%V tmy}ixVx˲A[_5&i2zsښjbXIƔsQRؖd*2M햀<}B%"{/b:(f!X!+BbZ\XX'O@,(y4q7[X5SnN$. s/1I[{k6NM+ޢ?y>p%Zpcw㝙'khr|!xOg.K+)<Ž,%!ΨjٛU U۶IPNO\@h6~o;R~ gzڔ }[@ T^[aP V,$ǎ_:}(2I%+L4-jw!u`qnn< PNǮ s`B DijS3REW T!rY`Ur+%ɭ-6vqT33W~G?hQAaok D'JV(%%',0T d)6sއrZCQ;^_F]g2C%‰Tr7!^vw/hu RmOA]/Ix%-/ ݻݻ/^ deVjܹx:^\uQO2DL.ƻC4A Yp"@2.$dljA%"3cBQ6igGudwAI\yA8-w1xK;n[wB򛿍ex=J9 +[z_H@{^!_O֭V^;l7sܙHPȺ3dI t2o`/T*21a j}znŜC+%2`GJK\)pzioGhW2Q?3гvW *!*!m!IS'q_Z2͕rZx*p6b `*1\ג3uf[w?I3caHD勗wڎ8+͗ г1S;w{^EI+uz I{*qð6ɾGv{ֺg¼X!K`GJMnKP xĂXfgd*{~W~- mC^-mhq3C=ƯӠ4([VVdv& zI_Wٲe-_tWqH}|[;u:Xov&qTLlRLʱJX)3.Bb)buq,9"kr='n#S)۰0Q" Yr}Oܾm yY#Xk5-ͥvAD ÜUJw'wX!޾Un񵔂=/QƌpRy!'UV/-Q"ۍfu՟YӕʆyYC) ~($?o^PfQ<}Oɧ@u5̑zI2^̺VCm[kEҒ:}sZ\j 4MI8C3DN!QfiF SYdAs3!ܥްiZ8kyЁx{;uAk=,K`u5lGXGzѡC_#w5x{ic. W4S$6>I Q֭פLb?1²lC4^J jv&~wRdo$۞г+Kҗ pSTRK>'8(x0ưVZX0~,g(Hx[OSJ4ueGɆ=}~awey#XQ~ hVwT r, ߭$gas$}E-dmrVCaljӧӧX;u*Dӝnit*&Sd!z]Iʋ]|rɉ3BMjo}gխ*UrŎ8T^݆Zۆya% ͠$j}.Bx;1qȦ-(f?D`F3!tO0L,~_u,ZWf13;n L}]`ջ9tzZrRZ):0KnFI$Hy"-0ѧ;sas~MAMzΗta_siuΆCm<ō8GmvKBE19I׮|?z}%I&։7;i Mn fZLdK_rͽ^ږ7=i ٶ}Gӣ''N&N'Im'(IS=-̖awHʒVjqiW35Պ}뽩g]`\V//?NV~S)n0f;V oEVvzQa|2~DC5Fd"7A9yX7yyٳS02=?3FG(eǀvl4ma@Cg՜{ 8*b {oK6 ''09=2w(w$y}t)gWD`5}uCut^J3kficEIY%+ьc՟dώP`ͩP?G?M|cGT&P󓛎2Ȋ+x^'~iZ+wp~ǎ;N/n{{J:zP~_͟O^Zn&utnW<rK L)u/>dn>خ^^=oIVV؉L6r7I < OƏk17+AgFuuZ32IDAT}mSFbxOS|r~'/-7яfT kŮкl18%wWW'|$UnI~z1#]ISҒ>ǝ"#ю9yk=K_ܞ29yn:W-/GK c3g%Qlk幮"hMsyGP/i{`?~L$!n оﯾrb҄,H=S˒kXaā\/LW*: t`k`0#O,ϟ<~l˓ǦZdR69N4PtbRI"F{b>Jyc#HQ/<&bb02%c&^ÒsˌW)rX:Pf#ZQs5Zj&+J2v>٘yK#|mO󕈻$Z}8V1k$,KRc#}!1}ʕUԪA~j?w%JR@( _$dkz䎉^ie]ףt[Q/qԵHJ >Q2e3(1ʤ$  70T a"^o#=[Z;T*>]m gw%d =PMIȋLRO7HA:1&7-!|m7,Yr` ̎,إ=GKE(IS}63A*vɴfi\zmh.UuE*MI -T|I /H/=e[e^wyW{$ݿ U;ՏVwi/݊j/@r5XDTǤHr=Z]IA9b׶iVKod;oxjG\w~Wq3.8'FgÚhߧrֺaSw4F`B U Ǜ8.Veentk,iky>?7V+hNr7yՌ``hsM=F*wWyDԜcikmwIAXw(Q& Gxӳ iFI_D  )'{Q$=>SIRѹ-K㼸"Jgqrtcc/iVh.4.*M aY/ OړR5 ,3snF=$&3&Q!\ggg)d pz0MoR)wZnox~M E`}v]LOϠlB$Kѿk'$2 O6K^]I^R\>:T*$APA4MΛqw ,,ё6Nky}F;7IBq7z8\,RYk%LlZ%lvz8I6%L߹ڶ GRJf2Tf_ //-j0IE7RJNNSU[<\*Pj}~v[reT$k5ɏ~_m4 K8ELJZ qgʓ; K6H w"y/ys#(ia, amP[QeYQQaQa:6t$zX>짎&Qu\m0jcz?&Uum@WKhuIENDB`GvRng_4.4/gui-gtk/pixmaps/gvrIcon.bmp0000644000175000017500000003006611326063740016342 0ustar stasstasBM606(@@0 哟䙗zxb_KI8452jz㓒wuZW?;3/1.1-0-0,.,.+NTvv菍nkOM@<<88451403/2.1.1-0-/,.+.+87m}vv뫩ߌmkWULJB@:8857473625151403/2.3085=;:7.+.*.*_ivvvv覤݈qn`]NK@<=:<8:8979786857573:3?3F3P8MHUU`ajkpnttJH.*.*BCrvvvvw礢܈qnZWGDB?A>@=?@=@=?;A:I7T1X+a'w#Ȼ %+5OPKi郅~A@-*-)JKuvvvvv|~ge\YUSONKIJGIFHEHDFCEBEADAME`GoC@@wD`FSFJDGAH;S5k+"&/EQ[{aa0,-)/+qvvvvvyYVRNPMOLNLMKLJKIJIHHFFDCDBXWefon|wqZNULBLM=L/B/N5_uZ_O?N=MM>MM=PA`TvjxB3B2A1B2~w|:7+(*'`ivvvvvvMILH;9!  !')nsajPBOCNBM?REcYphwo}ryB2A1@0B1|}mj+(*'CDsvvvvvPLKGFD'+"'%)('FGQEOBN@NAPG`bfdkcpgme]Npbm`A2A0?.B241+'+(grvvvvvwhdKGIF->-YK/+*&0.svvvvv~_[IEHD89=>ꑑafO@N?M>L>995:Y^chesf|VUE4E3D3C2B1A1B1F7J;O@SE]Q隩A5*&*&S[vwvvvvIEGDA>nnREO>M>M>K=97LOhngmfiflSOE5F6WHeXpj|yg*&*&75n~vvvvvQMGCFB襤‹O?N=M=MMM>MM=LD>SM=L;K:J:I9ZIui<,;+LCFC)%)$JKxvvvvv}A>A=_?JIK;J:J:H8H7bO°uI:=,<+;+K>ʓ+'(%1/qvvvvvHE?.=-<,;+:*<+߱=4(%($GMvvvvvvca?<>;f4CIJ:H8H8F6F5E4D3C3B3A2@/?.>.>-=,<,;+<-=.\Xe(%($22j{vvvvv~@==;@9&CEH8G7F5E3D3C3C2A2A0@/?.>-=,<+<,I?tvs6,)$(#R[vvvvvzXU=:<9b'8VF8F4E3D2C2B1A1@/?.>-=,@1VOzfG(%($67ovvvvv=:<9E3"5Z?EB:A5A3@4H9QD\Ssqp2*($(#Xdvvvvv}GD;8;7i#'TqlyT>)$($;Dus)&)$33k|vvvvvyv8473>2;3/2.TRØec*'*%20ixvvvvv~sp3/2-;7뚚1.*&)%MUvvvvvx3/1-1-a^͙NK*'*&55mvvvvvNK1-0,<9us0,*&*&Yevvvvvw3/0,1-kiב@=+'*&;=svvvvvA>0,/+A>c`-*+',(_lvvvvvyzx/,.*.+3/,(+'@Cvvvvvv:7.*-)-),(1/fuvvvvvz_\.*-)-),(KRvvvvvv0,-),(55k|vvvvvwOL-),(QZvvvvvw-)99pvvvvv51]jvvvvvwuvvvvvGvRng_4.4/gui-gtk/pixmaps/guido_n.svg0000644000175000017500000000532411326063740016377 0ustar stasstas image/svg+xml G GvRng_4.4/gui-gtk/pixmaps/Xo_s.png0000644000175000017500000000207411326063740015647 0ustar stasstasPNG  IHDR&5- pHYs  gAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxڼ=Ag S], \be !+v F0 9I  8sp.w۝;L{}CZw>5X/^}D~н}ώ!iԦq'ReGg1PEB. ٩@ȏɓ'yj;.Lar08h|,̭3]f 8:5>cBv+o4ky يzq 3$/jPe~WF`g @&ڗ0/m`NE/h?A+vkM:2aZPU 8>vh 3]υ:S$Ȕ?Cl\׵Y11_-1/`~m3C`uM,J}^ LA|哴7PP޴em&XH@Z&ggp K_g Eܺ`6Plq-!YBY!@ef*.m ffgÝBex|`hN39V( *2ɔ fH_k¹hPg%2"CpnlmAy!)^ATp,[LW..> MVqV*ANf-\"n?]Rg?iWIZ8lYa*N;0/gӜ^dUևLqvLN"*0? "THIENDB`GvRng_4.4/gui-gtk/pixmaps/gvrIcon-big.png0000644000175000017500000001111711326063740017103 0ustar stasstasPNG  IHDR9;"bKGD pHYs  ZtIME  ԡtEXtCommentCreated with The GIMPd%nIDATh՛Yy_w}4iF;` $̎m@ 8)`yHRyICTޒSE^RqbboEHHwfwh,`#@SSw;?Ub739d&f& @jdZ3npVZyDeBϚb;yR3LN7 3ګ_hϡ 'Z*ג @~ц ݷwd SnCkʁ7L< e}0bU_ 2uO:(088Bc=~Lr5%4GtmN6a/%q;A@Dg'\KhrYLck=^/ˇKͲXKm0r4HyKߒc~VS56b't_w-͑H(2LO6 ;|[/Yɝ:>z7n$L"$֯F? '{'ozAŠܱX J E.R9tn s!@{J:/ !G׵;H(ѧOMPsd ccy{/YINJ j[q#d##n M1?=QtjL/ QˈgT,A[[.L:~';Va _4,9` EGЊBS]>B*C昹@JS \!Uwp(lcn/[DH`mzNi?WnƮçk_P;%GyS.OD槣T1BP]+1"Y`xck oY;~ XVRQc qwhXJztyٔ>6Dў.jJ _z(jxR*DPXct<(mmaJ)\dž.!'_} 4+M JōBā?rD$l='~mi݀WkG] J.tY'ʞs\u#Z:DUF\@ .J=c]_xl5c}8mVq")k#մѢ%̻P. PA3=xq})LfYv>{{ _R]#*ܑ#ph(3j@&x+{z͊EƔxD&PL\ ]G:>~`zmu`yAC}xu'TBD&Gj"ݺMvq"*DB* }]pEE{8 55>EVb~jqz65 CU]. ;1sW\M6=Le%>**ъWd( зpa* !+]<7C,[E4;w*x]X2[T@F^")TATQk<5j,d+^`szRf)q'1_)P<9ƚ_xǎhdUrѣ+ARK2D 䜁嬤 ۼ;m~ȍ1\>'B#ơcgUÉ*aJÚ>űfahb*cQ. 0X;kOf)K[oZw5yhS/V %u%Hzz 7ݪlZga<\T%b][#Ͻlس&_1Zl Wr(P6 G49oNCm8bw-MMiv>!Q뾷ڝe0k /N,Kv%DmٌpfP-⦫nQVVڗ.]OXĿȖmDç19ү`y7jZRoSI'T1~@, f[ hYlZi;m$>J W|L:m[ڹŬ޶s^=hR@  FT"`rFGEYhiWV,lI/ =7t UywrbN]f۶:w?!ae#zݰWO"ܼp-(Aj%)0٭hoZUv%#N8Pe MFKv%vT* <SUiw *z"< ҿ*w 6J†yb8jAMI!W"Q!S"1 SK;$WqvpiV$?w=j_^S q]8x{e_O[GENi\iI%eAB crϨ0;g3oÅuq Ӕ<$B6%޳ \ .ۺ~1*,M?Gyn7?}ڙ9հA*TrԸwlq[qT D0}ATJ͢Z ӳ65O|O~HD"D~pb>Lm4 2kXFA/R6Nnj q],a%e)eyLpEYB`FD`ۦತg|WpGS+6'"UjI@dׯKy[kUYLޥR):U plo7!" ][;o-_U[ԁ|PQtv$I8dag2B$;A'cK N*NBV"Hb<2 ]X^q%x ۄ͛l{-RM ]Yl.\ߧTg =Ɗo 9U|o 뮕MTW+O;/z~Xeb* } Vpmn' MQq;x?v#2.$ARV]f1x(t5`ibXȊ'%|26~% [/uXC^3`J  &6>QS#T $--]X߄Dbך ^|-U,.ֵY!i ?\[W$1Z bvȼ.G܇J"{o%N[/n{R3$0X(Ql"jوw8Nggɔ grE "~9ǶlB\Ϧ92쬰e HeUEe[-@˭X2VRJ$SI2qJ*8]= `c])dx33Tc8)]ըz>9xu b)IV'9`$㬦`PDU+-].[+MZmJ"̚#H{κ!;pj`,s'X!dmWIqȅ^vt4q1jSSx(61ѰjTQUb@- WK5_.~NbO"RÊB鉀Lxe}bՉ: Lпn57ܲj ](G#;auc1㔦3T2*ss`*BJDR +0L7){qXk+EgxkC1Hֶ8dώu>㔁U+qۈFߑ_< 9cTFG)R.JHBjfq^oTKp"0_,kmWfm׹e8:G\73Cmjwd3CӣTs>^kõ,? y׵45)tϣ yfGswwtB:Mil7=F~|jQ2ׁ`.b ۯ KO }\r'OjqxQSf2s8&{o"7}eI| z image/svg+xml G GvRng_4.4/gui-gtk/SimpleGladeApp.py0000644000175000017500000003276411326063740015762 0ustar stasstas""" SimpleGladeApp.py Module that provides an object oriented abstraction to pygtk and libglade. Copyright (C) 2004 Sandino Flores Moreno """ # This library is free software; you can redistribute it and/or # modify it under the terms of the GNU Lesser General Public # License as published by the Free Software Foundation; either # version 2.1 of the License, or (at your option) any later version. # # This library is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public # License along with this library; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 # USA import logging import os import sys import re import tokenize import weakref import inspect import __builtin__ import pygtk #this is needed for py2exe if sys.platform == 'win32': #win32 platform, add the "lib" folder to the system path os.environ['PATH'] += ";lib;" else: #not win32, ensure version 2.0 of pygtk is imported pygtk.require('2.0') import gtk import gtk.glade module_logger = logging.getLogger("gvr.SimpleGladeApp") def bindtextdomain(app_name, lang='',locale_dir=None): """ Bind the domain represented by app_name to the locale directory locale_dir. It has the effect of loading translations, enabling applications for different languages. app_name: a domain to look for translations, tipically the name of an application. locale_dir: a directory with locales like locale_dir/lang_isocode/LC_MESSAGES/app_name.mo If omitted or None, then the current binding for app_name is used. """ module_logger.debug("bindtextdomain called with: %s %s %s" %\ (app_name, lang,locale_dir)) module_logger.debug("Setting gvr_gtk to locale: %s" % lang) try: import locale import gettext ## locale.setlocale(locale.LC_ALL, lang) gtk.glade.bindtextdomain(app_name, locale_dir) gettext.textdomain(app_name) gettext.install(app_name, locale_dir, unicode=1) except (IOError,locale.Error), e: print "Warning", app_name, e __builtin__.__dict__["_"] = lambda x : x class SimpleGladeApp: def __init__(self, path, root=None, domain=None, **kwargs): """ Load a glade file specified by glade_filename, using root as root widget and domain as the domain for translations. If it receives extra named arguments (argname=value), then they are used as attributes of the instance. path: path to a glade filename. If glade_filename cannot be found, then it will be searched in the same directory of the program (sys.argv[0]) root: the name of the widget that is the root of the user interface, usually a window or dialog (a top level widget). If None or ommited, the full user interface is loaded. domain: A domain to use for loading translations. If None or ommited, no translation is loaded. **kwargs: a dictionary representing the named extra arguments. It is useful to set attributes of new instances, for example: glade_app = SimpleGladeApp("ui.glade", foo="some value", bar="another value") sets two attributes (foo and bar) to glade_app. """ if os.path.isfile(path): self.glade_path = path else: glade_dir = os.path.dirname( sys.argv[0] ) self.glade_path = os.path.join(glade_dir, path) for key, value in kwargs.items(): try: setattr(self, key, weakref.proxy(value) ) except TypeError: setattr(self, key, value) self.glade = None gtk.glade.set_custom_handler(self.custom_handler) self.glade = gtk.glade.XML(self.glade_path, root, domain) if root: self.main_widget = self.glade.get_widget(root) else: self.main_widget = None self.normalize_names() self.add_callbacks(self) self.new() def __repr__(self): class_name = self.__class__.__name__ if self.main_widget: root = self.main_widget.get_name() repr = '%s(path="%s", root="%s")' % (class_name, self.glade_path, root) else: repr = '%s(path="%s")' % (class_name, self.glade_path) return repr def new(self): """ Method called when the user interface is loaded and ready to be used. At this moment, the widgets are loaded and can be refered as self.widget_name """ pass def add_callbacks(self, callbacks_proxy): """ It uses the methods of callbacks_proxy as callbacks. The callbacks are specified by using: Properties window -> Signals tab in glade-2 (or any other gui designer like gazpacho). Methods of classes inheriting from SimpleGladeApp are used as callbacks automatically. callbacks_proxy: an instance with methods as code of callbacks. It means it has methods like on_button1_clicked, on_entry1_activate, etc. """ self.glade.signal_autoconnect(callbacks_proxy) def normalize_names(self): """ It is internally used to normalize the name of the widgets. It means a widget named foo:vbox-dialog in glade is refered self.vbox_dialog in the code. It also sets a data "prefixes" with the list of prefixes a widget has for each widget. """ for widget in self.glade.get_widget_prefix(""): widget_name = widget.get_name() prefixes_name_l = widget_name.split(":") prefixes = prefixes_name_l[ : -1] widget_api_name = prefixes_name_l[-1] widget_api_name = "_".join( re.findall(tokenize.Name, widget_api_name) ) widget.set_name(widget_api_name) if hasattr(self, widget_api_name): raise AttributeError("instance %s already has an attribute named %s" % (self,widget_api_name)) else: setattr(self, widget_api_name, widget) if prefixes: widget.set_data("prefixes", prefixes) def add_prefix_actions(self, prefix_actions_proxy): """ By using a gui designer (glade-2, gazpacho, etc) widgets can have a prefix in theirs names like foo:entry1 or foo:label3 It means entry1 and label3 has a prefix action named foo. Then, prefix_actions_proxy must have a method named prefix_foo which is called everytime a widget with prefix foo is found, using the found widget as argument. prefix_actions_proxy: An instance with methods as prefix actions. It means it has methods like prefix_foo, prefix_bar, etc. """ prefix_s = "prefix_" prefix_pos = len(prefix_s) is_method = lambda t : callable( t[1] ) is_prefix_action = lambda t : t[0].startswith(prefix_s) drop_prefix = lambda (k,w): (k[prefix_pos:],w) members_t = inspect.getmembers(prefix_actions_proxy) methods_t = filter(is_method, members_t) prefix_actions_t = filter(is_prefix_action, methods_t) prefix_actions_d = dict( map(drop_prefix, prefix_actions_t) ) for widget in self.glade.get_widget_prefix(""): prefixes = widget.get_data("prefixes") if prefixes: for prefix in prefixes: if prefix in prefix_actions_d: prefix_action = prefix_actions_d[prefix] prefix_action(widget) def custom_handler(self, glade, function_name, widget_name, str1, str2, int1, int2): """ Generic handler for creating custom widgets, internally used to enable custom widgets (custom widgets of glade). The custom widgets have a creation function specified in design time. Those creation functions are always called with str1,str2,int1,int2 as arguments, that are values specified in design time. Methods of classes inheriting from SimpleGladeApp are used as creation functions automatically. If a custom widget has create_foo as creation function, then the a method named create_foo is called with str1,str2,int1,int2 as arguments. """ try: handler = getattr(self, function_name) return handler(str1, str2, int1, int2) except AttributeError: return None def gtk_widget_show(self, widget, *args): """ Predefined callback. The widget is showed. Equivalent to widget.show() """ widget.show() def gtk_widget_hide(self, widget, *args): """ Predefined callback. The widget is hidden. Equivalent to widget.hide() """ widget.hide() def gtk_widget_grab_focus(self, widget, *args): """ Predefined callback. The widget grabs the focus. Equivalent to widget.grab_focus() """ widget.grab_focus() def gtk_widget_destroy(self, widget, *args): """ Predefined callback. The widget is destroyed. Equivalent to widget.destroy() """ widget.destroy() def gtk_window_activate_default(self, window, *args): """ Predefined callback. The default widget of the window is activated. Equivalent to window.activate_default() """ widget.activate_default() def gtk_true(self, *args): """ Predefined callback. Equivalent to return True in a callback. Useful for stopping propagation of signals. """ return True def gtk_false(self, *args): """ Predefined callback. Equivalent to return False in a callback. """ return False def gtk_main_quit(self, *args): """ Predefined callback. Equivalent to gtk.main_quit() """ gtk.main_quit() def main(self): """ Starts the main loop of processing events. The default implementation calls gtk.main() Useful for applications that needs a non gtk main loop. For example, applications based on gstreamer needs to override this method with gst.main() Do not directly call this method in your programs. Use the method run() instead. """ gtk.main() def quit(self): """ Quit processing events. The default implementation calls gtk.main_quit() Useful for applications that needs a non gtk main loop. For example, applications based on gstreamer needs to override this method with gst.main_quit() """ gtk.main_quit() def run(self): """ Starts the main loop of processing events checking for Control-C. The default implementation checks wheter a Control-C is pressed, then calls on_keyboard_interrupt(). Use this method for starting programs. """ try: self.main() except KeyboardInterrupt: self.on_keyboard_interrupt() def on_keyboard_interrupt(self): """ This method is called by the default implementation of run() after a program is finished by pressing Control-C. """ pass GvRng_4.4/gui-gtk/gvr_gtk.glade0000644000175000017500000023313211326063740015212 0ustar stasstas Quit ? False True center dialog True vertical True vertical True gtk-dialog-question 6 0 True 8 27 Do you really want to quit ? True center False False 1 False False 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False end 0 About GvR center dialog True vertical True vertical True True 18 8 gvrIcon-big.png 0 True 18 8 Xo_s.png 1 0 2 True False False 3 True end gtk-ok -5 True True True False True False False 0 False end 0 5 Choose a file dialog True vertical 24 True end gtk-cancel -6 True True True False True False False 0 gtk-open -5 True True True True False True False False 1 False end 0 300 500 GvR - Editor True vertical True True _File True gtk-new True True True gtk-open True True True gtk-save True True True gtk-save-as True True True True gtk-print True True True True _Edit True gtk-cut True True True gtk-copy True True True gtk-paste True True True gtk-delete True True True False False 0 True True automatic automatic in 1 True False False 2 True Set language True dialog True vertical True vertical True 4 Change the language used (After you restart GvR) False False 0 True Catalan Dutch English French Norwegian Romenian Spanish Italian False False 4 1 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False 4 end 0 True Robot Speed True dialog True vertical True vertical True 4 Set Robot Speed False False 0 True Instant Fast Medium Slow 4 1 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False end 0 400 400 True Guido van Robot Programming Summary dialog True vertical True True 4 automatic automatic in True True 2 True end gtk-close -7 True True True False True False False 0 False end 0 450 200 True Guido van Robot - Robot arguments True 450 200 dialog True vertical True 7 5 2 8 True True True 3 1 2 4 5 True True 1 1 2 3 4 True True 2 1 2 2 3 True True 2 1 2 1 2 True 0 Robots position on the x-axes: 1 2 True 0 Robots position on the y-axes: 2 3 True 0 Direction robot is facing (N,E,S,W) 3 4 True 0 Number of beepers: 4 5 True <b>Alter the arguments for the 'robot' statement.</b> True 2 2 True end gtk-cancel -6 True True True False True False False 0 gtk-ok -5 True True True False True False False 1 False end 0 True 8 0 none True True True True True 400 True 6 0 True True vertical True True _GvR True Open WorldBuilder True False True gtk-execute True gtk-quit True True True True _Setup True Set Speed True False True gtk-media-forward True _Help True GvR Lessons True False True gtk-dnd-multiple GvR WorlBuilder True False True gtk-execute True gtk-about True True True False False 0 True 2 0 0 True 4 4 True start True True True False True 0 0 True 2 True gtk-refresh False False 0 True Reload True False False 1 False False 0 True True True False True 0 0 True 2 True gtk-redo False False 0 True Step True False False 1 False False 1 True True True False True 0 0 True 2 True gtk-execute False False 0 True Execute True False False 1 False False 2 True True True False True 0 0 True 2 True gtk-cancel False False 0 True Abort True False False 1 False False 3 False False 1 400 500 True True automatic automatic 2 True False False False 3 True <b>Guido's World</b> True label_item True Guido's World False tab True True True automatic automatic in 410 True True 8 False False 1 True Language reference 1 False tab True 4 2 True Lessons 2 False tab True 4 True True automatic automatic in True True False False 3 True Introduction 3 False tab False True True True 240 True 1 0 True True Code editor False tab 120 True 1 0 True 1 True World editor 1 False tab True True GvRng_4.4/gui-gtk/Win_Editors.py0000644000175000017500000001250711326063740015352 0ustar stasstas# -*- coding: utf-8 -*- # Copyright (c) 2006 Stas Zykiewicz # # Win_Editors.py # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # Provides a textview widget which is packed inside the glade generated # TextEditorWin from gvr_gtk.py # Only used on Windows, on GNU/Linux we use a wrapped gtksourceview widget. # Things missing in this editor: # Syntax highlighting # folding and indentation markers E_DEBUG = 0 import os,sys import utils import pygtk #this is needed for py2exe if sys.platform == 'win32': pass else: #not win32, ensure version 2.0 of pygtk is imported pygtk.require('2.0') import gtk class Editor: """Wraps a textview widget and adds a few abstraction methods.""" def __init__(self,parent,title=''): self.parent = parent self.frame = gtk.Frame() self.txttagtable = gtk.TextTagTable() self.txtbuffer = gtk.TextBuffer(table=self.txttagtable) self.tag_h = self.txtbuffer.create_tag(background='lightblue') self.txtview = gtk.TextView(buffer=self.txtbuffer) self.txtview.set_border_window_size(gtk.TEXT_WINDOW_LEFT, 20) self.txtview.connect("expose_event", self.line_numbers_expose) self.parent.add(self.txtview) self.parent.show_all() self.old_start_iter = None def get_all_text(self): """Return all text from the widget""" startiter = self.txtbuffer.get_start_iter() enditer = self.txtbuffer.get_end_iter() txt = self.txtbuffer.get_text(startiter,enditer) if not txt: return [] if '\n' in txt: txt = txt.split('\n') else:# assuming a line without a end of line txt = [txt] return txt def set_text(self,txt): """Load a text in the widget""" if E_DEBUG: print self.__class__,'set_text',txt try: txt = ''.join(txt) utxt = unicode(txt) except Exception,info: print "Failed to set text in source buffer" print info return self.txtbuffer.set_text(utxt.rstrip('\n')) def set_highlight(self,line): """Highlight the line in the editor""" if self.old_start_iter: self.txtbuffer.remove_tag(self.tag_h,self.old_start_iter,self.old_end_iter) end_iter = self.txtbuffer.get_iter_at_line(line) end_iter.forward_to_line_end() start_iter = self.txtbuffer.get_iter_at_line(line) self.txtbuffer.apply_tag(self.tag_h,start_iter,end_iter) self.old_start_iter,self.old_end_iter = start_iter,end_iter def reset_highlight(self): self.set_highlight(1) ##### taken from pygtk tutorial example ###################### def line_numbers_expose(self, widget, event, user_data=None): text_view = widget # See if this expose is on the line numbers window left_win = text_view.get_window(gtk.TEXT_WINDOW_LEFT) if event.window == left_win: type = gtk.TEXT_WINDOW_LEFT target = left_win else: return False first_y = event.area.y last_y = first_y + event.area.height x, first_y = text_view.window_to_buffer_coords(type, 0, first_y) x, last_y = text_view.window_to_buffer_coords(type, 0, last_y) numbers = [] pixels = [] count = self.get_lines(first_y, last_y, pixels, numbers) # Draw fully internationalized numbers! layout = widget.create_pango_layout("") for i in range(count): x, pos = text_view.buffer_to_window_coords(type, 0, pixels[i]) numbers[i] = numbers[i] + 1 str = "%d" % numbers[i] layout.set_text(str) widget.style.paint_layout(target, widget.state, False, None, widget, None, 2, pos + 2, layout) # don't stop emission, need to draw children return False def get_lines(self, first_y, last_y, buffer_coords, numbers): text_view = self.txtview # Get iter at first y iter, top = text_view.get_line_at_y(first_y) # For each iter, get its location and add it to the arrays. # Stop when we pass last_y count = 0 size = 0 while not iter.is_end(): y, height = text_view.get_line_yrange(iter) buffer_coords.append(y) line_num = iter.get_line() numbers.append(line_num) count += 1 if (y + height) >= last_y: break iter.forward_line() return count GvRng_4.4/copyright0000644000175000017500000000167411326063737013147 0ustar stasstasLook at 'GPL-2' for the complete copyright license Copyright (C) 2002-2006: Stas Zytkiewicz - stas.zytkiewicz@gmail.com Paul Carduner - paulcarduner@ibiblio.org Donald Oellerich - trelf@ibiblio.org Waseem Daher - wdaher@mit.edu Steve Howell - showell@zipcon.net This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. GvRng_4.4/locale/0000755000175000017500000000000011326063744012441 5ustar stasstasGvRng_4.4/locale/ca/0000755000175000017500000000000011326063743013023 5ustar stasstasGvRng_4.4/locale/ca/LC_MESSAGES/0000755000175000017500000000000011326063743014610 5ustar stasstasGvRng_4.4/locale/ca/LC_MESSAGES/gvrng.mo0000644000175000017500000002000611326063737016271 0ustar stasstaszH I g    5   % 9 ? I %Q %w ?, 0l #   < + %3 !Y !{     ! # ' 5BU fr  $73I1} 3-Lk#!  8:<AQH%#  #*DLRY\af j v    ->N c nxu 0Qk9  7 > J5U3@u6/3PRR" &.G'[)   ! >Kf o}!?.U   B  <]z|.* &,@0qswa|  >GNV[ bn       $(<Udt   gW-JI?;L$0u#f7Ga_A Mj<'t:Zy&=w[H`cE54S(\kxe/PUz]DB,QYb1^nT. 9p>ohCvqNXF Ri @r %*l2)O V"s!86Kd+m3"%s" has already been defined"%s" is not a valid name"%s" is not a valid test"%s" not defined'%s' statement is incompleteAlter the arguments for the 'robot' statement.Code EditorGuido's WorldWorld EditorAbortAbout GvRBEEPERSBad x value for positioning robot: %sBad y value for positioning robot: %sCan't find the lessons. Make sure you have installed the GvR-Lessons package. Check the GvR website for the lessons package. http://gvr.sf.netCatalan Dutch English French Norwegian Romenian Spanish ItalianChange the language used (After you restart GvR)Choose a fileDirection robot is facing (N,E,S,W)Do you really want to quit ?EError in line %s: %s Check your world file for syntax errorsExecuteExpected '%s' statement to end in ':'Expected code to be indented hereExpected positive integer Got: %sFailed to save the file. FastGo back one pageGo one page forwardGuido van Robot - Robot argumentsGuido van Robot Programming SummaryGuido's WorldGvR - EditorGvR - WorldbuilderGvR WorldbuilderGvr LessonsIndentation errorInstantInstant Fast Medium SlowIntroductionLanguage referenceLessonsLine %i: %sMediumNNo beepers to pick up.No beepers to put down.No content to saveNumber of beepers:Open worldbuilderPlease give the number of beepers to place on %d,%dPlease load a world and program before executing.ProgramsQuit ?ROBOTRan into a wallReloadRobot SpeedRobot turned offRobots position is %s %s %s and carrying %s beepersRobots position on the x-axes:Robots position on the y-axes:Running WorldbuilderSSIZESelected path is not a program fileSelected path is not a world fileSet Robot SpeedSet languageSet speed...SlowStepThe editor's content is changed. Do you want to save it?WWALLWorldsWritten the new configuration to disk You have to restart GvRng to see the effectYou don't have a program file loaded.You don't have a world file loaded.Your program must have commands._About_Edit_File_GvR_Help_Setupany_beepers_in_beeper_bagbeeperscheatdefinedoelifelseendfacing_eastfacing_northfacing_southfacing_westfront_is_blockedfront_is_clearifleft_is_blockedleft_is_clearmovenext_to_a_beeperno_beepers_in_beeper_bagnot_facing_eastnot_facing_northnot_facing_southnot_facing_westnot_next_to_a_beeperpickbeeperputbeeperright_is_blockedright_is_clearrobotturnleftturnoffwallwhileProject-Id-Version: gvr Report-Msgid-Bugs-To: POT-Creation-Date: 2008-03-18 09:46:55.092971 PO-Revision-Date: 2008-01-29 14:21+0100 Last-Translator: Stas Zytkiewicz Language-Team: Catalan MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Catalan X-Poedit-Country: SPAIN "%s" està realment ben definida"%s" no és un nom vàlid"%s" no és una prova vàlida"%s" no definidaDeclaració '%s' és incompletaModifica els paràmetres de la posició del robot.Editor de Codi Món de GuidoEditor del MónAvortaQuant a GvRBRUNZIDORSEl valor x és invàlid per a posicionar el robot: %sEl valor y és invàlid per posicionar el robot: %sNo es troben les lliçons. Assegureu-vos d'haver instal·lat el paquet de les lliçons del GvR. Consulteu el web del GvR per a obtindre els paquets de lliçons. http://gvr.sf.net/Català Dutch English French Norwegian Romenian Español ItalianCanvia l'idioma utilitzat (Després de reiniciar GvR )Seleccioneu un fitxerLa direcció del robot està encarat ( N,E,S,O)Esteu segur de voler sortir?EError a la línia %s: %s Mireu el vostre fitxer Món per buscar errors sintàcticsExecutaDeclaració esperada '%s' al finalCodi esperat per indentar aquíEsperat nombre enter: %sErrada al desar el fitxer. RàpidaTorna enrere una pàginaAvança una pàgina Paràmetres del robot Guido van Robot Resum de Programació de Guido van robotMón de GuidoGvR - EditorCreador de mons GvRCreador de mons GvRLliçons del GvRError d'indentació InstantaniInstant Ràpid Mitjana LentaIntroduccióReferència del llenguatgeLliçonsLínia %i: %sMitjanaNNo hi ha brunzidors per recollir.No hi ha brunzidors per desar.No hi ha contingut per desarNombre de brunzidors:Obrir Creador de mons GvRSi-us-plau poseu el nombre de brunzidors per col·locar %d,%d Carregueu un món i programa abans d'executar.ProgramesSurt ?ROBOTCorre per un murRecarregarVelocitat del robotRobot apagatLa posició del robot és %s %s %s i està carregant %s brunzidorsPosició del robots a l'eix 'x':Posició del robots a l'eix 'y':Executant el Creador de monsSMIDAEl camí seleccionat no té un fitxer programaEl camí seleccionat no té un fitxer MónAjusta la velocitat del robotEstableix l'idiomaEstableix la velocitat...LentaPasEl contingut de l'editor ha canviat. Voleu desar el contingut ?OMURMonsS'ha escrit la configuració nova al disc Heu de tornar a iniciar el GvRng per a que tinga efecteNo heu carregat cap programa.No heu carregat cap fitxer Món.Al seu programa li calen ordres._Quant a_Edita_Fitxer_GvR_Ajuda_Configuraralgun_brunzidor_a_la_bossabrunzidortrampadefineixfesosisinofiencarat_estencarat_nordencarat_sudencarat_oestdavant_bloquejatdavant_netsiesquerra_bloquejatesquerra_netmoujunt_a_un_brunzidorcap_brunzidor_a_la_bossano_encarat_estno_encarat_nordno_encarat_sudno_encarat_oestno_junt_a_un_brunzidorrecullbrunzidordesabrunzidordreta_bloquejatdreta_netrobotgiraesquerraapagamurmentreGvRng_4.4/locale/nl/0000755000175000017500000000000011326063743013051 5ustar stasstasGvRng_4.4/locale/nl/LC_MESSAGES/0000755000175000017500000000000011326063743014636 5ustar stasstasGvRng_4.4/locale/nl/LC_MESSAGES/gvrng.mo0000644000175000017500000001744411326063737016333 0ustar stasstaszH I g    5   % 9 ? I %Q %w ?, 0l #   < + %3 !Y !{     ! # ' 5BU fr  $73I1} 3-Lk#!  8:<AQH%#  #*DLRY\af j v    ->N c nxC.G]9z * *8c>3?s"I'9'V~"' #0H a m{    :J-b5   /Lh)'#8A9FW&#$3X]fos y      # 5BIZt  gW-JI?;L$0u#f7Ga_A Mj<'t:Zy&=w[H`cE54S(\kxe/PUz]DB,QYb1^nT. 9p>ohCvqNXF Ri @r %*l2)O V"s!86Kd+m3"%s" has already been defined"%s" is not a valid name"%s" is not a valid test"%s" not defined'%s' statement is incompleteAlter the arguments for the 'robot' statement.Code EditorGuido's WorldWorld EditorAbortAbout GvRBEEPERSBad x value for positioning robot: %sBad y value for positioning robot: %sCan't find the lessons. Make sure you have installed the GvR-Lessons package. Check the GvR website for the lessons package. http://gvr.sf.netCatalan Dutch English French Norwegian Romenian Spanish ItalianChange the language used (After you restart GvR)Choose a fileDirection robot is facing (N,E,S,W)Do you really want to quit ?EError in line %s: %s Check your world file for syntax errorsExecuteExpected '%s' statement to end in ':'Expected code to be indented hereExpected positive integer Got: %sFailed to save the file. FastGo back one pageGo one page forwardGuido van Robot - Robot argumentsGuido van Robot Programming SummaryGuido's WorldGvR - EditorGvR - WorldbuilderGvR WorldbuilderGvr LessonsIndentation errorInstantInstant Fast Medium SlowIntroductionLanguage referenceLessonsLine %i: %sMediumNNo beepers to pick up.No beepers to put down.No content to saveNumber of beepers:Open worldbuilderPlease give the number of beepers to place on %d,%dPlease load a world and program before executing.ProgramsQuit ?ROBOTRan into a wallReloadRobot SpeedRobot turned offRobots position is %s %s %s and carrying %s beepersRobots position on the x-axes:Robots position on the y-axes:Running WorldbuilderSSIZESelected path is not a program fileSelected path is not a world fileSet Robot SpeedSet languageSet speed...SlowStepThe editor's content is changed. Do you want to save it?WWALLWorldsWritten the new configuration to disk You have to restart GvRng to see the effectYou don't have a program file loaded.You don't have a world file loaded.Your program must have commands._About_Edit_File_GvR_Help_Setupany_beepers_in_beeper_bagbeeperscheatdefinedoelifelseendfacing_eastfacing_northfacing_southfacing_westfront_is_blockedfront_is_clearifleft_is_blockedleft_is_clearmovenext_to_a_beeperno_beepers_in_beeper_bagnot_facing_eastnot_facing_northnot_facing_southnot_facing_westnot_next_to_a_beeperpickbeeperputbeeperright_is_blockedright_is_clearrobotturnleftturnoffwallwhileProject-Id-Version: GvR 1.3.2 Report-Msgid-Bugs-To: POT-Creation-Date: 2008-03-18 09:46:55.092971 PO-Revision-Date: 2008-03-18 09:55+0100 Last-Translator: Stas Zytkiewicz Language-Team: Dutch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit "%s" is al gedefineerd"%s" is geen legale naam"%s" is geen legale test"%s" niet gedefineerd'%s' statement is incompleetVerander de argumenten voor het 'robot' statement.Code EditorGuido's wereldWereld EditorStopInfo over GvRPIEPERSVerkeerde x waarde in de robot positie: %sVerkeerde y waarde in de robot positie: %sKan de lessen niet vinden. Verzeker je ervan dat het GvR-Lessons pakket is geinstaleerd. Controleer de GvR website voor het lessen pakket. http://gvr.sf.netCatalaans Hollands Engels Frans Noors Romeens Spaans ItaliaansVerander de gebruikte taal (waneer Gvr is herstart)Kies een bestandRichting van de robot is (N,O,Z,W)Wil je echt stoppen?OFout in regel %s: %s Controleer je wereld bestand voor gramaticale foutenVoer uitVerwacht een ':' na een '%s' statement Verwachte inspringende code Verwacht een positive integer Kreeg: %sBestand bewaren is mislukt. SnelGa een pagina terugGa een pagina verderGuido van Robot - Robot argumentenGuido van Robot Programeer samenvattingGuido's wereldGvR - EditorGvR Wereld ConstructeurGvR Wereld Constructeur GvR lessen Inspring foutGelijkMeteen Snel Gemiddeld LangzaamIntroductieGvR programma referentielessenRegel %i: %sGemiddeldNGeen piepers om op te pakken.Geen piepers om te plaatsenGeen inhoud om te bewarenAantal piepers:GvR Wereld ConstructeurGeef het te plaatsen aantal piepers op %d, %dLaad eerst een wereld en programma omn uit te voeren.Programma'sStoppen ?ROBOTLiep tegen een muurHerlaadRobot snelheidRobot uitgezetRobots positie is %s %s %s en draagt %s piepersRobots postitie op de x-as:Robots positie op de y-as:Start Wereld ConstructeurZFormaatGeslecteerd pad is geen programma bestandGeselecteerd pad is geen wereld bestandStel de Robot snelheid inStel de taal inStel snelheid in... LangzaamStapDe inhoud van de Editor is veranderd. Wil je het bewaren?WMUURWereldenDe nieuwe configuratie is naar de schijf geschreven Herstart GvR om het effect te zien.Je heb geen programma bestand geladen.Je heb geen wereld bestand geladen.Je programma moet commando's hebben.OverVeranderBestand GvRHelp Instellenenige_piepers_in_piepertaspieperscheatdefinieerdoeandersalsanderseindnaar_oostnaar_noordnaar_zuidnaar_westvoorkant_is_versperdvoorkant_is_vrijalslinks_is_versperdlink_is_vrijbeweegnaast_een_piepergeen_piepers_in_piepertasniet_naar_oostniet_naar_noordniet_naar_zuidniet_naar_westniet_naast_een_pieperpak_pieperplaats_pieperrechts_is_versperdrechts_is_vrijrobotlinksafzetuitmuurterwijlGvRng_4.4/locale/de/0000755000175000017500000000000011326063743013030 5ustar stasstasGvRng_4.4/locale/de/LC_MESSAGES/0000755000175000017500000000000011326063743014615 5ustar stasstasGvRng_4.4/locale/de/LC_MESSAGES/gvrng.mo0000644000175000017500000000603311326063740016274 0ustar stasstas2C<HIO%W%}24<1>p v     1@C Safw   %-3)) =   @ ) 1 H Y [ !c                " , / @ K O W q           * -%(0&!,.# 1/'$)+" 2AbortBEEPERSBad x value for positioning robot: %sBad y value for positioning robot: %sCan't find the lessons. Make sure you have installed the GvR-Lessons package. Check the GvR website for the lessons package. http://gvr.sf.netEExecuteNPlease load a world and program before executing.ROBOTRobot SpeedRobot turned offSSIZESet Robot SpeedStepWWALLany_beepers_in_beeper_bagcheatdefinedoelifelseendfacing_eastfacing_northfacing_southfacing_westfront_is_blockedfront_is_clearifleft_is_blockedleft_is_clearmovenext_to_a_beeperno_beepers_in_beeper_bagnot_facing_eastnot_facing_northnot_facing_southnot_facing_westnot_next_to_a_beeperpickbeeperputbeeperright_is_blockedright_is_clearturnleftturnoffwhileProject-Id-Version: GvRGerman 1.0.4 Report-Msgid-Bugs-To: POT-Creation-Date: 2008-03-18 09:46:55.092971 PO-Revision-Date: 2005-11-05 17:44+0100 Last-Translator: Josef Scheele-von Alven Language-Team: German MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: German X-Poedit-Country: GERMANY AbbruchKORNUnzulaessiger X-Wert für den Hamster: %sUnzulaessiger Y-Wert für den Hamster: %sIch kann die Übungen nicht finden. Prüfe, ob die Hamsterübungen installiert wurden! Schau auf der GvR-Webseite nach den Übungen! http://www.bvr.sf.netOFühre ausNBitte lade eine Landschaft und ein Programm, bevor du startest! HAMSTERHamstergeschwindigkeitDer Hamster ruhtSGRÖSSESetze die HamstergeschwindiglkeitSchrittWWANDkorn_in_backentaschecheatdefinedoelifelseendblickrichtung_ostblickrichtung_nordblickrichtung_suedblickrichtung_westvorn_nicht_freivorn_freiiflinks_nicht_freilinks_freivorkorn_dakein_korn_in_backentascheblickrichtung_nicht_ostblickrichtung_nicht_nordblickrichtung_nicht_suedblickrichtung_nicht_westkein_korn_danimmgibrechts_nicht_freirechts_freilinksumruhewhileGvRng_4.4/locale/fr/0000755000175000017500000000000011326063743013047 5ustar stasstasGvRng_4.4/locale/fr/LC_MESSAGES/0000755000175000017500000000000011326063743014634 5ustar stasstasGvRng_4.4/locale/fr/LC_MESSAGES/gvrng.mo0000644000175000017500000000547411326063740016323 0ustar stasstas4G\xy%%1% +7HJZ_dfk     ,EUfw  < %0.8/g  D   / 1 P U e g k            * < C W r          * 3 ( - 20 " /3'41).%! #,*& +$AbortBEEPERSBad x value for positioning robot: %sBad y value for positioning robot: %sEExecuteFastInstantMediumNPlease load a world and program before executing.ROBOTRobot SpeedRobot turned offSSet Robot SpeedSlowStepWWALLany_beepers_in_beeper_bagcheatdefinedoelifelseendfacing_eastfacing_northfacing_southfacing_westfront_is_blockedfront_is_clearifleft_is_blockedleft_is_clearmovenext_to_a_beeperno_beepers_in_beeper_bagnot_facing_eastnot_facing_northnot_facing_southnot_facing_westnot_next_to_a_beeperpickbeeperputbeeperright_is_blockedright_is_clearturnleftturnoffwhileProject-Id-Version: gvr-new-fr Report-Msgid-Bugs-To: POT-Creation-Date: 2008-03-18 09:46:55.092971 PO-Revision-Date: 2005-01-22 16:23+0100 Last-Translator: Stas Zytkiewicz Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AbandonnerBALISESMauvaise abscisse pour positionner le robot %sMauvaise ordonnée pour positionner le robot %sEExécuterRapideInstantanéMoyenNS'il vous plait, chargez un monde et un programme avant d'exécuter.ROBOTVitesse du robotLe robot est éteintSConfigurer la vitesse du robotLentUne instructionOMURau_moins_une_balise_dans_le_sactrichedefinisrepetesinon_sisinonfinface_a_l_estface_au_nordface_au_sudface_a_l_ouestvoie_frontale_bloqueevoie_frontale_libresivoie_gauche_bloqueevoie_gauche_libreavanceproche_d_une_baliseplus_de_balise_dans_le_sacpas_face_a_l_estpas_face_au_nordpas_face_au_sudpas_face_a_l_ouestpas_proche_d_une_baliserecupere_une_baliseplace_une_balisevoie_droite_bloqueevoie_droite_libretourne_a_gaucheeteindretant_queGvRng_4.4/locale/cs/0000755000175000017500000000000011326063743013045 5ustar stasstasGvRng_4.4/locale/cs/LC_MESSAGES/0000755000175000017500000000000011326063743014632 5ustar stasstasGvRng_4.4/locale/cs/LC_MESSAGES/gvrng.mo0000644000175000017500000001731511326063740016316 0ustar stasstast\    ! 2 5O      % % % ? 0 % #3 W t <v  % ! ! % ? P !d #     3 ;GI`x31&,< CO3`#! / <I8NQ%#  1RY_ejpw       */@Yiz  &,#Pi~11 N6((QjTl/:;3o"(  (> R\#l40/B0VA   #10bx)+**/Z\`Eo 7 )5>F K Wcx       &=O`o   Ki> VscB^Fg1h']?-N j.`50L6:k3XaH&o)bpfnm9;#l+UJ=Z$%* [ ASCDI82der7\PM<4/E _YTR tO@!,QWq"(G"%s" has already been defined"%s" is not a valid name"%s" is not a valid test"%s" not defined'%s' statement is incompleteAlter the arguments for the 'robot' statement.Code EditorGuido's WorldWorld EditorAbortAbout GvRBEEPERSBad x value for positioning robot: %sBad y value for positioning robot: %sCan't find the lessons. Make sure you have installed the GvR-Lessons package. Check the GvR website for the lessons package. http://gvr.sf.netCatalan Dutch English French Norwegian Romenian Spanish ItalianChange the language used (After you restart GvR)Choose a fileDirection robot is facing (N,E,S,W)Do you really want to quit ?EError in line %s: %s Check your world file for syntax errorsExecuteExpected '%s' statement to end in ':'Expected code to be indented hereExpected positive integer Got: %sFailed to save the file. Go back one pageGo one page forwardGuido van Robot - Robot argumentsGuido van Robot Programming SummaryGuido's WorldGvR - EditorGvR - WorldbuilderGvR WorldbuilderGvr LessonsIndentation errorInstant Fast Medium SlowLanguage referenceLessonsLine %i: %sNNo beepers to pick up.No beepers to put down.No content to saveNumber of beepers:Open worldbuilderPlease give the number of beepers to place on %d,%dPlease load a world and program before executing.ProgramsQuit ?ROBOTRan into a wallReloadRobot SpeedRobot turned offRobots position is %s %s %s and carrying %s beepersRobots position on the x-axes:Robots position on the y-axes:SSIZESelected path is not a program fileSelected path is not a world fileSet Robot SpeedSet languageSet speed...StepThe editor's content is changed. Do you want to save it?WWALLWorldsWritten the new configuration to disk You have to restart GvRng to see the effectYou don't have a program file loaded.You don't have a world file loaded.Your program must have commands._About_Edit_File_GvR_Help_Setupany_beepers_in_beeper_bagbeeperscheatdefinedoelifelseendfacing_eastfacing_northfacing_southfacing_westfront_is_blockedfront_is_clearifleft_is_blockedleft_is_clearmovenext_to_a_beeperno_beepers_in_beeper_bagnot_facing_eastnot_facing_northnot_facing_southnot_facing_westnot_next_to_a_beeperpickbeeperputbeeperright_is_blockedright_is_clearrobotturnleftturnoffwallwhileProject-Id-Version: GvRCzech 0.0.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2008-03-18 09:46:55.092971 PO-Revision-Date: 2008-01-08 19:34+0100 Last-Translator: Stas Zytkiewicz Language-Team: Czech MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Czech X-Poedit-Country: CZECH REPUBLIC "%s" už bylo definováno"%s" není platné jméno"%s" není správně zadaná podmínka"%s" není definováno'%s' instrukce není úplnáZměňte parametry příkazu 'robot'.Editor instrukcíGuidův světEditor světaZastavO GvRBZUCAKYŠpatná souřadnice x pro umístění robota: %sŠpatná souřadnice y pro umístění robota: %sNemohu najít lekce. Zkontrolujte, zdali jste je nainstalovali. Navštivte webové stránky GvR, kde je najdete. http://www.bvr.sf.netKatalánsky Holandsky Anglicky Francouzsky Norsky Rumunsky Španělsky ItalskyZměňte použitý jazyk (Projeví se po restartu GvR)Vyberte souborSměr, kterým se robot kouká (S,V,J,Z)Opravdu chcete skončit?VChyba na řádku %s: %s Zkontrolujte, nejsou-li v souboru světa syntaktické chyby.SpusťInstrukce '%s' by měla končit dvojtečkou ':'Kód na tomto místě by měl být pravděpoobně odsazen.Očekávano přirozené číslo Místo toho jsem našel: %sNepodařilo se uložit soubor. Vrať se o stranu zpětPoskoč o stranu dopředuGuido van Robot - parametry robotaShrnutí programování Guida van RobotaGuidův světGvR - editorGvR - Stavitel světaStavitel světa GvRLekce GvRChyba odsazeníOkamžitě Rychle Normálně PomaluPřehled jazykaLekceŘádek %i: %sSNejsou tu žádné bzučáky, které by šly sebrat.Nemám žádné bzučáky, nemůžu je položit.Není co uložit.Počet bzučáků:Stavitel světa GvRProsím zadej počet bzučáků na pozici %d, %dProsím načtěte soubor světa a program, než robota spustíte.Soubory instrukcíSkončit?ROBOTAúúú! Naboural jsem do zdi.ObnovitRychlost robotaRobot vypnutRobot je na místě %s %s %s a nese %s bzučákůSouřadnice x robota:Souřadnice y robota:JVELIKOSTZvolený soubor není platným programem.Vybraný soubor není platný soubor světaNastav rychlost robotaNastavte jazykNastavit rychlost...KrokObsah okna se změnil. Chcete jej uložit?ZZEDSoubory světaZměny v nastavení byly uložena. Projeví se po restartování GvR.Nemáte načtený program.Nemáte načtený soubor světa.Ve vašem programu musí být alespoň jedna instrukce._O programuÚpr_avy_Soubor_GvR_Nápověda_Nastaveníjsou_bzucaky_v_pytlibzucakysvindlujnaucdelejnebo_kdyzjinakkoneckouka_na_vychodkouka_na_severkouka_na_jihkouka_na_zapadvpredu_zedvpredu_volnokdyzvlevo_zedvlevo_volnojdije_bzucaknejsou_bzucaky_v_pytlinekouka_na_vychodnekouka_na_severnekouka_na_jihnekouka_na_zapadneni_bzucakseberpolozvpravo_zedvpravo_volnorobotdolevavypnizeddokudGvRng_4.4/locale/ro/0000755000175000017500000000000011326063743013060 5ustar stasstasGvRng_4.4/locale/ro/LC_MESSAGES/0000755000175000017500000000000011326063743014645 5ustar stasstasGvRng_4.4/locale/ro/LC_MESSAGES/gvrng.mo0000644000175000017500000000547111326063740016331 0ustar stasstas4G\xy%%1% +7HJZ_dfk     ,EUfw  oX ak?   0 2 L S ] _ %f             , < A $S x         ) 1 ( - 20 " /3'41).%! #,*& +$AbortBEEPERSBad x value for positioning robot: %sBad y value for positioning robot: %sEExecuteFastInstantMediumNPlease load a world and program before executing.ROBOTRobot SpeedRobot turned offSSet Robot SpeedSlowStepWWALLany_beepers_in_beeper_bagcheatdefinedoelifelseendfacing_eastfacing_northfacing_southfacing_westfront_is_blockedfront_is_clearifleft_is_blockedleft_is_clearmovenext_to_a_beeperno_beepers_in_beeper_bagnot_facing_eastnot_facing_northnot_facing_southnot_facing_westnot_next_to_a_beeperpickbeeperputbeeperright_is_blockedright_is_clearturnleftturnoffwhileProject-Id-Version: GVR CVS Report-Msgid-Bugs-To: POT-Creation-Date: 2008-03-18 09:46:55.092971 PO-Revision-Date: 2005-02-03 09:22+0200 Last-Translator: Peter Damoc Language-Team: ROMANIA MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Romanian X-Poedit-Country: ROMANIA OpreştePIUITOAREValoarea x este incorectă: %sValoarea y este incorectă: %sEExecutăRapidInstantMediuNÎncărcaţi vă rog o lume şi un program inainte de execuţieROBOTViteză RobotRobotul s-a opritSSetează viteza robotuluiÎncetPaşeşteVPERETEorice_piuitoare_in_punga_cu_piuitoaretrisaredefinestefaaltfeldacaaltfelsfarsitcu_fata_la_estcu_fata_la_nordcu_fata_la_sudcu_fata_la_vestfata_e_blocatafata_e_liberadacastanga_e_blocatastanga_e_liberamutalanga_o_piuitoarefara_piuitoare_in_punga_cu_piuitoarenu_cu_fata_la_estnu_cu_fata_la_nordnu_cu_fata_la_sudnu_cu_fata_la_vestnu_langa_o_piuitoareridicapiuitoarepunepiuitoaredreapta_e_blocatadreapta_e_liberaintoarcerestangaoprestecattimpGvRng_4.4/locale/no/0000755000175000017500000000000011326063743013054 5ustar stasstasGvRng_4.4/locale/no/LC_MESSAGES/0000755000175000017500000000000011326063743014641 5ustar stasstasGvRng_4.4/locale/no/LC_MESSAGES/gvrng.mo0000644000175000017500000000557611326063740016333 0ustar stasstas2C<HIO%W%}24<1>p v     1@C Safw   %-?3sz--p s y 7{           " ( 0 7 = H S ^ i }           0 ; E X f r y  * -%(0&!,.# 1/'$)+" 2AbortBEEPERSBad x value for positioning robot: %sBad y value for positioning robot: %sCan't find the lessons. Make sure you have installed the GvR-Lessons package. Check the GvR website for the lessons package. http://gvr.sf.netEExecuteNPlease load a world and program before executing.ROBOTRobot SpeedRobot turned offSSIZESet Robot SpeedStepWWALLany_beepers_in_beeper_bagcheatdefinedoelifelseendfacing_eastfacing_northfacing_southfacing_westfront_is_blockedfront_is_clearifleft_is_blockedleft_is_clearmovenext_to_a_beeperno_beepers_in_beeper_bagnot_facing_eastnot_facing_northnot_facing_southnot_facing_westnot_next_to_a_beeperpickbeeperputbeeperright_is_blockedright_is_clearturnleftturnoffwhileProject-Id-Version: 1.3.4 Report-Msgid-Bugs-To: POT-Creation-Date: 2008-03-18 09:46:55.092971 PO-Revision-Date: 2006-02-22 20:05+0100 Last-Translator: John Arthur M.Rokkones Language-Team: Norwegian/Bokmaal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AvbrytALARMERDårlig x verdi for posisjonering av robot:%sDårlig y verdi for posisjonering av robot:%sKan ikke finne leksjonene. Sjekk at du har installert GvR leksjonen pakken Se etter leksjonspakken på internettsidene til Gvr. http://gvr.sf.netØKjørNVenligst åpne en verden og et program før du starter.ROBOTRobotfartRoboten slo seg avSSTØERRELSEVelg robotfartStegVVEGGnoen_alarmer_i_sekkenjuksdefinergjørellhvisellerssluttvendt_østvendt_nordvendt_sørvendt_vestfronten_er_blokkertfronten_er_frihvisvenstre_er_blokkertvenstre_er_friflyttved_en_alarmingen_alarmer_i_sekkenikke_vendt_østikke_vendt_nordikke_vendt_sørikke_vendt_vestikke_ved_en_alarmplukkalarmsettalarmhøyre_er_blokkerthøyre_er_frivendvenstreslåavmensGvRng_4.4/locale/es/0000755000175000017500000000000011326063743013047 5ustar stasstasGvRng_4.4/locale/es/LC_MESSAGES/0000755000175000017500000000000011326063743014634 5ustar stasstasGvRng_4.4/locale/es/LC_MESSAGES/gvrng.mo0000644000175000017500000000613611326063740016317 0ustar stasstas6I|%%1  "'AGNQV[ _ k x  "3C X cm~Z  , ,? l     * 0 92 l r                " - : K X [ o           1 ? N U  )#/ 1!$6% .2+34 5,*0 &('-"AbortBEEPERSBad x value for positioning robot: %sBad y value for positioning robot: %sCan't find the lessons. Make sure you have installed the GvR-Lessons package. Check the GvR website for the lessons package. http://gvr.sf.netEExecuteFastInstantMediumNPlease load a world and program before executing.ROBOTRobot SpeedRobot turned offSSIZESet Robot SpeedSlowStepWWALLany_beepers_in_beeper_bagcheatdefinedoelifelseendfacing_eastfacing_northfacing_southfacing_westfront_is_blockedfront_is_clearifleft_is_blockedleft_is_clearmovenext_to_a_beeperno_beepers_in_beeper_bagnot_facing_eastnot_facing_northnot_facing_southnot_facing_westnot_next_to_a_beeperpickbeeperputbeeperright_is_blockedright_is_clearturnleftturnoffwhileProject-Id-Version: 0.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2008-03-18 09:46:55.092971 PO-Revision-Date: 2005-09-23 00:28-0600 Last-Translator: Carlos David Suarez Pascal Language-Team: Spanish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit AbortarZUMBADORESValor x incorrecto para posicionar robot: %sValor y incorrecto para posicionar robot: %sNo se encuentran las lecciones. Asegúrate de haber instalado el paquete GvR-Lessons. Busca en el sitio web de GvR el paquete de lecciones. http://gvr.sf.netEEjecutarRápidoInstantáneoMedioNPor favor carga un mundo y un programa antes de ejecutar.ROBOTVelocidad del robotRobot apagadoSTAMAÑOEstablecer velocidad del robotLentoPasoOPAREDzumbadores_en_bolsatrampadefinirhacersinosisinofinviendo_esteviendo_norteviendo_surviendo_oestefrente_bloqueadofrente_libresiizquierda_bloqueadoizquierda_libremoverproximo_a_zumbadorsin_zumbadores_en_bolsano_viendo_esteno_viendo_norteno_viendo_surno_viendo_oesteno_proximo_a_zumbadortomarzumbadorponerzumbadorderecha_bloqueadoderecha_libregirarizquierdaapagarmientrasGvRng_4.4/locale/it/0000755000175000017500000000000011326063744013055 5ustar stasstasGvRng_4.4/locale/it/LC_MESSAGES/0000755000175000017500000000000011326063744014642 5ustar stasstasGvRng_4.4/locale/it/LC_MESSAGES/gvrng.mo0000644000175000017500000000522611326063740016323 0ustar stasstas3GLhio%w%1 '8:JOTV[u|     /?Paq  7 ''?gipw~0    * 1 ? J O Z f q ~           . @ N Z j z   ' , 1/ !.2&3%0(-$  "+) *#AbortBEEPERSBad x value for positioning robot: %sBad y value for positioning robot: %sEExecuteFastInstantMediumNPlease load a world and program before executing.ROBOTRobot SpeedRobot turned offSSet Robot SpeedSlowStepWWALLany_beepers_in_beeper_bagdefinedoelifelseendfacing_eastfacing_northfacing_southfacing_westfront_is_blockedfront_is_clearifleft_is_blockedleft_is_clearmovenext_to_a_beeperno_beepers_in_beeper_bagnot_facing_eastnot_facing_northnot_facing_southnot_facing_westnot_next_to_a_beeperpickbeeperputbeeperright_is_blockedright_is_clearturnleftturnoffwhileProject-Id-Version: 1.3.4 Report-Msgid-Bugs-To: POT-Creation-Date: 2008-03-18 09:46:55.092971 PO-Revision-Date: 2006-01-01 15:05+0100 Last-Translator: Andrea Primiani Language-Team: Italien MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FermaSIRENEValore x errato per posizione robot: %sValore y errato per posizione robot: %sEEseguiVeloceRapidoMedioNCarica un mondo e un programma prima di avviare.ROBOTVelocità robotRobot fermatoSImposta velocità robotLentoPassoOMUROqualche_sirena_in_borsadefinisciripetise_altrimentialtrimentifinefaccia_estfaccia_nordfaccia_sudfaccia_ovestchiuso_davantilibero_davantisechiuso_a_sinistralibero_a_sinistramuovivicino_sirenanessuna_sirena_in_borsanon_faccia_estnon_faccia_nordnon_faccia_sudnon_faccia_ovestnon_vicino_sirenaprendi_sirenaposa_sirenachiuso_a_destralibero_a_destragira_sinistraspentomentreGvRng_4.4/GvrModel.py0000644000175000017500000002250111326063737013275 0ustar stasstas# -*- coding: utf-8 -*- # Copyright (c) 2007 Stas Zykiewicz # # GvrModel.py # This program is free software; you can redistribute it and/or # modify it under the terms of version 3 of the GNU General Public License # as published by the Free Software Foundation. A copy of this license should # be included in the file GPL-3. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. """ This is the model, as in MVC, which acts as a interface on top of the original GvR implementation and talks with the controller (GvrController.py). The reason for an extra abstracting layer is because gvr was never designed as a MVC pattern. Because of that some constructs in here seems a bit strange but it is done to let the rest of the original gvr code intact. You should not talk to this object direct but by using the controller. """ import utils #set_locale() import world,worldMap,stepper,guiWorld, gvrparser import sys,os,time import logging _DEBUG = 0# increase for more info if _DEBUG: import pprint,time if os.name == "posix": os.environ["TMP"] = "/tmp" debugfile = os.path.join(os.environ["TMP"],"GvrModelDebugLog.txt") def DebugToFile(seq=[""]): """sends the given seq to a file this file is placed in the systems temporary directory. It uses the 'pprint' standard module to format the sequence. """ try: f = open(debugfile,"a") print >> f,time.asctime() print "Debug output send to %s" % debugfile pprint.pprint(seq,f) finally: f.close() class Breakpoint(Exception): pass class GvrModel: """This is the model from the MVC pattern. Every method in this class returns None on faillure, anything else means succes.""" def __init__(self,*args): """args is optional and not used. It's here for possible future use""" self.logger = logging.getLogger("gvr.GvrModel.GvrModel") self.logicworld = None self.myStepper = None # timer interval self.interval = 500 def stop(self): """This is called by the controller when the app should exit/stop. Do any cleanup here before it returns.""" pass def set_controller(self,contr): self.controller = contr return 1 def set_timer(self): self.timer = self.controller.get_timer() self.timer.set_func(self.wakeUp) self.timer.set_interval(interval=self.interval) def on_code_execute(self,gui=None,step=None): """The controller calls this when the user hits the 'execute' button. When step is True the timer isn't started. This is the point from where the whole show starts.""" self.logger.debug("on_code_execute called") worldlines = self.controller.get_worldwin_text() if _DEBUG > 1: print self.__class__,"worldlines",worldlines codelines = self.controller.get_codewin_text() if len(worldlines) == 0 or len(codelines) == 0: self.controller.give_warning(_("Please load a world and program before executing.")) return None codestring = "\n".join(codelines) if _DEBUG > 1: print self.__class__,"codestring",codestring logicworld = self.on_world_reload(worldlines) if not logicworld:# on_world_reload gives signals the controller in case of error return None # logicworld is made a class member because stepper doesn't pass the # logicworld object when it calls updateWorldBitmapAfterMove. # Because we want all the logic to use the same logicworld object we # made it a class member so that updateWorldBitmapAfterMove uses the # self.logicworld to pass on to the controller. # see also updateWorldBitmapAfterMove and GvrController.word_state_changed self.logicworld = logicworld # GuiWorld gets a GvrModel reference because it expects a object with a # updateWorldBitmapAfterMove(oldcoords) method which it calls when the # world state is changed. myGuiWorld = guiWorld.GuiWorld(self,logicworld) try: # stepper can be passed a object to highlight the current line of code # This object is 'debugger' which just provides the method stepper # calls: setLine # See stepper.Stepper.step self.myStepper = stepper.Stepper(codestring, myGuiWorld,self.controller) except gvrparser.BadCommand,info: utils.trace_error() self.controller.give_error(str(info)) else: if step: return 1 else: self.start_timer() #self.controller.draw_world(logicworld) return 1 def start_timer(self): if _DEBUG: print "start timer called" self.set_timer()# will also set self.timer self.timer.set_interval(self.controller.get_timer_interval()) self.timer.start() def wakeUp(self): """This calls stepper.step to execute the lines of code from the gvr program. It caches the stepper exceptions and when needed signals the controller that we stop/quit This is also called by the controller when the user hits the step button.""" #print "wakeUp called" if not self.myStepper: self.on_code_execute(step=True) try: self.myStepper.step() #self.refresh() #self.updateStatusBar() #self.startTimer() except guiWorld.TurnedOffException: self.stopRobot() self.controller.give_info(_('Robot turned off')) except (guiWorld.GuiWorldException,\ stepper.OutOfInstructionsException),e: self.stopRobot() self.controller.give_warning(str(e)) except Breakpoint: pass # XXX Not sure what to do here. Stas Z #self.Pause() except AttributeError: # happens when no world is loaded self.logger.exception("No world loaded?") pass else: pass # place holder for telling controller to update the world ?? return 1 def stopRobot(self): """Stops the robot and does some cleanup.""" #self.testtimer = 0 try: self.timer.stop() except: pass if _DEBUG: print "stoprobot" self.myStepper = None #self.stopTimer() #self.executeButton.Enable(1) #self.pauseButton.Enable(0) #self.abortButton.Enable(0) #self.reloadButton.Enable(1) return 1 def debug(self, message): """Wrapper for debug messages, the message will be put in a dialog from the view.""" self.controller.give_info(message) return 1 def updateWorldBitmapAfterMove(self,oldcoords=None): """Wrapper needed because stepper calls it after a move from guido. oldcoords are the old robot coords. Called from guiWorld.GuiWorld""" if not self.logicworld: print "no logicworld in GvrModel updateWorldBitmapAfterMove" print "This should not happening" self.controller.world_robot_state_changed(self.logicworld,oldcoords) self.controller.world_beepers_state_changed(self.logicworld) def updateWorldBitmapAfterBeeper(self): """Wrapper needed because stepper calls it after a beeper action from guido. oldcoords are the old robot coords. Called from guiWorld.GuiWorld""" self.controller.world_beepers_state_changed(self.logicworld) def on_world_reload(self,worldcode): """ This will return a world object representing the logic from the world code, it also makes it a class attribute. @worldcode must be a list of strings.""" #print self.__class__,'on_world_reload called' try: logicworld = world.World() # worldMap changes/sets the logicworld attributes worldMap.readWorld(worldcode, logicworld) except Exception,info: #print info self.controller.give_error(str(info)) return None else: self.stopRobot() if _DEBUG > 1: print "logicworld:" print "robot pos",logicworld.get_robots_position() print "robot dir",logicworld.get_robots_direction() self.logicworld = logicworld self.controller.world_state_changed(self.logicworld) return self.logicworld def get_beepers(self): """Return the number of beepers the robot has.""" b = None if self.logicworld: b = self.logicworld.get_robots_beepers() return b def get_position(self): """Returns the robot position in a tuple.""" p = None if self.logicworld: p = (self.logicworld.get_robots_position(), self.logicworld.get_robots_direction()) return p