- 好友
- 1
- 在线时间
- 0 小时
- 最后登录
- 2024-3-13
扈从
- UID
- 3096100
- 第纳尔
- 937
- 精华
- 0
- 互助
- 6
- 荣誉
- 2
- 贡献
- 10
- 魅力
- 249
- 注册时间
- 2019-8-16
鲜花( 25) 鸡蛋( 0)
|
本贴为任务系统教程,可以帮助大家完成任务的制作。而且我之前找了很久都没找到任务系统怎么做,所以只能自己研究做任务,因此现在才发这篇教程。其中在研究技术的时候也得到了论坛里边大佬的帮助,在此特别感谢@stevenxxy007的帮助,问了他很多问题,很多技术问题都是他帮我解决的。同时@在那悠远的苍穹、@JustinZCQ也在我学习技术的阶段给过我帮助,另外还翻了一些大佬的帖子,才算初步形成了自己技术的雏形吧!
好了,废话不多说,接下来是教程内容。
首先,做任务需要对变量和常量有一个基本的认识,这里采用先前学过的C来给大家讲解,因为这部分是任何语言的基础部分,不过PY里边的变量有些复杂,还是C里边的比较简化。
什么是变量?变量可以是任何英文字母、数字的组成,理论上12345、asdfg、1q2w3e、q1w2e3都可以是变量。不过通常而言,所谓的变量,要么就是类似name、work这种简单的英文单词,要么就是i、j、k、a、b、c这种英文字母,这两种形式出现的比较多,当然这个是在国外。在国内的话请自觉加上拼音这个选项,因为国人很多不会英文不是稀奇事,但是写代码必须用英文,因此会用拼音代替。
那么,为何要如此命名呢?我就是喜欢用诸如abcd的命名方式,可以不?当然可以,只要你能记得住,当然没问题了!但是一般除非是学习阶段小打小闹的程序,否则一个程序里几十个变量常量算少的,多的几百几千的有很多,只要你确定你能记住你每个变量的意思,分别对应的是哪些数据,一切都是可以的。当然假设你记不住的话。。。。。当然你也可以另外做个表格,把所有变量的意思记下来,不过这还不如用拼音呢,何况别人在修改或是读你代码的时候,也是使用单词或拼音更方便不是?
然而,这些说的是变量的命名规则。那么什么是变量呢?顾名思义,就是可变的量。比如说name这个变量,那么里边放的就是名字,在骑砍里就是trp_npc1,那么npc1后边的Borcha就相当于一个个独立的名字,而npc1相当于ID的概念。什么是ID,这个一会再解释,先说变量。那么这个时候name里的值是可变的,比如说Marnid也是name,Ymira也是name,所以说这个就叫变量,意思就是里边的值不是固定不变的。那么所谓常量,跟变量不同,里边的值是固定不变的了。
那么这里还有一个局部变量和全局变量的概念,局部变量又是啥?就是局部使用的变量,比如说我在当前的代码块里使用,出了当前的代码块就不用了,这叫局部变量。我在全局所有的程序里都用的,比如刚才说的name,这种就属于全局变量。顺便,:item_count这种是局部变量,$g_talk_troop这种是全局变量,也就是:单词代表局部变量,$单词代表全局变量,无论后边跟的是什么单词,而item_count及g_talk_troop都被视为单词。
那么回到刚才的问题,什么是ID?其实这个说的专业一点是叫唯一键,意思就是他是唯一的,不带重复的。比如说游戏里的训练场教练,游戏里总共有5个训练场教练,名字都是一样的。用过魔球的人都知道,实际上有5个重复的人,那么如何区分这5个人呢?这个时候就需要一个唯一键,这个唯一键通常都是ID。当然同理,你要喜欢也可以用name作为唯一键,这个不是问题。
|
那么回到帖子主题,任务模块的制作。在开始前推荐E文过关的童鞋去看看header_operations.py这个文件,很多用法都在这个文件里,我还有很多代码不会用,毕竟俺们E文太烂了
那么首先是第一个任务,此任务可广泛应用于各种收集物资,比如城市缺粮、收集物资等,好了,废话不多说,上代码。
(store_item_kind_count, ":item_count",itm_oil),
(ge, ":item_count", 1),
这个就是检测itm_oil这个道具是否满足需要,意思就是itm_oil代表的是items里的oil这个道具,store_item_kind_count代表计算部队拥有的指定类型的项目总数。默认部队是玩家。那么第一句的意思就是将oil放到:item_count变量里去,然后第二句是检测这个道具数量是否大于需要的数量。那么类似收集5袋小麦、5个面包、5桶酒这些,甚至是收集书籍等,都可以用这个代码实现。
收集武器我没试过,因为武器不容易买,有试过的可以说下怎么写代码。
|
跟随任务
(set_spawn_radius, 1), 设置距离用的
(spawn_around_party,"$g_encountered_party","pt_officials_caravan"),## 呼叫跟随者pt_officials_caravan
(assign, ":quest_target_party", reg0),
(party_set_ai_behavior, ":quest_target_party", ai_bhvr_track_party), 行为模式,更改ai_bhvr_track_party可变更行为模式
(party_set_ai_object, ":quest_target_party", "p_main_party"), 行为对象,更改p_main_party可变更行为对象
(party_set_flags, ":quest_target_party", pf_default_behavior, 0), 旗帜
(quest_set_slot, "qst_officials_caravan", slot_quest_target_party, ":quest_target_party"),
(quest_set_slot, "qst_officials_caravan", slot_quest_current_state, 0),
(str_store_party_name_link, s8, "p_town_7"), 将目标城市赋值给s8
(setup_quest_text, "qst_officials_caravan"), 将任务的标题写进任务列表
(str_store_string, s2, "@escort officials caravan to the town of {s8}."), 将任务的详情写进任务列表
(call_script, "script_start_quest", "qst_officials_caravan", "$g_talk_troop"), 开始qst_officials_caravan任务
(call_script, "script_end_quest", "qst_meeting"), 结束qst_meeting任务
(quest_set_slot, "qst_meeting", slot_quest_current_state,1), 将qst_meeting这个任务设置为1,这个应用非常广泛的。
(store_distance_to_party_from_party,":caravan_distance_to_destination","p_town_7","$caravan_escort_party_id"), 判断两个P之间的距离,那么这里就是判断caravan_escort_party_id跟p_town_7之间的距离。
(lt, ":caravan_distance_to_destination", 2), 判断距离值小于2
(quest_get_slot, ":quest_target_party", "qst_officials_caravan", slot_quest_target_party),
(remove_party, ":quest_target_party"), 移除队伍
(assign, "$g_leave_encounter", 1), 离开对话模式
(quest_set_slot, "qst_officials_caravan", slot_quest_current_state,1),
(check_quest_succeeded, "qst_officials_caravan"), 检测任务成功
|
(str_store_troop_name, s11, "$g_talk_troop"), 给于任务的人
(str_store_troop_name_link, s13, "trp_knight_1_15"), 送信的对象,就是送给谁的
(str_store_party_name_link, s14, "p_castle_25"), 送信的对象所在的城市
(setup_quest_text,"$random_quest_no"),
(str_store_string, s2, "@{s11} asked you to deliver a message to {s13}, who is imprisoned at {s14}."),
(quest_set_slot, "qst_deliver_message", slot_quest_current_state,1),
(quest_set_slot, "qst_yamila", slot_quest_current_state,2),
(call_script, "script_start_quest", "qst_deliver_message", "$g_talk_troop"),
这个任务里,除了将qst_deliver_message设置为1外,我还将qst_yamila设置为2。这里要说明下,在与NPC对话时,如果一个NPC处理多个任务,有时候就需要将任务设置为2或是3。因为初期默认所有的值都是0,因此如果将任务设置为0,那么就是哪个任务的对话先跑,就按哪个任务来,不管先前有没有做过。因此有时候需要设置为0以外的数字,避免重复做相同的任务。
|
接着基础的代码基本没了,因为调查某个地方还有刺杀以及劫狱的任务我也没搞出来。接着是进阶的:
首先是攻城的任务,怎么写任务信息的就不说了,教过了,主要是module_game_menus.py这个文件里。
找到castle_taken_2,这个是你加入王国后,攻下一座城市,然后国王给你册封的代码块。
(try_begin), 运算开始
(eq,"$g_encountered_party","p_ailun"), 判断城市是不是需要的那个城市
(succeed_quest,qst_attack_ailun), 任务是否成功
(quest_set_slot, "qst_attack_ailun", slot_quest_current_state,1),
(display_message,"str_npc19",0xFF99FF), 显示str_npc19的信息,0xFF99FF是颜色代码
(try_end), 运算结束
其实我这里没写封城市的代码,因为这个是交任务的时候封的。如果需要直接封,那么可以直接写上去就行了(大概)。因此这段代码只是判断这个任务是否完成,如果完成的话,把qst_attack_ailun设置为1,以便后续操作。try_begin需要加在最外层,还有最好先用display_message看一下是否起作用,防止因为嵌套而不起作用。
(call_script, "script_give_center_to_lord", "p_ailun", "trp_player", 0),
真正封城市的是这句,自己解读了哈。
|
击杀特定的队伍
这个我现在用的是击杀英雄队伍,然后在module_game_menus.py文件里,找到script_cf_check_hero_can_escape_from_player这串代码,在后边加了一句(neq,":stack_troop","trp_npc3"),然后问题解决,当然前提是你攻击的队伍本身是可以抓的。
不过据说这会碰到一个问题,就是这个英雄再也跑不掉,永远都能被抓住。因此有高手帮忙解决一下这个bug。
另外,队伍本身的设置:
["npc3","Ymira","Ymira",tf_female|tf_hero, 0, reserved, fac_outlaws, trp里把这个NPC的阵营改成不 法 之 徒 跟其他阵营都是敌对关系,当然也可以新建一个阵型。
("yamila","yamila",icon_bandit_lair|pf_quest_party|pf_is_static|pf_hide_defenders,0,fac_neutral,bandit_personality,[(trp_npc3,1,1),(trp_bandit,8,15),(trp_sea_raider,12,20)]), 队伍模版里记得也要改下阵营,我这里改成的是中立阵营。
[trp_npc3,"start", [(eq,"$talk_context",tc_hero_defeated),],"*****", "yizei5"
击败后的对话,(eq,"$talk_context",tc_hero_defeated),的作用是自动触发对话用的。
|
这样就可以做出攻击盗贼营地、攻城、收集物资、送信、攻击某个贵族等任务,那么运用好这些任务,一个
|
评分
-
查看全部评分
鲜花鸡蛋咸鱼圣代 在2023-9-17 18:13 送朵鲜花 并说:我非常同意你的观点,送朵鲜花鼓励一下 半世尘埃 在2021-5-10 21:45 送朵鲜花 并说:我非常同意你的观点,送朵鲜花鼓励一下 半世尘埃 在2021-5-10 21:45 送朵鲜花 并说:我非常同意你的观点,送朵鲜花鼓励一下 半世尘埃 在2021-5-10 21:44 送朵鲜花 并说:我非常同意你的观点,送朵鲜花鼓励一下 淋雨 在2021-2-19 19:24 送朵鲜花 并说:我非常同意你的观点,送朵鲜花鼓励一下
|