"""Trigger detection patterns. Triggers determine WHEN an ability activates: - ON_PLAY: When member enters the stage - ON_LIVE_START: When a live begins - ON_LIVE_SUCCESS: When a live succeeds - ACTIVATED: Manual activation - CONSTANT: Always active - etc. Patterns are organized in tiers: - Tier 1 (priority 10-19): Icon filenames (most reliable) - Tier 2 (priority 20-29): Specific phrases - Tier 3 (priority 30-39): Generic kanji keywords """ from .base import Pattern, PatternPhase TRIGGER_PATTERNS = [ # ========================================================================== # TIER 1: Icon-based triggers (highest priority) # ========================================================================== Pattern( name="on_play_icon", phase=PatternPhase.TRIGGER, regex=r"toujyou", priority=10, output_type="TriggerType.ON_PLAY", ), Pattern( name="on_live_start_icon", phase=PatternPhase.TRIGGER, regex=r"live_start", priority=10, output_type="TriggerType.ON_LIVE_START", ), Pattern( name="on_live_success_icon", phase=PatternPhase.TRIGGER, regex=r"live_success", priority=10, # Skip if "この能力は...のみ発動する" (activation restriction, not trigger) excludes=["この能力は"], output_type="TriggerType.ON_LIVE_SUCCESS", ), Pattern( name="activated_icon", phase=PatternPhase.TRIGGER, regex=r"kidou", priority=10, output_type="TriggerType.ACTIVATED", ), Pattern( name="constant_icon", phase=PatternPhase.TRIGGER, regex=r"jyouji", priority=10, output_type="TriggerType.CONSTANT", ), Pattern( name="on_leaves_icon", phase=PatternPhase.TRIGGER, regex=r"jidou", priority=10, output_type="TriggerType.ON_LEAVES", ), Pattern( name="live_end_icon", phase=PatternPhase.TRIGGER, regex=r"live_end", priority=10, output_type="TriggerType.TURN_END", ), # ========================================================================== # TIER 2: Specific phrase triggers # ========================================================================== Pattern( name="on_reveal_cheer", phase=PatternPhase.TRIGGER, regex=r"エールにより公開|エールで公開", priority=20, output_type="TriggerType.ON_REVEAL", ), Pattern( name="constant_yell_reveal", phase=PatternPhase.TRIGGER, keywords=["エールで出た"], priority=20, output_type="TriggerType.CONSTANT", ), # ========================================================================== # TIER 3: Kanji keyword triggers # ========================================================================== Pattern( name="on_play_kanji", phase=PatternPhase.TRIGGER, regex=r"登場", priority=30, # Filter: Not when describing "has [Play] ability" etc look_ahead_excludes=["能力", "スキル", "を持つ", "を持たない", "がない"], output_type="TriggerType.ON_PLAY", ), Pattern( name="on_live_start_kanji", phase=PatternPhase.TRIGGER, regex=r"ライブ開始|ライブの開始", priority=30, look_ahead_excludes=["能力", "スキル", "を持つ"], output_type="TriggerType.ON_LIVE_START", ), Pattern( name="on_live_success_kanji", phase=PatternPhase.TRIGGER, regex=r"ライブ成功", priority=30, look_ahead_excludes=["能力", "スキル", "を持つ"], output_type="TriggerType.ON_LIVE_SUCCESS", ), Pattern( name="activated_kanji", phase=PatternPhase.TRIGGER, keywords=["起動"], priority=30, look_ahead_excludes=["能力", "スキル", "を持つ"], output_type="TriggerType.ACTIVATED", ), Pattern( name="constant_kanji", phase=PatternPhase.TRIGGER, keywords=["常時"], priority=30, look_ahead_excludes=["能力", "スキル", "を持つ"], output_type="TriggerType.CONSTANT", ), Pattern( name="on_leaves_kanji", phase=PatternPhase.TRIGGER, keywords=["自動"], priority=30, look_ahead_excludes=["能力", "スキル", "を持つ"], output_type="TriggerType.ON_LEAVES", ), Pattern( name="turn_start", phase=PatternPhase.TRIGGER, keywords=["ターン開始"], priority=30, output_type="TriggerType.TURN_START", ), Pattern( name="turn_end_kanji", phase=PatternPhase.TRIGGER, regex=r"ターン終了|ライブ終了", priority=30, look_ahead_excludes=["まで"], # "Until end of turn" is duration, not trigger output_type="TriggerType.TURN_END", ), ]