# Hier wird die Spielwelt verwaltet. # Auch die Terminalausgabe passiert hier. import WorldParser import ParsedCommand import ActionModul import curses from curses import wrapper import logging from os import system, name class World: def clearScreen(self): self.stdscr.clear() def printText(self,textid): self.clearScreen() self.stdscr.addstr(1,0,self.texte[textid].name) self.waitForCR() self.printRaum() def printKarte(self): self.clearScreen() s = self.stdscr LAND=curses.color_pair( 5) WASSER=curses.color_pair(4) s.addstr(1,0,' ',LAND) s.addstr(1,17,'H', WASSER) s.addstr(1,18,' ', WASSER) s.addstr(1,51,'N ', LAND) s.addstr(2,0,' ',LAND) s.addstr(2,14,' ', WASSER) s.addstr(2,48,' W+O ', LAND) s.addstr(3,0,'X(Baum) ', LAND) s.addstr(3,10,' ',WASSER) s.addstr(3,46,' S ', LAND) s.addstr(4,0,' ', LAND) s.addstr(4,10,' ',WASSER) s.addstr(4,45,' ',LAND) s.addstr(5,0,' ', LAND) s.addstr(5,7,' ',WASSER) s.addstr(5,45,' ',LAND) s.addstr(6,0,' ', LAND) s.addstr(6,6,' ',WASSER) s.addstr(6,45,' ',LAND) s.addstr(7,0,' ', LAND) s.addstr(7,6,' ',WASSER) s.addstr(7,44,' ',LAND) s.addstr(8,0,' ', LAND) s.addstr(8,6,' ',WASSER) s.addstr(8,44,' ',LAND) s.addstr(9,0,' ', LAND) s.addstr(9,6,' großer ',WASSER) s.addstr(9,44,' ',LAND) s.addstr(10,0,' ', LAND) s.addstr(10,6,' See ',WASSER) s.addstr(10,44,' ',LAND) s.addstr(11,0,' ',WASSER) s.addstr(11,43,' ',LAND) s.addstr(12,0,' ',WASSER) s.addstr(12,17,' ', LAND) s.addstr(12,18,' ',WASSER) s.addstr(12,41,' o ',LAND) s.addstr(13,0,' ',WASSER) s.addstr(13,39,' (Grab) ',LAND) self.waitForCR() def printBefehle(self): self.clearScreen() befehlar = [] count = 0 self.stdscr.addstr(5,1,'Das System versteht folgende Befehle:') for befehlid in self.befehle: befehl = self.befehle[befehlid].name befehlar.append(befehl) count = count +1 self.stdscr.addstr(6,1, str(befehlar)) self.waitForCR() self.waitForCR() def waitForCR(self): self.stdscr.addstr(0,0,'Taste für Weiter',curses.color_pair(1)) self.stdscr.getch() def labelsInventar(self): labels =[] for itemid in self.inventar: item = self.inventar[itemid] labels.append(item.name) return labels def fortschritt(self): anz_raeume, anz_entdeckt = self.zaehleRaeume() return round((anz_entdeckt/anz_raeume) *100,2) def printRaum(self): raum = self.aktuellerRaum beschreibung = self.aktuellerRaum.beschreibung if self.aktuellerRaum.id == self.RAUM_LOCH: fackel = self.findItemImInventarById(self.ITEM_FACKEL) logging.debug(f'fackel={fackel}') if fackel != None: textid=f'raum-{self.RAUM_LOCH}-{fackel.zustand}' beschreibung = self.texte[textid].name self.clearScreen() if self.fehler != None and self.fehler != '': self.stdscr.addstr(self.fehler,curses.color_pair(1)) self.stdscr.addstr(3,0,'aktueller Raum: ' + raum.name,curses.color_pair(3)) self.stdscr.addstr(4,0,beschreibung) self.stdscr.addstr(7,0,'Gegenstände: ' + str(raum.labelsGegenstaende()),curses.color_pair(2)) self.stdscr.addstr(8,0,'Inventar: '+ str(self.labelsInventar()), curses.color_pair(2)) self.stdscr.addstr(9,0,'Personen: ' + str(raum.labelsPersonen()),curses.color_pair(2)) aus = raum.ausgaenge self.stdscr.addstr(10,0,'mögliche Richtungen: ') r = [] if aus[self.NORD] != '-1': r.append('Norden') if aus[self.OST] != '-1': r.append('Osten') if aus[self.WEST] != '-1': r.append('Westen') if aus[self.SUED] != '-1': r.append('Süden') if aus[self.RAUF] != '-1': r.append('Rauf') if aus[self.RUNTER] != '-1': r.append('Runter') richtungen ='' ixri = 0 anz_raeume, anz_entdeckt = self.zaehleRaeume() progress = (anz_entdeckt/anz_raeume) *100 self.stdscr.addstr(6,85,f'Schritte: {self.schrittzaehler}, Räume:{anz_entdeckt}/{anz_raeume}, Fortschritt: {self.fortschritt()}%') win = curses.newwin(7,35,7,85) win.box() win.addstr('Ausgänge:') for ri in r: richtungen = richtungen + ri win.addstr(ixri+1,1,ri) if ixri +1 < len(r): richtungen = richtungen + ', ' ixri = ixri +1 self.stdscr.addstr(10,22,richtungen) self.stdscr.refresh() win.refresh() def sucheRaum(self,id): for raumid in self.raumliste: raum = self.raumliste[raumid] # logging.debug(f'{raumid} - {raum.id}') if raum.id == id: return raum return None def sucheRaumName(self,name): if name == None: return self.aktuellerRaum for raumid in self.raumliste: raum = self.raumliste[raumid] if raum.name.lower() == name.lower(): return raum return None def findItemImInventarOderAktuellerRaum(self,itemname): item = self.findItemImInventar(itemname) if item == None: item = self.findItemInAktuellerRaum(itemname) return item def findItemById(self,id): for itemkey in self.gegenstaende: item = self.gegenstaende[itemkey] logging.debug(f'itemkey: {itemkey} item.id= {item.id} - {id}') if item.id == id: logging.debug(f'findItemBy(): return {item.name}') return item return None def findRaumById(self,raumid): for rid in self.raumliste: if rid == raumid: return self.raumliste[rid] return None def findItemInAktuellerRaum(self,itemname): raum = self.aktuellerRaum for itemid in raum.items: item = raum.items[itemid] logging.debug(f'raum.id={raum.id}') logging.debug(f'item.raumid={item.raumid}') logging.debug(f'findItemInAktuellerRaum() {itemname} - {item.name}') if item.raumid == raum.id and item.name.lower() == itemname.lower(): return item logging.debug(f'Item {itemname} nicht im aktuellen Raum gefunden') return None def findRaumItemById(self,id): raum = self.aktuellerRaum for itemid in raum.items: item = raum.items[itemid] logging.debug('findRaumItemById() ' + id + '-' + item.id) if item.raumid == raum.id and item.id == id: return item return None def findPersonImAktuellenRaum(self, personname): raum = self.aktuellerRaum for persid in raum.personen: person = raum.personen[persid] if person.name.lower() == personname.lower(): return person return None def findPersonImAktuellenRaumById(self, personid): raum = self.aktuellerRaum for persid in raum.personen: person = raum.personen[persid] logging.debug(f'{person.id} - {personid}') if person.id == personid: return person return None def findItemImInventar(self,itemname): for itemid in self.inventar: if self.inventar[itemid].name.lower() == itemname.lower(): return self.inventar[itemid] return None def findItemImInventarById(self,id): for itemid in self.inventar: if self.inventar[itemid].id == id: return self.inventar[itemid] return None def ermittleBefehlId(self,befehl): for id in self.befehle: name = self.befehle[id].name #logging.debug(f'{befehl} - {name}') if name == befehl: return id return None def findAdjektiv(self,adjektiv): skip def removeSortouts(self,words,parsedCommand): w = [] for word in words: if word in self.adjektive: if word == adj.name: parsedCommand.adjektiv = adj if word not in self.sortouts: w.append(word) return w def parseInput(self,input): logging.debug(f'parseInput() {input}') words = input.split(' ') parsedCommand = ParsedCommand.ParsedCommand() words = self.removeSortouts(words,parsedCommand) befehlid = self.ermittleBefehlId(words[0]) logging.debug(f'parseInput() befehlid {befehlid}') if befehlid != None: befehl = self.befehle[befehlid] parsedCommand.commandid = befehl.id parsedCommand.key = befehl.key if len(words) > 1: parsedCommand.gegenstand = words[1] if len(words) > 2: parsedCommand.gegenstand2 = words[2] return parsedCommand def zaehleEntdeckteRaeume(self): count = 0 for raumid in self.raumliste: raum = self.raumliste[raumid] if raum .entdeckt: count += 1 return count def zaehleRaeume(self): count = 0 entdeckt = 0 for raumid in self.raumliste: raum = self.raumliste[raumid] if raum .entdeckt: entdeckt += 1 count += 1 return count, entdeckt def findPrevRaumId(self): return self.weg[-1] def debug_Items(self): logging.debug('liste Items') logging.debug(self.gegenstaende) count = 1 for key in self.gegenstaende: item = self.gegenstaende[key] logging.debug(f'count= {count}') logging.debug('Itemtyp: ' + str(type(item))) logging.debug(f'Item-IdId:{item.id} - Item-Name:{item.name}') count = count +1 def __init__(self): self.schrittzaehler = 0 self.raumliste = {} self.msg = {} self.personen = {} self.bewegungen = {} self.gegenstaende = {} self.adjektive = {} self.befehle = {} self.inventar = {} self.objekte = {} self.sortouts = [] self.texte = {} self.weg = [] self.vorraum = '-1' self.aktuellerRaum = None self.parsedCommand = None self.NOEXIT = '-1' self.NORD = '0' self.OST = '1' self.SUED = '2' self.WEST = '3' self.RAUF = '4' self.RUNTER = '5' self.VERSION = '0.5' self.ITEM_TISCH = '1' self.ITEM_LEITER = '2' self.ITEM_TRUHE = '3' self.ITEM_PFLANZE = '4' self.ITEM_HAUSTUER = '5' self.ITEM_KRUG = '6' self.ITEM_BETT = '7' self.ITEM_NACHTSCHRANK = '8' self.ITEM_KLEINER_SCHLUESSEL = '9' self.ITEM_JACKE = '10' self.ITEM_SEIL = '12' self.ITEM_HAUSTUERSCHLUESSEL = '13' self.ITEM_RANKGITTER = '14' self.ITEM_PLANKE = '15' self.ITEM_TEICH = '16' self.ITEM_FISCH = '17' self.ITEM_SCHWERT = '18' self.ITEM_BOXSACK = '19' self.ITEM_MAUS = '20' self.ITEM_BOHNENRANKE = '21' self.ITEM_ELEFANT = '22' self.ITEM_HAFEN = '23' self.ITEM_GATTER = '25' self.ITEM_SCHACHTEL = '26' self.ITEM_KARTE = '27' self.ITEM_BOOT = '28' self.ITEM_FACKEL = '29' self.ITEM_SCHWIMMWESTE = '30' self.ITEM_KABINE = '31' self.ITEM_BEIBOOT = '32' self.ITEM_DIAMANT = '33' self.ITEM_SOCKEL = '34' self.ITEM_PALME = '40' self.ITEM_LOCH = '41' # Räume self.RAUM_UNDEF = '-1' self.RAUM_ESSZIMMER = '1' self.RAUM_DACHBODEN = '2' self.RAUM_FLUR = '3' self.RAUM_SCHLAFZIMMER = '4' self.RAUM_KELLER = '5' self.RAUM_GARTEN = '6' self.RAUM_DACH = '7' self.RAUM_BACH = '8' self.RAUM_FELD = '9' self.RAUM_TEICH = '10' self.RAUM_FELD = '11' self.RAUM_KLEINES_FELD = '12' self.RAUM_WIESE = '13' self.RAUM_BRACHLAND = '14' self.RAUM_BOHNENRANKE = '15' self.RAUM_PFAD = '16' self.RAUM_PFAD_SUED = '17' self.RAUM_PFAD_OST = '18' self.RAUM_TAL = '19' self.RAUM_BAUM = '20' self.RAUM_TUNNEL = '21' self.RAUM_STRAND = '22' self.RAUM_HAFEN = '23' self.RAUM_BAUMHAUS = '24' self.RAUM_BOOT = '25' self.RAUM_KABINE = '26' self.RAUM_BOOT2 = '27' self.RAUM_BEIBOOT = '28' self.RAUM_INSEL = '30' self.RAUM_LOCH = '31' self.RAUM_BOOT3 = '32' self.RAUM_KLIPPE = '33' self.RAUM_WASSER = '34' self.RAUM_STRAND = '35' self.RAUM_WALD = '36' self.RAUM_STATUE = '37' self.RAUM_KOPF = '38' self.RAUM_MAUER = '39' self.RAUM_GRAB = '40' # Personen self.PERSON_GEIST = '4' self.PERSON_FISCH = '2' self.PERSON_STIER = '5' self.PERSON_ZWERG = '6' self.fehler = '' parser = WorldParser.WorldParser(self) parser.parseWorld('world.xml')