From dad1a4c5885352a971d7c3a07bdab325f4c98d56 Mon Sep 17 00:00:00 2001 From: Zachary Watts Date: Tue, 28 Apr 2026 16:12:21 -0400 Subject: [PATCH] making the ui nicer --- __pycache__/adventurers.cpython-312.pyc | Bin 20854 -> 24752 bytes __pycache__/app.cpython-312.pyc | Bin 565 -> 1369 bytes __pycache__/equipment.cpython-312.pyc | Bin 1102 -> 1370 bytes __pycache__/main.cpython-312.pyc | Bin 5582 -> 5325 bytes __pycache__/spells.cpython-312.pyc | Bin 0 -> 532 bytes adventurers.py | 90 +++++++++++++++++++++++- app.py | 17 ++++- equipment.py | 4 ++ main.py | 21 +++--- spells.py | 6 ++ templates/{sheet.html => index.html} | 18 ++--- templates/party_sheet.html | 82 +++++++++++++++++++++ 12 files changed, 207 insertions(+), 31 deletions(-) create mode 100644 __pycache__/spells.cpython-312.pyc create mode 100644 spells.py rename templates/{sheet.html => index.html} (67%) create mode 100644 templates/party_sheet.html diff --git a/__pycache__/adventurers.cpython-312.pyc b/__pycache__/adventurers.cpython-312.pyc index 5e74106e01c23a71a63cc70e38e0a073d0f2fbde..06a4eaaf509410d15f07f38affec5360711d5aa2 100644 GIT binary patch delta 7626 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 diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc index f81ae2ba022baf47d11ac7b812c365aec87aba2c..0bc0282136780699334c6554b6f257de3b57594d 100644 GIT binary patch literal 1369 zcmZ`(&1)M+6rY*>(#P6K+Y&D%m(YYl+NK{6l+XkUIz((WV_CLVtIUo< zWRg}Pg{1V*-r{3UrNJ)r&_5#3i&_N=gP|?$#Wxw}Ps$R{uFwm)Tr{EaWUI8$TqF&GaBC!BW3kBp+lIy7c=7F%^Iw(EB6)E!C~5lpz7 zG|Q`d!drbQFZS%otvrI;Uy;qJqh5SLw8LHQwb)i+6Z%8p#Y0)87i5(V?kFFME)V=* zW(SJ|RMWQtTRR_iqI69kk)q3mY$y@;I*}5(AO&wr(Nx-#;(A}CYM+Kp%*@3C1Alw- zpdJu4MGgJY{O&6xV72v98%p0?T2XN)pb|-aMD{?F{WD<k1kx*_T@`gt^#f^7HTEo>2qkXEraHJFaQncOjf6?=kNIBbnQ(-;Q=SH1t9amFo$9UIxQH}Ou8+eBf*M!qCDf48YZU`Duei{2tzZk_?$dNnxgizTGm@Y>AM#G%TW0>SgY*o7%G1`t~E7ev@ zC~dX7N|&Wjec8Q?RGRq(%;d>eAuC0G78azB6`ZW-YhdGh`aUQai{szBcIVo6{okDG zwmO`r@;9CMFe`MM8ohH&}ii!6VPbac5rv)E1(`x0}23E@d&p#xqrfKb8pG6$Z delta 303 zcmcb~wUtHvG%qg~0}!}QeVcg)NIwQ~V1OCQ_#87)T~>^dfr%lNDV1e4BSbigHI+4s zcVd#JAbTaNCfiGps3zkrMlDUINsJQAzZmr=Z)f(mxy4eFT3k}aRh*HUTB4UxlAE)V z@fI7HSFFi&i>D~Hq_ik67$jR<#0oT{h!aQ@gDg>)T+8UKDhXsYFg)QFpTTySTfRZ< z4yVKnnH6bQI884wnSKUJGWcn7OwMBwpWM$P9l4UBhz}@K!~-OLaoFVMrW4W=2NFFKi5q!uJ_89@aSY`^dz^X!eZ7=QeUC;4SWS3 zLlC^?CZ6;l;uDx6#ere|!T0@`m%Y+$JvW2Fpq%M3sEsKb&($R2SKKalfKsH= yDFkGwblGXc^j@fZPL=``Y!Z&skOK@Aa+yvH#%woY{xFueCPys_icquyXzY delta 84 zcmcb`b&iAYG%qg~0}x24zs-EfI+0I;@zF%}$1IgnfTeYsW{TRZLGpT0vn-O`j>{!XUy44?M071!yjbSOk;;ua zNacwenqW~ueM%#mZbP6oWf-<9&|jgnXbIq?ea*x88hzT_&wmfL(a!K7?x9xrGS1Q0 z;kJ~Qq}k&c2AwPyUodT=uwx&C0S4FU&+z$)4p5(<8pn(6uX<_-w)N~0+v@&+coWy- zqIm8|#$pFyH_0Uc9RvIo9u&5Y`T?FJ`@~m98<;+bq~qg=_`s)fZm?Sb=xkW@W90Ng zfEe~;V!DGSLttggViQ^4?tcPa8N8g$7Jq`R7FYE z5%#q%<@TGJSMIC~er-Biq2tZxA8G|NpI1GN-**8XAgqA~VT=zl wM(;Z#~}i!U*U0-ZblQo0icY<4*&oF delta 1130 zcmYjQPiPcZ82{ePo7rS%XEVF5yV*_Lof!Nx8zCmEB}H3lYpSs}HcgR|QkEez)|I%4 zZ$=?9As%wDps-~Q3T+{Uf`=Tmcqu)35PB$<3|rV`^q7l>!e&ztdh&Z~OnflE_x+pq zec$_j@0s!UQ2Z}djRLO7um4u6@!#TKN6&~{$F+4B;U3s9LoApPEZK@!!iqE_TH*@K zP>Ui;mV_uT5~C}Oe_=9r@r+%ynd#0m|7p~Vh0z6WEIXB(_TzEoPa!{whq4h4JZ~6V zm@^k`R-T}8Xgvo3bvT()gDl$crl&Sv}2X+-=}T5(TEDj~TNil%kL;eF`3 z?pL)5^1%OHJGs1(NY|L3Z3FGzfBT~sdviaP?z@e`a8MYo_Z_Y89chE0zF#BFbgq#; z7^DxbUJKGjO>AoYt71bh1$wEjAAe*9`dFZi{Sa$O7~YaW&E6jmVguiwZ*}9ztte>v zdRKuRzyfBsZxBWBmBc6+^*>C!M<)F1iNaCxlA_rV7%z3wh_E8=Y>2}V4k->NIDE?C ztp7)1pf`i!3j8OC(qKEPNasj97nSs_UY{g$eF8c=!@P*XJ#crjuYo_7EbslH54OIjJh(kPKVy~j?p`7hh~@1^loJqc}tunO4Y^QKSqsVDhSD(!!saN z*dDIatLAd0%DzN-3P0xq1Z+ApxH?|X6xV60sqSloC~3DzGm&fq>Fz@^#S*ot+9$PZ zwL^C&TO!&vy41Uo%?QSIE+gzJm#>IW7U!j4| n&pCyFM-s9D+2^3XlJ}GRCLp{zOLTHz6A;>`iAaw44^#Qq;IH|Y diff --git a/__pycache__/spells.cpython-312.pyc b/__pycache__/spells.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..030726d0165163a77a2ad5eaaba566baba9dc5db GIT binary patch literal 532 zcmXw0J&)8d5Ooq3?Xk(RCjkq5JIA(IeG2bWLSTMv9ovUg1d2#OZ9sF3%_QJ{hY}EDh|!fqttw6EmQ0=OPF0| zD*uwdXS<@lQ!ipEJ3)r`K;GF{DhMD0H=;!utF?9_pl!KAFXN(fTJhdd5IQb3wq4*) zl%S0T@9S9YhqyuSQA2#tlbf{AS-vJ`IBZeJV*;VL7PcKk3x2%oI|Qx9nb!dQSZ%=u zLhU{d=uKV5`_kEzU=W(`4dddFaIdyJ5VTwLxY95duim{K%L7M^VK>e;*2&E{*J&h( z0I||erjxtXhm0vC!zwP$F$zk_lT@8wrERmTJi(hf z8&CERKN~#IneRbs|Bc;D>%V>07*HshDCDN`!BKK(UXtrq?xIn!ZJdYG=>voeK&LI( z=AXdRes?>6Zk!r4yr5;$njHP(1iy{3v!jdr&#ZWu|6nI{oNoUDN_?=D literal 0 HcmV?d00001 diff --git a/adventurers.py b/adventurers.py index 165d194..d751612 100755 --- a/adventurers.py +++ b/adventurers.py @@ -1,6 +1,7 @@ #!/usr/bin/python3 import random from equipment import * +from spells import * # functions def roll_dice(count, sides): @@ -22,7 +23,7 @@ class Adventurer: self.gold= roll_dice(3,6) self.torches = roll_dice(1,6) self.rations = roll_dice(1,6) - self.equipment = [ 'backpack', 'tinderbox', 'waterskin' ] + self.equipment = self.roll_equipment() # all armor, individual classes may have overrides self.possible_armor = list(armor.keys()) # all weapons, individual classes may have overrides @@ -32,6 +33,11 @@ class Adventurer: # each character should get 1 melee and 1 random (missle or melee) self.weapons = [ random.choice(self.possible_melee_weapons), random.choice(self.possible_weapons) ] self.armor = random.choice(self.possible_armor) + # special abilities + self.spells = None + self.spell_book = None + self.thief_skills = None + self.turn_undead = None def __str__(self): return f"{self.player_class}" @@ -51,6 +57,9 @@ class Adventurer: sheet.append('{0: <28}'.format(f"| {self.weapons[0]['name'].title()}")) sheet.append('{0: <28}'.format(f"| {self.weapons[1]['name'].title()}")) sheet.append('{0: <28}'.format(f"| Equipment:")) + for item in self.equipment: + item_string = "| " + '{0:22}'.format(f"{item}").title() + sheet += ['{0: <28}'.format(item_string)] sheet.append('{0: <28}'.format(f"| ")) sheet.append('{0: <28}'.format(f"| Gold: {self.gold}")) sheet.append('| ------------------------- ') @@ -58,6 +67,9 @@ class Adventurer: key_string = "| " + '{0:22}'.format(f"{key}").title() + f" {val}" sheet += ['{0: <28}'.format(key_string)] sheet.append('| ------------------------- ') + #if self.spells: + # sheet.append('{0: <28}'.format("| Spellbook: ")) + # sheet += ['{0: <28}'.format(f"| {spell.title()}") for spell in self.spell_book ] # append a | to each string, after the formatted whitespace sheet = [ line + "|" for line in sheet ] return sheet @@ -73,7 +85,24 @@ class Adventurer: return max(prime_attributes, key=prime_attributes.get) def roll_equipment(self): - print("testing!") + equipment = [ 'backpack', 'tinderbox', 'waterskin' ] + random_items = [ random.choice(adventuring_gear) for i in range(2) ] + for item in random_items: + equipment += item.split("+") + while len(equipment) < 7: + equipment.append("") + return equipment + + def select_spells(self): + spell_book = [] + for spell_level, count in self.spells.items(): + if count != "-": + for i in range(count): + random_spell = "" + while random_spell not in spell_book: + random_spell = random.choice(magic_user_spells[spell_level]) + spell_book.append(random_spell) + return spell_book class Fighter(Adventurer): @@ -101,6 +130,7 @@ class Fighter(Adventurer): self.progression = Fighter.progression self.hp = roll_dice(self.level, 8) self.ac = armor[self.armor] + self.vertical_sheet = self.character_sheet() class MagicUser(Adventurer): prime_requisite = "intelligence" @@ -121,6 +151,22 @@ class MagicUser(Adventurer): { "level" : 13, "xp" : 900000, "hit-dice" : 9, "thac0" : 14, "saves" : { "death / poison" : 8, "wands" : 9, "paralysis / petrify" : 8, "breath attack" : 8, "spells / rods / staves" : 8 }}, { "level" : 14, "xp" : 1050000, "hit-dice" : 9, "thac0" : 14, "saves" : { "death / poison" : 8, "wands" : 9, "paralysis / petrify" : 8, "breath attack" : 8, "spells / rods / staves" : 8 }} ] + spells = { + 1: { 1: 1, 2: '-', 3: '-', 4: '-', 5: '-', 6: '-'}, + 2: { 1: 2, 2: '-', 3: '-', 4: '-', 5: '-', 6: '-'}, + 3: { 1: 2, 2: 1, 3: '-', 4: '-', 5: '-', 6: '-'}, + 4: { 1: 2, 2: 2, 3: '-', 4: '-', 5: '-', 6: '-'}, + 5: { 1: 2, 2: 2, 3: 1, 4: '-', 5: '-', 6: '-'}, + 6: { 1: 2, 2: 2, 3: 2, 4: '-', 5: '-', 6: '-'}, + 7: { 1: 3, 2: 2, 3: 2, 4: 1, 5: '-', 6: '-'}, + 8: { 1: 3, 2: 3, 3: 2, 4: 2, 5: '-', 6: '-'}, + 9: { 1: 3, 2: 3, 3: 3, 4: 2, 5: 1, 6: '-'}, + 10: { 1: 3, 2: 3, 3: 3, 4: 3, 5: 2, 6: '-'}, + 11: { 1: 4, 2: 3, 3: 3, 4: 3, 5: 2, 6: 1 }, + 12: { 1: 4, 2: 4, 3: 3, 4: 3, 5: 2, 6: 1 }, + 13: { 1: 4, 2: 4, 3: 4, 4: 3, 5: 3, 6: 3 }, + 14: { 1: 4, 2: 4, 3: 4, 4: 4, 5: 3, 6: 3 } + } def __init__(self, level, attributes={}) -> None: Adventurer.__init__(self, level, attributes) self.player_class = "magic user" @@ -129,6 +175,9 @@ class MagicUser(Adventurer): self.armor = "None" self.ac = armor[self.armor] self.weapons = [ list(filter(lambda d: 'silver dagger' in d['name'],weapons))[0], { "name" : "" } ] + self.spells = MagicUser.spells[self.level] + self.spell_book = self.select_spells() + self.vertical_sheet = self.character_sheet() class Cleric(Adventurer): @@ -150,6 +199,22 @@ class Cleric(Adventurer): { "level" : 13, "xp" : 600000, "hit-dice" : 9, "thac0" : 12, "saves" : { "death / poison" : 3, "wands" : 5, "paralysis / petrify" : 7, "breath attack" : 8, "spells / rods / staves" : 7 }}, { "level" : 14, "xp" : 700000, "hit-dice" : 9, "thac0" : 12, "saves" : { "death / poison" : 3, "wands" : 5, "paralysis / petrify" : 7, "breath attack" : 8, "spells / rods / staves" : 7 }} ] + spells = { + 1: { 1: '-', 2: '-', 3: '-', 4: '-', 5: '-'}, + 2: { 1: 1, 2: '-', 3: '-', 4: '-', 5: '-'}, + 3: { 1: 2, 2: '-', 3: '-', 4: '-', 5: '-'}, + 4: { 1: 2, 2: 1, 3: '-', 4: '-', 5: '-'}, + 5: { 1: 2, 2: 2, 3: '-', 4: '-', 5: '-'}, + 6: { 1: 2, 2: 2, 3: 1, 4: 1, 5: '-'}, + 7: { 1: 2, 2: 2, 3: 2, 4: 1, 5: 1 }, + 8: { 1: 3, 2: 3, 3: 2, 4: 2, 5: 1 }, + 9: { 1: 3, 2: 3, 3: 3, 4: 2, 5: 2 }, + 10: { 1: 4, 2: 4, 3: 3, 4: 3, 5: 2 }, + 11: { 1: 4, 2: 4, 3: 4, 4: 3, 5: 3 }, + 12: { 1: 5, 2: 5, 3: 4, 4: 4, 5: 3 }, + 13: { 1: 5, 2: 5, 3: 4, 4: 4, 5: 4 }, + 14: { 1: 6, 2: 5, 3: 5, 4: 5, 5: 4 } + } def __init__(self, level, attributes={}) -> None: Adventurer.__init__(self, level, attributes) self.player_class = "cleric" @@ -161,6 +226,9 @@ class Cleric(Adventurer): self.possible_melee_weapons = list(filter(lambda d: 'blunt' in d['traits'] and 'melee' in d['traits'], weapons)) self.possible_weapons = list(filter(lambda d: 'blunt' in d['traits'], weapons)) self.weapons = [ random.choice(self.possible_melee_weapons), random.choice(self.possible_weapons) ] + self.spells = Cleric.spells[self.level] + self.spell_book = self.select_spells() + self.vertical_sheet = self.character_sheet() class Thief(Adventurer): prime_requisite = "dexterity" @@ -188,6 +256,7 @@ class Thief(Adventurer): self.hp = roll_dice(self.level, 4) self.armor = random.choice(list(armor.keys())) self.ac = armor[self.armor] + self.vertical_sheet = self.character_sheet() class Dwarf(Adventurer): prime_requisite = "strength" @@ -213,6 +282,7 @@ class Dwarf(Adventurer): self.hp = roll_dice(self.level, 8) self.armor = random.choice(list(armor.keys())) self.ac = armor[self.armor] + self.vertical_sheet = self.character_sheet() class Elf(Adventurer): prime_requisite = "intellgence" @@ -229,6 +299,18 @@ class Elf(Adventurer): { "level" : 9, "xp" : 400000, "hit-dice" : 9, "thac0" : 14, "saves" : { "death / poison" : 8, "wands" : 9, "paralysis / petrify" : 9, "breath attack" : 10, "spells / rods / staves" : 10 }}, { "level" : 10, "xp" : 600000, "hit-dice" : 9, "thac0" : 12, "saves" : { "death / poison" : 6, "wands" : 7, "paralysis / petrify" : 8, "breath attack" : 8, "spells / rods / staves" : 8 }} ] + spells = { + 1: { 1: 1, 2: '-', 3: '-', 4: '-', 5: '-', 6: '-'}, + 2: { 1: 2, 2: '-', 3: '-', 4: '-', 5: '-', 6: '-'}, + 3: { 1: 2, 2: 1, 3: '-', 4: '-', 5: '-', 6: '-'}, + 4: { 1: 2, 2: 2, 3: '-', 4: '-', 5: '-', 6: '-'}, + 5: { 1: 2, 2: 2, 3: 1, 4: '-', 5: '-', 6: '-'}, + 6: { 1: 2, 2: 2, 3: 2, 4: '-', 5: '-', 6: '-'}, + 7: { 1: 3, 2: 2, 3: 2, 4: 1, 5: '-', 6: '-'}, + 8: { 1: 3, 2: 3, 3: 2, 4: 2, 5: '-', 6: '-'}, + 9: { 1: 3, 2: 3, 3: 3, 4: 2, 5: 1, 6: '-'}, + 10: { 1: 3, 2: 3, 3: 3, 4: 3, 5: 2, 6: '-'} + } def __init__(self, level, attributes={}) -> None: Adventurer.__init__(self, level, attributes) self.player_class = "elf" @@ -236,6 +318,9 @@ class Elf(Adventurer): self.hp = roll_dice(self.level, 6) self.armor = random.choice(list(armor.keys())) self.ac = armor[self.armor] + self.spells = Elf.spells[self.level] + self.spell_book = self.select_spells() + self.vertical_sheet = self.character_sheet() class Halfling(Adventurer): prime_requisite = "dexterity" @@ -257,3 +342,4 @@ class Halfling(Adventurer): self.hp = roll_dice(self.level, 6) self.armor = random.choice(list(armor.keys())) self.ac = armor[self.armor] + self.vertical_sheet = self.character_sheet() diff --git a/app.py b/app.py index de65d7f..46338af 100644 --- a/app.py +++ b/app.py @@ -1,11 +1,22 @@ #!/usr/bin/python3 from main import * -from flask import Flask, render_template +from flask import Flask, render_template, redirect, request app = Flask(__name__) @app.route('/') def index(): - sheets = returnSheets('test') - return render_template("sheet.html", sheets=sheets) + return render_template("index.html") + +@app.route('/party', methods = ["GET","POST"]) +def party(): + if request.method == "GET": + count = request.args.get("count", default=4, type=int) + adv_party = returnParty(count) + return render_template("party_sheet.html", adv_party=adv_party, count=count) + +@app.route('/character') +def characters(): + adv_party = returnParty(1) + return render_template("party_sheet.html", adv_party=adv_party) diff --git a/equipment.py b/equipment.py index f163945..8327e0e 100755 --- a/equipment.py +++ b/equipment.py @@ -19,3 +19,7 @@ weapons = [ { 'name' : 'war hammer', 'damage-dice' : 6, 'traits' : [ 'melee', 'blunt' ] } ] +adventuring_gear = [ + "crowbar", "hammer (small)+12 iron spikes", "holy water", "lantern+3 flasks of oil", "mirror (small, steel)", "pole (10' long, wooden)", + "rope (50')", "rope (50')+grappling hook", "sack (large)", "sack (small)", "stakes (3)+mallet", "wolfsbane (1 bunch)" + ] diff --git a/main.py b/main.py index d598dac..b756449 100755 --- a/main.py +++ b/main.py @@ -40,7 +40,7 @@ class ClassSelector(): return selected_class class PartyGenerator(): - def __init__(self, party_size=4) -> None: + def __init__(self, party_size: int) -> None: self.size = party_size self.adventurers = [] self.adventurer_types = [] @@ -63,26 +63,21 @@ class PartyGenerator(): character_sheets = [] for c in self.adventurers: character_sheets.append(c.character_sheet()) - for i in range(15): - for j in range(len(self.adventurers)): - adv = self.adventurers[j] - sheet_string += adv.character_sheet()[i] - sheet_string += '|\n' return character_sheets def __str__(self): return f"{self.adventurers}" -def returnSheets(foo): - new_party = PartyGenerator() +def returnParty(party_size): + new_party = PartyGenerator(party_size) new_party.gen_party() - return new_party.get_character_sheets() + return new_party def main(): - character_sheets = returnSheets('foo') - for c in character_sheets: - for l in c: - print(f"{l}|") + adventurer_party = returnParty(party_size=5) + for adv in adventurer_party.adventurers: + for line in adv.vertical_sheet: + print(f"{line}") print() if __name__ == "__main__": diff --git a/spells.py b/spells.py new file mode 100644 index 0000000..44084c2 --- /dev/null +++ b/spells.py @@ -0,0 +1,6 @@ +#!/usr/bin/python3 + +magic_user_spells = { + 1 : [ "charm person", "detect magic", "floating disc", "hold portal", "light (darkness)", "magic missile", "protection from evil", "read languages", "shield", "sleep", "ventriloquism" ], + 2 : [ "continual light", "detect evil", "detect invisible", "ESP", "invisibility", "knock", "levitate", "locate object", "mirror image", "phantasmal force", "web", "wizard lock" ] +} diff --git a/templates/sheet.html b/templates/index.html similarity index 67% rename from templates/sheet.html rename to templates/index.html index 26a7cc1..197cf6e 100644 --- a/templates/sheet.html +++ b/templates/index.html @@ -23,12 +23,12 @@ diff --git a/templates/party_sheet.html b/templates/party_sheet.html new file mode 100644 index 0000000..7d1ef96 --- /dev/null +++ b/templates/party_sheet.html @@ -0,0 +1,82 @@ + + + + + D&D Characters + + + + + + + +
+
+
+
+
+

Welcome to the Dungeon

+

How many party members?

+
+ {%for i in range(2,6)%} + {% if count|int() == i|int() %} + {{i}} + {% else %} + {{i}} + {% endif %} + {%endfor%} +
+ +
+
+ {%for character in adv_party.adventurers%} +
+
+ +
+
{{character.vertical_sheet | join("\n")}}
+
+ {%endfor%} +
+
+
+
+
+ +
+
+
+
+
+ + + + +