Spaces:
Runtime error
Runtime error
File size: 4,378 Bytes
1dc4501 6c56e9d b03b8e6 1dc4501 5d36cc3 1dc4501 5d36cc3 1dc4501 5d36cc3 1dc4501 6329a16 5d36cc3 6329a16 668a3f5 6329a16 1dc4501 5d36cc3 1dc4501 ac64ec0 b03b8e6 ac64ec0 9e96640 b03b8e6 5d36cc3 b03b8e6 5d36cc3 9e96640 ac64ec0 8512428 5d36cc3 8512428 5d36cc3 8512428 1dc4501 5d36cc3 1dc4501 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
import streamlit as st
import svgwrite
from PIL import Image
from io import BytesIO
import os
st.set_page_config(page_title="Card Evolution Game", page_icon=":hearts:")
def get_default_card_size():
return 75, 100
def get_default_parts():
return {"background": "white", "suit": "clubs", "value": "1"}
def get_default_levels():
return ["level 1", "common"]
def draw_card(background, suit, value, level, card_width, card_height):
dwg = svgwrite.Drawing(size=(f"{card_width}px", f"{card_height}px"))
dwg.add(dwg.rect((0, 0), (card_width, card_height), rx=10, ry=10, fill=background, stroke="black", stroke_width=2))
# Add suit and value labels
suit = svgwrite.text.Text(suit.upper(), insert=(5, 15), fill="black", font_size="16px", font_weight="bold")
dwg.add(suit)
value = svgwrite.text.Text(value, insert=(5, card_height - 10), fill="black", font_size="16px", font_weight="bold")
dwg.add(value)
# Add level label
level = svgwrite.text.Text(level.upper(), insert=(card_width - 50, card_height - 10), fill="black", font_size="12px", font_weight="bold")
svg_string = dwg.tostring()
return svg_string
def display_parts_selection():
selected_parts = {}
for part, options in PARTS.items():
selected_parts[part] = st.sidebar.selectbox(f"Select {part}", options)
return selected_parts
def display_level_selection():
selected_level = st.sidebar.selectbox("Select Level", LEVELS)
return selected_level
def display_size_selection(default_width, default_height):
card_width = st.sidebar.slider("Card Width", min_value=50, max_value=150, value=default_width, step=5)
card_height = st.sidebar.slider("Card Height", min_value=75, max_value=200, value=default_height, step=5)
return card_width, card_height
def display_image_upload():
uploaded_file = st.sidebar.file_uploader("Upload Card Background Image", type=["png", "jpg", "jpeg"])
if uploaded_file is not None:
image_name = uploaded_file.name
with open(image_name, "wb") as f:
f.write(uploaded_file.getbuffer())
return image_name
else:
return None
def display_card(selected_parts, selected_level, card_width, card_height, background):
if background and os.path.exists(background):
img = Image.open(background)
img = img.resize((card_width, card_height))
img_bytes = BytesIO()
img.save(img_bytes, format="PNG")
img_data = img_bytes.getvalue()
img_href = "data:image/png;base64," + img_data.hex()
background_name = os.path.basename(background)
st.sidebar.markdown(f"**Background Image:** {background_name}")
background = img_href
else:
st.sidebar.markdown(f"**Background Image:** {selected_parts['background'].capitalize()}")
card_svg = draw_card(selected_parts["background"], selected_parts["suit"], selected_parts["value"], selected_level, card_width, card_height)
st.write(f'<svg viewBox="0 0 {card_width} {card_height}">{card_svg}</svg>', unsafe_allow_html=True)
# Create a download link for the card SVG
svg_content = '<?xml version="1.0" encoding="utf-8" ?>' + card_svg
st.download_button("Download Card as SVG", svg_content, "card.svg", "text/plain")
# Create button to level up card
if selected_level != LEVELS[-1]:
if st.button("Level Up"):
current_level_index = LEVELS.index(selected_level)
new_level = LEVELS[current_level_index + 1]
selected_level = new_level
st.sidebar.warning(f"Card has been leveled up to {selected_level}")
DEFAULT_CARD_WIDTH, DEFAULT_CARD_HEIGHT = get_default_card_size()
DEFAULT_PARTS = get_default_parts()
DEFAULT_LEVELS = get_default_levels()
PARTS = {"background": ["white", "black", "red", "blue", "green", "yellow"],
"suit": ["clubs", "diamonds", "hearts", "spades"],
"value": ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]}
LEVELS = ["level 1", "common", "uncommon", "rare", "epic", "legendary", "mythic", "godlike"]
selected_parts = display_parts_selection()
selected_level = display_level_selection()
card_width, card_height = display_size_selection(DEFAULT_CARD_WIDTH, DEFAULT_CARD_HEIGHT)
background = display_image_upload()
display_card(selected_parts, selected_level, card_width, card_height, background)
|