骑马与砍杀会见村长镇长快捷菜单(问题)

这段我怎么看不懂

menus.txt
menu_village ... 1 3 0 [11 => 12]
mno_village_manage ... +[mno_village_elder_meeting 3 2147484189 3 144115188075856056 35 2 2147484189 3 144115188075856056 35 1 2147484209 3 144115188075856056 39 1 Meet_with_the_Village_Elder. 12 4 0 1 1 936748722493063394 5 0 1261 1 720575940379279361 1262 0 1263 2 0 360287970189639680 521 3 1224979098644774912 144115188075856056 25 1263 2 11 1224979098644774912 1911 1 792633534417207297 1910 1 720575940379279361 2049 1 1224979098644774912 3 0 . ]mno_village_leave ...
menu_town ... 1 3 0 [23 => 24]
mno_castle_castle ... +[mno_guild_master_meeting 1 541 3 144115188075856056 0 3 Meet_with_the_Guild_Master. 12 4 0 1 1 936748722493063394 5 0 1261 1 720575940379279361 1262 0 1263 2 0 360287970189639680 521 3 1224979098644774912 144115188075856056 25 1263 2 11 1224979098644774912 1911 1 792633534417207297 1910 1 720575940379279361 2049 1 1224979098644774912 3 0 . ]mno_town_leave...
不理解,

  我很无耻的复制了骑砍论坛里的教程。。。我自己也看不懂,不知道这一段对楼主有用没。。

  第八部分:触发器(trigger)

  现在我们有了不少使用MOD系统的经验,可以转入一些更加复杂的部分:触发器。触发器是基于时间的操作模块,可以每隔一段

  时间间隔或者在特定场合被激活。所有在触发器操作模块中的操作都会被执行。

  8.1 简单触发器模块(module_simple_triggers )剖析

  目前,简单触发器模块只有一个功能:当在大地图上将遭遇另外一支部队时将玩家指向一个特定的菜单。为了实现这个效果,它

  的Python列表之包含一个长段。

  (ti_on_party_encounter,
  [
  (store_encountered_party, reg(1)),
  (store_encountered_party2,reg(2)), # encountered_party2 is set when we come across a battle or siege,

  otherwise it's a minus value
  (try_begin),
  (lt, reg(2),0), #Normal encounter. Not battle or siege.
  (try_begin),
  (ge, reg(1), towns_begin),
  (lt, reg(1), towns_end),
  (jump_to_menu, "mnu_town"),
  (else_try),
  (else_try),
  (ge, reg(1), castles_begin),
  (lt, reg(1), castles_end),
  (jump_to_menu, "mnu_castle"),
  (else_try),
  (eq, reg(1), "p_zendar"),
  (jump_to_menu, "mnu_zendar"),
  (else_try),
  (eq, reg(1), "p_salt_mine"),
  (jump_to_menu, "mnu_salt_mine"),
  (else_try),
  (eq, reg(1), "p_four_ways_inn"),
  (jump_to_menu, "mnu_four_ways_inn"),
  (else_try),
  (eq, reg(1), "p_dhorak_keep"),
  (jump_to_menu, "mnu_dhorak_keep"),
  (else_try),
  (eq, reg(1), "p_training_ground"),
  (jump_to_menu, "mnu_training_ground"),
  (else_try),
  (store_current_hours, reg(7)),
  (le, reg(7), "$defended_until_time"),
  (assign, "$defended_until_time", 0),
  (jump_to_menu, "mnu_in_castle_under_attack"),
  (end_try),
  (else_try), #Battle or siege
  (try_end)
  ]),

  这是列表中第一个也是唯一的触发器。他的结构很简单,只包含两个分开的域。

  段的各个域剖析:
  1)检测间隔:触发器检测的时刻或者检测频率。
  2)操作块:这必须是有效的操作块。参照 header_operations.py 。

  段检测:
  1)检测间隔 = ti_on_party_encounter
  2)操作块:将会进行检测的操作块。

  由ti_on_party_encounter我们可以看出,当队伍在大地图上遇到了另一支队伍的时候,检测此触发器。我们现在将分别突出此

  段各个部分来检查它的作用。

  第1部分:
  (store_encountered_party, reg(1)),
  (store_encountered_party2,reg(2)), # encountered_party2 is set when we come across a battle or siege,

  otherwise it's a minus value

  1)"store_encountered_party"找出玩家遇到了何种队伍,并且将队伍的ID存放在寄存器reg(1)中。
  2)"store_encountered_party2"完成同样的功能,存储第二个遭遇的队伍到reg(2)中。显然这只有在玩家遇到了一个战斗或者

  攻城战时才会发生。如果没有第二支部队,reg(2)的值为0。

  第2部分:
  (try_begin),
  (lt, reg(2),0), #Normal encounter. Not battle or siege.

  条件(lt, reg(2),0)需要reg(2)小于0。由于reg(2)在玩家遇到一个正在进行的战斗之前一直小于0,这个操作块经继续第3部分

  的内容。
  这一部分中有趣的内容是操作(try_begin)。此操作打开一个尝试操作(try operation),它的功能和一般操作块相似,除了

  一点不同。如果一个尝试操作有一个条件没有满足,并不取消其他操作块全部;它只取消到最近的(try_end)。所有(try_end)之

  后的操作正常执行。事实上,一个尝试操作如同操作块中的一个独立操作块一样。

  同样,代码中也存在另外的尝试操作(else_try),可以将其插入与一个主动尝试操作中,如同在module_simple_triggers中的一

  样。一个else_try块的内容只有在所有else_try之前的尝试操作(包含之前的else_trys)的条件都不能被满足的时候才有可能

  被执行。

  第3部分:
  (try_begin),
  (ge, reg(1), towns_begin),
  (lt, reg(1), towns_end),
  (jump_to_menu, "mnu_town"),
  这部分以一个在尝试操作中的尝试操作开始。如果reg(1)——遭遇到的队伍——在常量towns_begin ("p_town_1"在

  module_parties.py中)和 towns_end ("p_salt_mine"在module_parties中)(wander注:这两个之间的表示是城市,begin和end

  分别是上下界)之间,这部分将被执行。如果满足条件,玩家将会被转到 "mnu_town"菜单中。反之,如果条件不满足,则转入

  第4部分。

  第4部分:
  (else_try),
  (ge, reg(1), castles_begin),
  (lt, reg(1), castles_end),
  (jump_to_menu, "mnu_castle"),
  这部分只有当上面的尝试操作失败了才可能被执行(注:其实就是if——else格式,说得那么麻烦),只有当遇到的不是城镇的

  时候才会被考虑到。因此,已经认定了遇到的不是城镇,这一部分检测遇到的对象是否在castles_begin ("p_castle_1")和

  castles_end ("p_river_pirate_spawn_point")之间。如果尝试操作成果,玩家将会被转到"mnu_castle".菜单。否则转入第5部

  分。

  第5部分:
  (else_try),
  (eq, reg(1), "p_zendar"),
  (jump_to_menu, "mnu_zendar"),
  已知遇到的对象并非城镇或城堡,这个尝试操作检测是否遇到的是"p_zendar"(禅达)。如果是,此尝试操作将使玩家转入

  "mnu_zendar"(禅达对应的菜单,下同)。否则转入第6部分。

  第6部分:
  (else_try),
  (eq, reg(1), "p_salt_mine"),
  (jump_to_menu, "mnu_salt_mine"),
  如果遇到"p_salt_mine"(盐矿),转入"mnu_salt_mine"。

  第7部分:
  (else_try),
  (eq, reg(1), "p_four_ways_inn"),
  (jump_to_menu, "mnu_four_ways_inn"),
  如遇到 "p_four_ways_inn"(四方客栈),转入"mnu_four_ways_inn"。

  第8部分:
  (else_try),
  (eq, reg(1), "p_dhorak_keep"),
  (jump_to_menu, "mnu_dhorak_keep"),
  如遇到 "p_dhorak_keep"(dhorak哨所),转入"mnu_dhorak_keep"。

  第9部分:
  (else_try),
  (eq, reg(1), "p_training_ground"),
  (jump_to_menu, "mnu_training_ground"),
  如遇到 "p_training_ground"(训练场),转入"mnu_training_ground"。

  第10部分:
  (else_try),
  (store_current_hours, reg(7)),
  (le, reg(7), "$defended_until_time"),
  (assign, "$defended_until_time", 0),
  (jump_to_menu, "mnu_in_castle_under_attack"),
  这一部分将游戏开始后经历的时间存入reg(7)中,检测reg(7)是否小于等于变量"$defended_until_time"。如果满足条件的话,

  将"$defended_until_time"置0,将玩家转入"mnu_in_castle_under_attack"菜单。否则转入第11部分。

  第11部分:
  (end_try),
  这部分标记了第二个尝试操作的结束。第一个尝试操作继续进行,不论第二个尝试操作发生了什么。

  第12部分:
  (else_try), #Battle or siege
  (try_end)
  这个else_try操作包含了所有遇到战斗中的两支部队的情况。由于现在他没有其他操作,结果将遭遇到战斗——就如我们在第二

  部分创造的"new_town",它还没有指向菜单的操作,也没有pf_auto_start_dialog的标记。我们将在下一节中对其进行调整。

  8.2 编辑队伍遭遇触发器为了让一个城镇工作,我们需要确保每次遇到这个城镇都将玩家转入正确的游戏菜单。这留给我们两个

  选择:使用现有的菜单如mnu_town,或者我们建立一个新的。

  我们将为我们的新城镇建立一个自定义的菜单,之后我们会解释新建立的城镇如何使用原有的城镇菜单。

  首先,所有更多的队伍遭遇触发器条目需要添加在第10部分前面:
  (else_try),
  (store_current_hours, reg(7)),
  (le, reg(7), "$defended_until_time"),
  (assign, "$defended_until_time", 0),
  (jump_to_menu, "mnu_in_castle_under_attack"),

  如果你在此后添加了任何条目,则在午夜遇到你的新队伍时会出现问题。确保这不会发生,我们将把我们的新条目放在这之前,

  第9部分之后:
  (else_try),
  (eq, reg(1), "p_training_ground"),
  (jump_to_menu, "mnu_training_ground"),

  在第9、10两部分间留出一些空白。之后我们将开始建立新条目。

  所有在这个触发器中的新条目都必须以else_try开始。之后,我们可以添加条件来判断何时此条目被不被触发。然后,如果所有

  条件都满足的话,我们可以添加执行内容,如将玩家转入游戏菜单。执行内容可以是多种多样的,不止是jump_to_menu,但它们

  必须都是有效的操作。

  拷贝粘贴第9部分(训练场条目)进我们建立的新空间。此后将 "p_training_ground"改

  为"p_new_town","mnu_training_ground"改为"mnu_new_town"。

  现在为了让我们的新城镇可操作所要做的只是给它建立一个菜单。在我们继续到module_game_menus之前,让我们去了解触发器

  的许多其他功能。打开module_triggers.py,转入下一段。

  8.3 触发器模块解析
  M&B的MOD系统中有两种触发器:简单触发器和扩展触发器。扩展触发器在module_triggers.py中。它和简单触发器的工作原理相

  同,但有一些其他选项。

  (0.1, 0, ti_once, [(map_free,0)], [(tutorial_box,"str_tutorial_map1")]),

  这个文件中的第一个触发器很简单易懂。它是玩家第一次出现在地图上时弹出地图教程的触发器。

  解析:
  1)检测间隔:检测触发器的间隔时间
  2)延迟间隔:在所有条件满足之后,确认触发器执行内容之前的时间长短。
  3)重新可用间隔:在执行一次触发器内容之后下次触发器变为可激活的时间。
  4)条件块:必须是有效操作段。如果条件块为空,则它一直被满足。即这个触发器一直触发。
  5)执行块:(Consequences block直译:结果块)。必须是有效操作段。

  1)检测间隔 = 0.1
  2)延迟间隔 = 0
  3)重新可用间隔 = ti_once
  4)条件块 = (map_free,0)
  5)执行块 = (tutorial_box,"str_tutorial_map1")

  我们可以看出这个触发器每隔0.1小时游戏时间被检测一次;没有延迟间隔;由于设置了ti_once而不可重用。这意味着:如果所

  有此触发器的条件被满足,此触发器只执行一次,不再执行。因此,这个触发器在玩家被放到大地图任何地方的时候被触发。

  现在我们可以设计自己的触发器了。拷贝教程触发器并将之粘贴在Python列表最下端。
  下面我们要对这个新触发器做的是在大地图上生成另一支队伍;叫做Geoffrey的队伍。替换触发器条件块(map_free,0)如下:
  (eq,"$geoffrey_duel",1),
  (store_time_of_day,reg(1)),
  (gt,reg(1),19),

  如果你记得我们在教程的第七部分中做的,当你同Geoffrey的对话进行到决斗时,我们将变量"$geoffrey_duel"赋值为1。因此

  ,(eq,"$geoffrey_duel",1)检测Geoffrey是否向你提出了挑战。如果没有,这个条件将不被满足。

  接下来的操作是存储当前在一天中的时间到reg(1)中,检测reg(1)是否大于19;即一天中的时间是否在19:00之后。如果是,条

  件满足,触发器被触发。

  现在,替换执行块中的 (tutorial_box,"str_tutorial_map1") 为下面的操作:
  (set_spawn_radius,0),
  (spawn_around_party,"p_zendar","pt_new_template"),
  (assign,"$geoffrey_party_id",reg(0)),
  (party_set_ai_behavior,"$geoffrey_party_id",ai_bhvr_track_party),
  (party_set_ai_object,"$geoffrey_party_id","p_main_party"),

  第一个操作设置了生成(部队的)半径;每次你要生成一个队伍的时候你都有做这个,否则队伍将会在最近一次设置的半径中生

  成,这是不可预知的。

  下一个操作在("p_zendar")附近生成了一个队伍模版("pt_new_template")。这项操作也将生成队伍的ID存入reg(0)中。接下来

  我们将这个存入reg(0)中的ID存入一个变量里,这样在reg(0)被改写的时候这个数据不会丢失。

  最后,我们设置队伍的AI行为和目标。这些操作很简单。我们使"$geoffrey_party_id"跟随 "p_main_party"。当你设置一个队

  伍跟随另一个队伍时,它将无情地追赶另一个队伍并且攻击它,不考虑所属势力或其他因素。

  保存。现在你还不能编译,由于我们还要为我们在8.2节中建立的队伍遭遇(party encounter)建立一个菜单。我们接下来将做这

  个。现在我们准备好进入教程的第9部分。

  -----------------------------------------------------------------------------------------------------------

  第九部分:Module_Game_Menus(菜单模块)

  我们要关注的下一个mod文件是module_game_menus.py,包括了M&B中的所有游戏菜单。游戏菜单是遇到队伍和跳入新场景之间的过渡,当然它还有其他许多用途。游戏内的通道系统的部分功能也使用到了菜单。

  9.1 Module_Game_Menus 解析

  这个文件的开头是它的Python列表,然后列出了游戏人物创建时的两个菜单,即玩家的性别选择和阶层选择。这有相当的复杂度,所以我们跳过去,看一个稍简单的例子。

  一个游戏菜单的例子:

  (
  "salt_mine",mnf_auto_enter,
  "You enter the salt mine.",
  "none",
  [(reset_price_rates,0),(set_price_rate_for_item,"itm_salt",55)],
  [
  ("enter",[],"Enter.",[[set_jump_mission,"mt_visit_town_horseback"],[jump_to_scene,"scn_salt_mine"],[change_screen_mission]]),
  ("leave",[],"Leave.",[[leave_encounter],[change_screen_return]]),
  ]
  ),

  这个菜单处理了你进入盐矿(salt_mine)的情形。除了mnf_auto_enter标识外,此菜单相当直观。当条件都满足时,具有mnf_auto_enter标识的菜单会自动激活第一个菜单项,而不是等待用户输入。就这个盐矿的例子来说,这个菜单项是"enter"(进入)。

  元组字段解析:

  1) 菜单id。用于在其他文件中引用。
  2) 菜单标识。
  3) 菜单文本。玩家将在菜单窗口中看到这些文本。
  4) 网格名。目前未使用,必须为字符串"none"。
  5) 操作块。菜单被激活时所执行的一系列操作。必须为合法操作块。
  6) 菜单项列表。包括下列字段:
  6.1) 菜单项id。用于在其他文件中引用。
  6.2) 条件块。每个菜单项都会执行这些条件,来决定该不该对玩家显示这一菜单项。必须为合法条件块。
  6.3) 菜单项文本。菜单项中实际可点击的文本。用一个下划线(_)来代替菜单项文本,可以简单地将这项变为不可点击。
  6.4) 结果块。结果只为玩家点选的菜单项执行。必须为合法操作块。

  观察盐矿元组:

  1) 菜单id = "salt_mine"
  2) 菜单标识 = mnf_auto_enter
  3) 菜单文本 = "You enter the salt mine."
  4) 网格名 = "none"
  5) 操作块 = (reset_price_rates,0),(set_price_rate_for_item,"itm_salt",55)
  6) 菜单项列表:
  6.1) 菜单项id = "enter", "leave"
  6.2) 条件块 = Block contains no conditions.
  6.3) 菜单项文本 = "Enter.", "Leave."
  6.4) 结果块 = [set_jump_mission,"mt_visit_town_horseback"],[jump_to_scene,"scn_salt_mine"],[change_screen_mission],
  [leave_encounter],[change_screen_return]

  此菜单做的第一件事是把所有物价恢复成正常,然后把盐价设成正常值的55%。然后,由于mnf_auto_enter的存在,菜单会自动选择满足所有条件的第一个菜单项("enter")并执行之,这样玩家就不用点击,自动跳入盐矿场景了。

  下一节我们会以盐矿作为一个模板,来创建我们自己的城镇菜单,以使教程第二部分中创建的mod城镇可用。

  参考资料找不到网址了。。。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-02-01
哪儿不懂?
不会改还是不理解?