MOD代码编写指南,如何阅读官方代码

字体:        | 上一篇 下一篇 | 打印

MOD代码编写指南:
首先去http://bbs.mountblade.com.cn/vie ... &extra=page%3D1
1 下载python
2 下载官方mod代码.
3 下载source insight并按步骤设置,ultraedit和ultracompare其实是用不到的.

mod的代码都是在官方代码的基础上修改而成.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

首先说明mnb的几个重要的概念:
1 mnb的游戏构架:
如图所示:
整个游戏就是在世界地图,菜单和场景中的不断切换.(在这里把”对话”部分也看成菜单)



t1.jpg

2 主角遇到别的party时(城镇其实也是一种party),触发菜单,选择菜单项之后,调用场景(野战场景或城镇场景)

3 场景中包含很多元素,比如道具,物品,树木等,但其中最重要的元素是entry point,它决定了人出现在场景的具体坐标位置,比如野战场景中,主角方出现在正方形战场的一侧,敌人出现在另一侧.
entry point设置方法:在游戏最初的配置中选择”windows模式”和”edit模式”,打开游戏,进入某个场景,按ctrl+e,就可以在某些位置发现在native中已经设置好的entry point.如果添加或减少entry point,整个场景的数据将保存在Sceneobj目录下的sco文件中.(也就是场景的结构都是存在于这些sco文件中的).

以上介绍的是一些简单概念,但掌握这些概念是最重要的理解mod编程的手段.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
如何阅读官方的py文件?
只有Module_*.py文件是我们需要修改的.
Header_operations.py是我们常用的操作符.
就像C语言一样,if 是判断语句的操作符,而编写mod代码的操作符就存在于header_operations中.

阅读任何一个module_*.py文件,最重要的是看文件头的注释部分,这实质说明了后面代码的一个模板.
例子:module_mission_templates.py文件开始部分的注释是:
#   Each mission-template is a tuple that contains the following fields:
#  1) Mission-template id (string): used for referencing mission-templates in other files.
#     The prefix mt_ is automatically added before each mission-template id
#
#  2) Mission-template flags (int): See header_mission-templates.py for a list of available flags
#  3) Mission-type(int): Which mission types this mission template matches.
#     For mission-types to be used with the default party-meeting system,
#     this should be 'charge' or 'charge_with_ally' otherwise must be -1.
#     
#  4) Mission description text (string).
#  5) List of spawn records (list): Each spawn record is a tuple that contains the following fields:
#    5.1) entry-no: Troops spawned from this spawn record will use this entry
#    5.2) spawn flags.
#    5.3) alter flags. which equipment will be overriden
#    5.4) ai flags.
#    5.5) Number of troops to spawn.
#    5.6) list of equipment to add to troops spawned from here (maximum 8).
#  6) List of triggers (list).
#     See module_triggers.py for infomation about triggers.
#
#  Please note that mission templates is work in progress and can be changed in the future versions.

其后的代码部分都是基于这个模板建立的.举例如下:
(
"lead_charge",mtf_battle_mode,charge,      
对照注释:”lead_charge”将成为mission_templates中的某个ID.
         mtf_battle_mode是mission_templates的flag,标志着调用的是战斗模式.
         “charge”标志战斗的类型是主角领导部队冲锋.

"You lead your men to battle.",
对照注释: 对这个mission的文字描述
    [
     (1,mtef_defenders,0,group(1)|aif_start_alarmed,8,[]),
     (0,mtef_defenders,0,group(1)|aif_start_alarmed,0,[]),
     (4,mtef_attackers,0,aif_start_alarmed,8,[]),
     (4,mtef_attackers,0,aif_start_alarmed,0,[]),
对照注释:这些是士兵如何出现在场景中的.
        首先(1,    这个1指的是出现在编号为entry point 1 的位置.即1是No.1
这个entry point.
             mtef_defenders,是指出现在entry point 1这个位置的是防守方.
             0,指要不要把防守方的某些装备脱掉,0表示不去除装备
             group(1)|aif_start_alarmed指士兵的ai,是警觉的,那么他们将跑向最近的敌人并攻击敌人.
             8指的是一次从entry point出现的人数是8个防守方的人数.(这个人数不是绝对的,人数还取决于其他条件,比如主角的统帅力.
             [ ] 里面虽然没有东西,却其实是可以添加一些装备给防守方使用.现在是没有添加任何装备
     ],
     对照注释:以下的部分是触发器(triggers)理解以下代码,请看module_triggers.py的文件头注释部分,就不赘述了.
    [
      (ti_tab_pressed, 0, 0, [],
       [
           (try_begin),
             (eq, "$battle_won", 1),
             (finish_mission,0),
           (else_try),
             (call_script, "script_check_enemies_nearby"),
             (question_box,"str_do_you_want_to_retreat"),
           (else_try),
             (display_message,"str_can_not_retreat"),
           (try_end),
        ]),
      (ti_question_answered, 0, 0, [],
       [(store_trigger_param_1,":answer"),(eq,":answer",0),(finish_mission,0),]),

      (0, 0, ti_once, [], [(assign,"$battle_won",0),(assign,"$defender_reinforcement_stage",0),(assign,"$attacker_reinforcement_stage",0)]),
      (1, 0, 5, [(lt,"$defender_reinforcement_stage",2),(store_mission_timer_a,reg(1)),(ge,reg(1),10),(store_defender_count,reg(2)),(lt,reg(2),3)],
           [(add_reinforcements_to_entry,0,4),(val_add,"$defender_reinforcement_stage",1)]),
      (1, 0, 5, [(lt,"$attacker_reinforcement_stage",2),(store_mission_timer_a,reg(1)),(ge,reg(1),10),(store_attacker_count,reg(2)),(lt,reg(2),3)],
           [(add_reinforcements_to_entry,3,4),(val_add,"$attacker_reinforcement_stage",1)]),
      (1, 60, ti_once, [(store_mission_timer_a,reg(1)),
                        (ge,reg(1),10),(all_enemies_defeated,2),
                        (neg|main_hero_fallen,0),
                        (set_mission_result,1),
                        (assign, "$g_battle_result", 1),
                        (display_message,"str_msg_battle_won"),
                        (assign,"$battle_won",1)],
           [(finish_mission,1)]),
      (10, 0, 0, [], [(eq,"$battle_won",1),(display_message,"str_msg_battle_won"),]),
      (1, 4, ti_once, [(main_hero_fallen)],
          [
              (assign, "$g_battle_result", -1),
              (set_mission_result,-1),(finish_mission,1)]),
      (ti_inventory_key_pressed, 0, 0, [(display_message,"str_use_baggage_for_inventory")], []),
    ],
  ),

其他任何module_*.py文件都是这样先阅读文件头的注释部分,然后按此注释的模板去理解后面的代码的.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
另附上python简明教程:
http://www.byteofpython.info/language/chinese/index.html


[ 本帖最后由 kanesunny 于 2007-3-26 12:48 编辑 ]

查看全部评论(0)我来说两句

-5 -3 -1 - +1 +3 +5