def monster_menu_selection(menu_entry):
    monsters = DnD.Monsters()

    if menu_entry in range(6, 11) and menu_entry != 7:
        monster_name = input('Enter monster name: \n')

        if menu_entry == 6:
            monsters.create_monster(monster_name)

        if menu_entry == 8:
            monsters.list_monster_stats(monster_name)

        if menu_entry == 9:
            while True:
                try:
                    monsters.list_monster_stats(monster_name)
                    monster_stat = input('Enter stat name: \n')
                    new_stat = int(input('Enter new stat value: \n'))
                    monsters.change_stat(monster_name, monster_stat, new_stat)

                except ValueError:
                    print('Enter a number, not a string.')

                break

        if menu_entry == 10:
            monsters.remove_monster(monster_name)

    elif menu_entry == 7:
        monsters.list_monsters()
Exemple #2
0
def cr_appraisal(party):
    """
    Assess the victory probability of each monster in the manual against Creatures in the `party` Encounter
    :param party: a list of creatures
    :return:
    """
    # set to same team
    for pc in party:
        pc.alignment = "players"
    out = csv.DictWriter(open("CR stats.csv", 'w', newline=''),
                         fieldnames=[
                             'beast', 'victory'
                         ])  # DnD.Encounter().json() is overkill and messy
    out.writeheader()
    # challenge each monster
    for beastname in DnD.Creature.beastiary:
        beast = DnD.Creature(beastname)
        beast.alignment = "opponent"
        party.append(
            beast)  # seems a bit wrong, but everything gets hard reset
        party.go_to_war(100)
        print(beastname + ": " + str(party.tally['victories']['players']) +
              "%")
        out.writerow({
            'beast': beastname,
            'victory': party.tally['victories']['players']
        })
        party.remove(beast)  # will perform a hard reset by default
def character_menu_selection(menu_entry):
    characters = DnD.Characters()

    if menu_entry == 1 or menu_entry >= 3:
        character_name = input('Enter character name: \n').lower()

        if menu_entry == 1:
            characters.create_character(character_name)

        elif menu_entry == 3:
            characters.list_character_stats(character_name)

        elif menu_entry == 4:
            while True:
                try:
                    characters.list_character_stats(character_name)
                    character_stat = input('Enter stat name: \n')
                    new_stat = int(input('Enter new stat value: \n'))
                    characters.change_stat(character_name, character_stat,
                                           new_stat)

                except ValueError:
                    print('Enter a number, not a string.')

                break

        elif menu_entry == 5:
            characters.remove_character(character_name)

    elif menu_entry == 2:
        characters.list_characters()
Exemple #4
0
def poster(environ, start_response):  #If POST...
    #from cgi import parse_qs
    try:
        request_body_size = int(environ['CONTENT_LENGTH'])
        request_body = environ['wsgi.input'].read(request_body_size)
    except (TypeError, ValueError):
        request_body = "0"
        print("No request found")

    #parsed_body = parse_qs(request_body)
    #value = parsed_body.get('test_text', [''])[0] #Returns the first value

    try:
        l = json.loads(str(request_body)[2:-1])
        wwe = DnD.Encounter(*l)
        w = threading.Thread(target=wwe.go_to_war, args=(1000, ))
        w.start()
        time.sleep(10)
        wwe.KILL = True
        response_body = wwe.battle(1, 1).json()
        add_to_tales(wwe)
    except Exception as e:
        print(e)
        response_body = json.dumps({'battles': "Error: " + str(e)})
    ctype = 'text/plain'
    response_body = response_body.replace("\n", "<br/>")
    response_body = response_body.encode('utf-8')
    status = '200 OK'
    response_headers = [('Content-Type', ctype),
                        ('Content-Length', str(len(response_body)))]
    start_response(status, response_headers)
    return [response_body]
Exemple #5
0
 def _make_buttons(self):
     self._enter_button = tk.Button(
         self._main_frame,
         text='Search',
         command=lambda: self._change_text(
             DnD.search_for(DnD.spell_data.data, self._text_entry.get())))
     self._enter_button.place(relx=0.82,
                              rely=0,
                              relwidth=0.16,
                              relheight=0.05)
