【Mount&Blade】劫狱和对话功能来龙去脉

关于劫狱的来龙去脉
一:对话py的基本概念。
1,首先要知道对话有许多环境,在constant里面定义了21种环境,以tc_开头,出现橘黄色对话的框,然后按f对话,这是系统硬核,但是按了f后,对话究竟什么时候说什么话,那要区分对话的内容是英语还是翻译文件。
a:假如是英语,那么就是通过一些列条件来限定,一般两个条件结合起来足够了,一个是用tc环境来限定talk_context,还有一个是g_talk_troop就是和你对话的对象,这两个条件可以限定了。
b:假如是翻译,那么对话的内容就是由开始标签和结束标签共同决定?
你可以自己查看language的文件,你就知道,对话的开始标签和结束标签决定一个英文的翻译,但是这里有一个非常操蛋的地方,你试过就知道,当玩家在街道上和守卫对话,他会对你说,”别找麻烦“,而当你在领主大厅和守卫说话,他会和你说,”我在站岗“你纳闷儿了,为什么同样的npc对话,却有两种不同的话语内容?看dialog的py文件在街道上,是这样的

[anyone,"start", [(eq, "$talk_context", 0),
                    (is_between,"$g_talk_troop",regular_troops_begin, regular_troops_end),
                    (is_between,"$g_encountered_party_faction",kingdoms_begin, kingdoms_end),
                     ], "Mind your manners within the walls and we'll have no trouble.", "close_window",[]],

开始标签是start,结束标签是close,条件是(eq, "talk_context", 0),其中0表示tc_town_talk也就是环境条件在大街上,并且g_talk_troop对话对象是一些regulartroop的范围包括斗士什么的,又因为城池里只有守卫是落在这个范围里的,所以视同和守卫对话。于是有了这两个环境+对话对象的限制,那么直接就英文话语Mind your manners within the walls and we'll have no trouble
这时候,你在language里,把开始标签设定为start,结束标签设定为close_window,然后中文翻译为”尼玛比“,那么进入游戏,你和守卫对话你会发现他绝对不会说尼玛比,为什么!,因为原版英语的话,可以通过条件模块来区别对话内容,这就会导致共用许多开始标签和结束标签,那么英语原版没问题,到了翻译文件那里,就有问题了,如果你写开始标签和结束标签,那么播放的对话可能是众多startclosewindow对话的第一个对话内容。那么怎么办呢,骑砍公司给你了方案,就是你这个对话在dialog里同样的开始结束标签,排行老几,那么在翻译文件里,就在结束标签后面增加”点“+排行老几的数字,那么就能对应了。我个人觉得十分操蛋【【【【【【更操蛋的是!!!!对于开始标签是start,结束标签是close的,那就更加奇葩!!!!也就是从# KINGDOM LORD DUEL OUTCOMES开始,py里start-close的第n个对应翻译csv文件里的序号要+3!!,而# KINGDOM LORD DUEL OUTCOMES之前的start-close的第n个对应翻译文件里的第n个,你能想到?!!!!所以,1.174会带来许多翻译的问题,比如小女孩回到家乡会播放站岗的话语,护送商队完成以后,他会播放不要找麻烦的话语。】】】】】】

c:
dialog里start-close的话语顺序对应csv翻译文件里的对照表(部分)。

