首先去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 编辑 ]