From 15342552f1f8eb3c0897b3aadedbf2dff2744546 Mon Sep 17 00:00:00 2001 From: Zachary Watts Date: Wed, 29 Apr 2026 13:55:07 -0400 Subject: [PATCH] can now load a character from a cookie --- __pycache__/adventurers.cpython-312.pyc | Bin 24628 -> 25176 bytes __pycache__/app.cpython-312.pyc | Bin 2671 -> 3446 bytes __pycache__/main.cpython-312.pyc | Bin 6228 -> 6465 bytes adventurers.py | 29 +++++++++++++++++------- app.py | 21 ++++++++++++++--- main.py | 6 ++++- templates/character.html | 2 +- 7 files changed, 45 insertions(+), 13 deletions(-) diff --git a/__pycache__/adventurers.cpython-312.pyc b/__pycache__/adventurers.cpython-312.pyc index d2c5d26b15de20b3184618168af0b3f2cff56b2d..61f9698fc2eda3a6b328d9ffd5f384d30c813885 100644 GIT binary patch delta 7489 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 WsCz-fX<-u!0l5308ctRXuK91!xe0&( diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc index 77a49197f4344e45bdfcf8d8500d2cc70782d8c6..b4b5c6392fceb40a37e3b0ab60153852e537eed5 100644 GIT binary patch delta 1300 zcmYjR-HRJl6u)=o&R3FV^0C2W6E|7ARq)5>&wjQF0oVl^(4YYnx-tg5$G|CKo*~v?O{5@`Q#g}X zcvDaWQ&dDh3K^0aQ6dm9Ku3D?fbdaKVj8E%8nZno&(h`Fd@`cP0xtx__hRqoGAH}s z=?a&ipuY%LVDj(^EI^nzyvbw{oH_i4mtj;OoGkgCM40|SC~rNqIa-E_Jza=y@F5IA zLkeLCG)7}>e-P9(KnIkWNYGyUdCpk>7^Tx7NBnJQ$NfN}8cAw@1BN+_oeF)K0R6w( zF9f)erI}GC$ZX{ME}HFshomLeVKvULga~4M1PJ1N#My!Sa1^yqr|DlfZ>X_(Jgpu<)J8lE$$`v)_xP`9&yC{ zln0UAFjv0+$pdM1$gJW7Ic7OEy+mZH^(J1R)8MX=C$)tU!MI41Z+* xitm~&ZQIaS@nvG8e;;c=)FT!`_$P=?KxzVV{a>VBDh1zr!UE>(F+-5g@ElO-!L?hm9W%`tkjO|lt(;uA}4htcT}^JiPVcc1O~Ac=Q^Zf zP9zkM#jW5l`xli{rc}BARTqzX)PyOMm=}w&7y>ni?VjZRDEPg?izdicaRn#4H*p@Z z*uBpJ8)v#NoFWQN8W!2XOUT~45|^`I>~d2a?SLkXrSD>+FlH6MgRh+qJIt?wbg$?c zO7yY;L+d$$+kSPsqAS%#tj}yW(nO*@OSE*gYg$eiC>bzM(kBT9MIASGb#rH9JgChD zB^%h)8#Of=uN(bRNl%&n+}{m#y+*_-vic>07JTFRhgpixvCrL(5>C@x}c3P?JWEb++ qaV>kEUkEmcG#^;+5d5$Z@hgZSOlSRkd)CH_cwhlLx6e#C68Zz{Id{GQ diff --git a/__pycache__/main.cpython-312.pyc b/__pycache__/main.cpython-312.pyc index b3863c4cdf33480cf1ae78133b5c7346e5add222..fbc2f369af378b3c52144859335649ca8aeaa40e 100644 GIT binary patch delta 437 zcmca&aL|bNG%qg~0}%YP`;>WfBX6k~7YmTb48)&rP3{r15Ef@(sAVi+1*rjn8pbTP z$$^Z*lll2L1$rb|7)m%G5)2Gk+&~E_y;`OkrW9sLplB^K6GIJi3QG#h8rIcJ5M{M2 zNM^Ah%u1?c&}8#_2~wrWRAd08iVT6oE%vm`^o)|!q9SRCj5SEc1jJ@53IwrDfy6D= zf}+g4k|GI^0LVMH1k+PX;)_d@l5-M^i{n!=lS?#NC+mxg*WcnuOeq5k+~O)pEiQ=% ztGLCHms%d5oRL^m4DzW02owo}3}VSm%*-o_12WTqxHt(&G%(x|S6Y#{Bk+p2{RI}0 z8~pOu`L!?dYky*3WR>k;zQe)Wk=&o#nR}H(<^wZO=n20hM8Rc#U9|>}8-kKEG%pIO zGs&Gyxn!=g$WERiZp#=q`I@*AW8&nW;`XfUjB+0& JCfiDg0|1BUaDxB< delta 239 zcmX?Tbj5)8G%qg~0}w3j|Cp)0k+)QgixtRY2I9{}lY7K01f>}mY8gvFf?!a?IN5VvM3lRQ4BIcL7_+(q=6+jF*C0y639#gNf}L6kdPOX>tMda!P}AC zpVOJsop+T(_9HVRtK8&P30ua<$%iGB7-J?sldzXzW|aFNz`(-OQFVz~@+J#MtJ?== L1{SFzRiH@#XZkr_ diff --git a/adventurers.py b/adventurers.py index d2131c2..48fb9c4 100755 --- a/adventurers.py +++ b/adventurers.py @@ -44,6 +44,12 @@ class Adventurer: def __str__(self): return f"{self.player_class}" + def get_subclass_dict(): + subclasses = {} + for subclass in Adventurer.__subclasses__(): + subclasses[subclass.adv_class] = subclass + return subclasses + def get_json(self): char_dict = self.__dict__ char_json = json.dumps(char_dict) @@ -113,6 +119,7 @@ class Adventurer: class Fighter(Adventurer): + adv_class = "fighter" prime_requisite = "strength" requirements = None progression = [ @@ -133,12 +140,13 @@ class Fighter(Adventurer): ] def __init__(self, c_id, level, attributes={}) -> None: Adventurer.__init__(self, c_id, level, attributes) - self.player_class = "fighter" + self.player_class = Fighter.adv_class self.progression = Fighter.progression self.hp = roll_dice(self.level, 8) self.ac = armor[self.armor] class MagicUser(Adventurer): + adv_class = "magic user" prime_requisite = "intelligence" requirements = None progression = [ @@ -175,7 +183,7 @@ class MagicUser(Adventurer): } def __init__(self,c_id, level, attributes={}) -> None: Adventurer.__init__(self, c_id, level, attributes) - self.player_class = "magic user" + self.player_class = MagicUser.adv_class self.progression = MagicUser.progression self.hp = roll_dice(self.level, 4) self.armor = "None" @@ -185,6 +193,7 @@ class MagicUser(Adventurer): self.spell_book = self.select_spells() class Cleric(Adventurer): + adv_class = "cleric" prime_requisite = "wisdom" requirements = None progression = [ @@ -221,7 +230,7 @@ class Cleric(Adventurer): } def __init__(self,c_id, level, attributes={}) -> None: Adventurer.__init__(self, c_id, level, attributes) - self.player_class = "cleric" + self.player_class = Cleric.adv_class self.progression = Cleric.progression self.hp = roll_dice(self.level, 6) self.armor = random.choice(list(armor.keys())) @@ -234,6 +243,7 @@ class Cleric(Adventurer): self.spell_book = self.select_spells() class Thief(Adventurer): + adv_class = "thief" prime_requisite = "dexterity" requirements = None progression = [ @@ -254,13 +264,14 @@ class Thief(Adventurer): ] def __init__(self,c_id, level, attributes={}) -> None: Adventurer.__init__(self, c_id, level, attributes) - self.player_class = "thief" - self.progression = Fighter.progression + self.player_class = Thief.adv_class + self.progression = Thief.progression self.hp = roll_dice(self.level, 4) self.armor = random.choice(list(armor.keys())) self.ac = armor[self.armor] class Dwarf(Adventurer): + adv_class = "dwarf" prime_requisite = "strength" requirements = {'constitution' : 9 } progression = [ @@ -279,13 +290,14 @@ class Dwarf(Adventurer): ] def __init__(self,c_id, level, attributes={}) -> None: Adventurer.__init__(self, c_id, level, attributes) - self.player_class = "dwarf" + self.player_class = Dwarf.adv_class self.progression = Dwarf.progression self.hp = roll_dice(self.level, 8) self.armor = random.choice(list(armor.keys())) self.ac = armor[self.armor] class Elf(Adventurer): + adv_class = "elf" prime_requisite = "intellgence" requirements = {'intelligence' : 9 } progression = [ @@ -314,7 +326,7 @@ class Elf(Adventurer): } def __init__(self,c_id, level, attributes={}) -> None: Adventurer.__init__(self, c_id, level, attributes) - self.player_class = "elf" + self.player_class = Elf.adv_class self.progression = Elf.progression self.hp = roll_dice(self.level, 6) self.armor = random.choice(list(armor.keys())) @@ -323,6 +335,7 @@ class Elf(Adventurer): self.spell_book = self.select_spells() class Halfling(Adventurer): + adv_class = "halfling" prime_requisite = "dexterity" requirements = {'constitution' : 9, 'dexterity' : 9 } progression = [ @@ -337,7 +350,7 @@ class Halfling(Adventurer): ] def __init__(self,c_id, level, attributes={}) -> None: Adventurer.__init__(self, c_id, level, attributes) - self.player_class = "halfling" + self.player_class = Halfling.adv_class self.progression = Halfling.progression self.hp = roll_dice(self.level, 6) self.armor = random.choice(list(armor.keys())) diff --git a/app.py b/app.py index 310c56f..e9ae2f1 100644 --- a/app.py +++ b/app.py @@ -1,6 +1,7 @@ #!/usr/bin/python3 import zlib from main import * +from adventurers import * from flask import Flask, render_template, redirect, request, make_response from flask_session import Session @@ -37,6 +38,20 @@ def party(): @app.route('/character', methods = ["GET","POST"]) def characters(): if request.method == "GET": - c_id = request.args.get("id", default=0, type=int) - character = returnCharacter(c_id) - return render_template("character.html", character=character) + c_id = str(request.args.get("id", default=0, type=int)) + cookie_encoded = request.cookies[c_id] + cookie_compressed = base64.urlsafe_b64decode(cookie_encoded) + character_dict = json.loads(zlib.decompress(cookie_compressed).decode()) + chosen_class = character_dict['player_class'] + c_id = character_dict['id'] + level = character_dict['level'] + adv_dict = Adventurer.get_subclass_dict() + chosen_class = adv_dict[chosen_class] + # note, i wonder if i can find a way to use the dict in a one liner, like from hw1 + # makes a new character of the correct player class + new_char = chosen_class(c_id=c_id, level=level) + # loads in all the values from the dict + for k, v in character_dict.items(): + # https://realpython.com/ref/builtin-functions/setattr/ + setattr(new_char,k, v) + return render_template("character.html", character=new_char) diff --git a/main.py b/main.py index 9adc1ae..76a92a5 100755 --- a/main.py +++ b/main.py @@ -102,7 +102,11 @@ def returnCharacter(c_id): def main(): adventurer_party = returnParty(party_size=2, party_level=2) for adv in adventurer_party.adventurers: - print(adv.get_json()) + print(adv.adv_class) + adv_dict = Adventurer.get_subclass_dict() + test_class = adv_dict['fighter'] + new_char = test_class(c_id=1,level=1) + print(new_char.adv_class) # for line in adv.vertical_sheet: # print(f"{line}") # print() diff --git a/templates/character.html b/templates/character.html index 2f14812..048d536 100644 --- a/templates/character.html +++ b/templates/character.html @@ -46,7 +46,7 @@
-
{{character.vertical_sheet | join("\n")}}
+
{{character.vertical_sheet() | join("\n")}}