def print(self, index): #todo: pass colored indeces into dbox func. to allow colored messages x = rog.msgs_x() y = rog.msgs_y() w = rog.msgs_w() h = rog.msgs_h() rog.dbox(x, y, w, h, self.msgs[index], border=None, margin=0)
def _alreadyHaveTrait(string): rog.dbox( 0,0,rog.window_w(),4, text='''You already have this trait: "{}". <Press any key to continue>'''.format(string), wrap=True,con=rog.con_final(),disp='mono' ) rog.refresh() rog.Input(rog.window_w()-2,1,mode='wait')
def _insufficientPoints(points, cost, string): rog.dbox( 0,0,rog.window_w(),5, text='''Not enough {} points remaining. (Cost: {} | Points remaining: {}) <Press any key to continue>'''.format(string, cost, points), wrap=False,con=rog.con_final(),disp='mono' ) rog.refresh() rog.Input(rog.window_w()-2,1,mode='wait')
def _maxedSkill(string): rog.dbox( 0,0,rog.window_w(),8, text='''You've reached the maximum skill level in skill: "{}". Please choose another skill, or select "<confirm>" on the "character specs" menu to continue. <Press any key to continue>'''.format(string), wrap=True,con=rog.con_final(),disp='mono' ) rog.refresh() rog.Input(rog.window_w()-2,1,mode='wait')
def _printElement(elemStr): #global yy,y1,x1 rog.dbox(x1, y1 + iy, ROOMW, 3, text=elemStr, wrap=False, border=None, con=rog.con_game(), disp='mono') rog.blit_to_final(rog.con_game(), 0, 0) rog.refresh()
def _select_gender(): Chargen.ww=rog.window_w() rog.dbox(Chargen.x1,Chargen.y1+Chargen.iy,Chargen.ww,3,text="what is your gender?", wrap=True,border=None,con=rog.con_final(),disp='mono') rog.refresh() _gender='' while (_gender == ''): _menuList={'m':'male','f':'female','n':'nonbinary','*':'random',} _gender=rog.menu("gender select",Chargen.xx,Chargen.yy,_menuList,autoItemize=False) if _gender == -1: _gender = 'random' if _gender == 'nonbinary': _genderName = "nonbinary" # temporary... _genderID = GENDER_OTHER else: #random, male and female if _gender == 'random': _gender = random.choice(("male","female",)) if _gender == 'male': _genderName = "male" _genderID = GENDER_MALE elif _gender == 'female': _genderName = "female" _genderID = GENDER_FEMALE # end while # save selected data Chargen._pronouns = rog._get_pronouns(_genderID) Chargen._gender = _genderID Chargen._genderName = _genderName Chargen.female=(Chargen._genderName=="female") # print char data so far libtcod.console_clear(rog.con_final()) _printElement("name: {}".format(Chargen._name), Chargen.iy-1) Chargen.iy=_printElement("gender: {}".format(Chargen._genderName), Chargen.iy) print("gender chosen: ", Chargen._genderName)
def chargen(sx, sy): world = rog.world() # init x1 = 0 y1 = 0 xx = 0 yy = 4 iy = 0 ww = rog.window_w() hh = 5 # _printElement - local function # draw the string to con_game at (x1,y1) then move y vars down def _printElement(elemStr): #global yy,y1,x1 rog.dbox(x1, y1 + iy, ROOMW, 3, text=elemStr, wrap=False, border=None, con=rog.con_game(), disp='mono') rog.blit_to_final(rog.con_game(), 0, 0) rog.refresh() # get char data from player # name _name = rog.prompt(x1, y1, ww, hh, maxw=20, q="What is your name?", mode="text") _title = "" print("Name chosen: ", _name) _printElement("Name: {}".format(_name)) iy += 1 # load saved game loadedGame = False savedir = os.listdir(os.path.join(os.path.curdir, "save")) for filedir in savedir: if ".save" != filedir[-5:]: continue #wrong filetype try: with open(filedir, "r") as save: line = save.readline() if ("name:{}\n".format(_name) == line): #found a match. Begin reading data pc = loadFromSaveFile(save) return pc except FileNotFoundError: pass except: print("ERROR: Corrupted save file detected.") print("Continuing chargen...") break if not loadedGame: #continue chargen... # gender rog.dbox(x1, y1 + iy, ROOMW, 3, text="What is your gender?", wrap=True, border=None, con=rog.con_final(), disp='mono') rog.refresh() #get added genders _genderList = {} genderFileDir = os.path.join(os.path.curdir, "settings", "genders.txt") try: with open(genderFileDir, "r") as file: for line in file: if "//" in line: continue data = line.split(':') if len(data) < 2: continue gname = data[0] data = data[1].split(',') gpronouns = data _genderList.update({gname: gpronouns}) except FileNotFoundError: print("ALERT: file '{}' not found. Creating new file...") with open(genderFileDir, "w+") as file: file.write("\n") #gender selection _gender = '' while (_gender == ''): _menuList = { 'm': 'male', 'f': 'female', 'n': 'nonbinary', '*': 'random', } #read genders from genders.txt _gender = rog.menu("Gender Select", xx, yy, _menuList, autoItemize=False) if _gender == 'nonbinary': #select gender from list of added genders _menuNonbin = [] for jj in _genderList.keys(): _menuNonbin.append(jj) _menuNonbin.append('add new gender') choice = rog.menu("Nonbinary Genders", xx, yy, _menuNonbin) #add gender if choice == 'add new gender': _genderName, _pronouns = _add_gender() else: _genderName = choice _pronouns = _genderList[_genderName] if _genderName == '': #failed to select or add new gender _gender = '' #prompt user again for gender else: #random, male and female if _gender == 'random': _gender = random.choice(( "male", "female", )) if _gender == 'male': _genderName = "male" _pronouns = ( 'he', 'him', 'his', ) elif _gender == 'female': _genderName = "female" _pronouns = ( 'she', 'her', 'hers', ) print("Gender chosen: ", _genderName) _printElement("Gender: {}".format(_genderName)) iy += 1 # class rog.dbox(x1, y1 + iy, ROOMW, 3, text="What is your profession?", wrap=True, border=None, con=rog.con_final(), disp='mono') rog.refresh() _classList = { } #stores {className : (classChar, classID,)} #all classes #create menu options _menuList = {} #stores {classChar : className} #all playable classes _randList = [] #for random selection. for k, v in jobs.getJobs().items(): # k=ID v=charType if v not in rog.playableJobs(): continue #can't play as this class yet ID = k # get ID of the class typ = v # get chartype of the class name = jobs.getName(ID) _classList.update({name: ( typ, ID, )}) _menuList.update({typ: name}) _randList.append(ID) _menuList.update({'*': 'random'}) #user selects a class _className = rog.menu("Class Select", xx, yy, _menuList, autoItemize=False) #random if _className == 'random': _classID = random.choice(_randList) _className = jobs.getName(_classID) #get the relevant data _type = _classList[_className][0] # get the class Char value _mask = _type _classID = _classList[_className][1] #grant stats / abilities of your chosen class print("Class chosen: ", _className) _printElement("Class: {}".format(_className)) iy += 1 # skill rog.dbox(x1, y1 + iy, ROOMW, 3, text="In which skill are you learned?", wrap=True, border=None, con=rog.con_final(), disp='mono') #rog.refresh() #get list of all skills _skillName = rog.menu("Skill Select", xx, yy, SKILLS.values()) #get the skill ID for skid, name in SKILLS.items(): if name == _skillName: _skillID = name break print("Skill chosen: ", _skillName) #should show ALL skills you're skilled in, not just the one you pick #for skill in jobs.getSkills(_skillID): _printElement("Skills: {}".format(_skillName)) iy += 1 #stats? _stats = {} #gift? _gift = 0 #create pc object from the data given in chargen ## pc = world.create_entity( # USE create_monster function!!!! ## cmp.Position(sx,sy), ## cmp.Name(_name, title=_title,pronouns=_pronouns), ## cmp.Draw('@', COL['white']), ## cmp.Form( ## ) ## pc = rog.create_monster('@',0,0,COL['white'],mutate=0) ## pc.name = _name ## pc.title = _title ## pc.mask = '@' ## pc.job = _className ## pc.gender = _genderName ## pc.pronouns = _pronouns ## pc.faction = FACT_ROGUE ## #add additional skill ## rog.train(pc,_skillID) ## #add specific class stats return pc
def examine_pc(pc, item): rog.drain(pc, 'nrg', NRG_EXAMINE) rog.dbox(0,0,40,30, thing.DESCRIPTIONS[item.name])
def _select_class(): _classList={} #stores {className : (classChar, classID,)} #all classes #create menu options _menuList={} #stores {classChar : className} #all playable classes _randList=[] #for random selection. for k,v in entities.getJobs().items(): # k=ID v=charType ## if v not in rog.playableJobs(): continue #can't play as this class yet ID=k # get ID of the class typ=v # get chartype of the class name=entities.getJobName(ID) _classList.update({name:(typ,ID,)}) _menuList.update({typ:name}) _randList.append(ID) _menuList.update({'*':'random'}) classSelected = False while not classSelected: _printChargenData(showclass=False) rog.dbox( Chargen.x1,Chargen.y1+Chargen.iy,Chargen.ww,3, text="what is your profession?", wrap=True,border=None,con=rog.con_final(),disp='mono' ) rog.refresh() #user selects a class _className = rog.menu( "class select",Chargen.xx,Chargen.yy+Chargen.iy,_menuList, autoItemize=False ) #random if (_className == 'random' or _className == -1): _classID = random.choice(_randList) _className = entities.JOBS[_classID][1] #get the relevant data _type = _classList[_className][0] # get the class Char value _mask = _type _classID = _classList[_className][1] _mass = entities.getJobMass(_classID) _jobstats = entities.getJobStats(_classID).items() _jobskills = entities.getJobSkills(_classID) _jobmoney = entities.getJobMoney(_classID) _jobitems = entities.getJobItems(_classID) _jobkeys = entities.getJobClearance(_classID) # for display by confirmation prompt _classDescription = entities.getJobDescription(_classID) # create class stats info _classStats="" if _jobstats: for k,v in _jobstats: _classStats += "{}: {}, ".format(STATS[k],v) _classStats=_classStats[:-2] # create class items info _classItems = "" if _jobitems: for tupl in _jobitems: name,table,quantity,slot,mat,script = tupl matname = "{} ".format(rog.getMatName(mat)) if mat else "" _classItems += "{}{}, x{}; ".format(matname, name, quantity) _classItems=_classItems[:-2] # info about class && confirmation while True: ph=4 text = '''Class: {name}. {desc} Mass: {kg} KG. Starts with (${money}, {items}). [ {stats} ]'''.format( name=_className, kg=_mass, money=_jobmoney, items=_classItems, desc=_classDescription, stats=_classStats ) rog.dbox( 0,0,rog.msgs_w(),12,text, wrap=True,border=1,con=rog.con_final() ) ans=rog.prompt( 0,rog.window_h()-ph,rog.window_w(),ph, q='''Choose this class? y/n''', mode="wait",default='n',wrap=False ) if ans=='y': classSelected=True break elif ans=='n': libtcod.console_clear(rog.con_final()) rog.refresh() break else: continue # end while # end while # confirmed class selection Chargen._type = _type Chargen._classID = _classID Chargen._className = _className Chargen._jobstats = _jobstats Chargen._jobskills = _jobskills Chargen._jobmoney = _jobmoney Chargen._jobitems = _jobitems Chargen._jobkeys = _jobkeys Chargen._jobmass = _mass #add specific class skills for sk_id,sk_lv in Chargen._jobskills.items(): rog.setskill(Chargen.pc, sk_id, sk_lv) # print char data so far _printChargenData() rog.refresh() print("class chosen: ", _className)
def _printElement(elemStr,iy): rog.dbox(Chargen.x1,Chargen.y1+iy,Chargen.ww,3,text=elemStr, wrap=False,border=None,con=rog.con_final(),disp='mono') return iy+1
def _select_trait(_trait): pc=Chargen.pc pts = CHARACTERISTICS[_trait][0] # already have if _trait in Chargen._traits: _alreadyHaveTrait(_trait) return False # confirmation prompt description = CHARACTERISTICS_DESCRIPT[_trait] c = "Costs" if pts < 0 else "Gives" description = '{}: {}. {}: {} pts. Points remaining: {}'.format( _trait, description, c, abs(pts), Chargen.traitPts) rog.dbox( 0,0,Chargen.ww,8, text=description, wrap=True, con=rog.con_final() ) inp=rog.prompt(0,10,Chargen.ww,4,q="select this trait? y/n", mode='wait') if inp!='y': return False # insufficient points if Chargen.traitPts < -pts: _insufficientPoints(Chargen.traitPts, -pts, "trait") return False success = False # (attempt to) apply trait data = CHARACTERISTICS[_trait][1] for k,v in data.items(): # meta traits if k=="skillPts": Chargen.skillPts += v success = True elif k=="statPts": Chargen.statPts += v success = True elif k=="attPts": Chargen.attPts += v success = True # component flags elif k=="astigmatism": # TODO: make these apply components in chargen Chargen.astigmatism=True success = True elif k=="cancer": Chargen.cancer=True success = True elif k=="rapidMetabolism": Chargen.rapidMetabolism=True success = True elif k=="ironGut": Chargen.ironGut=True success = True elif k=="immuneVenom": Chargen.immuneVenom=True success = True elif k=="immunePoison": Chargen.immunePoison=True success = True elif k=="immunePain": Chargen.immunePain=True success = True elif k=="hydrophobia": Chargen.hydrophobia=True success = True elif k=="attractedMen": Chargen.attractedMen=True success = True elif k=="attractedWomen": Chargen.attractedWomen=True success = True elif k=="fastLearner": Chargen.fastLearner=True success = True # sub-menu traits elif k=="talent": success = _select_talent() elif k=="trauma": success = _select_trauma() elif k=="addict": success = _select_addict() elif k=="allergy": success = _select_allergy() elif k=="scarred": success = _select_scar() # body stats elif k=="mfat": Chargen.mbodyfat *= v success = True elif k=="fat": Chargen.bodyfat += v success = True elif k=="mgut": Chargen.mgut *= v #(TODO: make these change stats in chargen) success = True elif k=="mvision": Chargen.mvision *= v #(TODO: make these change stats in chargen) success = True # stats elif k=="mmass": Chargen.mmass *= v success = True elif k=="mass": Chargen.mass += v success = True elif k=="mcm": Chargen.mcm *= v success = True elif k=="mreach": Chargen.mreach *= v success = True elif k=="mreach": Chargen.mreach *= v success = True elif k=="mmsp": Chargen.mmsp *= v success = True elif k=="bea": Chargen.statsCompo.bea += v success = True elif k=="idn": Chargen.statsCompo.idn += v success = True elif k=="cou": Chargen.statsCompo.cou += v success = True elif k=="str": Chargen.statsCompo.str += v*MULT_STATS success = True elif k=="agi": Chargen.statsCompo.agi += v*MULT_STATS success = True elif k=="dex": Chargen.statsCompo.dex += v*MULT_STATS success = True elif k=="end": Chargen.statsCompo.end += v*MULT_STATS success = True elif k=="con": Chargen.statsCompo.con += v*MULT_STATS success = True elif k=="int": Chargen.statsCompo.int += v*MULT_STATS success = True elif k=="resbio": Chargen.statsCompo.resbio += v success = True elif k=="resfire": Chargen.statsCompo.resfire += v success = True elif k=="rescold": Chargen.statsCompo.rescold += v success = True elif k=="respain": Chargen.statsCompo.respain += v success = True # end for if success: # trait chosen successfully Chargen.traitPts += pts if Chargen.traitPts <= 0: Chargen.open_traits = False Chargen._traits.append(_trait) print("trait chosen: {} (pts: {})".format(_trait, Chargen.traitPts)) return True return False