def poster():  #If POST...
    #from cgi import parse_qs
    print("Poster")
    #print()
    request_body = ""
    #list = tuple(request.form.items())[0][0] #this one stopped working?!?
    list = ""
    # might be able to use .items() off a dictionary obj may work
    try:
        request_body_size = request.environ['CONTENT_LENGTH']
        print("body size : " + request_body_size)
        #list = json.loads(request.json)
        #print("request body : " + request.form.read(request_body_size))
        #request_body = request.environ['wsgi.input'].read(request_body_size)
    except (TypeError, ValueError):
        request_body = "0"
        print("No request found")

    #parsed_body = parse_qs(request_body)
    #value = parsed_body.get('test_text', [''])[0] #Returns the first value

    try:

        #l = json.loads(str(request_body)[2:-1])
        #l = json.loads(str(request.json))
        l = request.json
        # print("l : " + l)
        wwe = DnD.Encounter(*l)
        w = threading.Thread(
            target=wwe.go_to_war,
            args=(1000, ))  #default is 1000, changing to 5 for testing
        w.start()
        time.sleep(10)
        wwe.KILL = True
        response_body = wwe.battle(1, 1).json()
        add_to_tales(wwe)
    except Exception as e:
        print(e)
        response_body = json.dumps({'battles': "Error: " + str(e)})
    ctype = 'text/plain'
    response_body = response_body.replace("\n", "<br/>")
    response_body = response_body.encode('utf-8')
    status = '200 OK'
    response_headers = [('Content-Type', ctype),
                        ('Content-Length', str(len(response_body)))]
    #start_response(status, response_headers)
    # The view function did not return a valid response.
    # The return type must be a string, dict, tuple, Response instance, or WSGI callable, but it was a list.
    print("resopnse body : " + str(response_body))

    return response_body
Exemple #7
0
    def __init__(self, character):
        super().__init__()

        self.character = character
        try:
            self.image = DnD.load_image(self.character)
        except:
            self.image = 'not loaded'
        self.fonts = []

        # Setup

        self._canvas = tk.Canvas(self, width=1200, height=700)
        self._canvas.pack()
        self._main_frame = tk.Frame(self._canvas, bd=5)
        self._main_frame.place(relwidth=1, relheight=1, anchor='nw')
        self.winfo_toplevel().title('Class Info')
Exemple #8
0
    def getOdds(self):

        friendList = []
        enemyList = []
        count = 0
        best_count = 0

        use_list = str(input("Use default lists? (y/n)"))
        # If default list selected, preload list
        if (use_list == 'y' or use_list == 'Y'):
            #use_list = str(input("Which enemy list? (y/n)"));

            #enemyList = [bandit, bandit, bandit]
            #friendList = [archmage, archmage, archmage]
            for i in range(4):
                enemyList.insert(i, "bandit")
                friendList.insert(i, "archmage")

            #print the lists, so what is in the default is apparent
            print(f"Enemy Force: {enemyList}")
            print(f"Friendly Force: {friendList}")
        #Get user input if not using default or preset list
        else:
            try:
                enemies = int(input("How many enemies: "))
            except ValueError:
                print("Not a Number")

            try:
                friendlies = int(input("How many friendlies: "))
            except ValueError:
                print("Not a Number")

            for i in range(enemies):
                Type = str(input("Type of enemies: "))
                enemyList.insert(i, Type)

            for j in range(friendlies):
                Type = str(input("Type of Friendlies: "))
                friendList.insert(j, Type)

        #Determine and display success rates in single simulated encounters

        if (enemyList == friendList):

            #Loop Checks Encounters based on input
            for q in range(len(enemyList)):
                #Calculations to determine rate

                Friendly = DnD.Creature(friendList[q])
                Enemy = DnD.Creature(enemyList[q])
                #Predictor library found in DnD Battler
                rate = DnD.Encounter(Friendly, Enemy).predict()
                if (rate[1] > rate[3]):
                    count += 1

            #Loop checks all possible encounters and displays the total encounters that
            #can result in a win

            for r in itertools.product(friendList, enemyList):
                Friendly = DnD.Creature(r[0])
                Enemy = DnD.Creature(r[1])
                rate = DnD.Encounter(Friendly, Enemy).predict()
                if (rate[1] > rate[3]):
                    best_count += 1

            #Display success rates
            print(f"\nEnemy Alignment: {rate[0]}")
            print(f"Expected Enemy Success Rate: {rate[1]}")
            print(f"Ally Alignment: {rate[2]}")
            print(f"Expected Ally Success Rate: {rate[3]}")
            print(rate)
            print(
                f"\nAnticipated wins based on current orientation: {count}\n")
            print(
                f"\nPossible amount of favoriable encounters: {best_count}\n")
        else:
            print("Cant Simulate Odd Number of Enemies and Friendlies")