[anyone ,"start", [(store_conversation_troop, "$g_talk_troop"),

对应0号 ok

[anyone, "start", 
   [
    (eq, "$g_talk_troop", "trp_hired_assassin"),
        (eq,1,0),
    ],
   "{!}Added to match dialog ids with translations.", "close_window", []],

对应1号

       (str_store_string, s9, "str_stop_no_shooting_no_shooting"), 对应2号ok
      "I humbly request that your lordship keeps his hands where I can  对应3ok
      "It has been an honor to serve you, {sire/my lady}" 

对应4 ok 之前没有东西,也就是说东西在4-9之间

       [anyone,"start", [(troop_slot_eq,"$g_talk_troop", slot_troop_occupation, slto_player_companion),
                    (neg|main_party_has_troop,"$g_talk_troop"),
                    (eq, "$talk_context", tc_party_encounter)],
   "{!}Do you want me to rejoin you?", "close_window",[]], # unused

对应5

  [anyone,"start", [(neg|main_party_has_troop,"$g_talk_troop"),(eq, "$g_encountered_party", "p_four_ways_inn")], "{!}Do you want me to rejoin you?", "close_window",[]], 

对应6
【【【【【【【【【【【从这里开始操蛋】】】】】】】】】】】】】】】】】】】】】】

"Very well. You've made your point. I have nothing more to say 7 对应翻译文件里的10
  "Very well. You've made your point. I retract what I said.   9  对应翻译文件里的11
        "Get up. Let all those present today witness that I have defeated you, and 12 以此类推
 "Em, {playername}, you might not be used to our w  14 
  "I do not know where to find my {s11} {s10}, who by traditi对应15号
     "The honorable {s12} has agreed to allow us to 16 
     
   "We will shortly depart{s5}. It is  17 ok
        "Well, {playername} -- you fought a duel with {s10}, and los 18 ok
            "Ah, {playername}. How good it is to see you again. Howe 19 ok
            "There! I can see the walls of {s3}  20 ok
           
   
    "Get lost before I lose my temper you vile beggar!  21 ok
     "You arrived just in the nick of time! {playername}. You have my deepes  25 ok
    
    
    [anyone,"start", [(eq,"$talk_context",tc_ally_thanks),
                   (troop_is_hero, "$g_talk_troop"),
                   (ge, "$g_relation_boost", 4),
                   对应28号 ok
                   
                   
       "Thank you for your help {sir/madam}. You saved {reg1?our lives:my life} out there 对应30号,ok
       
       "Don't worry, {sir/madam}, I'm on my way." 对应33号 ok 
          "Thank you for helping us {sir/madam}. Crush those bandits!对应34号 ok
          
             Thanks for escorting us. Good luck. 对应 36号 ok

所以写对话一般都要回避冲突,因为太操蛋了。
2:一个对话下面出现多种回答框,怎么写?
满足如下条件:
a)说话人必须是anyone|plyr,比如第一个回答框是anyone|plyr,那么第二个回答框的说话人就不能是anyone
b)对话框的开始标签必须一致,但是结束标签必须不一致。
c)多个回答框的条件模块可以不一致,这样会引导到不同的分支。
举例:

[anyone|plyr, "merchant_quest_persuasion", 
  [
    (check_quest_finished, "qst_collect_men"),
    (check_quest_finished, "qst_learn_where_merchant_brother_is"),
    (check_quest_finished, "qst_save_relative_of_merchant"),
    (neg|check_quest_finished, "qst_save_town_from_bandits"),
    (neg|check_quest_active, "qst_save_town_from_bandits"),
  ],
  "You make a persuasive case. I will help you.", "merchant_quest_4b8", 
  [  
  ]],

  [anyone|plyr, "merchant_quest_persuasion", 
  [
  ],
  "As I say, I have more important business elsewhere.", "close_window", 
  [  
  ]],

上面这个就是开局商人任务的两个分支,条件模块不一致没关系,但是开始标签一致,并且说话人都是anyone|plyr也就是说,条件模块可以决定这个回答框是否跳出来,这里要知道,如果写了复合回答框,那么说话人就不会切换到他的视角只有单个回答线条,那么才会有视角的切换

3:auto_proceed的应用
比如沙漠强盗或者山贼,他们和玩家party相遇,也就是野怪相遇,野怪有5种,你不想写5种不同的对话体系,这样太烦。这时候,auto_proceed就派上用处了。你可以: 说话人a|auto_proceed ,然后start到jieshubiaoqian.然后,说话人b|auto_proceed ,然后start到jieshubiaoqian
两个结束标签必须统一,接下俩就再写 anyone,然后开始标签是jieshubiaoqian 然后引导到另一个结束标签比如jieshubiaoqian2.那么就把两种不同的说话者统一到一个模块去了,也就是说auto_proceed是自动执行下一个以结束标签为开始标签的对话.主要应用领域为:一个对话a说着说着引导到另一个对话b中去,然后中途离开了这个对话b,下次再和某人对话来进入对话b,也就是说,如果进入对话b的方式有直接和人硬核对话或者由另一个对话转来,那么可以试着用auto_proceed。一般来说,用auto_proceed的这个对话,一般就起到过渡作用,话语内容一般是"{!}."表示不播放跳过。

4:在通过change_screen_map_conversation(往往配合着触发mt和载入场景)激发出一个对话的时候,这是和硬核橘黄色对话触发有区别的这种对话触发,往往说话对象需要(store_conversation_troop, "g_talk_troop"),来获得说话对象。而硬核触发的,往往自动就获得了g_talk_troop。那么触发好以后,一般来说,要么anyone 然后+条件模块来限定语言,要么你已经知道说话人的情况下,直接说话人就用trp_xx;如果说话的人你已经知道他的party_template,那么也可以比如:party_tpl|pt_kidnapped_girl来作为对话人,三种效果都可以触发对话。此外,作为触发机制,一般都是start,只有在trigger或simple_trigger里写的(start_map_conversation, ":npc", -1),这种的,才要用到event_triggered作为触发机制。(其实对话触发类型我认为都是鸡肋,start完全可以都解决)

5:当一个对话有两条对话线,两种条件框都可以触发,那么游戏规则是,根据dialog.py里自上而下的顺序,只会触发最上面的那个对话。
比如一个是anyone start close_window 然后说话人g_talk_troop是trp_kidnapped_girl 内容是你好啊另一个是trp_kidnapped_girl start close_window 。内容是你是否好啊。那么如果你触发了和被绑架小女孩的对话,根据上面的原则只会播放你好啊,而下面的你是否好啊是不会播放的。这就是“排头第一的原则”

6:对话中一些常用需要知道的变量和命令
a)g_encountered_party 对话前最后一个遇到的party,
b)g_encountered_party_faction 对话前最后一个遇到的party所属的国家
c)g_talk_troop 通过硬核对话触发的对话里,和你说话的人。
d)g_talk_agent 触发对话框以后,在对话界面你看到的那个人所代表的agent(因为对话本质是模拟一个scene出来,由场景就会有agent。
e)store_conversation_troop 第四点已经说过了。
f)g_talk_troop_party 对话对象所属的部队,如果有的话。
g)g_talk_troop_relation 对话对象和玩家的关系
h)g_talk_troop_faction_relation 对话对象所在国家和玩家个人的关系【骑砍里关系分三种,个人与个人,国家与玩家(玩家没有自立前是fac_player_faction,自立后
就是意淫王国和国家的关系),
国家与国家】

