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'{card_svg}', unsafe_allow_html=True) # Create a download link for the card SVG svg_content = '' + 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}") st.set_page_config(page_title="Card Evolution Game", page_icon=":hearts:") 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)