aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/examples/plugin_system_demo.py
diff options
context:
space:
mode:
author简律纯 <i@jyunko.cn>2025-10-25 00:30:48 +0800
committer简律纯 <i@jyunko.cn>2025-10-25 00:30:48 +0800
commitcbc653ffd0ea9abf4360623dc7a7651e1a49cc61 (patch)
treeea3c396148158077bae3e77eaa9341f8c1990636 /examples/plugin_system_demo.py
parent08299b37dfda86e56e4f2b442f68ccd2da7a82e3 (diff)
downloadconventional_role_play-cbc653ffd0ea9abf4360623dc7a7651e1a49cc61.tar.gz
conventional_role_play-cbc653ffd0ea9abf4360623dc7a7651e1a49cc61.zip
feat: Implement plugin system with combat tracker and dice analyzer
- Added `plugin_system_demo.py` to demonstrate basic plugin usage, processing, and analysis. - Created `CombatTrackerPlugin` for tracking combat statistics including damage and healing. - Developed `DiceAnalyzerPlugin` for analyzing dice rolls and calculating success rates. - Introduced `renderer_demo.py` for rendering output in HTML, Markdown, and JSON formats. - Implemented `rule_system_demo.py` to showcase rule engine capabilities with various examples. - Established core rule engine functionality in `rules.py` with support for conditions and actions. - Enhanced base plugin structure in `base.py` to support different plugin types (Processor, Renderer, Analyzer). - Added custom exception handling in `exceptions.py` for better error management. - Configured logging setup in `logging_config.py` for improved logging capabilities. - Created unit tests in `test_rust_core.py` to validate core functionalities and performance.
Diffstat (limited to 'examples/plugin_system_demo.py')
-rw-r--r--examples/plugin_system_demo.py173
1 files changed, 173 insertions, 0 deletions
diff --git a/examples/plugin_system_demo.py b/examples/plugin_system_demo.py
new file mode 100644
index 0000000..1899b34
--- /dev/null
+++ b/examples/plugin_system_demo.py
@@ -0,0 +1,173 @@
+import sys
+import os
+from pathlib import Path
+
+sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
+
+from conventionalrp.plugins import PluginManager
+from conventionalrp.core.parser import Parser
+
+sys.path.insert(0, str(Path(__file__).parent / "plugins"))
+from dice_analyzer_plugin import DiceAnalyzerPlugin
+from combat_tracker_plugin import CombatTrackerPlugin
+
+
+def demo_basic_plugin_usage():
+ manager = PluginManager()
+
+ dice_analyzer = DiceAnalyzerPlugin()
+ dice_analyzer.initialize()
+ manager.register_plugin(dice_analyzer)
+
+ combat_tracker = CombatTrackerPlugin()
+ combat_tracker.initialize()
+ manager.register_plugin(combat_tracker)
+
+ print("\nRegistered Plugins:")
+ for plugin_info in manager.list_plugins():
+ print(f" - {plugin_info['name']} v{plugin_info['version']} (type: {plugin_info['type']})")
+
+ stats = manager.get_statistics()
+ print(f"\nPlugin Statistics: {stats}")
+
+
+def demo_processor_plugin():
+ manager = PluginManager()
+
+ combat_tracker = CombatTrackerPlugin()
+ combat_tracker.initialize()
+ manager.register_plugin(combat_tracker)
+
+ combat_log = [
+ {"type": "dialogue", "speaker": "战士", "content": "我攻击兽人,造成12点伤害!"},
+ {"type": "dialogue", "speaker": "法师", "content": "火球术!造成28点火焰伤害"},
+ {"type": "dialogue", "speaker": "牧师", "content": "治疗之光,恢复15点生命值"},
+ {"type": "dialogue", "speaker": "战士", "content": "重击!造成18点伤害"},
+ {"type": "dialogue", "speaker": "牧师", "content": "群体治疗,恢复10点生命值"},
+ ]
+
+ print("\nProcessing Combat Log:")
+ from conventionalrp.plugins.base import ProcessorPlugin
+ processed_log = manager.execute_plugins(combat_log, plugin_type=ProcessorPlugin)
+
+ for token in processed_log:
+ if "combat_data" in token:
+ print(f" {token['speaker']}: {token['content']}")
+ print(f" -> {token['combat_data']}")
+
+ print("\nCombat Summary:")
+ summary = combat_tracker.get_combat_summary()
+ print(f" 总伤害: {summary['total_damage']}")
+ print(f" 总治疗: {summary['total_healing']}")
+ print(f" 净伤害: {summary['net_damage']}")
+ print("\n 角色统计:")
+ for character, stats in summary['character_stats'].items():
+ print(f" {character}: 造成伤害={stats['damage_dealt']}, 治疗={stats['healing_done']}")
+
+
+def demo_analyzer_plugin():
+ manager = PluginManager()
+
+ dice_analyzer = DiceAnalyzerPlugin()
+ dice_analyzer.initialize()
+ manager.register_plugin(dice_analyzer)
+
+ dice_rolls = [
+ {"type": "dice", "content": "d20=15", "result": 15},
+ {"type": "success", "content": "检定成功"},
+ {"type": "dice", "content": "d6=4", "result": 4},
+ {"type": "dice", "content": "d20=20", "result": 20},
+ {"type": "success", "content": "大成功!Critical hit!"},
+ {"type": "dice", "content": "d20=1", "result": 1},
+ {"type": "failure", "content": "大失败..."},
+ {"type": "dice", "content": "d20=12", "result": 12},
+ {"type": "dice", "content": "d6=3", "result": 3},
+ {"type": "success", "content": "检定成功"},
+ ]
+
+ print("\nDice Roll Data:")
+ for roll in dice_rolls:
+ if roll["type"] == "dice":
+ print(f" {roll['content']}")
+
+ from conventionalrp.plugins.base import AnalyzerPlugin
+ analysis = manager.execute_plugins(dice_rolls, plugin_type=AnalyzerPlugin)
+
+ print("\nAnalyze result:")
+ print(f" 总投掷次数: {analysis['total_rolls']}")
+ print(f" 骰子类型分布: {analysis['dice_types']}")
+ print(f" 成功次数: {analysis['success_count']}")
+ print(f" 失败次数: {analysis['failure_count']}")
+ print(f" 大成功次数: {analysis['critical_hits']}")
+ print(f" 大失败次数: {analysis['critical_fails']}")
+ print(f" 成功率: {analysis['success_rate']:.1%}")
+ print(f" 出现极值比率: {analysis['critical_rate']:.1%}")
+
+
+def demo_plugin_enable_disable():
+ manager = PluginManager()
+ dice_analyzer = DiceAnalyzerPlugin()
+ dice_analyzer.initialize()
+ manager.register_plugin(dice_analyzer)
+
+ combat_tracker = CombatTrackerPlugin()
+ combat_tracker.initialize()
+ manager.register_plugin(combat_tracker)
+
+ print("\nInitial State:")
+ for plugin_info in manager.list_plugins():
+ print(f" {plugin_info['name']}: {'Enabled' if plugin_info['enabled'] else 'Disabled'}")
+
+ # Disable DiceAnalyzer
+ print("\nDisabling DiceAnalyzer...")
+ manager.disable_plugin("DiceAnalyzer")
+
+ print("\nCurrent State:")
+ for plugin_info in manager.list_plugins():
+ print(f" {plugin_info['name']}: {'Enabled' if plugin_info['enabled'] else 'Disabled'}")
+
+ print("\nRe-enabling DiceAnalyzer...")
+ manager.enable_plugin("DiceAnalyzer")
+
+ print("\nFinal State:")
+ for plugin_info in manager.list_plugins():
+ print(f" {plugin_info['name']}: {'Enabled' if plugin_info['enabled'] else 'Disabled'}")
+
+
+def demo_plugin_discovery():
+ plugin_dir = Path(__file__).parent / "plugins"
+ manager = PluginManager(plugin_dirs=[str(plugin_dir)])
+
+ print(f"\nSearching for plugins in directory: {plugin_dir}")
+ discovered = manager.discover_plugins()
+
+ print(f"\nFound {len(discovered)} plugin modules:")
+ for module in discovered:
+ print(f" - {module}")
+
+ print("\nLoading plugins...")
+ for py_file in plugin_dir.glob("*.py"):
+ if py_file.name.startswith("_"):
+ continue
+
+ plugin_class = manager.load_plugin_from_file(str(py_file))
+ if plugin_class:
+ print(f" ✓ Successfully loaded: {py_file.name}")
+
+
+def main():
+ try:
+ demo_basic_plugin_usage()
+ demo_processor_plugin()
+ demo_analyzer_plugin()
+ demo_plugin_enable_disable()
+ demo_plugin_discovery()
+
+ except Exception as e:
+ print(f"\n{e!r}: {e}")
+ import traceback
+ traceback.print_exc()
+
+
+if __name__ == "__main__":
+ main()