二、关于监狱的基本概念
1:监狱是怎么回事。你进入了一个城市,根据原理“硬核——过渡outside——town,将会触发menu_outside,同时在这个菜单下先行赋值$all_doors_locked为1然后进入如下菜单:

"town",mnf_enable_hot_keys|mnf_scale_picture,

这个菜单很大,所有的竞技大会,街上转转,市场交易,酒馆等等都是从这个菜单进去的,又会把all_doors_locked赋值为0,然后加入以后触发script的”潜入被发现“或者”中了贼寇的埋伏“才会再次把all_doors_locked赋值为1。言归正传,那么我们往下数第七个子菜单就是监狱

("town_dungeon",
       [(eq, 1, 0)],
       "Never: Enter the prison.",
       [       
           (try_begin),
            (eq, "$talk_context", tc_prison_break),
            (gt, "$g_main_attacker_agent", 0),
            
            (neg|agent_is_alive, "$g_main_attacker_agent"),

            (agent_get_troop_id, ":agent_type", "$g_main_attacker_agent"),
            (try_begin),
              (eq, "$g_encountered_party_faction", "fac_player_supporters_faction"),
              (party_get_slot, ":prison_guard_faction", "$current_town", slot_center_original_faction),
            (else_try),
              (assign, ":prison_guard_faction", "$g_encountered_party_faction"),
            (try_end),
            (faction_slot_eq, ":prison_guard_faction", slot_faction_prison_guard_troop, ":agent_type"),

            (call_script, "script_deduct_casualties_from_garrison"),
            (call_script, "script_enter_dungeon", "$current_town", "mt_visit_town_castle"),

           (else_try),
             (eq,"$all_doors_locked",1),
             (display_message,"str_door_locked",0xFFFFAAAA),
           (else_try),
             (this_or_next|party_slot_eq, "$current_town", slot_town_lord, "trp_player"),
             (eq, "$g_encountered_party_faction", "$players_kingdom"),
             (assign, "$town_entered", 1),
             (call_script, "script_enter_dungeon", "$current_town", "mt_visit_town_castle"),
           (else_try),
             (display_message,"str_door_locked",0xFFFFAAAA),
           (try_end),
        ],"Door to the dungeon."),

