Commits

Arne Babenhauserheide  committed 49c2b4d

TextRPG story() now outputs scrolling text - thanks to (damn I tend to forget names far too often - he writes a nice and simple GUI for talking to users people with talking GNUs and speech bubbles) for pointing me towards shell escape sequences.

  • Participants
  • Parent commits 35791f8

Comments (0)

Files changed (3)

File rpg_lib/anyrpg.py

     - char.compete(other, skill_name) -> See who wins and by how much. 
 
 Ideas: 
-    - Lazy loading modules, to be able to print stuff at once without having to print before the imports.
+    - Lazy loading modules, to be able to print stuff at once without having to print before the imports. 
     - Add getting experience for groups and show the chars together (only one experience header instead of one per char). 
 
 
 	    sleep(0.01)
             return raw_input(_(question) + " ")
     
-    def diag(self, data, localize=True, autoscroll=False, *args, **kwds):
+    def diag(self, data, localize=True, autoscroll=False, line_wait = 0.4, char_wait = 0.05, *args, **kwds):
+	""" Print a dialog line. 
+	
+	@param line_wait: The time to wait at linebreaks before continuing with the text. 
+	@param char_wait: The time to wait per char before printing the next char. 
+	"""
         if localize: 
             text = _(data)
         else: text = data 
         if not autoscroll: 
             raw_input(text)
         else: 
-            print text
+	    if text: 
+		print text[0]
+	    else: 
+		print text
+		sleep(line_wait)
             # First sleep 1/10th second. This ensures that the text gets shown before sleeping.
-            sleep(0.1)
-            sleep((len(text) - 1)*0.1)
+            sleep(char_wait)
+	    # If we have text, wait one 10th of a second per char. 
+	    for i in range(len(text)): 
+		print '\033[1A' + text[:i+1] # this depends on the shell to work! 
+		sleep(char_wait)
 
 class Dialogs(object): 
     """Basic dialogs. 

File rpg_lib/textrpg.py

 
 The code for the TextRPG can be found at U{http://dreehg.org/ArneBab/textrpg}
 
+Shell escape codes: 
+    - print 'abc';print '\033[2A';sleep(0.3);print 'abcd'; -> die geschriebene Zeile ersetzen. 
+
 """
 
 try: 
 class Story(any_story): 
     def __init__(self, *args, **kwds): 
         super(Story, self).__init__(*args, **kwds)
+
+    def split_diag(self, text, line_length = 80, localize=True, autoscroll=False): 
+	"""Print a dialog in single lines split at word borders. 
+	
+	@param text: The text to output. 
+	@param line_length: Maximum length of a line. 
+	
+	"""
+	# Split the text by words to output at most 80 chars per line. 
+	text_to_print = ""
+	for j in text.split(): 
+	    if len(text_to_print) + len(j) > 80: 
+		self.diag(text_to_print, localize=localize, autoscroll=autoscroll) # TODO: If j > 80 -> split j. 
+		text_to_print = j
+	    else: 
+		# if we already have text_to_print, add j with a space. 
+		if text_to_print: 
+		    text_to_print += " " + j
+		else: 
+		    text_to_print = j
+	self.diag(text_to_print, localize=localize, autoscroll=autoscroll)
     
     def story(self, data=None, *args, **kwds): 
         """Tell a part of the story.
         if data is not None: 
             data = _(data)
             for i in data.split("\n"): 
-                #if i.rstrip() == "": 
-                #    self.diag("...", localize=False)
-                #else: 
-                    self.diag(i, localize=False)
+		self.split_diag(i, localize=False, autoscroll=True)
         
 
 # Define helper functions. 

File tutorial_de.py

 
 story("""Willkommen im Interaktiven TextRPG Tutorial!
 
-Dieser Leitfaden wird Ihnen Schritt für Schritt die Möglichkeiten des TextRPG nahebringen und es Ihnen so ermöglichen auf einfache Art eigene TextRPGs zu schreiben. 
+Dieser Leitfaden wird Ihnen Schritt für Schritt die Möglichkeiten des TextRPG nahebringen und es Ihnen so ermöglichen auf einfache Weise eigene TextRPGs zu schreiben. 
 
 Erstmal zur Definition: Ein TextRPG ist eine interaktive Geschichte, in die ihre Nutzer eintauchen und ihren Ausgang beeinflussen können. 
 
 
 Stattdessen definiert es eine einfache Skriptumgebung, mit der der Code einer interaktiven Geschichte sehr ähnlich aussieht wie ein Skript für ein Theaterstück, Sie gleichzeitig aber auf die gesamte Macht von Python zurückgreifen können, mit dem sowohl einfache Skripte, als auch komplexeste Programme geschrieben werden können (und das auch die NASA und Google nutzen).
 
-Obwohl diese erste Version rein textbasiert ist, sind die Skripte auf eine Art geschrieben, die eine spätere Uebertragung in graphische Oberflächen einfach macht, so dass in den Skripten nur eingefügt werden muss, welche Oberfläche sie nutzen sollen. Das gleiche gilt für sonstige Erweiterungen. 
+Obwohl diese erste Version rein textbasiert ist, sind die Skripte auf eine Art geschrieben, die eine spätere Übertragung in graphische Oberflächen einfach macht, so dass in den Skripten nur eingefügt werden muss, welche Oberfläche sie nutzen sollen. Das gleiche gilt für sonstige Erweiterungen. 
 
 Für Charakterinteraktionen gibt sie Ihnen ausserdem eine vollständige RPG Bibliothek, die das Ein Würfel System implementert, ein universelles und frei lizensiertes Rollenspielsystem. 
 
 
 ask('''Frage? (Antwort 1, antwort 2, ...)''')
 
-ask liefert die Antwort des Benutzers zurück. In obigem Beispiel verfällt sie allerdings. Damit Sie mit ihr arbeiten können müssen Sie diese Antwort noch auffangen. Beispielsweise können Sie sie als antwort speichern: 
+ask liefert die Antwort des Benutzers zurück. 
+
+In obigem Beispiel verfällt sie allerdings. Damit Sie mit ihr arbeiten können müssen Sie diese Antwort noch auffangen. Beispielsweise können Sie sie als "antwort" speichern: 
 
 antwort = ask('''Frage? (Antwort 1, antwort 2, ...)''')
 
 In dem Fall ruft sie story() mit dem Wert '''Gerne!''' auf. 
 
 Gibt der Nutzer keine Antwort, sondern drückt einfach Enter, dann gilt das als "", also eine leere Antwort. Diesen Wert können Sie sehr einfach nutzen, um die Standardantwort zu wählen. 
-Nach Konvention wird die Standardantwort bei Fragen groß geschrieben und der Rest klein. 
+Nach Konvention wird die Standardantwort bei Fragen groß geschrieben und der Rest klein. Damit haben Nutzer mehr Orientierung. Ob Sie sich daran halten ist natürlich Ihre Sache. 
 
 Der Doppelpunkt bei "if ... :" und die Einrückung von story() zeigen in TextRPG Skripten an, dass story('''Oh Ja!''') zu dem Block der if Abfrage gehört. Wo es wieder zur ursprünglichen Einrückung zurück geht (bei elif) ist der if-block beendet.