本帖最后由 ww1437599567 于 2025-1-12 17:22 编辑
前言:蛮久没玩潘德了,最近不是砍2打折蛮多嘛,买了玩了一下,发现始终没有那种感觉。最近确实没啥玩的了,之前参加过一个魔改版的作者的mod开发,研究了一些蛮有用的功能。但是如果这些功能只存在于一个mod当中,感觉蛮可惜的。 所以我突发奇想,想写一篇比较详细的分析贴,将这些功能尽可能详细的分享出来,让我们这些潘德的爱好者都能按照自己的想法添加自己想要的这些功能。尤其是我特别喜欢的她城子mod作者大佬和g版移植的作者大佬,如果这些功能能被他们采纳,那我简直要高兴得蹦起来,哈哈哈。 回复可能不能及时看到,欢迎大家加q群进行交流:1014278498
功能:
以下是我分享的功能的添加(不区别顺序),后续每一个功能都会出详细的教程,在此感谢领军者作者、泡菜作者等大佬的分享,很多代码都是借鉴了他们的mod。
- 特殊战利品 (from:领军者)
- 战场boss血条功能 (from:群里大佬)
- 潘德百科词典(from:泡菜)
- 主动技能(from:泡菜)
- 遗忘之河洗点
- 查看兵种特技(from:群里大佬)
- 营地储物箱
需要准备的工具:
工欲善其事必先利其器,要实现这些功能,还是要准备一些工具来进行的。 https://pan.baidu.com/s/1RqupIhksTqiDWp-bgjHmNA?pwd=y4t9 骑砍类工具: 1.魔球 2.反编译软件 查看/编写代码的工具: 1.vscode 2.notepad++
需要了解的基础:
强烈建议先看这里了解最基本的mod制作的一些基础知识,再去观看后面的具体功能的添加!!! 字符串-----strings.txt 这个里面主要保存了mod里面用到的字符串,理解不了没关系,你只需要记住:1.当你要输出自定义的文字的时候需要用到它;2.每增加一个字符串需要将字符串计数+1(如图);
说了这么多肯定很空洞,下面举一个例子,比如你要实现打印一串英文:hello world。那么你就需要在strings.txt的最后一行添加代码:str_hello_world_test hello_world. 注意2点: 1.这里是有一个空格的,空格前面是它的名字(后面调用打印脚本时用的就是这个名字)名字是你自己随便取的,只能是英文哈,不能和原有的重复,所以尽可能复杂一点最好;后面是具体的打印的内容,这里就是hello world。 2.字符串计数器记得+1;
这样你要实现打印hello world就能实现了,但是具体的实现脚本,我现在先不说,后面遇到再详细说,你只需要记住,叫你在strings.txt里面怎么添加字符串就行了。 编译和反编译 编译和反编译需要用到工具:MBCodeEditor 编译:源码 ----> txt 反编译:txt ----> 源码 看不懂没关系,不用太过在意编译和反编译这两个高大上的名词,重点放在下面如何进行编译和反编译的操作就行。
一般代码会涉及两种操作,这里以脚本函数为例(注意:大家修改了代码,比如添加了脚本函数、添加了变量和字符串等等,一定要重新点一下载入,不然可能识别不到相关的代码): ① 新增脚本函数; 新增脚本函数直接利用MBCodeEditor,将源码编译成txt就行。 ② 修改已有的脚本函数。 修改已有的脚本函数,比如要在原来的脚本函数最后加上一行代码。就需要先利用MBCodeEditor反编译txt成源码,然后在源码上进行添加/修改操作,最后将修改后的源码编译成txt。
变量-----variables.txt 你可以把变量想象成一个盒子。这个盒子可以用来装东西,比如苹果、书或者玩具。在编程中,变量就像一个盒子,可以用来存储数据(比如数字、文字等)。你可以随时查看盒子里的内容,也可以随时更换盒子里的东西。 理解不了的朋友没关系,这并不影响我们后面功能的添加。 只需要知道怎么添加变量就行了。
添加变量比较简单,打开variables.txt,在文件最后添加就行:
脚本函数-----scripts.txt 懂编程的朋友就可以不用往下看了。脚本函数可以这样理解:一台全自动洗衣机。当你有洗衣服的需求,不用脚本函数就相当于你用老式洗衣机,需要把衣服放进去后洗了之后,再手动拿出来,放入脱水机里面,最后拿出来放入烘干机里面,然后就得到了洗好的衣服了。而你使用全自动洗衣服,就不用去在意这些过程了,你把这些过程全都封装进去了,只需要关注放脏衣服进去,洗好后拿烘干的衣服就行。 脚本函数不会自己执行,就像你用全自动洗衣服,也需要按一下启动按钮一样,需要你用一行代码进行调用,这样它就能执行你封装的内容了。 在我看来,骑砍里面的脚本函数还有一种用法,就是代码分离。举个例子,现在我有一个需求,就是需要在玩家开新档的时候,初始化一些数据,比如:哪些兵种显示战场内的血条(参考boss血条功能)。如果我全放在潘德官方初始化的脚本函数里面,官方本身初始化的脚本内容本来就很多了,有好几千行,你进行代码的添加肯定要先txt反编译成源码,然后加进去后,又编译成txt。而编译反编译工具在代码行数多了之后可能会有bug,这样就很容易出错。那怎么办呢? 只需要在官方的初始化函数的最后,加上一行来调用我们自己定义的脚本函数,这个脚本函数专门用来初始化我们自己的数据,而且做修改只需要在我们定义的初始化脚本函数内进行修改,这样就完美避开了刚才的问题。
操作示例①:新增脚本函数pm_init_param打开MBCodeEditor编译以下的源码(测试的代码): - (assign, "$key_open_show_health", key_v), # 这里是显示全局血量的按键
- (troop_set_slot, "trp_hero_maltise", 358, 1), # 这里是指定需要显示血量的boss,这里是马姐
复制代码 |
注意这里的空格,一定不能多也不能少,严格按照我图片里面说明的来。 操作示例②:修改原来的脚本函数game_start 添加完成,然后我们要将潘德的第一个脚本函数game_start最后加上一行代码,来调用触发我们刚刚定义的函数。 - (call_script, "script_pm_init_param"), # 调用脚本函数
复制代码 |
注意:这里由于反编译的行数有点多,可能会出bug,就是没办法添加源码到最后,你只需要将txt粘贴两次,反编译一下(这时候代码行数肯定*2了),然后再正常进行反编译,你发现就可以添加了,我也不知道为什么会有这个bug。反编译完成,添加源码后。正常进行编译,将编译后的txt替换掉原来的txt,然后修改代码行数,就大功告成了,后面我们做初始化相关的操作都在这个函数pm_init_param里面进行修改。
槽函数 虽然他的名字是函数,但我觉得他和函数关系不大,就是一个新的东西,大家不要被函数两个字诱导了,重点放在槽这个字上就行。熟悉编程的朋友肯定知道类,槽函数其实就类似于类的成员变量。说的通俗一点就是,槽函数其实就像一个带编号的小盒子,这个盒子里装着一个数字。通常情况下,这个数字是0,但我们可以根据需要往盒子里装别的数字,还可以随时查看盒子里的数字。 每个盒子都有一个编号,这个编号是我们自己决定的。举个例子,我们可以用358号盒子来判断一个角色是不是需要显示“BOSS血条”。如果358号盒子里的数字是“1”,那就说明需要显示;如果不是“1”,就说明不需要。就是这么简单,槽函数就像这些小盒子,一起帮我们管理各种有趣的规则和状态。 - (troop_slot_eq, ":curr_show_boss_troop", 358, 1), # 是否有boss显示的槽
复制代码 |
- (troop_set_slot, "trp_hero_maltise", 358, 1), # 这里是指定需要显示血量的boss,这里是马姐
复制代码 |
触发器 代码也好,脚本函数也好,不会无缘无故的执行,需要通过触发器去执行。有的小伙伴可能就有疑问:那上面的官方的游戏开局的初始化脚本函数为什么能自动执行呢?其实他就是由触发器执行的。就像你过年的鞭炮一样,你不去点火,他难道能无缘无故的爆炸? 鞭炮分很多种,有那种一点就炸的,也有那种点了之后等一会才炸的。触发器也一样,你可以让它立刻执行,也可以延迟10s或者20s执行。甚至可以每隔多少秒执行一次。再大胆一点,当敌人刀砍你身上的那一瞬间,也能触发…… 重点来了哈,问你们一个问题,骑砍里面不是有大地图和野外战场吗?大地图上面叫大地图相关的触发器,那战场上的触发器叫什么呢?没错,就是战场触发器,简称mt。其实大地图上的触发器和战场上的触发器他们的格式没啥大的区别,都有: ① 触发的一些设置,就是我们上面说的是立即触发还是延迟触发,是每隔多少秒触发一次还是只触发一次等等; ② 触发条件。比如我需要按哪个键才能触发。 ③ 触发后执行的代码。 有了这个基础,我们具体看看触发器的格式吧,然后怎么利用骑砍反编译工具修改触发器的代码。
添加书相关操作 ① 添加书: 打开魔球,物品-搜索“潘 德 草 药 全 书”,然后点击下面的创建按钮复制一份。相关属性设置如下: - itm_pendor_improve_read_first
- itm_pendor_improve_read_first
- 潘 德 百 科 辞 典( 上 卷 )
- 潘 德 百 科 辞 典( 上 卷 )
- itm_pendor_improve_read_second
- itm_pendor_improve_read_second
- 潘 德 百 科 辞 典( 下 卷 )
- 潘 德 百 科 辞 典( 下 卷 )
复制代码 |
同样的方法还可以创建一本。然后点击保存剧本即可。 ② 给书增加说明性的文字:打开strings.txt,先添加字符串(记得计数器+2): - str_intr_pendor_improve_read_first intr_pendor_improve_read_first
- str_intr_pendor_improve_read_second intr_pendor_improve_read_second
复制代码 |
添加翻译文件,打开".\languages\cns\game_strings.csv"添加在后面即可: - str_intr_pendor_improve_read_first|由 数 位 潘 德 大 陆 的 著 名 学 者 共 同 编 写 而 成,^涵 盖 内 容 非 常 广 泛,注 解 精 辟,是 不 可 多 ^得 的 工 具 书。 全 套 辞 典 共 分 为 上、下 两 卷,^这 是 其 中 的 上 半 卷。此 卷 能 将 阅 读 速 度 ^提 高 50% 。上 下 卷 阅 读 速 度 可 叠 加 , 共 提 高 75 % 。
- str_intr_pendor_improve_read_second|由 数 位 潘 德 大 陆 的 著 名 学 者 共 同 编 写 而 成,^涵 盖 内 容 非 常 广 泛,注 解 精 辟,是 不 可 多 ^得 的 工 具 书。 全 套 辞 典 共 分 为 上、下 两 卷, ^这 是 其 中 的 下 半 卷。此 卷 能 将 阅 读 速 度 ^提 高 50% 。上 下 卷 阅 读 速 度 可 叠 加 , 共 提 高 75% 。
复制代码 |
打开scripts.txt,搜索定位到game_get_item_extra_text,这个函数脚本,然后准备反编译txt修改源码。 - (try_begin),
- (eq, ":var_0", "itm_pendor_improve_read_first"),
- (eq, ":var_1", 0),
- (set_result_string, "str_intr_pendor_improve_read_first"),
- (set_trigger_result, 65535),
- (try_end),
- (try_begin),
- (eq, ":var_0", "itm_pendor_improve_read_second"),
- (eq, ":var_1", 0),
- (set_result_string, "str_intr_pendor_improve_read_second"),
- (set_trigger_result, 65535),
- (try_end),
复制代码 |
添加源码后编译成txt,然后替换掉原本的game_get_item_extra_text脚本函数代码即可,注意代码行数的修改。 这样就可以进入游戏查看了:
添加功能:特殊战利品 功能介绍 功能特点如下: ① 该特殊战利品分为神器和特殊物品两种,战斗结束后会分别计算概率,意思就是你运气爆棚的话,可以同时获得一件神器和特殊物品; ② 获取的物品跟你打的怪是什么没关系,哪怕你打劫匪,都有极低的概率掉落神器和特殊物品,掉落的物品是随机从神器、特殊物品库里抽取的,神器库里的神器爆完了就不会再掉神器了,而特殊物品库的东西可以反复爆出来; ③ 开发者可以通过魔球添加或者修改神器战利品库(trp_zendar_chest_1)和特殊物品库(trp_zendar_chest_backup_2)里的物品,但是修改完需要开新档才能生效; ④ 概率的问题:掉落的概率跟你的等级、你的掠夺等级、还有双方的强度差有关(强度值每次计算概率时会给出,可以参考一下),而且神器有爆率上限,具体多少我记不清了,好像是10%,意思就是哪怕你一个人单挑眼珠子大军,也只有10%的概率掉神器,特殊物品好像上限是25%,具体可以分析一下源代码; ⑤ 平衡性的问题:这个大家不用太担心,我当时设计的初衷就是打完架给玩家一个惊喜感,有种抽盲盒的感觉。神器要是前期爆率太高,肯定会影响平衡的,所以我把神器爆率控制得很低(参考其他玩家的游玩经历,运气不好的打了100多天接近200天,一件神器的影子都没有,还怀疑是不是bug了),也有那种拿命玩游戏的玩家,开局打劫匪都爆神器的。。。。。那种真不是我代码出问题了,冤枉; ⑥ 神器和特殊物品爆出来了直接放在玩家的背包里了,大家打架一定记得腾出位置,不然爆不出来,到时候别怪我说代码出问题了哈; ⑦ 祝大家游玩愉快。
下面是一张爆出来一件特殊物品的截图,仅供参考: step1:魔球打开mod,添加三个战利品库 打开魔球找到:编辑器 - 兵种 - 框内搜索trp_zendar_chest,我们将他选中,复制创建三个战利品库,trp_zendar_chest_1、trp_zendar_chest_2和trp_zendar_chest_backup_2,复制完成之后,我们就得到3个空的战利品库,并将他们的辎重管理都改成10级。 注意:为了防止出问题,复制之后,修改名称时,不清楚的朋友请严格按照下图修改!!! 介绍: - trp_zendar_chest_1神器战利品库,神器连续添加到该兵种的物品栏即可,爆完就不会爆了。
- trp_zendar_chest_backup_2特殊物品战利品库,特殊物品连续添加到该兵种的物品栏即可,特殊物品可以重复爆。
- trp_zendar_chest_2该功能需要的库,必须添加。
大家可以按照我上面的介绍,往战利品库中添加自己想添加的神器和特殊战利品,添加完成后不要忘记保存。
添加神器(不能重复爆):
添加特殊战利品(可以重复爆):
step2:strings.txt文件中需要添加的字符参数
打开strings.txt文件,在文件最后一行添加如下代码,记得第一行的计数器需要+6!!!!(不清楚的骑友记得看下前面的基础) - str_chance_of_getting_a_special_item Chance_of_getting_a_special_item:_{reg0}%.
- str_chance_of_getting_a_rare_item Chance_of_getting_a_rare_item:_{reg0}%.
- str_get_a_special_item You_get_a_special_item.
- str_get_a_rare_item You_get_a_rare_item.
- str_enemy_force_strength_pm enemy_force_strength:_{reg0}.
- str_strength_of_our_forces_pm strength_of_our_forces:_{reg0}.
复制代码
step3:language中的修改-汉化 该文件路径".\languages\cns\game_strings.csv"添加在后面即可 - str_chance_of_getting_a_special_item|获 得 特 殊 物 品 的 概 率 为 {reg0} % 。
- str_chance_of_getting_a_rare_item|获 得 神 器 的 概 率 为 {reg0} % 。
- str_get_a_special_item|运 气 不 错 嘛 , 恭 喜 你 在 战 利 品 中 获 得 一 件 特 殊 物 品 ———— {s1}。
- str_get_a_rare_item|人 品 大 爆 发 ,你 竟 然 在 尸 体 中 发 现 了 一 件 神 兵 利 器 !!!恭 喜 你 获 得 一 件 神 器 ———— {s1}。
- str_enemy_force_strength_pm|敌 军 强 度 参 考 值 为 {reg0} 。
- str_strength_of_our_forces_pm|我 军 强 度 参 考 值 为 {reg0} 。
复制代码step4:scripts.txt中的修改-添加脚本函数 这里就需要用到我们的编译工具了。特殊战利品功能需要添加两个脚本函数,请按照我添加的顺序一个一个进行添加: 第一个脚本函数party_calculate_strength_include_wounded - ("party_calculate_strength_include_wounded",
- [
- (store_script_param_1, ":party"),
- (store_script_param_2, ":exclude_leader"),
-
- (assign, reg0,0),
- (party_get_num_companion_stacks, ":num_stacks", ":party"),
- (assign, ":first_stack", 0),
- (try_begin),
- (neq, ":exclude_leader", 0),
- (assign, ":first_stack", 1),
- (try_end),
- (try_for_range, ":i_stack", ":first_stack", ":num_stacks"),
- (party_stack_get_troop_id, ":stack_troop",":party", ":i_stack"),
- (store_character_level, ":stack_strength", ":stack_troop"),
- (val_add, ":stack_strength", 4),
- (val_mul, ":stack_strength", ":stack_strength"),
- (val_mul, ":stack_strength", 2),
- (try_begin),
- (troop_is_mounted, ":stack_troop"),
- (val_mul, ":stack_strength", 5),
- (val_div, ":stack_strength", 4),
- (try_end),
- (val_div, ":stack_strength", 100),
- (val_max, ":stack_strength", 1),
- (party_stack_get_size, ":stack_size",":party",":i_stack"),
- (val_mul, ":stack_strength", ":stack_size"),
- (val_add, reg0, ":stack_strength"),
- (try_end),
- ]),
复制代码
|
我们打开我们的编译工具MBCodeEditor,将我们的源码复制到里面,将得到我们txt代码(就是我们熟知的txt修改):
然后打开我们的scripts.txt文件,将输出的txt代码复制到最后一行(注意检查前面是不是有且仅有一个空格+代码行数+有且仅有一个空格+复制的txt代码),然后在他的上面一行添加一个函数名,格式为(函数名记得顶格,不要有空格),最后别忘了最开始的计数器+1(添加了一个脚本函数): - party_calculate_strength_include_wounded -1
复制代码
第二个脚本函数give_special_loot
这里添加第二个脚本函数我就不这么详细了,参考第一个脚本函数的添加方法就行。编译的时候如果出错,记得再点击一下载入模组,源码如下:
- ("give_special_loot",
- [
- (store_script_param_1, ":enemy_party"),
- (store_script_param_2, ":ally_party"),
-
- (try_begin),
- (troop_get_inventory_slot, ":first_item", "trp_zendar_chest_2", 10),
- (le, ":first_item", -1),
- (call_script, "script_copy_inventory", "trp_zendar_chest_backup_2", "trp_zendar_chest_2"),
- (try_end),
-
- (call_script, "script_party_calculate_strength_include_wounded", ":enemy_party", 0),
- (assign, ":enemy_strength", reg0),
- (display_message, "str_enemy_force_strength_pm", 0xFFFFFFFF),
- (call_script, "script_party_calculate_strength", ":ally_party", 0),
- (assign, ":ally_strength", reg0),
- (display_message, "str_strength_of_our_forces_pm", 0xFFFFFFFF),
- (store_sub, ":total_gain", ":enemy_strength", ":ally_strength"),
- (store_character_level, ":troop_level", "trp_player"),
- #(store_mul, ":limit_lower_bound", ":troop_level", 1),
- (store_mul, ":limit_lower_bound", 1, 1),
- (store_add, ":limit_upper_bound", ":limit_lower_bound", 2500),
- (store_add, ":total_gain_lower_bound", ":limit_lower_bound", 3),
- (assign, ":gain_rare", ":total_gain"),
- (try_begin),
- (gt, ":total_gain", ":total_gain_lower_bound"),
- (store_sub, ":gain_rare_addition_back", ":total_gain", ":total_gain_lower_bound"),
- (store_div, ":gain_rare_addition",":gain_rare_addition_back", 500),
- (store_div, ":total_gain_addition",":gain_rare_addition_back", 110),
- (store_add, ":gain_rare", ":total_gain_lower_bound", ":gain_rare_addition"),
- (store_add, ":total_gain", ":total_gain_lower_bound", ":total_gain_addition"),
- (try_end),
- (val_max, ":gain_rare", ":total_gain_lower_bound"),
- (val_max, ":total_gain", ":total_gain_lower_bound"),
-
-
- # 这里对神器爆率进行加成
- (party_get_skill_level, ":loot_level", "p_main_party", "skl_looting"),
- (store_mul, ":loot_bonus_rare", ":loot_level", 2), # 获取掠夺*5
- (val_add, ":gain_rare", ":loot_bonus_rare"),
- (store_mul, ":loot_bonus_level_rare", ":troop_level", 1), # 等级*3
- (val_add, ":gain_rare", ":loot_bonus_level_rare"),
-
- # 这里对特殊物品爆率进行加成
- (store_mul, ":loot_bonus_special", ":loot_level", 20), # 获取掠夺*5
- (val_add, ":total_gain", ":loot_bonus_special"),
- (store_mul, ":loot_bonus_level_special", ":troop_level", 6), # 等级*3
- (val_add, ":total_gain", ":loot_bonus_level_special"),
- (try_begin),
- (ge, ":gain_rare", 240),
- (assign, ":gain_rare", 240),
- (try_end),
- (try_begin),
- (ge, ":total_gain", 2000),
- (assign, ":total_gain", 2000),
- (try_end),
- (store_random_in_range, ":random", ":limit_lower_bound", ":limit_upper_bound"),
- (store_sub, ":rare_rate_tmp", ":gain_rare", ":limit_lower_bound"),
- (store_div, ":rare_rate",":rare_rate_tmp", 25),
- (assign, reg0, ":rare_rate"),
- (display_message, "str_chance_of_getting_a_rare_item", 0xFF0000),
- (try_begin),
- (lt, ":random", ":gain_rare"),
- (troop_get_inventory_slot, ":rare_first_item", "trp_zendar_chest_1", 10),
- (gt, ":rare_first_item", -1),
- (troop_get_inventory_capacity, ":inv_cap", "trp_zendar_chest_1"),
- (store_free_inventory_capacity, ":free_cap", "trp_zendar_chest_1"),
- (store_sub, ":num_special_loot", ":inv_cap", 10),
- (val_sub, ":num_special_loot", ":free_cap"),
- (gt, ":num_special_loot", 0),
- (store_random_in_range, ":random_slot", 0, ":num_special_loot"),
- (val_add, ":random_slot", 10),
- (troop_get_inventory_slot, ":rare_item", "trp_zendar_chest_1", ":random_slot"),
- #(troop_ensure_inventory_space, "trp_temp_troop", 1),
- (str_store_item_name, s1, ":rare_item"),
- (display_message, "str_get_a_rare_item", 0xFF0000),
- (play_sound,"snd_quest_succeeded"),
- (store_free_inventory_capacity, ":tmp_player_free_cap"), # 如果玩家物品栏满了,则不触发
- (gt, ":tmp_player_free_cap", 0),
- (troop_add_item, "trp_player", ":rare_item"), # 获得奖励
- (troop_remove_item, "trp_zendar_chest_1", ":rare_item"),
- (troop_sort_inventory, "trp_zendar_chest_1"),
- (troop_sort_inventory, "trp_temp_troop"),
- (try_end),
- (store_random_in_range, ":random", ":limit_lower_bound", ":limit_upper_bound"),
- (store_sub, ":special_rate_tmp", ":total_gain", ":limit_lower_bound"),
- (store_div, ":special_rate",":special_rate_tmp", 25),
- (assign, reg0, ":special_rate"),
- (display_message, "str_chance_of_getting_a_special_item", 0x0000FF),
- (try_begin),
- (lt, ":random", ":total_gain"),
- (troop_get_inventory_capacity, ":inv_cap", "trp_zendar_chest_2"),
- (store_free_inventory_capacity, ":free_cap", "trp_zendar_chest_2"),
- (store_sub, ":num_special_loot", ":inv_cap", 10),
- (val_sub, ":num_special_loot", ":free_cap"),
- (gt, ":num_special_loot", 0),
- (store_random_in_range, ":random_slot", 0, ":num_special_loot"),
- (val_add, ":random_slot", 10),
- (troop_get_inventory_slot, ":special_item", "trp_zendar_chest_2", ":random_slot"),
- #(troop_ensure_inventory_space, "trp_temp_troop", 1),
-
- (str_store_item_name, s1, ":special_item"),
- (display_message, "str_get_a_special_item", 0x0000FF),
- (play_sound,"snd_quest_succeeded"),
- (store_free_inventory_capacity, ":tmp_player_free_cap"), # 如果玩家物品栏满了,则不触发
- (gt, ":tmp_player_free_cap", 0),
- (troop_add_item, "trp_player", ":special_item"), # 获得奖励
- (troop_remove_item, "trp_zendar_chest_2", ":special_item"),
- (troop_sort_inventory, "trp_zendar_chest_2"),
- (troop_sort_inventory, "trp_temp_troop"),
- (try_end),
- ]),
复制代码
|
step5:触发特殊战利品脚本(战后结算的位置)
打开scripts.txt,搜索party_calculate_loot,复制txt机器码出来,利用MBCodeEditor进行反编译。将反编译输出的源码位置的最后一行加入我们的触发代码:
- (call_script, "script_give_special_loot", ":var_0", "p_collective_friends_backup"),
复制代码 然后点击进行编译成txt脚本函数,将它复制出来,按照我们上面添加脚本函数的格式,将原来的代码给覆盖掉,记得将代码行数+1。
到此,该功能就已经添加完成,可以进游戏进行游玩测试了!!
大家想要增加和修改战利品库就可以直接通过魔球中的trp_zendar_chest_1和trp_zendar_chest_backup_2进行神器和特殊物品的增加和删除,但是需要注意,由于是修改的初始化数据,用魔球修改后需要重新开档才能生效。
添加功能:战场boss血条和全局血条功能
特别说明:
① 该功能涉及到ui相关的代码,由于骑砍的ui机制,血条相关的功能只能依托于小地图的ui代码里,意思就是如果没有小地图功能的mod(比如原版),那么可能添加不了该功能,或者大家也可以自己研究研究。在这里,我用的是打了她城子mod(25年元旦版本)的潘德来进行教程的书写的;
② 如果要增加boss,则在scripts.txt中的pm_init_param脚本里面新增(troop_set_slot, "trp_hero_maltise", 358, 1), 这里的"trp_hero_maltise"是马姐,可以任意修改,不知道对应的trp的可以打开魔球查看;
③ 该功能必须开启小地图功能才能生效;
④ 全局血条战场中默认不开启,可以按V键开启,再按一下V键关闭,小兵和英雄的血条颜色是不一样的;
⑤ 要修改开启/关闭全局血条的按键,也是在scripts.txt中的pm_init_param脚本里面,(assign, "$key_open_show_health", key_v), 这里的key_v;
⑥ 教程里面,mt里面只添加了lead_charge野战场景,如果要支持其他场景,比如攻城场景,需要在对应场景增加相关血条mt代码,还有小地图的支持,详细的场景可以参考这个文章:mission_templates中 各个场景意思全部解析
⑦ 祝大家游玩愉快。
step1:添加相关变量
添加变量比较简单,打开variables.txt,在文件最后加入如下变量(添加变量的好处就是不需要修改前面的计数器):
- refresh_show_health_time
- is_open_show_health
- key_open_show_health
- pm_g_boss_show_curr_agent_id
复制代码
|
step2:添加mesh模型对象
这里没有添加新的模型进去,其实就是用了潘德原来的模型,添加模型也没啥难的,打开meshes.txt,最后加上我提供的代码就行:
- mesh_progressbar 0 progressbar 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000
- mesh_progressbar_handle 0 progressbar_handle 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 1.000000 1.000000 1.000000
复制代码
|
step3:添加脚本函数
第一个脚本函数blood_bar_show_ui_func
打开scripts.txt,添加到最后,具体步骤忘了的请看基础篇:
- ("blood_bar_show_ui_func",
- [
- (store_script_param, ":cur_time", 1),
- (get_player_agent_no, ":tmp_player_agent"),
- (try_begin),
- (neg|ge, ":cur_time", "$refresh_show_health_time"),
- (assign, "$refresh_show_health_time", ":cur_time"),
- (try_end),
- (assign, ":curr_show_boss", -1), # 当前显示的boss
- (assign, ":boss_create_mesh1", -1), # boss血条需要的mesh,分别对应了agent的槽398,399,400
- (assign, ":boss_create_mesh2", -1),
- (assign, ":boss_create_mesh3", -1),
- (try_begin),
- (store_sub, ":var_43", ":cur_time", "$refresh_show_health_time"),
- (gt, ":var_43", 5),
- (assign, "$refresh_show_health_time", ":cur_time"),
- (get_player_agent_no, reg21),
- (set_fixed_point_multiplier, 1000),
- (try_for_agents, reg22),
- (agent_is_human, reg22),
- #(neg|agent_is_ally, reg22),
- (agent_is_non_player, reg22),
- (assign, ":boss_is_create_mesh", -1),
-
- (assign, reg23, -1),
- (assign, reg24, -1),
- (assign, reg34, -1),
- (assign, reg44, -1),
- (agent_get_slot, reg23, reg22, 382),
- (agent_get_slot, ":boss_is_create_mesh", reg22, 397),
- (assign, ":distance", 800), # boss血条的显示距离
- (try_begin),
- #(agent_is_alive, reg22),
- (agent_get_troop_id, ":curr_show_boss_troop", reg22),
- (troop_slot_eq, ":curr_show_boss_troop", 358, 1), # 是否有boss显示的槽
- (get_player_agent_no, ":player_agent"), # 判断和玩家是否是敌人
- (agent_get_team, ":player_agent_team", ":player_agent"),
- (agent_get_team, ":index_agent_team", reg22),
- (teams_are_enemies, ":index_agent_team", ":player_agent_team"),
- (try_begin), # 这是没有创建mesh,则需要创建mesh
- (neg|eq, ":boss_is_create_mesh", 21399),
- (create_mesh_overlay, ":boss_create_mesh1", "mesh_progressbar_handle"),
- (create_mesh_overlay, ":boss_create_mesh2", "mesh_progressbar"),
- (agent_get_troop_id, ":curr_show_boss_troop", reg22),
- (str_store_troop_name, s1, ":curr_show_boss_troop"),
- (create_text_overlay, ":boss_create_mesh3", s1),
- (agent_set_slot, reg22, 398, ":boss_create_mesh1"),
- (agent_set_slot, reg22, 399, ":boss_create_mesh2"),
- (agent_set_slot, reg22, 400, ":boss_create_mesh3"),
- (agent_set_slot, reg22, 397, 21399),
- (try_end),
- # 通过agent的槽获取mesh
- (agent_get_slot, ":boss_create_mesh1", reg22, 398),
- (agent_get_slot, ":boss_create_mesh2", reg22, 399),
- (agent_get_slot, ":boss_create_mesh3", reg22, 400),
- # 默认全部不显示
- (overlay_set_display, ":boss_create_mesh1", 0),
- (overlay_set_display, ":boss_create_mesh2", 0),
- (overlay_set_display, ":boss_create_mesh3", 0),
- # 判断是否在范围内
- (agent_get_position, pos1, reg22),
- (agent_get_position, pos2, ":player_agent"),
- (get_distance_between_positions_in_meters, ":cur_distance", pos1, pos2),
- (try_begin), # 在范围内的话,就需要选择改boss为agent
- (le, ":cur_distance", ":distance"),
- (agent_is_alive, reg22),
- (assign, ":curr_show_boss", reg22), # 在外面单独设置
- (try_end),
- (try_end),
- (try_begin),
- (agent_is_alive, reg22),
- (neg|eq, reg23, 21399),
- # (create_mesh_overlay, reg24, "mesh_pic_pendor_manageinventory"),
- (create_mesh_overlay, reg24, "mesh_pic_pendor_manageinventory"),
- (create_mesh_overlay, reg34, "mesh_pic_pendor_manageinventory"), # 能量条
- (agent_set_slot, reg22, 384, reg34),
- (agent_set_slot, reg22, 381, reg24),
- (agent_set_slot, reg22, 382, 21399),
- (overlay_set_display, reg24, 0),
- (overlay_set_alpha, reg24, 255),
- (overlay_set_display, reg34, 0),
- (overlay_set_alpha, reg34, 255),
- (agent_get_troop_id, reg26, reg22),
- (try_begin),
- (troop_is_hero, reg26),
- (overlay_set_color, reg24, 0x0000FF),
- (else_try),
- (overlay_set_color, reg24, 0xFF0000),
- (try_end),
- (overlay_set_color, reg34, 0x00CC00),
- (try_end),
- (agent_get_slot, reg23, reg22, 382),
- (try_begin),
- (eq, "$is_open_show_health", 1), # 是否开启血条显示的功能
- (agent_is_alive, reg22),
- (eq, reg23, 21399),
- (agent_get_slot, reg34, reg22, 384), # 能量条
- (agent_get_slot, reg24, reg22, 381),
- (agent_get_position, pos3, reg22),
- (agent_get_position, pos4, reg21),
- (get_distance_between_positions_in_meters, reg29, pos3, pos4),
- (try_begin),
- (neg|gt, reg29, 30),
- (agent_get_position, pos1, reg22),
- (agent_get_position, pos3, reg22), # 这里的pos3就是能量条
- (agent_get_horse, reg30, reg22),
- (try_begin),
- (ge, reg30, 0),
- (position_move_z, pos1, 280, 1),
- (position_move_z, pos3, 270, 1),
- (else_try),
- (position_move_z, pos1, 190, 1),
- (position_move_z, pos3, 180, 1),
- (try_end),
- (position_get_screen_projection, pos2, pos1),
- (position_get_x, reg31, pos2),
- (position_get_y, reg32, pos2),
- (position_get_screen_projection, pos4, pos3),
- (position_get_x, reg35, pos4),
- (position_get_y, reg36, pos4),
- (try_begin),
- (is_between, reg31, -100, 1100),
- (is_between, reg32, -100, 850),
- (is_between, reg35, -100, 1100),
- (is_between, reg36, -100, 850),
- # 设置血条
- (store_agent_hit_points, reg45, reg22),
- (val_div, reg45, 3),
- (position_set_x, pos1, reg45),
- (position_set_y, pos1, 5),
- (overlay_set_size, reg24, pos1),
- (position_get_x, reg31, pos2),
- (val_div, reg45, 2),
- (val_sub, reg31, reg45),
- (position_set_x, pos2, reg31),
- # 设置能量条
- #(store_agent_hit_points, reg44, reg22),
- (agent_get_troop_id, reg26, reg22),
- (assign, ":var_43", 0),
- # (try_begin), # 判断如果是英雄单位, 则用troop的槽
- # (troop_is_hero, reg26),
- # (troop_get_slot, ":var_43", reg26, 359),
- # (else_try), # 判断如果是非英雄单位, 则用agent的槽
- # (neg|troop_is_hero, reg26),
- (agent_get_slot, ":var_43", reg22, 383),
- # (try_end),
- (assign, reg44, ":var_43"),
- (val_div, reg44, 50),
- (val_div, reg44, 3),
- (position_set_x, pos3, reg44),
- (position_set_y, pos3, 5),
- (overlay_set_size, reg34, pos3),
- (position_get_x, reg35, pos4), # 这里的pos4是能量条的在屏幕上的位置
- (val_div, reg44, 2), # 这里的44就是能量的值除以2
- (val_sub, reg35, reg44),
- (position_set_x, pos4, reg35),
- (overlay_set_position, reg24, pos2),
- (overlay_set_position, reg34, pos4),
- (overlay_set_display, reg24, 1),
- (overlay_set_display, reg34, 1),
- (else_try),
- (overlay_set_display, reg24, 0),
- (overlay_set_display, reg34, 0),
- (try_end),
- (else_try),
- (overlay_set_display, reg24, 0),
- (overlay_set_display, reg34, 0),
- (try_end),
- (else_try),
- (agent_get_slot, reg23, reg22, 382),
- (eq, reg23, 21399),
- (agent_get_slot, reg24, reg22, 381),
- (agent_get_slot, reg34, reg22, 384),
- (overlay_set_display, reg24, 0),
- (overlay_set_display, reg34, 0),
- (try_end),
- (try_end),
- (try_end),
-
- (try_begin),
- # 如果当前boss的agent不为-1,则显示该agent的血量
- (neg|eq, ":curr_show_boss", -1),
- # 获取boss的血量
- (store_agent_hit_points, ":boss_hp", ":curr_show_boss"),
- # (create_mesh_overlay, "$g_presentation_obj_1", "mesh_progressbar_handle"),
- (overlay_set_display, ":boss_create_mesh1", 1),
- (position_set_x, pos1, 180),
- (position_set_y, pos1, 700),
- (overlay_set_position, ":boss_create_mesh1", pos1),
- (val_mul, ":boss_hp", 10),
- (position_set_x, pos1, ":boss_hp"),
- (position_set_y, pos1, 1000),
- (overlay_set_size, ":boss_create_mesh1", pos1),
- # (create_mesh_overlay, reg1, "mesh_progressbar"),
- (overlay_set_display, ":boss_create_mesh2", 1),
- (position_set_x, pos1, 180),
- (position_set_y, pos1, 700),
- (overlay_set_position, ":boss_create_mesh2", pos1),
- (agent_get_troop_id, ":curr_show_boss_troop", ":curr_show_boss"),
- (str_store_troop_name, s1, ":curr_show_boss_troop"),
- (overlay_set_display, ":boss_create_mesh3", 1),
- # (create_text_overlay, reg1, s1),
- (position_set_x, pos1, 180),
- (position_set_y, pos1, 710),
- (overlay_set_position, ":boss_create_mesh3", pos1),
- (position_set_x, pos1, 800),
- (position_set_y, pos1, 800),
- (overlay_set_size, ":boss_create_mesh3", pos1),
- (overlay_set_color, ":boss_create_mesh3", 0xffffff),
- (try_end),
- ]),
复制代码
|
完成效果:
第二个脚本函数pm_init_param
这个函数我在基础篇-脚本函数那里也提到过,后面我们做初始化相关的操作都在这个函数里面进行。这里不多解释了,不懂的朋友去上面看我的基础,这里在里面添加一些血条功能需要的代码:
- (assign, "$key_open_show_health", key_v), # 这里是显示全局血量的按键
- (troop_set_slot, "trp_hero_maltise", 358, 1), # 这里是指定需要显示血量的boss,这里是马姐
复制代码
|
这里需要注意:
① 全局血量的按键默认是键盘的v键,如果想要修改成其他按键的可以在这里改源码;
② 这里是我定义的槽函数,序号358,槽函数358值设置成1代表这个兵种开启boss血条显示,不知道什么是槽函数的朋友请看基础。
step4:添加ui相关代码
添加ui稍微复杂一点,主要是针对小地图的ui代码的修改。打开presentations.txt,搜索prsnt_mini_map,定位到如下图的位置,其中需要改的地方,图中我已经标出来了,后续需要使用MBCodeEditor进行反编译后修改源码(不知道怎么反编译的看我前面的基础介绍):
这里小地图源码1这里反编译之后,在(presentation_set_duration, 999999), 代码之前添加我们的源码;
小地图源码2这里反编译之后,在首行和尾行分别添加我提供的源码。
- (assign, reg33, 0),
- (get_player_agent_no, reg21),
- (set_fixed_point_multiplier, 1000),
- (try_for_agents, reg22),
- (agent_is_human, reg22),
- (agent_is_non_player, reg22),
- (assign, reg23, -1),
- (assign, reg24, -1),
- (assign, reg34, -1),
- (create_mesh_overlay, reg24, "mesh_pic_pendor_manageinventory"),
- (create_mesh_overlay, reg34, "mesh_pic_pendor_manageinventory"),
- (agent_set_slot, reg22, 384, reg34),
- (agent_set_slot, reg22, 381, reg24),
- (agent_set_slot, reg22, 382, 21399),
- (overlay_set_display, reg34, 0),
- (overlay_set_alpha, reg34, 255),
- (overlay_set_display, reg24, 0),
- (overlay_set_alpha, reg24, 255),
- (agent_get_troop_id, reg26, reg22),
- (try_begin),
- (troop_is_hero, reg26),
- (overlay_set_color, reg24, 255),
- (else_try),
- (overlay_set_color, reg24, 16711680),
- (try_end),
- (overlay_set_color, reg34, 52224),
- (try_begin),
- (agent_get_troop_id, ":var_14", reg22),
- (troop_slot_eq, ":var_14", 358, 1),
- (get_player_agent_no, ":var_15"),
- (agent_get_team, ":var_16", ":var_15"),
- (agent_get_team, ":var_17", reg22),
- (teams_are_enemies, ":var_17", ":var_16"),
- (assign, ":var_18", reg22),
- (create_mesh_overlay, ":var_19", "mesh_progressbar_handle"),
- (create_mesh_overlay, ":var_20", "mesh_progressbar"),
- (agent_get_troop_id, ":var_14", reg22),
- (str_store_troop_name, s1, ":var_14"),
- (create_text_overlay, ":var_21", 1),
- (agent_set_slot, reg22, 398, ":var_19"),
- (agent_set_slot, reg22, 399, ":var_20"),
- (agent_set_slot, reg22, 400, ":var_21"),
- (agent_set_slot, reg22, 397, 21399),
- (store_agent_hit_points, ":var_22", ":var_18"),
- (position_set_x, pos1, 180),
- (position_set_y, pos1, 700),
- (overlay_set_position, ":var_19", pos1),
- (val_mul, ":var_22", 10),
- (position_set_x, pos1, ":var_22"),
- (position_set_y, pos1, 1000),
- (overlay_set_size, ":var_19", pos1),
- (position_set_x, pos1, 180),
- (position_set_y, pos1, 700),
- (overlay_set_position, ":var_20", pos1),
- (position_set_x, pos1, 180),
- (position_set_y, pos1, 710),
- (overlay_set_position, ":var_21", pos1),
- (position_set_x, pos1, 800),
- (position_set_y, pos1, 800),
- (overlay_set_size, ":var_21", pos1),
- (overlay_set_color, ":var_21", 16777215),
- (try_end),
- (try_end),
复制代码
|
- store_trigger_param_1, ":input_param"),
- # 中间是它原有的代码
- (call_script, "script_blood_bar_show_ui_func", ":input_param"),
复制代码
|
看图容易理解一点,添加位置如图所示:
修改完成后,将原来的txt给替换掉:
step5:添加战场触发器mt
打开mission_templates.txt,搜索lead_charge,定位到这个位置,添加一行mt代码,这里mt触发器块里面是空的,所以格式是(看不懂的朋友看我的基础-触发器-战场触发器):
- 0.000000 0.000000 0.000000 0 10 <txt代码>
复制代码
|
源码如下:编译成txt即可,复制中间的代码进行编译即可,前面那些中跨号啥的可以不管。
- (0, 0, 0,
- [
- ],
- [
- (try_begin),
- (key_clicked, "$key_open_show_health"), # 玩家按下了显示全局血量的按键
- (try_begin),
- (eq, "$is_open_show_health", 1), # 是否开启血条显示的功能
- (assign, "$is_open_show_health", 0),
- (else_try),
- (eq, "$is_open_show_health", 0), # 是否开启血条显示的功能
- (assign, "$is_open_show_health", 1),
- (try_end),
- (try_end),
- ]),
复制代码
|
添加了一个mt,记得计数器+1,添加完成就可以了。
添加功能:潘德百科辞典 你是否觉得骑砍里面读一本书太慢了,为了读一本书花费了太多的时间,能不能有什么好的办法提高我的读书速度啊?于是,潘德百科辞典诞生了: ① 该辞典分为上卷和下卷,放在背包即生效(需要大地图走两步哈); ② 单独一本提高50%的读书速度,并且+1智力,两本可以叠加,共提高75%的读书速度与+2智力; ③ 获取方式为,上卷:和任意市长关系到达10,对话即可获得;下卷:和任意市长关系到达20,对话即可获得。可以在同一市长处获得上下卷; ④ 如果没触发的多对话几次,并检查背包是否有剩余空间; ⑤ 提高读书速度后,你会发现读过的书,进度不是100%,放心,这只是显示bug,该书已经读完了,且无法再读,对游戏游玩没有任何影响; ⑥ 不要把上下卷扔掉,不然可能会出bug,可以放城镇箱子里; ⑦ 祝大家游玩愉快。
step1:添加两本书:潘德百科辞典( 上卷 )和( 下卷 ) 详细添加过程可以看基础-添加一本书。 - itm_pendor_improve_read_first
- pendor_improve_read_first
- 潘 德 百 科 辞 典( 上 卷 )
- 潘 德 百 科 辞 典( 上 卷 )
- itm_pendor_improve_read_second
- pendor_improve_read_second
- 潘 德 百 科 辞 典( 下 卷 )
- 潘 德 百 科 辞 典( 下 卷 )
复制代码 |
添加完成之后,给书加上说明性的文字: step2:添加功能需要的一些字符和变量 ① 添加字符串:刚才添加上下卷的时候,已经添加了一些字符串了,现在还需要添加4个字符串和翻译,打开strings.txt和".\languages\cns\game_strings.csv"进行添加即可: - str_you_have_pendor_improve_read_first you_have_pendor_improve_read_first
- str_you_have_pendor_improve_read_second you_have_pendor_improve_read_second
- str_you_lost_pendor_improve_read_first you_lost_pendor_improve_read_first
- str_you_lost_pendor_improve_read_second you_lost_pendor_improve_read_second
复制代码 |
- str_you_have_pendor_improve_read_first|你 获 得 了 潘 德 百 科 辞 典( 上 卷 ) 的 提 升 : 智 力 + 1 , 阅 读 速 度 提 高 50% 。
- str_you_have_pendor_improve_read_second|你 获 得 了 潘 德 百 科 辞 典( 下 卷 ) 的 提 升 : 智 力 + 1 , 阅 读 速 度 提 高 50% 。
- str_you_lost_pendor_improve_read_first|你 失 去 了 潘 德 百 科 辞 典( 上 卷 ) 的 提 升 : 智 力 - 1 , 阅 读 速 度 降 低 50% 。
- str_you_lost_pendor_improve_read_second|你 失 去 了 潘 德 百 科 辞 典( 下 卷 ) 的 提 升 : 智 力 - 1 , 阅 读 速 度 降 低 50% 。
复制代码 |
② 添加变量和对话翻译文件 打开variables.txt进行添加即可: - has_book1
- has_book2
- book1_add
- book2_add
- read_speed1
- read_speed2
- has_all_books
- all_books_add
- read_speed_all
- give_book_dbk1
- give_book_dbk2
复制代码 |
对话翻译文件打开该文件路径".\languages\cns\dialogs.csv"添加在后面即可: - dlga_start:give_book_dbk1|感 谢 您 对 我 们 的 照 顾, {大 人/夫 人}, 我 们 不 会 忘 记 您 为 城 市 所 做 的 一 切。 为 了 对 您 表 达 谢 意, 请 收 下 这 本 辞 典。 这 是 由 数 位 潘 德 大 陆 上 的 著 名 的 学 者 共 同 编 写 而 成 的。 遗 憾 的 是 其 中 一 部 分 资 料 在 长 年 的 战 乱 中 遗 失 了。 不 过, 即 使 它 并 不 完 整, 也 一 定 会 对 您 有 所 帮 助 的。
- dlga_give_book_dbk1:give_book_dbk1_2|哦…… 这 真 是 非 常 有 用 的 东 西, 那 我 就 不 客 气 了。
- dlga_give_book_dbk1_2:close_window|这 是 我 的 荣 幸, {大 人/夫 人}。
- dlga_start:give_book_dbk2|这 里 的 人 民 都 对 您 赞 不 绝 口, 尊 敬 的 {playername} {大 人/夫 人}, 我 们 为 能 够 拥 有 您 这 样 英 明 神 武 的 领 主 而 深 感 荣 幸! 这 本 书 是 很 久 以 前 一 个 游 吟 诗 人 留 在 这 里 的, 他 嘱 咐 我 要 把 它 交 给 一 个 值 得 尊 敬 和 信 赖 的 人。 除 了 您, 我 再 也 找 不 到 第 二 个 更 适 合 得 到 它 的 人 了。 虽 然 它 看 起 来 不 够 完 整, 但 如 果 您 能 找 到 其 它 部 分, 那 它 的 价 值 决 不 是 现 在 能 比 的。
- dlga_give_book_dbk2:give_book_dbk2_2|太 好 了! 我 一 直 在 找 这 本 书, 现 在 终 于 可 以 凑 齐 整 套 了!
- dlga_give_book_dbk2_2:give_book_dbk2_3|啊, 祝 贺 您 {大 人/夫 人}。
- dlga_give_book_dbk2_3:give_book_dbk2_4|这 套 完 整 的 辞 典 将 会 给 予 我 更 大 的 帮 助。 你 做 的 很 好!
- dlga_give_book_dbk2_4:close_window|很 荣 幸 能 够 帮 上 您 的 忙, {playername} {大 人/夫 人}。 愿 上 帝 保 佑 您!
复制代码 |
step3:判断背包中是否有上下卷 这里需要用到我们基础篇中说的大地图的触发器,对应的txt文件是:triggers.txt。 都到这里了,我们就不去多分析原理了,大家按照我的格式将源码编译成txt(编译只需要中间的源码,不用全部复制()和[]这些),然后按照模板合并一下,放在triggers.txt最后一行位置就行: - 0.200000 0.000000 0.000000 0 67 <txt代码>
复制代码 |
- (0.200000, 0.000000, 0.000000,
- [],
- [
- (try_begin),
- (neg|player_has_item, "itm_pendor_improve_read_first"),
- (assign, "$has_book1", 0),
- (try_end),
- (try_begin),
- (neg|player_has_item, "itm_pendor_improve_read_second"),
- (assign, "$has_book2", 0),
- (try_end),
- (try_begin),
- (map_free, 0),
- (eq, "$has_book1", 0),
- (player_has_item, "itm_pendor_improve_read_first"), # 判断是否拥有是否有上卷
- (assign, "$has_book1", 1),
- (assign, "$book1_add", 1),
- (assign, "$read_speed1", 1),
- (troop_raise_attribute, "trp_player", ca_intelligence, 1),
- (display_message, "str_you_have_pendor_improve_read_first", 0x0000FF), # 提升阅读速度的提示
- (try_end),
- (try_begin),
- # 下卷同理
- (map_free, 0),
- (eq, "$has_book2", 0),
- (player_has_item, "itm_pendor_improve_read_second"), # 判断是否拥有是否有下卷
- (assign, "$has_book2", 1),
- (assign, "$book2_add", 1),
- (assign, "$read_speed2", 1),
- (troop_raise_attribute, "trp_player", ca_intelligence, 1),
- (display_message, "str_you_have_pendor_improve_read_second", 0x0000FF), # 提升阅读速度的提示
- (try_end),
- (try_begin),
- (eq, "$book1_add", 1),
- (eq, "$has_book1", 0), # 上卷不在背包里了
- (assign, "$book1_add", 0),
- (assign, "$read_speed1", 0),
- (troop_raise_attribute, "trp_player", ca_intelligence, -1),
- (display_message, "str_you_lost_pendor_improve_read_first", 0xFF0000),
- (try_end),
- (try_begin),
- (eq, "$book2_add", 1),
- (eq, "$has_book2", 0), # 下卷不在背包里了
- (assign, "$book2_add", 0),
- (assign, "$read_speed2", 0),
- (troop_raise_attribute, "trp_player", ca_intelligence, -1),
- (display_message, "str_you_lost_pendor_improve_read_second", 0xFF0000),
- (try_end),
- (try_begin),
- (eq, "$has_book1", 0),
- (assign, "$has_all_books", 0),
- (try_end),
- (try_begin),
- (eq, "$has_book2", 0),
- (assign, "$has_all_books", 0),
- (try_end),
- (try_begin),
- (map_free, 0),
- (eq, "$has_all_books", 0),
- (eq, "$has_book1", 1),
- (eq, "$has_book2", 1),
- (assign, "$has_all_books", 1),
- (assign, "$all_books_add", 1),
- (assign, "$read_speed_all", 1),
- (try_end),
- (try_begin),
- (eq, "$all_books_add", 1),
- (eq, "$has_all_books", 0),
- (assign, "$all_books_add", 0),
- (assign, "$read_speed_all", 0),
- (try_end),
- ]),
复制代码 |
最终的效果如下图所示,大家记得计数器+1就行: 游戏里面的效果就是这样:
step4:添加读书加速效果
打开simple_triggers.txt,我们需要找到原版读书相关的位置。怎么定位呢?我给以下潘德原版的代码,大家利用MBCodeEditor编译成txt,然后在simple_triggers.txt中搜索该txt出现的位置,就能定位到了。
- (gt, "$g_player_reading_book", 0),
- (player_has_item, "$g_player_reading_book"),
- (store_attribute_level, ":var_0", "trp_player", ca_intelligence),
- (item_get_slot, ":var_1", "$g_player_reading_book", slot_item_intelligence_requirement),
- (neg|gt, ":var_1", ":var_0"),
- (item_get_slot, ":var_2", "$g_player_reading_book", slot_item_book_reading_progress),
- (item_get_slot, ":var_3", "$g_player_reading_book", slot_item_book_read),
- (eq, ":var_3", 0),
- (val_add, ":var_2", 7),
复制代码
|
我们将原来的txt复制出来进行反编译,准备修改里面的源代码了。
- (try_begin),
- (neg|eq, "$read_speed1", 1),
- (neg|eq, "$read_speed2", 1),
- (neg|eq, "$read_speed_all", 1),
- (assign, reg50, 1000),
- (else_try),
- (eq, "$read_speed_all", 1),
- (assign, reg50, 200),
- (else_try),
- (eq, "$read_speed1", 1),
- (assign, reg50, 500),
- (else_try),
- (eq, "$read_speed2", 1),
- (assign, reg50, 500),
- (try_end),
- (ge, ":var_2", reg50),
复制代码
|
注意这里必须严格按照我下图的格式进行修改,不然会出问题的。
修改完成编译成txt,覆盖掉原来的txt代码,然后记得修改代码行数哦!!!
step5:添加获取方式(和市长对话)
先让我们来梳理一下对话流程:
① 获取上卷:和市长关系有10点(条件),触发对话并获取上卷(实际实现)。
① 获取下卷:和市长关系有20点(条件),触发对话并获取下卷(实际实现)。
所以这里我们的代码就有4个部分,分别是两个条件和两个实现:
- (is_between, "$g_talk_troop", "trp_town_1_mayor", "trp_village_1_elder"),
- (eq, "$give_book_dbk1", 0),
- (store_free_inventory_capacity, ":tmp_player_free_cap"), # 如果玩家物品栏满了,则不触发
- (gt, ":tmp_player_free_cap", 0),
- (party_get_slot, ":var_0", "$current_town", slot_center_player_relation), # 获取村庄或者城镇的关系
- (ge, ":var_0", 10),
复制代码
|
- (troop_add_item, "trp_player", "itm_pendor_improve_read_first"),
- (assign, "$give_book_dbk1", 1),
复制代码
|
- (is_between, "$g_talk_troop", "trp_town_1_mayor", "trp_village_1_elder"),
- (eq, "$give_book_dbk2", 0),
- (store_free_inventory_capacity, ":tmp_player_free_cap"), # 如果玩家物品栏满了,则不触发
- (gt, ":tmp_player_free_cap", 0),
- (party_get_slot, ":var_0", "$current_town", slot_center_player_relation),
- (ge, ":var_0", 20),
复制代码
|
- (troop_add_item, "trp_player", "itm_pendor_improve_read_second"),
- (assign, "$give_book_dbk2", 1),
复制代码
|
好了,源码贴出来了,接下来给大家一个模板,大家要做的就是把源码编译成txt,然后按照对应位置连带上中括号一起覆盖掉,填上去就行了。
注意这里编译出来的txt如果全选复制,最后会默认加上一个空格,所以记得删掉一个多的空格。
- dlga_start:give_book_dbk1 4095 1389 6 <获取上卷的条件txt代码> Thank_you_for_you_have_take_care_of_us,{sire/madam},_we_will_never_forget_your_help._Please_accept_this_encyclopaedia_as_our_gift._It_eas_wrote_bu_several_famous_scholars_together_in_this_country,_but_some_volume_have_been_lost_in_the_years_of_war._It_will_help_you_for_sure_although_it_is_not_so_complete. 62581 2 <获取上卷的实际实现txt代码> NO_VOICEOVER
- dlga_give_book_dbk1:give_book_dbk1_2 69631 62581 0 Oh...it's_wonderful._thank_you_for_this. 62582 0 NO_VOICEOVER
- dlga_give_book_dbk1_2:close_window 4095 62582 0 It's_my_honour,_{sire/madam}. 6 0 NO_VOICEOVER
- dlga_start:give_book_dbk2 4095 1389 6 <获取下卷的条件txt代码> You_earned_great_reputation_along_the_people_here,_{sire/madam},_it's_our_honour_to_have_such_a_great_and_reliable_lord_like_you!_This_book_is_left_by_a_rhymist_long_long_ago,_and_he_told_to_give_it_to_a_person_who_are_worthful_to_it._I_cann't_find_another_person_except_you._It_is_not_unabridged,_but_if_you_can_find_the_other_part_of_it,_then_its_value_is_far_more_greater_than_it's_now. 62584 2 <获取下卷的实际实现txt代码> NO_VOICEOVER
- dlga_give_book_dbk2:give_book_dbk2_2 69631 62584 0 Great._I_have_looking_for_that_for_a_long_time,_and_now_it's_finaly_completed. 62585 0 NO_VOICEOVER
- dlga_give_book_dbk2_2:give_book_dbk2_3 4095 62585 0 Oh,_congratulations,{sire/madam}. 62586 0 NO_VOICEOVER
- dlga_give_book_dbk2_3:give_book_dbk2_4 69631 62586 0 This_complete_encyclopaedia_will_give_lots_of_helps,_you_have_done_well! 62587 0 NO_VOICEOVER
- dlga_give_book_dbk2_4:close_window 4095 62587 0 It's_my_honour_to_help_you,_{Mr/Mz}{playername}._May_God_be_with_you. 6 0 NO_VOICEOVER
复制代码 |
这个8行代码准备完毕之后,我们需要定位到我们代码需要放在什么位置,打开conversation.txt文件,然后搜索_I_am_the_guild_master_of_the_town,在这里位置的下面一行的下面一行,如图的位置,放我们刚刚准备好的代码 (记得计数器+8):
附带一个对话的完整源码,作为参考,看不懂的小伙伴可以不用管:
- # 开始和市长对话,关系满10触发:give_book_dbk1
- [anyone, "start",
- [
- #(this_or_next|is_between, "$g_talk_troop", "trp_village_1_elder", "trp_merchants_end"),
- (is_between, "$g_talk_troop", "trp_town_1_mayor", "trp_village_1_elder"),
- (eq, "$give_book_dbk1", 0),
- (store_free_inventory_capacity, ":tmp_player_free_cap"), # 如果玩家物品栏满了,则不触发
- (gt, ":tmp_player_free_cap", 0),
- (party_get_slot, ":var_0", "$current_town", slot_center_player_relation), # 获取村庄或者城镇的关系
- (ge, ":var_0", 10),
- ],
- "Thank you for you have take care of us,{sire/madam}, we will never forget your help. Please accept this encyclopaedia as our gift. It eas wrote bu several famous scholars together in this country, but some volume have been lost in the years of war. It will help you for sure although it is not so complete.", "give_book_dbk1",
- [
- (troop_add_item, "trp_player", "itm_pendor_improve_read_first"),
- (assign, "$give_book_dbk1", 1),
- ]],
- # 对话give_book_dbk1_2,紧跟give_book_dbk1
- [anyone|plyr, "give_book_dbk1",
- [
- ],
- "Oh...it's wonderful. thank you for this.", "give_book_dbk1_2", []],
- # 对话结束,紧跟give_book_dbk1_2
- [anyone, "give_book_dbk1_2",
- [
- ],
- "It's my honour, {sire/madam}.", "close_window", []],
- # 开始和市长对话give_book_dbk2,关系满20触发
- [anyone, "start",
- [
- #(this_or_next|is_between, "$g_talk_troop", "trp_village_1_elder", "trp_merchants_end"),
- (is_between, "$g_talk_troop", "trp_town_1_mayor", "trp_village_1_elder"),
- (eq, "$give_book_dbk2", 0),
- (store_free_inventory_capacity, ":tmp_player_free_cap"), # 如果玩家物品栏满了,则不触发
- (gt, ":tmp_player_free_cap", 0),
- (party_get_slot, ":var_0", "$current_town", slot_center_player_relation),
- (ge, ":var_0", 20),
- ],
- "You earned great reputation along the people here, {sire/madam}, it's our honour to have such a great and reliable lord like you! This book is left by a rhymist long long ago, and he told to give it to a person who are worthful to it. I cann't find another person except you. It is not unabridged, but if you can find the other part of it, then its value is far more greater than it's now.", "give_book_dbk2",
- [
- (troop_add_item, "trp_player", "itm_pendor_improve_read_second"),
- (assign, "$give_book_dbk2", 1),
- ]],
- # 对话give_book_dbk2_2,由对话give_book_dbk2触发
- [anyone|plyr, "give_book_dbk2",
- [
- ],
- "Great. I have looking for that for a long time, and now it's finaly completed.", "give_book_dbk2_2", []],
- # 对话give_book_dbk2_3,由对话give_book_dbk2_2触发
- [anyone, "give_book_dbk2_2",
- [
- ],
- "Oh, congratulations,{sire/madam}.", "give_book_dbk2_3", []],
- # 对话give_book_dbk2_4,由对话give_book_dbk2_3触发
- [anyone|plyr, "give_book_dbk2_3",
- [
- ],
- "This complete encyclopaedia will give lots of helps, you have done well!", "give_book_dbk2_4", []],
- # 对话结束,由对话give_book_dbk2_4触发
- [anyone, "give_book_dbk2_4",
- [
- ],
- "It's my honour to help you, {Mr/Mz}{playername}. May God be with you.", "close_window", []],
复制代码 |
|