|
沙发

楼主 |
发表于 2020-11-29 10:52:23
|
只看该作者
处理事件顶层逻辑
程序(C++)内部有个可处理事件集,它定义了游戏支持的所有事件类型,具体是事件的触发时机、类型名称。MOD关卡(WML)内部有个可处理事件集,它定义了此个关卡关心的事件名称、触发条件、以及该事件一旦被触发执行的操作。玩家在玩游戏过程中满足触发时机时,C++向事件处理模块(程序内一个模块)抛出该事件,后者发现正在玩的关卡是关注该事件并满足触发条件,于是就调用关卡中定义的操作。
以刘备传之长坂坡之战中两个事件来进一步理解处理事件逻辑。(WML代码见<kingdom-src>/data/campaigns/Legend_of_Bei_Liu/scenarios/01_changbanpo.cfg)
事件attack_end的WML代码- [event]
- name=attack_end
-
- first_time_only=no
- [filter]
- side=3
- [/filter]
- [filter_second]
- side=1
- hp=yes
- master_hero=50
- [/filter_second]
-
- [message]
- speaker=43
- message= _ "My ability can not compare with Cao Cao, I surrender."
- [/message]
- [kill]
- master_hero=50
- a_side=3
- animate=yes
- [/kill]
- [/event]
复制代码 C++程序约定一旦攻击结束后会产生attack_end事件,即该事件触发时机是攻击结束后、名称是attack_end。MOD关卡定义了一个name=attack_end的[event]块(见以上WML代码),它表示此个关卡关心attack_end事件,但要执行操作还要满足(即触发条件)攻击方是属于曹操势力(side=3),防御方是属于刘琮势力(side=1)、并且防御单位主将是襄阳(master_hero=50)、攻击后襄阳没被催垮(hp=yes),而一旦满足条件后将执行两个动作,第一个动作是弹出一个消息框([message]),框中内容是刘琮(speaker=43)说“我的才能不及曹操,愿献城投降”,第二个动作是襄阳改为归属攻击方([kill]),即曹操势力。
事件comeinto的WML代码- [event]
- name=comeinto
- [filter]
- must_heros = 216
- [/filter]
- [filter_second]
- must_heros = 4
- [/filter_second]
-
- [sideheros]
- side=2
- heros=0,4,5,10,31,32,40,42,58,59,60,61,80,81,82,162,209,213
- [/sideheros]
-
- [endlevel]
- result=victory
- [/endlevel]
- [/event]
复制代码 C++程序约定一旦单位(一般是部队)进城后会产生comeinto事件,即该事件触发时机是单位进城后、名称是comeinto。MOD关卡定义了一个name=comeinto的[event]块(见以上WML代码),它表示此个关卡关心comeinto事件,但要执行操作还要满足(即触发条件)进入砦这个城市(must_heros=216)、进入的部队中有刘备这个武将(must_heros = 4),而一旦满足条件后将执行两个动作。第一个动作是调整刘备势力武将([sideheros]),把heros字段指定的武将归属刘备势力,而不是的武将则让退出,第二个动作是触发关卡结束([endlevel]),result=victory表示玩家胜利通过本关卡。 |
|