从这个菜单种我们可以看条件模块 0=1,这个条件不可能实现,所以这个进入监狱大门的子菜单是不会显示的,但是子菜单的条件模块只是起到显示作用,并不能影响在场景里的passage(就是那个像生化污染的标记的那个passage,简称传送门,传送门有两个参数,一个是entrypoint,就是一旦传送以后,玩家在哪个entrypoint刷出来,一般是0,另一个就是传送子菜单的目的地,如果你填7,那么你走进传送门(一般按在监狱的门spr上),点击硬核,那么就会被传送到上面的子菜单,然后跳过子菜单条件模块直接进入执行模块,我们可以看到,如果玩家是这个监狱所在城堡的领主,那么就会执行script_enter_dungeon来进入监狱,如果不是,那么不管$all_doors_locked.是不是1,都会显示门锁上了!并且是红色),由此我们可以看到,进入监狱只剩下通过script来触发进入,即script_enter_dungeon。

2:那么劫狱的游戏流程是怎么样的呢?以一个城堡为例
a)你进入城堡,然后视察城堡,然后走到监狱门口,和看守对话,然后让他交出钥匙,他大喊有人劫狱!这时候
会执行三个命令

(call_script, "script_activate_town_guard"),
  (assign, "$g_main_attacker_agent", "$g_talk_agent"),
  (assign, "$talk_context", tc_prison_break),

也就是
1:激活城镇的守卫,然后通过(set_party_battle_mode),命令让该城市所在party处于战争状态,一般是(finish_party_battle_mode),来和他对应,但是我看许多功能都只有前者,并没有写后者,感觉是鸡肋。进去看,会发现这个script主要是分配平民和守卫(每个城堡总会在一些entrypoint预先刷一些看守),并且里面有句话

(is_between, ":troop_type", "trp_swadian_recruit", "trp_looter"),

意味着你以后自行添加troop的时候,不要再looter附件,因为这样会打乱.劫狱的看守来支援的troop,造成bug。
2:激活主要进攻敌人就是看守,即g_main_attacker_agent不再是0,变得大于0,因为在"town_center",0,-1,这个mt里,会把g_main_attacker_agent初始化为0。但是视察城堡进入的是"castle_visit",0,-1,,却没有,需要修复

(assign, "$g_main_attacker_agent", 0),

3:激活对话新背景tc_prison_break

b)既然激活了tc_prison_break,那么你选择还在"castle_visit",0,-1,的mt里,并没有跳出过这个mt,然后你按tab,意味着ti_tab_pressed这时候是不能离开的,因为mt里有这个子功能:

(ti_tab_pressed, 0, 0,
      [
        (try_begin),
          (this_or_next|eq, "$talk_context", tc_escape),
          (eq, "$talk_context", tc_prison_break),
          (display_message, "str_cannot_leave_now"),
        (else_try),
          (this_or_next|eq, "$g_mt_mode", tcm_default),
          (eq, "$g_mt_mode", tcm_disguised),
          (set_trigger_result, 1),
          (mission_enable_talk),
        (else_try),
          (display_message, "str_cannot_leave_now"),
        (try_end),
      ], 
      []),

可以看到并没有执行finish_mission的命令,就是个虚的。然后你杀光所有的守卫,发现并没有像往常一样的退回菜单,因为mt里的杀光所有敌人后的条件并没有tc_prison_break,而是tc_escape请看如下:

