475 lines
13 KiB
Python
475 lines
13 KiB
Python
# 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():
|
|
logging.debug(f'return {item.name}')
|
|
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 = '38'
|
|
self.ITEM_SOCKEL = '34'
|
|
self.ITEM_PALME = '40'
|
|
self.ITEM_LOCH = '41'
|
|
self.ITEM_KOPF = '42'
|
|
|
|
# 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')
|
|
|
|
|