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]
            )