Package schlachtfeld :: Module namen
[hide private]
[frames] | no frames]

Source Code for Module schlachtfeld.namen

  1  #!/bin/env python 
  2  # encoding: utf-8 
  3   
  4  # Schlachtfeld - Großkämpfe im EWS System 
  5  #   http://rpg-tools-1d6.sf.net 
  6  # Copyright © 2007 - 2007 Achim Zien 
  7   
  8  # This program is free software; you can redistribute it and/or modify 
  9  # it under the terms of the GNU General Public License as published by 
 10  # the Free Software Foundation; either version 2 of the License, or 
 11  # (at your option) any later version. 
 12   
 13  # This program is distributed in the hope that it will be useful, 
 14  # but WITHOUT ANY WARRANTY; without even the implied warranty of 
 15  # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 16  # GNU General Public License for more details. 
 17   
 18  # You should have received a copy of the GNU General Public License 
 19  # along with this program; if not, write to the Free Software 
 20  # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, 
 21  # MA 02110-1301 USA 
 22   
 23  """Dieses Modul kapselt mehrere Namensgeneratoren.  
 24   
 25  Anwendung:  
 26   
 27  import namen 
 28   
 29  name = Name(anzahl=200,  quelle="yould", art="Englisch") 
 30   
 31  Möglichkeiten:  
 32   
 33  anzahl: yould und cfnamegen erstellen beide immer 500 namen auf einen Schlag, was bei Geschiwndigkeitstest berücksichtigt werden sollte.  
 34   
 35  quellen:  
 36          - yould: Namen auf Grundlage der Wahrscheinlichkeit, dass eine bestimmte Kombination in einem Wort auftaucht.  
 37          - pointon_phonetic: Einfacher Namensgenerator mit zufallsalgorythmus 
 38          - cfnamegen: Ähnlich ie pointon_phonetic. Auf Grundlage von Kontexctfreien Grammatiken  
 39   
 40  art: Wird bisher nur von yould verwendet. Esperanto oder Enlisch. Sonstige Werte werden als "Altenglisch" gewertet (default).  
 41   
 42  """ 
 43   
 44  #### Imports #### 
 45   
 46  import random_phonetic_name_generator_von_Pointon.random_phonetic_name_generator as phonetic_gen 
 47   
 48  import yould.yould as yould 
 49   
 50  import namegen.pycfnamegen.cfnamegen as cfnamegen 
 51   
 52  import string 
 53   
 54  # Obtain Grammars from yaml-files 
 55  from amov import Namensgrammatik, Versionsverwaltung 
 56   
 57   
 58  #### Imports #### 
 59   
 60  #### Classes #### 
 61   