Exemple #9
0
def commoner_brawl(n=5000):
    achilles = DnD.Creature("Achilles", base='commoner', alignment='Achaeans')
    patrocles = DnD.Creature("Patrocles",
                             base='commoner',
                             alignment='Achaeans')
    hector = DnD.Creature("Hector", base='commoner', alignment='Trojans')
    print(achilles.attacks[0]['damage'])
    ratty = DnD.Creature("giant rat")
    rattie = DnD.Creature("giant rat")
    for d in [
            DnD.Dice(1, [2], role="damage"),
            DnD.Dice(0, [4], role="damage"),
            DnD.Dice(-1, [6], role="damage"),
            DnD.Dice(-1, [2, 3], role="damage"),
            DnD.Dice(1, [4], role="damage"),
            DnD.Dice(0, [6], role="damage"),
            DnD.Dice(-1, [8], role="damage"),
            DnD.Dice(2, [2], role="damage"),
            DnD.Dice(0, [2, 3], role="damage"),
            DnD.Dice(-1, [3, 4], role="damage")
    ]:
        achilles.attacks[0]['damage'] = d
        print(
            d, T,
            T.join([
                str(
                    DnD.Encounter(
                        *party).go_to_war(n).tally['victories']['Achaeans'])
                for party in [(achilles, hector), (
                    achilles,
                    ratty), (achilles, patrocles,
                             ratty), (achilles, patrocles, ratty, rattie)]
            ]))
def main():
    # print main menu
    while True:
        print('What would you like to do?')
        print('1) Add a new character')
        print('2) List all characters')
        print('3) List a character\'s stats')
        print('4) Update a character\'s stats')
        print('5) Remove a character')
        print('6) Add a new monster')
        print('7) List all monsters')
        print('8) List a monster\'s stats')
        print('9) Update a monster\'s stats')
        print('10) Remove a monster')
        print('11) Roll a single dX')
        print('12) Roll a XdX')
        print('13) Single attack (no initiative check, no attack hits stat)')
        print('14) Single attack (no initiative check, use attack hit stat)')
        print('15) Battle simulator')
        print('q) Quit \n')

        menu_entry = input()

        # if 'q' or a number is entered quit. If not, re-prompt.
        if menu_entry == 'q':
            exit(print('Bye bye!'))

        elif menu_entry.isalpha():
            print('\nPlease enter \'q\' or a number \n\n')

        # do a sanity check on the entry for numbers
        elif menu_entry.isnumeric():
            menu_entry = int(menu_entry)

            if menu_entry in range(1, 6):
                character_menu_selection(menu_entry)

            elif menu_entry in range(6, 11):
                monster_menu_selection(menu_entry)

            # single-die roll
            elif menu_entry == 11:
                while True:
                    try:
                        sides = int(input('Enter amount of sides: \n'))
                    except ValueError:
                        print('Enter an integer')

                    break

                roll_die(sides)
                input('Press enter to return to the menu. \n\n')

            # multi-die roll
            elif menu_entry == 12:
                while True:
                    try:
                        total_dice = int(input('Number of dice to throw? \n'))
                        sides = int(input('Enter amount of sides: \n'))
                        break

                    except ValueError:
                        print('Enter an integer')

                while total_dice > 0:
                    roll_die(sides)
                    total_dice -= 1

                input('Press enter to continue... \n\n')

            elif menu_entry >= 13:
                # character_name = input('Enter character name: \n')
                # monster_name = input('Enter monster name: \n')
                character_name, monster_name = 'matt', 'vampireSpawn'  # FOR DEV WORK ONLY #
                battle = DnD.Battle(character_name, monster_name)
                damage_type = battle.damage_modifier()
                aggro_level = battle.attack_aggressiveness()

                if menu_entry == 13:
                    single_attack(battle, damage_type)

                elif menu_entry == 14:
                    num_attacks = battle.char['numAttacks']
                    print('Conducting {!s} attacks...'.format(num_attacks))
                    for x in range(num_attacks):
                        print('Attack {0}'.format(x))
                        single_attack(battle, damage_type)

                elif menu_entry == 15:
                    conduct_combat(battle, damage_type, aggro_level)
Exemple #11
0
    Assess the victory probability of each monster in the manual against Creatures in the `party` Encounter
    :param party: a list of creatures
    :return:
    """
    #set to same team
    for pc in party:
        pc.alignment = "players"
    out = csv.DictWriter(open("CR stats.csv", 'w', newline=''),
                         fieldnames=[
                             'beast', 'victory'
                         ])  #DnD.Encounter().json() is overkill and messy
    out.writeheader()
    #challenge each monster
    for beastname in DnD.Creature.beastiary:
        beast = DnD.Creature(beastname)
        beast.alignment = "opponent"
        party.append(beast)  #seems a bit wrong, but everything gets hard reset
        party.go_to_war(100)
        print(beastname + ": " + str(party.tally['victories']['players']) +
              "%")
        out.writerow({
            'beast': beastname,
            'victory': party.tally['victories']['players']
        })
        party.remove(beast)  # will perform a hard reset by default


if __name__ == "__main__":
    cr_appraisal(
        DnD.Encounter('my druid', 'my barbarian', 'mega_tank',
                      "netsharpshooter"))