(3, 0, 0, 
      [
        (eq, "$talk_context", tc_escape),
        (neg|main_hero_fallen,0),
        (store_mission_timer_a, ":time"),
        (ge, ":time", 10),      
        (all_enemies_defeated), #1 is default enemy team for in-town battles
      ],
      [
        (call_script, "script_deduct_casualties_from_garrison"),
        (try_for_agents, ":agent"),
          (agent_get_troop_id, ":troop", ":agent"),
          (troop_slot_ge, ":troop", slot_troop_mission_participation, mp_prison_break_fight),
          (try_begin),
            (agent_is_alive, ":agent"),
            (troop_set_slot, ":troop", slot_troop_mission_participation, mp_prison_break_escaped),
          (else_try),
            (troop_set_slot, ":troop", slot_troop_mission_participation, mp_prison_break_caught),
          (try_end),
        (try_end),
        (jump_to_menu, "mnu_sneak_into_town_caught_ran_away"),
        (mission_enable_talk),
        (finish_mission, 0),
      ]),

这是为什么呢?因为骑砍作者需要增加一个进监狱对话的环节,加入玩家被干掉,那么就两个tc标签都有,因为结局已经无所谓了。言归正传,原来啊,你回到town_dungeon子菜单,可以看到判定,如果 $g_main_attacker_agent大于0,并且死了,(意思是管钥匙的守卫死了)
那么就触发进入地牢的script,这就告诉我们,选择除了进入地牢这个传送门以外,哪里都不能去。于是我们进入了地牢。发现进入地牢的mt是"mt_visit_town_castle",然后场景是:
(set_jump_entry, 0),————————》这个就是通过代码设定进入场景后的entrypoint,因为和传送门一致,所以很鸡肋

      (jump_to_scene,":dungeon_scene"),
      (scene_set_slot, ":dungeon_scene", slot_scene_visited, 1),————》这个表示改场景已经访问过了,但是全篇py没有发现slot_scene_visited归零的操作,因为用的是变量的slot_scene_visited,每次变量都会初始化。
      (change_screen_mission),

c: 进入地牢以后,找到俘虏的英雄,和他对话,这时候有两个slot标签一定要记住,一个我称之为越狱方针slot_troop_mission_participation,另一个我称之为是否最终明确加入越狱slot_troop_will_join_prison_break,当你第一次和俘虏对话的时候,越狱方针还没有赋值,还是0,因此他回答你的是怎么了呢,然后有三个方针给你选,分别是呆在监狱=1;跟着玩家=2;自行战斗=3;如果有了方针选好了以后,再对话,就是另外的对话线因为在“怎么了呢”这个对话线上面同样的开始标签又写了个对话线,只不过加入了条件就是方针大于等于1,那么这时候第二次找俘虏对话内容就变成“计划有什么改变吗”不得不佩服骑砍代码的严谨。然后这时候,你和俘虏在地牢里,但是你按tab是退不出去的,因为你在地牢的时候,mt是"visit_town_castle",0,-1,,进入mt一看原来这个mt里明确表示,如果没有tc_prison_break环境标签,那么才可以退出去。所以只能老老实实的走到大门口,接近传送门,然后点击这样就传送到town菜单的子菜单——视察城堡了(这里有个鸡肋设置,由于在"visit_town_castle"的mt里,有一个ti_on_leave_area,然后判断tc的环境是否是prison_break,如果是,那么转到"mt_sneak_caught_fight"里去,但是实际上,虽然条件模块对了,但是并不会转,因为这个ti_on的trigger是指游戏场景里硬核的边缘,就是场景边缘会自动出来“离开”的字样,这是硬核,显然传送门离开的方式不属于这个trigger,所以还是进入“视察城堡”的子菜单),这时候,你的环境tc还是tc_prison_break,但是因为传送门的原因,你要视察城堡的子菜单再滚一遍,于是你发现这个子菜单开始就会把tc_prison_break变成tc_escape的环境(至此可以理解为,tc_prison_break为交出钥匙到定好方针之间的环境;而tc_escape为走出地牢大门后的环境。),经过子菜单,我们就又进入了"castle_visit",0,-1,的mt,这时候,会执行如下的顺序.
1:因为在抢钥匙的时候,以及激发过"activate_town_guard",里面已经把敌我双方都分类了,
现在在这个状态下,筛选出场景内其他的平民(就是都不属于敌我team的),将老百姓归归类,假如有平民的话,让他们跑,同时(mission_disable_talk),来屏蔽遇到人出现橘黄色的对话硬核框。(这个之后可以在玩家打败所以守卫以后触发(mission_enable_talk),回复对话功能)。

