Spaces:
Sleeping
Sleeping
File size: 5,360 Bytes
71b378e |
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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 |
"""
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]
)
|