62 -class Name:
63 - def __init__(self, art="Esperanto", familie="default", stimmung="default", anzahl=1, quelle="cfnamegen"):
64 """Container for all name-generation actions. Call it global, to be able to reuse it.""" 65 # TODO: Implement familie und stimmung 66 self.name = "" #: One result 67 self.names = [] #: The list of names. 68 self.art = art #: The type of the name. Ork, Elf, Mensch, Troll, Deutsch, Englisch, ... 69 self.familie = familie #: Die Unterart. Orks -> Mordor, Orks -> Isengard, noch nicht in Verwendung 70 self.stimmung = stimmung #: Stimmung: Düster, Stark, Verloren... noch nicht in Verwendug. 71 self.anzahl = anzahl #: Number of names to generate. 72 self.anzahl_erzeugter_namen = 0 #: Wieviele Namen dieses Objekt bereits erzeugt hat. 73 self.Quelle = quelle #: Die genutzte Namensquelle. 74
75 - def erzeuge(self,art="Esperanto", familie="default", stimmung="default"):
76 """Erzeuge die Namen. After 2500 names, always switch to the quick gen.""" 77 if self.anzahl_erzeugter_namen < 4500: 78 self.schnell = False 79 else: 80 self.schnell = True 81 82 if self.Quelle == "pointon_phonetic" or self.schnell: 83 return self.pointon_namen() 84 elif self.Quelle == "yould": 85 return self.yould_namen(art, familie, stimmung) 86 elif self.Quelle == "cfnamegen": 87 return self.cfnamegen_namen() 88
89 - def erzeuge_speziellen_namen(self,art="Esperanto", familie="default", stimmung="default"):
90 """Erzeuge besonderen Namen. Nimm dafür immer den besten Namensgenerator.""" 91 return self.yould_namen(art=art, familie=familie, stimmung=stimmung) 92
93 - def yould_namen(self, art="Esperanto", familie="default", stimmung="default"):
94 """Hol die Namen aus dem Yould Namensgegerator.""" 95 if self.anzahl == 1: # Generate only one name 96 # since yould is much faster when it generates many names at once, we first prepare 1000 names for internal use. 97 # But only, if we have no more names avaible. 98 if len(self.names) < 2: 99 # print "Erzeuge die Namen", self.anzahl_erzeugter_namen, 'bis', self.anzahl_erzeugter_namen + 500 100 self.names = self.yould_aufrufen(anzahl=1000, art=art, familie=familie, stimmung=stimmung) 101 self.anzahl_erzeugter_namen += 500 102 self.name = " ".join([self.names[0].capitalize(), self.names[1].capitalize()]) 103 # Lösche die beiden verwendeten Namen. 104 del(self.names[0]) 105 del(self.names[0]) 106 # print self.name, "noch", len(self.names), "Namen verfügbar" 107 return self.name 108 else: # Generate many names 109 self.names = self.yould_aufrufen(self.anzahl * 2) 110 names = [] 111 for i in range(self.anzahl): 112 names.append(self.names[2*i].capitalize() + " " + self.names[(2*i)+1].capitalize()) 113 return names 114
115 - def yould_aufrufen(self, anzahl=1000, art="Esperanto", familie="default", stimmung="default"):
116 if art == "Esperanto": 117 names = yould.generate_names(eval(open("yould/gutenberg_esperanto.prob").read()), 5, 12, 1000, 0, min_prob=0.000000001, max_prob=0.00001) 118 if art == "Englisch": 119 names = yould.generate_names(eval(open("yould/various_gutenberg.prob").read()), 5, 12, 1000, 0, min_prob=0.000000001, max_prob=0.00001) 120 else: 121 names = yould.generate_names(eval(open("yould/gutenberg_erotik_und_romantik.prob").read()), 5, 12, 1000, 0, min_prob=0.000000001, max_prob=0.00001) 122 return names 123
124 - def pointon_namen(self):
125 """Hol die Namen aus dem Pointon Namensgenertor.""" 126 if self.anzahl == 1: 127 self.name = phonetic_gen.namegen() + " " + phonetic_gen.namegen() 128 return self.name 129 else: 130 while self.anzahl > 0: 131 self.name = phonetic_gen.namegen() + " " + phonetic_gen.namegen() 132 self.names.append(self.name) 133 self.anzahl -= 1 134 return self.names 135
136 - def cfnamegen_namen(self):
137 """Hol die Namen aus dem CFNameGen Namensgenertor. TODO: Mehrere Namen auf einmal erzeugen.""" 138 if self.anzahl == 1: 139 # Fist create 1000 names and keep them (optimization). 140 if len(self.names) == 0 or len(self.names) == 1: 141 self.names = self.cfnamegen_aufrufen(anzahl=1000) 142 # Then for each name join two names to get first and second name. 143 self.name = self.names[0] + " " + self.names[1] 144 del self.names[0] 145 del self.names[0] 146 return self.name 147 else: 148 # return a fixed number of names. 149 grammatikObjekt = Namensgrammatik.Grammar() 150 fooGrammar = grammatikObjekt.grammar 151 names = [] 152 self.names = self.cfnamegen_aufrufen(anzahl=self.anzahl*2) 153 while self.anzahl != 0: 154 self.name = self.names[0] + " " + self.names[1] 155 del self.names[0] 156 del self.names[0] 157 names.append(self.name) 158 self.anzahl -= 1 159 return names 160
161 - def cfnamegen_aufrufen(self, anzahl=1000):
162 grammatikObjekt = Namensgrammatik.Grammar() 163 fooGrammar = grammatikObjekt.grammar 164 foong = cfnamegen.CFNameGen(fooGrammar) 165 names = [] 166 while anzahl != 0: 167 names.append(foong.getName()) 168 anzahl -= 1 169 return names 170 171 172 173 #### Classes #### 174 175 #### Self-Test #### 176 177 if __name__ == "__main__": 178 print "Erzeuge Esperanto-Namen mit yould" 179 name = Name(anzahl=20, quelle="yould") 180 namen = name.erzeuge() 181 for i in namen: 182 print i 183 print "\nErzeuge Englische Namen mit yould" 184 name = Name(anzahl=20, quelle="yould", art="Englisch") 185 namen = name.erzeuge() 186 for i in namen: 187 print i 188 print "\nErzeuge erotische Namen mit yould" 189 name = Name(anzahl=20, quelle="yould", art="Martin Luther") 190 namen = name.erzeuge() 191 for i in namen: 192 print i 193 print "\nErzeuge die Namen mit pointon" 194 name = Name(anzahl=20, quelle="pointon_phonetic") 195 namen = name.erzeuge() 196 for i in namen: 197 print i 198 print "\nErzeuge die Namen mit cfnamegen" 199 name = Name(anzahl=20, quelle="cfnamegen") 200 namen = name.erzeuge() 201 for i in namen: 202 print i 203 204 #### Self-Test #### 205