def make_location(vnum): """ Get a Tale location object for the given circle room vnum. This performs an on-demand conversion of the circle room data to Tale. """ try: return converted_rooms[vnum] # get cached version if available except KeyError: c_room = rooms[vnum] loc = Location(c_room.name, c_room.desc) loc.vnum = vnum # keep the circle vnum for ed in c_room.extradesc: loc.add_extradesc(ed["keywords"], ed["text"]) converted_rooms[vnum] = loc for circle_exit in c_room.exits.values(): if circle_exit.roomlink >= 0: xt = make_exit(circle_exit) while True: try: xt.bind(loc) break except LocationIntegrityError as x: if x.direction in xt.aliases: # circlemud exit keywords can be duplicated over various exits # if we have a conflict, just remove the alias from the exit and try again xt.aliases = xt.aliases - {x.direction} continue else: if loc.exits[x.direction] is xt: # this can occur, the exit is already bound break else: # in this case a true integrity error occurred raise else: # add the description of the inaccessible exit to the room's own description. loc.description += " " + circle_exit.desc return loc