2:老百姓跑了,接下来就要根据方针,来刷俘虏agent到场景里了,如果方针是2或者3(即跟着玩家或者自行战斗),那么就激活“明确越狱”的slot:slot_troop_will_join_prison_break=1,然后在entrypoint编号24的位置(也就是地老大门口),把俘虏刷出来。
3:接下来,在"castle_visit",0,-1,的mt里,写着,一旦agent被刷出来,那么如何初始化,这里就是检测刷出来的agent是否有“明确越狱”的标签,如果有,那么就把他的team设置成和玩家agent一样(即team0,这个在以前1.158的时候,还没有修复,导致俘虏反过来砍玩家),其他的都是team7,(其实守卫是在子菜单视察城堡的时候就刷进来的,一开始他们的team都是7,但是因为越狱,抢钥匙的时候,由于script——"activate_town_guard"的关系,他们team变成team1;第二次出来的时候,又从菜单重新进入mt,这样一来,一开始其他人的team又变成7,但是由于环境变成了tc_escape,因此又执行了一遍script——"activate_town_guard"),又把敌人的team变成1了,这样0和1就要进攻互相殴打。

4:现在人齐了,就开打了,而且现在环境已经变成tc_escape,打的结果,就在"castle_visit",0,-1,里,有写,就是(all_enemies_defeated),表示,所有和玩家team不一样的敌人都死了,如果俘虏的方针是2或者3,那么假如俘虏agent活着,那么方针变为4,假如死了,方针变为5.根据不同的结果,决定"mnu_sneak_into_town_caught_ran_away"这个接下来的跳转菜单的结局,即救援到底成不成功。你进去"mnu_sneak_into_town_caught_ran_away"这个菜单看就知道,如果救援成功,那么是会变化tc环境的,变为和“被绑架小姑娘”一样的tc_hero_freed,然后再执行script_setup_troop_meeting建立对话窗口。然后开关很重要,开关是slot_troop_mission_participation,如果对话过以后,那么这个slot_troop_mission_participation变成-1,这样就不会反复触发对话setup_troop_meeting了。

三、1.174版本的劫狱真的就没有bug了吗?其实还是有的,体现在如下几点
1:鸡肋bug,也就是那个ti_on_leave_trigger这个里面,写和不写都不影响。改法是:
找到"visit_town_castle"的mt,里面找到

(ti_on_leave_area, 0, 0,
      [
        (eq, "$talk_context", tc_prison_break),
      ], 
      [
        (display_message, "str_leaving_area_during_prison_break"),
        (set_jump_mission, "mt_sneak_caught_fight"),
        
      ]),

这段完全没有存在的必要。
2:就是城市进入大街逛逛,如果又监狱的话,在通过菜单进入的"town_center",0,-1,的mt里,会在mission开始前,把

(ti_before_mission_start, 0, 0, [],
      [
        (assign, "$g_main_attacker_agent", 0),
      ]),
也就是把看门的那个全局变量定义为0,
    但是,在视察城堡的"castle_visit",0,-1的mt里,却没有这个,应该补上。
所以,找到"castle_visit",0,-1这个mt,在空白处补上

#########napolun_mod_jieyubugxiufu########
      (ti_before_mission_start, 0, 0, [],
      [
        (assign, "$g_main_attacker_agent", 0),
      ]),
      #########napolun_mod_jieyubugxiufu########    

3:就是三种方针里,如果选择stay_out就是方针1,那么在城市监狱的mt里,没问题,俘虏会老老实实呆在监狱里,(就好比玩家是闹着玩的,并不打算救俘虏,所以杀进监狱,但是不救人,又杀出来)但是在城堡监狱的mt里,就出问题了!!!,就算你选择方针1呆在监狱,等你出监狱传送门的时候,俘虏还是很刷在你旁边24点位,究其原因,程序员把2搞错成1了,因为在视察城堡的mt里,(troop_slot_ge, ":prisoner", slot_troop_mission_participation, 1),是这么写,也就是3300行这个位置,找到(try_for_range, ":prisoner", active_npcs_begin, kingdom_ladies_end),,在下面,找到

(troop_slot_ge, ":prisoner", slot_troop_mission_participation, 1),

