interactive-theatre-designer by 4444j99/a-i--skills
npx skills add https://github.com/4444j99/a-i--skills --skill interactive-theatre-designer此技能为创建戏剧体验提供指导,让观众通过互动系统和分支叙事参与、影响或共同创作表演。
Passive Active
│ │
├──Traditional──┬──Promenade──┬──Immersive──┬──Participatory──┤
│ Theatre │ Theatre │ Theatre │ Theatre │
│ │ │ │ │
│ Fixed seats │ Audience │ Audience │ Audience │
│ Fourth wall │ moves │ is inside │ affects │
│ No agency │ Partial │ story world │ narrative │
│ │ agency │ Some agency │ Full agency │
└───────────────┴─────────────┴─────────────┴─────────────────┘
| 模式 |
|---|
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| 描述 |
|---|
| 设计挑战 |
|---|
| 见证者 | 置身其中观察 | 管理视线,营造亲密感 |
| 探索者 | 选择去向 | 平衡错失恐惧,奖励好奇心 |
| 玩家 | 做出故事选择 | 创造有意义的利害关系 |
| 共创者 | 生成内容 | 搭建创意脚手架 |
| 表演者 | 成为角色 | 降低抑制障碍 |
Linear with Variations
A ──→ B ──→ C ──→ D
↓
B' (variation based on earlier choice)
Branching Tree
┌── B1 ──→ C1
A ────┤
└── B2 ──→ C2 ──┬── D1
└── D2
Folding Paths (reconvergent)
┌── B1 ──┐
A ────┤ ├──→ D
└── B2 ──┘
Hub and Spoke
┌── B ──┐
┌────┤ │
A ──┤ └───────┘
│ ┌── C ──┐
└────┤ │
└───────┘
Parallel Threads
A1 ───────→ B1 ───────→ C1
↕ sync
A2 ───────→ B2 ───────→ C2
class NarrativeChoice:
"""A decision point in the story"""
def __init__(self, prompt, options):
self.prompt = prompt
self.options = options
self.context_requirements = []
self.consequences = {}
def evaluate_options(self, audience_state):
"""Determine available choices based on state"""
available = []
for option in self.options:
if option.is_available(audience_state):
available.append(option)
# Always ensure at least two meaningful options
if len(available) < 2:
available.append(self._create_fallback_option())
return available
class StoryBeat:
"""A unit of narrative action"""
def __init__(self, content, duration_range, choice=None):
self.content = content
self.min_duration = duration_range[0]
self.max_duration = duration_range[1]
self.choice = choice # Optional NarrativeChoice
self.state_changes = {} # What this beat modifies
self.prerequisites = [] # What must be true to reach this
class ConsequenceTracker:
"""Track choices and their ripple effects"""
def __init__(self):
self.choices_made = []
self.world_state = {}
self.character_relationships = {}
self.available_endings = set()
def record_choice(self, choice_id, option_selected, timestamp):
self.choices_made.append({
'choice': choice_id,
'selected': option_selected,
'time': timestamp
})
self._apply_consequences(choice_id, option_selected)
self._update_available_endings()
def _apply_consequences(self, choice_id, option):
"""Apply immediate and delayed consequences"""
# Immediate effects
for effect in option.immediate_effects:
self._apply_effect(effect)
# Queue delayed effects
for effect in option.delayed_effects:
self._queue_effect(effect)
def get_story_fingerprint(self):
"""Unique identifier for this audience's journey"""
return hash(tuple(
(c['choice'], c['selected'])
for c in self.choices_made
))
让选择有意义 :
避免选择瘫痪 :
class CollectiveDecision:
"""Aggregate audience input into story decisions"""
def __init__(self, voting_method='plurality'):
self.voting_method = voting_method
self.votes = {}
def collect_votes(self, options, timeout_seconds=30):
"""Gather votes from audience"""
# Methods: raise hands, mobile app, physical movement, sound
pass
def resolve(self):
"""Determine outcome based on voting method"""
methods = {
'plurality': self._plurality, # Most votes wins
'supermajority': self._supermajority, # Needs 2/3
'consensus': self._consensus, # Unanimous
'weighted': self._weighted, # Some votes count more
'random_delegate': self._delegate # One person decides
}
return methods[self.voting_method]()
def _plurality(self):
return max(self.votes.keys(), key=lambda x: self.votes[x])
| 方法 | 优点 | 缺点 |
|---|---|---|
| 个体选择 | 个人投入感 | 后勤复杂 |
| 集体投票 | 易于管理 | 少数派感觉被忽视 |
| 代表制 | 两者平衡 | 选择代表 |
| 平行路径 | 每个人都有能动性 | 需要更多内容 |
TRADITIONAL STAGE IMMERSIVE SPACE
┌─────────────────┐ ┌─────────────────────────────┐
│ │ │ GARDEN │ LIBRARY │
│ STAGE │ │ (Past) │ (Memory) │
│ │ │ ◇ ↔ ◇ │
├─────────────────┤ ├────────────┼───────────────┤
│ AUDIENCE │ │ KITCHEN │ BEDROOM │
│ │ │ (Present) │ (Future) │
└─────────────────┘ │ ◇ ↔ ◇ │
└─────────────────────────────┘
◇ = Performance hotspot
↔ = Audience flow path
class ImmersiveSpace:
"""Design an immersive theatrical environment"""
def __init__(self, venue):
self.venue = venue
self.zones = {}
self.artifacts = []
self.ambient_states = {}
def add_zone(self, zone):
"""Define a narrative zone"""
self.zones[zone.name] = zone
def design_discovery_path(self, story_beats):
"""Create environmental narrative arc"""
path = []
for beat in story_beats:
zone = self._select_zone_for_beat(beat)
artifacts = self._place_artifacts(beat, zone)
ambient = self._set_ambient_state(beat, zone)
path.append({
'beat': beat,
'zone': zone,
'artifacts': artifacts,
'ambient': ambient
})
return path
class NarrativeArtifact:
"""Object that tells story when discovered"""
def __init__(self, name, backstory, discovery_trigger):
self.name = name
self.backstory = backstory # What it reveals
self.discovery_trigger = discovery_trigger # How found
self.required_for_story = False
self.hidden_level = 0 # 0=obvious, 5=very hidden
| 感官 | 叙事用途 | 技术考量 |
|---|---|---|
| 视觉 | 角色、氛围、焦点 | 灯光设计图、布景 |
| 听觉 | 气氛、过渡 | 扬声器、声学设计 |
| 嗅觉 | 记忆、地点、情感 | 气味机、自然气味 |
| 触觉 | 质感、温度 | 材料选择 |
| 味觉 | 仪式、共融 | 食品安全、过敏 |
class ShowController:
"""Manage live show based on audience behavior"""
def __init__(self, script, performers, systems):
self.script = script
self.performers = performers
self.systems = systems # Lights, sound, effects
self.current_beat = None
self.audience_state = AudienceState()
def update(self):
"""Called continuously during show"""
# Observe audience
self.audience_state.update(self._observe_audience())
# Check for triggers
triggers = self._check_triggers()
# Adapt if needed
for trigger in triggers:
self._handle_trigger(trigger)
# Cue performers
self._send_performer_cues()
def _check_triggers(self):
"""Detect conditions that require adaptation"""
triggers = []
# Audience engagement low
if self.audience_state.engagement < 0.3:
triggers.append(('low_engagement', 'intensify'))
# Audience moving to unexpected zone
if self._unexpected_movement():
triggers.append(('migration', 'redirect_or_adapt'))
# Time running over/under
pace = self._calculate_pace()
if pace < 0.8:
triggers.append(('slow_pace', 'compress'))
elif pace > 1.2:
triggers.append(('fast_pace', 'expand'))
return triggers
class PerformerCueSystem:
"""Real-time communication with performers"""
def __init__(self):
self.performers = {}
self.cue_queue = []
def add_performer(self, name, device_type):
"""Register performer with their cue device"""
self.performers[name] = {
'device': device_type, # 'earpiece', 'wearable', 'visual'
'current_track': None,
'status': 'ready'
}
def send_cue(self, performer, cue_type, content, urgency='normal'):
"""Send cue to specific performer"""
cue = {
'performer': performer,
'type': cue_type, # 'go', 'hold', 'redirect', 'improv'
'content': content,
'urgency': urgency
}
self._transmit(cue)
def broadcast_state_change(self, new_state):
"""Inform all performers of story state change"""
for performer in self.performers:
self.send_cue(
performer,
'state_change',
new_state,
urgency='low'
)
## [Show Title] Production Bible
### Concept
- Logline (one sentence)
- Themes
- Audience experience goals
### Narrative
- Story summary (non-branching core)
- Branch points and options
- Endings (and how reached)
- Character breakdowns
### Space
- Venue requirements
- Zone map
- Artifacts inventory
- Technical requirements
### Interactivity
- Choice points catalog
- Participation mechanics
- Edge cases and recovery
### Operations
- Audience journey map
- Performer tracks
- Stage management protocol
- Emergency procedures
TIME | BEAT | ACTION | TRIGGERS
--------|----------------|----------------------|------------------
0:00 | GATHERING | Audience enters | N/A
0:15 | INTRO | Host welcome | All present
0:20 | CHOICE 1 | Vote on path | 2 min timer
0:22 | BRANCH A or B | Split audience | Vote result
... | ... | ... | ...
1:45 | CONVERGENCE | All paths meet | All groups arrive
2:00 | FINALE | Final choice | Timer
2:10 | END | House lights | Applause
references/choice-architecture.md - 设计有意义的决策references/immersive-case-studies.md - 知名作品分析references/live-systems-tech.md - 技术实现模式每周安装量
1
仓库
GitHub 星标
2
首次出现
1 天前
安全审计
安装于
zencoder1
amp1
cline1
openclaw1
opencode1
cursor1
This skill provides guidance for creating theatrical experiences where audiences participate in, influence, or co-create the performance through interactive systems and branching narratives.
Passive Active
│ │
├──Traditional──┬──Promenade──┬──Immersive──┬──Participatory──┤
│ Theatre │ Theatre │ Theatre │ Theatre │
│ │ │ │ │
│ Fixed seats │ Audience │ Audience │ Audience │
│ Fourth wall │ moves │ is inside │ affects │
│ No agency │ Partial │ story world │ narrative │
│ │ agency │ Some agency │ Full agency │
└───────────────┴─────────────┴─────────────┴─────────────────┘
| Mode | Description | Design Challenge |
|---|---|---|
| Witness | Observe from within | Manage sight lines, intimacy |
| Explorer | Choose where to go | Balance FOMO, reward curiosity |
| Player | Make story choices | Create meaningful stakes |
| Co-creator | Generate content | Scaffold creativity |
| Performer | Become a character | Lower inhibition barriers |
Linear with Variations
A ──→ B ──→ C ──→ D
↓
B' (variation based on earlier choice)
Branching Tree
┌── B1 ──→ C1
A ────┤
└── B2 ──→ C2 ──┬── D1
└── D2
Folding Paths (reconvergent)
┌── B1 ──┐
A ────┤ ├──→ D
└── B2 ──┘
Hub and Spoke
┌── B ──┐
┌────┤ │
A ──┤ └───────┘
│ ┌── C ──┐
└────┤ │
└───────┘
Parallel Threads
A1 ───────→ B1 ───────→ C1
↕ sync
A2 ───────→ B2 ───────→ C2
class NarrativeChoice:
"""A decision point in the story"""
def __init__(self, prompt, options):
self.prompt = prompt
self.options = options
self.context_requirements = []
self.consequences = {}
def evaluate_options(self, audience_state):
"""Determine available choices based on state"""
available = []
for option in self.options:
if option.is_available(audience_state):
available.append(option)
# Always ensure at least two meaningful options
if len(available) < 2:
available.append(self._create_fallback_option())
return available
class StoryBeat:
"""A unit of narrative action"""
def __init__(self, content, duration_range, choice=None):
self.content = content
self.min_duration = duration_range[0]
self.max_duration = duration_range[1]
self.choice = choice # Optional NarrativeChoice
self.state_changes = {} # What this beat modifies
self.prerequisites = [] # What must be true to reach this
class ConsequenceTracker:
"""Track choices and their ripple effects"""
def __init__(self):
self.choices_made = []
self.world_state = {}
self.character_relationships = {}
self.available_endings = set()
def record_choice(self, choice_id, option_selected, timestamp):
self.choices_made.append({
'choice': choice_id,
'selected': option_selected,
'time': timestamp
})
self._apply_consequences(choice_id, option_selected)
self._update_available_endings()
def _apply_consequences(self, choice_id, option):
"""Apply immediate and delayed consequences"""
# Immediate effects
for effect in option.immediate_effects:
self._apply_effect(effect)
# Queue delayed effects
for effect in option.delayed_effects:
self._queue_effect(effect)
def get_story_fingerprint(self):
"""Unique identifier for this audience's journey"""
return hash(tuple(
(c['choice'], c['selected'])
for c in self.choices_made
))
Make Choices Meaningful :
Avoid Choice Paralysis :
class CollectiveDecision:
"""Aggregate audience input into story decisions"""
def __init__(self, voting_method='plurality'):
self.voting_method = voting_method
self.votes = {}
def collect_votes(self, options, timeout_seconds=30):
"""Gather votes from audience"""
# Methods: raise hands, mobile app, physical movement, sound
pass
def resolve(self):
"""Determine outcome based on voting method"""
methods = {
'plurality': self._plurality, # Most votes wins
'supermajority': self._supermajority, # Needs 2/3
'consensus': self._consensus, # Unanimous
'weighted': self._weighted, # Some votes count more
'random_delegate': self._delegate # One person decides
}
return methods[self.voting_method]()
def _plurality(self):
return max(self.votes.keys(), key=lambda x: self.votes[x])
| Approach | Pros | Cons |
|---|---|---|
| Individual choices | Personal investment | Logistical complexity |
| Collective voting | Easy to manage | Minority feels unheard |
| Representative | Balance of both | Choosing representative |
| Parallel paths | Everyone gets agency | Requires more content |
TRADITIONAL STAGE IMMERSIVE SPACE
┌─────────────────┐ ┌─────────────────────────────┐
│ │ │ GARDEN │ LIBRARY │
│ STAGE │ │ (Past) │ (Memory) │
│ │ │ ◇ ↔ ◇ │
├─────────────────┤ ├────────────┼───────────────┤
│ AUDIENCE │ │ KITCHEN │ BEDROOM │
│ │ │ (Present) │ (Future) │
└─────────────────┘ │ ◇ ↔ ◇ │
└─────────────────────────────┘
◇ = Performance hotspot
↔ = Audience flow path
class ImmersiveSpace:
"""Design an immersive theatrical environment"""
def __init__(self, venue):
self.venue = venue
self.zones = {}
self.artifacts = []
self.ambient_states = {}
def add_zone(self, zone):
"""Define a narrative zone"""
self.zones[zone.name] = zone
def design_discovery_path(self, story_beats):
"""Create environmental narrative arc"""
path = []
for beat in story_beats:
zone = self._select_zone_for_beat(beat)
artifacts = self._place_artifacts(beat, zone)
ambient = self._set_ambient_state(beat, zone)
path.append({
'beat': beat,
'zone': zone,
'artifacts': artifacts,
'ambient': ambient
})
return path
class NarrativeArtifact:
"""Object that tells story when discovered"""
def __init__(self, name, backstory, discovery_trigger):
self.name = name
self.backstory = backstory # What it reveals
self.discovery_trigger = discovery_trigger # How found
self.required_for_story = False
self.hidden_level = 0 # 0=obvious, 5=very hidden
| Sense | Storytelling Uses | Technical Considerations |
|---|---|---|
| Visual | Character, mood, focus | Lighting plots, scenic |
| Audio | Atmosphere, transition | Speakers, acoustic design |
| Smell | Memory, place, emotion | Scent machines, natural |
| Touch | Texture, temperature | Material selection |
| Taste | Ritual, communion | Food safety, allergies |
class ShowController:
"""Manage live show based on audience behavior"""
def __init__(self, script, performers, systems):
self.script = script
self.performers = performers
self.systems = systems # Lights, sound, effects
self.current_beat = None
self.audience_state = AudienceState()
def update(self):
"""Called continuously during show"""
# Observe audience
self.audience_state.update(self._observe_audience())
# Check for triggers
triggers = self._check_triggers()
# Adapt if needed
for trigger in triggers:
self._handle_trigger(trigger)
# Cue performers
self._send_performer_cues()
def _check_triggers(self):
"""Detect conditions that require adaptation"""
triggers = []
# Audience engagement low
if self.audience_state.engagement < 0.3:
triggers.append(('low_engagement', 'intensify'))
# Audience moving to unexpected zone
if self._unexpected_movement():
triggers.append(('migration', 'redirect_or_adapt'))
# Time running over/under
pace = self._calculate_pace()
if pace < 0.8:
triggers.append(('slow_pace', 'compress'))
elif pace > 1.2:
triggers.append(('fast_pace', 'expand'))
return triggers
class PerformerCueSystem:
"""Real-time communication with performers"""
def __init__(self):
self.performers = {}
self.cue_queue = []
def add_performer(self, name, device_type):
"""Register performer with their cue device"""
self.performers[name] = {
'device': device_type, # 'earpiece', 'wearable', 'visual'
'current_track': None,
'status': 'ready'
}
def send_cue(self, performer, cue_type, content, urgency='normal'):
"""Send cue to specific performer"""
cue = {
'performer': performer,
'type': cue_type, # 'go', 'hold', 'redirect', 'improv'
'content': content,
'urgency': urgency
}
self._transmit(cue)
def broadcast_state_change(self, new_state):
"""Inform all performers of story state change"""
for performer in self.performers:
self.send_cue(
performer,
'state_change',
new_state,
urgency='low'
)
## [Show Title] Production Bible
### Concept
- Logline (one sentence)
- Themes
- Audience experience goals
### Narrative
- Story summary (non-branching core)
- Branch points and options
- Endings (and how reached)
- Character breakdowns
### Space
- Venue requirements
- Zone map
- Artifacts inventory
- Technical requirements
### Interactivity
- Choice points catalog
- Participation mechanics
- Edge cases and recovery
### Operations
- Audience journey map
- Performer tracks
- Stage management protocol
- Emergency procedures
TIME | BEAT | ACTION | TRIGGERS
--------|----------------|----------------------|------------------
0:00 | GATHERING | Audience enters | N/A
0:15 | INTRO | Host welcome | All present
0:20 | CHOICE 1 | Vote on path | 2 min timer
0:22 | BRANCH A or B | Split audience | Vote result
... | ... | ... | ...
1:45 | CONVERGENCE | All paths meet | All groups arrive
2:00 | FINALE | Final choice | Timer
2:10 | END | House lights | Applause
references/choice-architecture.md - Designing meaningful decisionsreferences/immersive-case-studies.md - Notable productions analysisreferences/live-systems-tech.md - Technical implementation patternsWeekly Installs
1
Repository
GitHub Stars
2
First Seen
1 day ago
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
zencoder1
amp1
cline1
openclaw1
opencode1
cursor1
前端设计技能指南:避免AI垃圾美学,打造独特生产级界面
39,800 周安装