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)