把他改为

#######napolun_mod_jieyubugxiufu########
          #(troop_slot_ge, ":prisoner", slot_troop_mission_participation, 1),
          (troop_slot_ge, ":prisoner", slot_troop_mission_participation, mp_prison_break_fight),
          #######napolun_mod_jieyubugxiufu########

4:最后一个劫狱错误就是3号方针的翻译问题,3号方针意思是mp_prison_break_stand_back,也就是呆在玩家后面,紧跟玩家获得保护。但是在游戏里,你会发现,俘虏刷出来以后,就呆在24点位不动,原因是你看agent刷出来的那一刹那,假如agent对应的troop的方针
是mp_prison_break_stand_back,那么就获取agent的位置,然后scripted 移动到这个位置,也就是呆在24点位不动了。但是这样一来和方针的翻译是不相符的,所以要么改翻译:你就呆在地牢门口自保!要么真的写一个跟随玩家的功能。我偏向后者。于是发现城市和城堡的mt里都有一个现成的时间触发器,就是老百姓逃跑,间隔为1,0,0,这是正好的,我就在这个触发器下面做文章,因此,找到城市mt里的(call_script, "script_neutral_behavior_in_fight"), 大概1700行上下。在下面加入

#######napolun_mod_jieyubugxiufu########
     (try_for_agents, ":agent"),
        (agent_get_troop_id, ":troop", ":agent"),
        (troop_slot_eq, ":troop", slot_troop_mission_participation, mp_prison_break_stand_back),
        (get_player_agent_no, ":player_agent"),
        (agent_get_position, pos1, ":player_agent"),            
        (agent_set_scripted_destination, ":agent", pos1),
     (try_end),
        #######napolun_mod_jieyubugxiufu########

同理,找到城市mt里的(call_script, "script_neutral_behavior_in_fight"),,大概在3200行上下,插入如下:

#######napolun_mod_jieyubugxiufu########
     (try_for_agents, ":agent"),
        (agent_get_troop_id, ":troop", ":agent"),
        (troop_slot_eq, ":troop", slot_troop_mission_participation, mp_prison_break_stand_back),
        (get_player_agent_no, ":player_agent"),
        (agent_get_position, pos1, ":player_agent"),            
        (agent_set_scripted_destination, ":agent", pos1),
     (try_end),
        #######napolun_mod_jieyubugxiufu########

至此,1.174的骑砍战团的劫狱bug也就彻底修复好了!!!!

四、场景里刷agent是怎么个模式和机制

场景分两种。
a)一种是野战的随机场景,比如随机草原一种是野战的随机场景,比如随机草原"scn_random_scene_steppe"这种的,里面是没有entrypoint这样的黄色箭头的。那么这里面刷agent只能在mt里通过spawn agent来实现。

b)另一种是固定的场景,比如领主大厅,或者城堡外围等等,"scn_castle_1_exterior",里面有传送门,有spr,也有黄色箭头entrypoint这样的场景,有两种添加agent方式。
方式1:进入这个场景一般通过menu菜单,然后设置一下jump mt,再jump一下scene,最后change screen就行,
那么就在这个菜单里设置,语句是一套组合拳,以"scn_castle_1_exterior"为例:
(modify_visitors_at_site, "scn_castle_1_exterior"),
(reset_visitors),
然后你自己已经熟知该场景里,有几个entrypoint,不同编号的entrypoint的位置自己心中有数。
接下来总要添加玩家吧:(set_visitor, 7, "$g_player_troop"),这个如果不写,那么默认玩家进入场景以后刷在entrypoint0,
写了就是刷在特别的地方。
然后,比如你场景里有40到47共八个entrypoint,你想结合你的城池的守军来增添人数,那么这么写:

        (assign, ":guard_no", 40),           
           (party_get_num_companion_stacks, ":num_stacks", "$g_encountered_party"),
           (try_for_range, ":troop_iterator", 0, ":num_stacks"),
             (lt, ":guard_no", 47),
             (party_stack_get_troop_id, ":cur_troop_id", "$g_encountered_party", ":troop_iterator"),
             (neg|troop_is_hero, ":cur_troop_id"),
             (party_stack_get_size, ":stack_size","$g_encountered_party",":troop_iterator"),
             (party_stack_get_num_wounded, ":num_wounded","$g_encountered_party",":troop_iterator"),
             (val_sub, ":stack_size", ":num_wounded"),
             (gt, ":stack_size", 0),
             (party_stack_get_troop_dna,":troop_dna", "$g_encountered_party", ":troop_iterator"),
             (set_visitor, ":guard_no", ":cur_troop_id", ":troop_dna"),
             (val_add, ":guard_no", 1),
           (try_end),             

