Skip to content

Latest commit

 

History

11 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

EvFrame - 高策略性RPG复杂事件处理框架

Python Version License

更简单的框架?

EvFrame主要用于高策略性RPG游戏的复杂事件处理,可以适应于需要高度自定义和动态修改事件处理逻辑的或者多层嵌套和连锁的复杂系统。 如果你只是简单的做一个简单的游戏,建议使用更简单的框架 ->更简单的框架

概述

EvFrame 是一个专为复杂策略性RPG设计的模块化事件处理框架。它通过分阶段事件处理自定义修饰器动态监听器机制,实现了对嵌套事件、连锁反应和动态逻辑修改的深度支持。其核心设计理念是"事件即消息",所有游戏逻辑(如攻击、治疗、技能效果)均通过消息传递实现,为开发者提供了极高的灵活性和扩展性。

流程图

%% 消息处理流程图
graph TD
    A[Create GameMessage] --> B{Phase is NONE?}
    B -->|Yes| C[Split into PRE-MAIN-POST]
    B -->|No| D[Add to Queue]
    C --> E[Add to Queue in Order]
    
    subgraph Message Processing
        direction TB
        E --> F[Pop Message]
        D --> F
        F --> G[Broadcast to Listeners]
        G --> H{Generate New Msg?}
        H -->|Yes| I[Enqueue New Msg]
        H -->|No| J[Apply Modifiers]
        J --> K{Custom Modifier?}
        K -->|Yes| L[Execute Custom Logic]
        K -->|No| M[Apply Base Modifiers]
        L --> N[Broadcast MODIFY Event]
        M --> N
        N --> O[Execute Phase Handler]
        O --> P{Result}
        P -->|CONTINUE| Q[Process Next]
        P -->|STOP| R[Clear Queue]
        P -->|SKIP| S[Skip Same Type]
        P -->|RE_INPUT| T[Re-Input Msg]
    end
    
    subgraph "Example: Attack Flow"
        direction LR
        U(ATTACK) --> V[[PRE Phase]]
        V -->|Calc Base Dmg| W[[MAIN Phase]]
        W -->|Apply Crit/Dodge| X[[POST Phase]]
        X -->|Trigger Skills| Y(Generate DAMAGE)
        Y -->|Chain Reaction| Z(Generate HEAL)
    end

    style A fill:#f9f,stroke:#333
    style U fill:#cdf,stroke:#369
    style Q fill:#cfc,stroke:#093
Loading

核心特性

1. 事件分阶段处理

采用 PRE-MAIN-POST 三阶段模型:

class MessagePhase(Enum):
    PRE = auto()   # 预处理(如伤害计算前修改基础值)
    MAIN = auto()  # 主处理(实际生效逻辑)
    POST = auto()  # 后处理(结果回调与连锁触发)
  • NONE 类型消息自动拆分为三阶段
  • 支持阶段间数据继承与校验
  • 示例:攻击事件自动生成 DAMAGE 消息,并在不同阶段应用暴击/闪避计算

2. 自定义修饰器系统

通过 modify() 方法动态修改事件参数:

# 测试用例:技能A在DAMAGE预处理阶段增加伤害
class SkillA(PassiveSkill):
    def effect(self, msg: GameMessage):
        if msg.type == "DAMAGE" and msg.phase == MessagePhase.PRE:
            msg.modify(('set_value', lambda x: x.get_value() + 10))  # 修饰器修改伤害值

修饰器类型

类型 功能 示例
set_value 修改事件数值 伤害增益/减益
set_sender 修改事件发起者 伤害反弹
set_receiver 修改事件目标 转移治疗目标
自定义 通过register_modifier注册 复杂连锁逻辑

3. 动态监听器机制

通过继承 PassiveSkill 实现事件监听:

# 测试用例:荆棘护甲反弹伤害
class ThornArmorSkill(PassiveSkill):
    def effect(self, msg):
        if msg.type == "DAMAGE" and msg.phase == MessagePhase.PRE:
            reflect_msg = msg.create(...)  # 创建新DAMAGE消息
            msg.messagechain.i.manager.acceptmsgp(reflect_msg)  # 注入新事件

监听器优势

  • 自动注册:通过 manager.register() 实现零配置监听
  • 上下文感知:可通过 msg.phase 精确控制触发时机
  • 嵌套支持:事件处理中生成的新事件自动进入队列

复杂逻辑适应性

案例1:多重技能连锁

# test_complex_skills_interaction 测试流程:
1. 角色1发起攻击(原始伤害20)
2. 技能A(PRE阶段):伤害+10 → 30
3. 技能B(PRE阶段):注册自定义修饰器,伤害减半为15,反弹15
4. 主处理:角色2受到15伤害
5. POST阶段:技能C治疗角色2(+2 HP)
6. 反弹伤害触发:角色1受到15伤害
7. POST阶段:技能C再次治疗角色1(+2 HP)

▶️ 最终结果:角色1/2实际各损失13 HP,框架自动处理了4层事件嵌套

案例2:动态修饰器注册

# 技能B通过临时注册修饰器实现复杂逻辑
class SkillB(PassiveSkill):
    def effect(self, msg):
        def custom_modifier(...):
            # 动态计算伤害分配
            msg.value = reduced
            reflect_msg = msg.create(...)  # 生成反弹事件
            msg.messagechain.i.manager.acceptmsgp(reflect_msg)
            return raw_value, reduced, True
        msg.modify(('SkillB_custom_modifier',0))  # 绑定临时修饰器

扩展性设计

1. 模块化处理器

class Handler:
    def register_type(self, msg_type: str, handler: Callable, phase: MessagePhase)
    def replace_type(self, msg_type: str, handler: Callable, phase: MessagePhase)
    def handles(self, msg_type: str, phase: MessagePhase)  # 装饰器模式
  • 支持继承(如 Mainhandler=Handler(BASE_MSG_HANDLER)
  • 内置攻击/伤害/治疗等基础事件处理器

2. 消息链管理

class MessageChain:
    def acceptmsg(self, msg)   # 左插入(立即执行)
    def acceptmsgp(self, msg)  # 右插入(延迟执行)
  • 自动处理NONE消息拆分
  • 记录已响应对象防止循环

3. 消息元数据

通过 MessageExtra 枚举实现强类型扩展:

class MessageExtra(Enum):
    DAMAGE_TYPE = ("damage_type", str)        # 伤害类型标记
    AFTER_CRIT_DAMAGE = ("after_crit_damage", int)  # 暴击后伤害
    RAW_VALUE = ("raw_value", Any)           # 原始值追踪

About

适用于中等复杂度的高策略RPG游戏(Python)的事件处理框架,可以有效处理多层嵌套、连锁反应和自定义事件。

Topics

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages