File size: 4,122 Bytes
a184f51
 
 
1dc4501
 
 
 
a184f51
 
 
5d36cc3
a184f51
1dc4501
6329a16
 
5d36cc3
1349f96
 
 
a184f51
 
1dc4501
1349f96
a184f51
1dc4501
1349f96
a184f51
1dc4501
 
 
 
 
a184f51
ac64ec0
 
a184f51
 
 
 
 
 
 
ac64ec0
 
a184f51
9e96640
b03b8e6
5d36cc3
 
a184f51
5d36cc3
 
a184f51
 
1349f96
 
a184f51
 
 
1349f96
 
 
ac64ec0
8512428
1349f96
8512428
 
 
a184f51
8512428
5d36cc3
1349f96
8512428
1349f96
 
 
 
 
 
 
 
 
 
 
 
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
import os
from io import BytesIO

import streamlit as st
import svgwrite
from PIL import Image

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 = ["common", "uncommon", "rare", "epic", "legendary", "mythic", "godlike"]

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))
    dwg.add(svgwrite.text.Text(suit.upper(), insert=(5, 15), fill="black", font_size="16px", font_weight="bold"))
    dwg.add(svgwrite.text.Text(value, insert=(5, card_height - 10), fill="black", font_size="16px", font_weight="bold"))
    dwg.add(svgwrite.text.Text(level.upper(), insert=(card_width - 50, card_height - 10), fill="black", font_size="12px", font_weight="bold"))
    return dwg.tostring()

def display_parts_selection():
    return {part: st.sidebar.selectbox(f"Select {part}", options) for part, options in PARTS.items()}

def display_level_selection():
    return st.sidebar.selectbox("Select Level", LEVELS)

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(card_width, card_height):
    uploaded_file = st.sidebar.file_uploader("Upload Card Background Image", type=["png", "jpg", "jpeg"])
    if uploaded_file is not None:
        image = Image.open(uploaded_file)
        image = image.resize((card_width, card_height))
        img_bytes = BytesIO()
        image.save(img_bytes, format="PNG")
        img_data = img_bytes.getvalue()
        img_href = "data:image/png;base64," + img_data.hex()
        return img_href
    else:
        return None

def display_card(selected_parts, selected_level, card_width, card_height, background):
    if background and os.path.exists(background):
        background_name = os.path.basename(background)
        st.sidebar.markdown(f"**Background Image:** {background_name}")
        background_color = "white"
    else:
        st.sidebar.markdown(f"**Background Image:** {selected_parts['background'].capitalize()}")
        background_color = selected_parts["background"]

    card_svg = draw_card(background_color, selected_parts["suit"], selected_parts["value"], selected_level, card_width, card_height)
    if background:
        img = svgwrite.image.Image(href=background, size=(f"{card_width}px", f"{card_height}px"))
        dwg = svgwrite.fromstring(card_svg)
        dwg.add(img)
        st.write(f'<svg viewBox="0 0 {card_width} {card_height}">{dwg.tostring()}</svg>', unsafe_allow_html=True)
    else:
        st.write(f'<svg viewBox="0 0 {card_width} {card_height}">{card_svg.decode("utf-8")}</svg>', unsafe_allow_html=True)

    # Create a download link for the card SVG
    svg_content = '<?xml version="1.0" encoding="utf-8" ?>' + card_svg.decode("utf-8")
    st.download_button("Download Card as SVG", svg_content, "card.svg", "text/plain")

    # Create button to level up card
    if selected_level != "godlike":
        if st.button("Level Up"):
            current_level_index = LEVELS.index(selected_level)
            selected_level = LEVELS[current_level_index + 1]
            st.sidebar.warning(f"Card has been leveled up to {selected_level}")

def main():
    st.set_page_config(page_title="Card Evolution Game", page_icon=":hearts:")
    selected_parts = display_parts_selection()
    selected_level = display_level_selection()
    card_width, card_height = display_size_selection(75, 100)
    background = display_image_upload(card_width, card_height)
    display_card(selected_parts, selected_level, card_width, card_height, background)

if __name__ == '__main__':
    main()