From e6d19b1f699bb58601729a5f8b14894ab5f0bbf2 Mon Sep 17 00:00:00 2001 From: Zachary Watts Date: Wed, 29 Apr 2026 01:25:10 -0400 Subject: [PATCH] able to get compress JSON characters stored as cookies --- __pycache__/adventurers.cpython-312.pyc | Bin 24752 -> 24628 bytes __pycache__/app.cpython-312.pyc | Bin 1369 -> 2671 bytes __pycache__/main.cpython-312.pyc | Bin 5325 -> 6228 bytes __pycache__/spells.cpython-312.pyc | Bin 532 -> 738 bytes adventurers.py | 47 +++++++------ app.py | 34 ++++++++-- .../2029240f6d1128be89ddc32729463129 | Bin 0 -> 9 bytes main.py | 47 ++++++++++--- requirements.txt | 3 +- spells.py | 3 +- templates/character.html | 63 ++++++++++++++++++ templates/party_sheet.html | 45 +++++++++---- 12 files changed, 185 insertions(+), 57 deletions(-) create mode 100644 flask_session/2029240f6d1128be89ddc32729463129 create mode 100644 templates/character.html diff --git a/__pycache__/adventurers.cpython-312.pyc b/__pycache__/adventurers.cpython-312.pyc index 06a4eaaf509410d15f07f38affec5360711d5aa2..d2c5d26b15de20b3184618168af0b3f2cff56b2d 100644 GIT binary patch delta 5333 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 Il=M0EUs(%N*Z=?k diff --git a/__pycache__/app.cpython-312.pyc b/__pycache__/app.cpython-312.pyc index 0bc0282136780699334c6554b6f257de3b57594d..77a49197f4344e45bdfcf8d8500d2cc70782d8c6 100644 GIT binary patch literal 2671 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 M+P)|fDWF^SFGs!(TmS$7 delta 1579 zcmaJ>T}&fY6uxJE=>JSh+bur@N-3-b0w|!10tvfh(T&Tx(YTSsG_^BvTWck^T}-hA z9?* zT#jXv^E$Plx#`4ln5JpI7x6vpLs%yTD3F+Wz~N=WdL2z_o=_V~QPGgN6_#>@+yeC= zMF$YF+y>ilbk_H9sS#m`RD7)~(yER9>Yy#0807E>2hJMK*>pUw(^w)M&t~Zm=lQi$l^@D!eNIo) zASYT8qLNuX_PY|4B$QcD?K^9h@)wkr$gbj9iDbWTOWsL-tMuZBKd3K(g-y79u*05rulvjhxjREmT#wUuBB#?^ zo;P5O6+Gd#k(G&xGgx+Z6rCL#6XnQoF*00=JhtOJw=aTigni~|V3)lQ!ysGqJ_?iU zV{coRm3E^!%G-?ga>HUWlcPQ^KEYvv!-ZSE;4s(Ab|Ng3eL<8vHU{?zE_a6x`BJqz z_Oah&YX-{=&mPZ(K>PXk zJcOuVj)Y;$=j!84~L6rx@{H5^pW-JltBLg^GT{LS(^!b^9zzB6BPcP~9vkz8dd zP?Q4OQe(y8`$qDy*)z@IRaEs-ccnA>s?212xzvBDYi)U1z3@x!| z+;gzR8F?XBs0n9-*Yh*Hh}tL>4D?(zOs3pL8JL<2TCoCBH_SnEnlK?+l8dGtl+0M} zMx_!Nt+_Tzwj+?aW^*v0q}vDCsRRVrhQ_BSZdX82S_!hCi4xWw)mmAeTA!x5zEl0jQ zp^{mXWuu2VBL~w$MlJbfwO|?BP+8g M(?tfsB0iuj0An^7NB{r; diff --git a/adventurers.py b/adventurers.py index d751612..d2131c2 100755 --- a/adventurers.py +++ b/adventurers.py @@ -1,4 +1,5 @@ #!/usr/bin/python3 +import json import random from equipment import * from spells import * @@ -9,8 +10,9 @@ def roll_dice(count, sides): # Player Character Classes class Adventurer: - def __init__(self, level=1, attributes={}) -> None: + def __init__(self, c_id: int, level=1, attributes={}) -> None: # using a get() method to pull an attribute else use a default value, https://python-academy.org/en/handbook/get + self.id = c_id self.player_class = None self.level = level self.strength = attributes.get('strength', roll_dice(3,6)) @@ -42,7 +44,12 @@ class Adventurer: def __str__(self): return f"{self.player_class}" - def character_sheet(self): + def get_json(self): + char_dict = self.__dict__ + char_json = json.dumps(char_dict) + return char_dict + + def vertical_sheet(self): sheet = [] sheet.append('{0: <28}'.format(f"| {self.player_class.title()} - Level {self.level}")) for key, val in self.get_attributes().items(): @@ -124,13 +131,12 @@ class Fighter(Adventurer): { "level" : 13, "xp" : 720000, "hit-dice" : 9, "thac0" : 10, "saves" : { "death / poison" : 4, "wands" : 5, "paralysis / petrify" : 6, "breath attack" : 5, "spells / rods / staves" : 8 }}, { "level" : 14, "xp" : 840000, "hit-dice" : 9, "thac0" : 10, "saves" : { "death / poison" : 4, "wands" : 5, "paralysis / petrify" : 6, "breath attack" : 5, "spells / rods / staves" : 8 }} ] - def __init__(self, level, attributes={}) -> None: - Adventurer.__init__(self, level, attributes) + def __init__(self, c_id, level, attributes={}) -> None: + Adventurer.__init__(self, c_id, level, attributes) self.player_class = "fighter" 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" @@ -167,8 +173,8 @@ class MagicUser(Adventurer): 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) + def __init__(self,c_id, level, attributes={}) -> None: + Adventurer.__init__(self, c_id, level, attributes) self.player_class = "magic user" self.progression = MagicUser.progression self.hp = roll_dice(self.level, 4) @@ -177,8 +183,6 @@ class MagicUser(Adventurer): 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): prime_requisite = "wisdom" @@ -215,8 +219,8 @@ class Cleric(Adventurer): 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) + def __init__(self,c_id, level, attributes={}) -> None: + Adventurer.__init__(self, c_id, level, attributes) self.player_class = "cleric" self.progression = Cleric.progression self.hp = roll_dice(self.level, 6) @@ -228,7 +232,6 @@ class Cleric(Adventurer): 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" @@ -249,14 +252,13 @@ class Thief(Adventurer): { "level" : 13, "xp" : 640000, "hit-dice" : 9, "thac0" : 12, "saves" : { "death / poison" : 8, "wands" : 9, "paralysis / petrify" : 7, "breath attack" : 10, "spells / rods / staves" : 8 }}, { "level" : 14, "xp" : 760000, "hit-dice" : 9, "thac0" : 12, "saves" : { "death / poison" : 8, "wands" : 9, "paralysis / petrify" : 7, "breath attack" : 10, "spells / rods / staves" : 8 }} ] - def __init__(self, level, attributes={}) -> None: - Adventurer.__init__(self, level, attributes) + def __init__(self,c_id, level, attributes={}) -> None: + Adventurer.__init__(self, c_id, level, attributes) self.player_class = "thief" self.progression = Fighter.progression 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" @@ -275,14 +277,13 @@ class Dwarf(Adventurer): { "level" : 11, "xp" : 530000, "hit-dice" : 9, "thac0" : 12, "saves" : { "death / poison" : 2, "wands" : 3, "paralysis / petrify" : 4, "breath attack" : 4, "spells / rods / staves" : 6 }}, { "level" : 12, "xp" : 660000, "hit-dice" : 9, "thac0" : 12, "saves" : { "death / poison" : 2, "wands" : 3, "paralysis / petrify" : 4, "breath attack" : 4, "spells / rods / staves" : 6 }} ] - def __init__(self, level, attributes={}) -> None: - Adventurer.__init__(self, level, attributes) + def __init__(self,c_id, level, attributes={}) -> None: + Adventurer.__init__(self, c_id, level, attributes) self.player_class = "dwarf" self.progression = Dwarf.progression 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" @@ -311,8 +312,8 @@ class Elf(Adventurer): 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) + def __init__(self,c_id, level, attributes={}) -> None: + Adventurer.__init__(self, c_id, level, attributes) self.player_class = "elf" self.progression = Elf.progression self.hp = roll_dice(self.level, 6) @@ -320,7 +321,6 @@ class Elf(Adventurer): 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" @@ -335,11 +335,10 @@ class Halfling(Adventurer): { "level" : 7, "xp" : 64000, "hit-dice" : 7, "thac0" : 14, "saves" : { "death / poison" : 4, "wands" : 5, "paralysis / petrify" : 6, "breath attack" : 7, "spells / rods / staves" : 8 }}, { "level" : 8, "xp" : 120000, "hit-dice" : 8, "thac0" : 14, "saves" : { "death / poison" : 4, "wands" : 5, "paralysis / petrify" : 6, "breath attack" : 7, "spells / rods / staves" : 8 }}, ] - def __init__(self, level, attributes={}) -> None: - Adventurer.__init__(self, level, attributes) + def __init__(self,c_id, level, attributes={}) -> None: + Adventurer.__init__(self, c_id, level, attributes) self.player_class = "halfling" self.progression = Halfling.progression 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 46338af..310c56f 100644 --- a/app.py +++ b/app.py @@ -1,10 +1,17 @@ #!/usr/bin/python3 - +import zlib from main import * -from flask import Flask, render_template, redirect, request +from flask import Flask, render_template, redirect, request, make_response +from flask_session import Session app = Flask(__name__) +# Configure session +app.config["SESSION_PERMANENT"] = False +app.config["SESSION_TYPE"] = "filesystem" +Session(app) + + @app.route('/') def index(): return render_template("index.html") @@ -13,10 +20,23 @@ def index(): 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) + level = request.args.get("level", default=1, type=int) + adv_party = returnParty(count, level) + resp = make_response(render_template("party_sheet.html", adv_party=adv_party, count=count, level=level)) + # make a cookie for each character + # this took a while to figure out, json alone was too large, b64 encoded json was too large, but it turns out you can compress json as a cookie + for character in adv_party.adventurers: + cookie_string = str(character.id) + char_json = json.dumps(character.get_json()) + compressed = zlib.compress(char_json.encode()) + cookie_data = base64.urlsafe_b64encode(compressed).decode() + resp.set_cookie(cookie_string, cookie_data) + return resp +# return render_template("party_sheet.html", adv_party=adv_party, count=count, level=level) -@app.route('/character') +@app.route('/character', methods = ["GET","POST"]) def characters(): - adv_party = returnParty(1) - return render_template("party_sheet.html", adv_party=adv_party) + 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) diff --git a/flask_session/2029240f6d1128be89ddc32729463129 b/flask_session/2029240f6d1128be89ddc32729463129 new file mode 100644 index 0000000000000000000000000000000000000000..60b84f8bf0af235343c89653c31a85c904ebfc66 GIT binary patch literal 9 QcmZQzU|?uq^=8lm00XQ5{{R30 literal 0 HcmV?d00001 diff --git a/main.py b/main.py index b756449..9adc1ae 100755 --- a/main.py +++ b/main.py @@ -1,5 +1,7 @@ #!/usr/bin/python3 from adventurers import * +import base64 +import json import random # Player Class Selector @@ -40,19 +42,23 @@ class ClassSelector(): return selected_class class PartyGenerator(): - def __init__(self, party_size: int) -> None: + def __init__(self, party_size: int, party_level: int) -> None: self.size = party_size + self.size = party_size + self.level = party_level self.adventurers = [] self.adventurer_types = [] def gen_party(self): + c_id = 0 while len(self.adventurers) < self.size: - new_player = Adventurer() + c_id += 1 + new_player = Adventurer(c_id, self.level) attempts = 0 while new_player.player_class not in self.adventurer_types: attempts += 1 selected_class = ClassSelector(new_player).selection() - new_player = selected_class(new_player.level, new_player.get_attributes()) + new_player = selected_class(new_player.id, new_player.level, new_player.get_attributes()) # i couldnt randomly generate a scenario where a character couldn't be added, but it seems possible, so this is the hard cut off if (new_player.player_class not in self.adventurer_types) or (attempts > 10): self.adventurers.append(new_player) @@ -62,23 +68,44 @@ class PartyGenerator(): sheet_string = "" character_sheets = [] for c in self.adventurers: - character_sheets.append(c.character_sheet()) + character_sheets.append(c.vertical_sheet()) return character_sheets + def get_json(self): + party_list = [] + for c in self.adventurers: + party_list.append(c.get_json()) + party_json = json.dumps(party_list) + return party_json + def __str__(self): return f"{self.adventurers}" -def returnParty(party_size): - new_party = PartyGenerator(party_size) +def returnParty(party_size, party_level): + # keep variables within expected ranges + if party_size <= 0 or party_size > 5: + party_size = 1 + if party_level < 1 or party_level > 5: + party_level = 1 + # generate an aventuring party per size and level + new_party = PartyGenerator(party_size, party_level) + # for adventurers select classes new_party.gen_party() + # return the created adventurer party return new_party +def returnCharacter(c_id): + for adv in new_party.adventurers: + if adv.id == c_id: + return adv + def main(): - adventurer_party = returnParty(party_size=5) + adventurer_party = returnParty(party_size=2, party_level=2) for adv in adventurer_party.adventurers: - for line in adv.vertical_sheet: - print(f"{line}") - print() + print(adv.get_json()) +# for line in adv.vertical_sheet: +# print(f"{line}") +# print() if __name__ == "__main__": main() diff --git a/requirements.txt b/requirements.txt index 980a7fc..5c1bea9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ -flash +flask +flask-session diff --git a/spells.py b/spells.py index 44084c2..b3fd27f 100644 --- a/spells.py +++ b/spells.py @@ -2,5 +2,6 @@ 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" ] + 2 : [ "continual light", "detect evil", "detect invisible", "ESP", "invisibility", "knock", "levitate", "locate object", "mirror image", "phantasmal force", "web", "wizard lock" ], + 3 : [ "clairvoyance", "dispel magic", "fire ball", "fly", "haste", "hold person", "infravision", "invisibility 10'", "lightning bolt", "protection from evil 10'", "protection from normal missiles", "water breathing" ] } diff --git a/templates/character.html b/templates/character.html new file mode 100644 index 0000000..2f14812 --- /dev/null +++ b/templates/character.html @@ -0,0 +1,63 @@ + + + + + D&D Characters + + + + + + + +
+
+
+
+
+

Welcome to the Dungeon

+
+
+
+
{{character.vertical_sheet | join("\n")}}
+
+
+
+
+
+
+
+
+
+ + + + + diff --git a/templates/party_sheet.html b/templates/party_sheet.html index 7d1ef96..fe73166 100644 --- a/templates/party_sheet.html +++ b/templates/party_sheet.html @@ -43,35 +43,52 @@

Welcome to the Dungeon

-

How many party members?

-
- {%for i in range(2,6)%} - {% if count|int() == i|int() %} - {{i}} - {% else %} - {{i}} - {% endif %} - {%endfor%} +
+
+
+

How many party members? {{count}}

+
+ {%for i in range(2,6)%} + {% if count|int() == i|int() %} + {{i}} + {% else %} + {{i}} + {% endif %} + {%endfor%} +
+
+
+

What level for the party? {{level}}

+
+ {%for j in range(1,6)%} + {% if level|int() == j|int() %} + {{j}} + {% else %} + {{j}} + {% endif %} + {%endfor%} +
+
+
-
{%for character in adv_party.adventurers%}
- + Select this {{character.player_class.title()}}
-
{{character.vertical_sheet | join("\n")}}
+
{{character.vertical_sheet() | join("\n")}}
{%endfor%}
-
+
-
+