Spaces:
Sleeping
Sleeping
| """ | |
| Campaign Create Tab for D'n'D Campaign Manager | |
| """ | |
| import gradio as gr | |
| import traceback | |
| from src.agents.campaign_agent import CampaignAgent | |
| from src.models.campaign import CampaignTheme | |
| class CampaignCreateTab: | |
| """Create Campaign tab for creating new campaigns""" | |
| def __init__(self, campaign_agent: CampaignAgent): | |
| self.campaign_agent = campaign_agent | |
| def create_campaign_ui( | |
| self, | |
| name: str, | |
| theme: str, | |
| setting: str, | |
| summary: str, | |
| main_conflict: str, | |
| game_master: str, | |
| world_name: str, | |
| starting_location: str, | |
| level_range: str, | |
| party_size: int | |
| ) -> str: | |
| """Create a new campaign""" | |
| try: | |
| if not name.strip(): | |
| return "β Error: Please provide a campaign name" | |
| campaign = self.campaign_agent.create_campaign( | |
| name=name, | |
| theme=theme, | |
| setting=setting, | |
| summary=summary, | |
| main_conflict=main_conflict, | |
| game_master=game_master, | |
| world_name=world_name, | |
| starting_location=starting_location, | |
| level_range=level_range, | |
| party_size=party_size | |
| ) | |
| return f"""β Campaign Created Successfully! | |
| **ID:** {campaign.id} | |
| **Name:** {campaign.name} | |
| **Theme:** {campaign.theme.value} | |
| **Setting:** {campaign.setting} | |
| Campaign has been saved to database. | |
| Use the campaign ID to manage characters and sessions.""" | |
| except Exception as e: | |
| return f"β Error creating campaign:\n\n{str(e)}\n\n{traceback.format_exc()}" | |
| def create(self) -> None: | |
| """Create and return the Create Campaign tab component""" | |
| with gr.Tab("Create Campaign"): | |
| gr.Markdown("### Create New Campaign") | |
| with gr.Row(): | |
| with gr.Column(): | |
| campaign_name = gr.Textbox( | |
| label="Campaign Name", | |
| placeholder="The Shattered Crown", | |
| info="Name of your campaign" | |
| ) | |
| campaign_theme = gr.Dropdown( | |
| choices=[theme.value for theme in CampaignTheme], | |
| label="Campaign Theme", | |
| value="High Fantasy", | |
| info="Select the theme of your campaign" | |
| ) | |
| campaign_gm = gr.Textbox( | |
| label="Game Master Name", | |
| placeholder="Your name", | |
| info="DM/GM running the campaign" | |
| ) | |
| campaign_party_size = gr.Slider( | |
| minimum=1, | |
| maximum=10, | |
| value=4, | |
| step=1, | |
| label="Party Size", | |
| info="Expected number of players" | |
| ) | |
| campaign_level_range = gr.Textbox( | |
| label="Level Range", | |
| value="1-5", | |
| placeholder="1-5", | |
| info="Expected level range for the campaign" | |
| ) | |
| with gr.Column(): | |
| campaign_world = gr.Textbox( | |
| label="World Name", | |
| placeholder="Forgotten Realms", | |
| info="Name of your world/realm" | |
| ) | |
| campaign_starting = gr.Textbox( | |
| label="Starting Location", | |
| placeholder="Phandalin", | |
| info="Where the adventure begins" | |
| ) | |
| campaign_setting = gr.Textbox( | |
| label="Setting Description", | |
| placeholder="A war-torn kingdom...", | |
| lines=3, | |
| info="Describe the campaign setting" | |
| ) | |
| campaign_summary = gr.Textbox( | |
| label="Campaign Summary", | |
| placeholder="The adventurers must...", | |
| lines=3, | |
| info="Brief campaign hook/summary" | |
| ) | |
| campaign_conflict = gr.Textbox( | |
| label="Main Conflict", | |
| placeholder="A succession crisis threatens the kingdom", | |
| lines=2, | |
| info="Central conflict/tension" | |
| ) | |
| create_campaign_btn = gr.Button("βοΈ Create Campaign", variant="primary", size="lg") | |
| campaign_create_status = gr.Textbox(label="Status", lines=8) | |
| create_campaign_btn.click( | |
| fn=self.create_campaign_ui, | |
| inputs=[ | |
| campaign_name, | |
| campaign_theme, | |
| campaign_setting, | |
| campaign_summary, | |
| campaign_conflict, | |
| campaign_gm, | |
| campaign_world, | |
| campaign_starting, | |
| campaign_level_range, | |
| campaign_party_size | |
| ], | |
| outputs=[campaign_create_status] | |
| ) | |