关于劫狱的来龙去脉
一:对话py的基本概念。
1,首先要知道对话有许多环境,在constant里面定义了21种环境,以tc_开头,出现橘黄色对话的框,然后按f对话,这是系统硬核,但是按了f后,对话究竟什么时候说什么话,那要区分对话的内容是英语还是翻译文件。
a:假如是英语,那么就是通过一些列条件来限定,一般两个条件结合起来足够了,一个是用tc环境来限定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, "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。那么触发好以后,一般来说,要么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赋值为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。但是视察城堡进入的是"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"),