此外,还可以在菜单里添加(mission_tpl_entry_set_override_flags, "mt_castle_visit", 24, af_override_all),表示在载入场景后
24点位的人没有任何装备。这个添加的屏蔽装备效果要和mt里的屏蔽效果并集来看,记住,是并集,不是交集。

方式2:已经在一个mt场景里了,临时添加一个,(针对已知entrypoint的情况)

(store_current_scene, ":cur_scene"), #this might be a better option?
(modify_visitors_at_site, ":cur_scene"),
(add_visitors_to_current_scene, 24, ":prisoner", 1, 0, 0),

实例,当玩家抢到地牢钥匙,并且和俘虏商定方案以后,走出地牢大门后,我让原先的守卫数量翻倍,怎么写?
答:找到castle_inspect子菜单,在有(assign, "$talk_context", tc_escape),这个try里面,代表走出地牢大门的环节。
找到

(set_visitor, ":guard_no", ":cur_troop_id", ":troop_dna"), 

擦除,替换为

#######napolun_mod_jieyujiaqiang############
                          (val_min, ":stack_size", 2),
                          (set_visitors, ":guard_no", ":cur_troop_id", ":stack_size"),
#######napolun_mod_jieyujiaqiang############

那么这样一来,抢钥匙环节还是原来的守军数量,等到再次出大门,守军数量就翻倍啦。
+++++++++++++++++++++++其他笔记+++++++++++++++++++++++++++++++++++++
选出最高长官.

("siege_request_meeting",[(eq, "$cant_talk_to_enemy", 0)],"Call for a meeting with the castle commander.", [
          (assign, "$cant_talk_to_enemy", 1),
          (assign, "$g_enemy_surrenders",0),
          (assign, "$g_castle_left_to_player",0),
          (assign, "$talk_context", tc_castle_commander),
          (party_get_num_attached_parties, ":num_attached_parties_to_castle","$g_encountered_party"),
          (try_begin),
            (gt, ":num_attached_parties_to_castle", 0),
            (party_get_attached_party_with_rank, ":leader_attached_party", "$g_encountered_party", 0),
            (call_script, "script_setup_party_meeting", ":leader_attached_party"),
          (else_try),
            (call_script, "script_setup_party_meeting", "$g_encountered_party"),
          (try_end),
           ]),

大地图模拟战争

game_event_simulate_battle",
script_setup_troop_meeting  建立起对话感觉

获取战利品

 (else_try),          
          (eq, "$loot_screen_shown", 0),
          (assign, "$loot_screen_shown", 1),
#          (try_begin),
#            (gt, "$g_ally_party", 0),
#            (call_script, "script_party_add_party", "$g_ally_party", "p_temp_party"), #Add remaining prisoners to ally TODO: FIX it.
#          (else_try),
#            (party_get_num_attached_parties, ":num_quick_attachments", "p_main_party"),
#            (gt, ":num_quick_attachments", 0),
#            (party_get_attached_party_with_rank, ":helper_party", "p_main_party", 0),
#            (call_script, "script_party_add_party", ":helper_party", "p_temp_party"), #Add remaining prisoners to our reinforcements
#          (try_end),          
          (troop_clear_inventory, "trp_temp_troop"),
          (call_script, "script_party_calculate_loot", "p_total_enemy_casualties"), #p_encountered_party_backup changed to total_enemy_casualties
          (gt, reg0, 0),          
          (troop_sort_inventory, "trp_temp_troop"),
          (change_screen_loot, "trp_temp_troop"),

两个party的关系

(call_script, "script_event_player_defeated_enemy_party", "$g_enemy_party"),
(call_script, "script_clear_party_group", "$g_enemy_party"),
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354