| 
好友3
 在线时间27 小时
 最后登录2025-10-26
 
 贵族[MOD作者]   
 UID3048044
 第纳尔2234 
 精华0
 互助21 
 荣誉3 
 贡献20 
 魅力516 
 注册时间2018-12-15
 
   鲜花(45 )   鸡蛋(0 ) | 
 
| 本帖最后由 黑暗路西法 于 2022-5-19 14:35 编辑 
 借鉴(cahoxi)了有限幻想前辈, 圣殿骑士的光辉前辈,hushuailiner2前辈的教程,主攻俺寻思搞出了一个城镇招兵的代码,纯新手向,适合和我一样还没搞明白py但想diy的人入门
 (大佬就不用看了,想必米娜桑都是有自己解决方法的)
 
 帮助兼讨论:村庄招兵代码 分析 及修改 (参考了在玩家没有势力的情况下招别的东西)
 https://bbs.mountblade.com.cn/thread-251902-1-1.html
 
 
 【分享】一个简单的城镇招兵功能(想加独立菜单的需要参考这个)
 https://bbs.mountblade.com.cn/thread-1881038-1-1.html
 
 给玩家城镇添加招兵菜单  (PY分享)(参考了控制文化和关系)
 https://bbs.mountblade.com.cn/thread-1559344-1-1.html
 
 
 存放代码的位置可以参考上面两个帖子里的
 
 ("功能名字",[                 条件
 (this_or_next|party_slot_eq, "$g_encountered_party", slot_party_type, spt_town),   检查城市或城堡,如果单独检查一个可以把
 (party_slot_eq, "$g_encountered_party", slot_party_type, spt_castle),  可以换成 (party_slot_eq, "$g_encountered_party", slot_party_type, spt_village),塞到村庄里
 (store_troop_gold,":wanjiaqian","trp_player"),      检查玩家是否有足够的钱,可以修改或去掉
 (ge,":wanjiaqian", 数字),
 (player_has_item,"物品"),原文里就有的条件
 (troops_can_join, 数字),        玩家部队剩余的位置
 (party_get_slot, ":guanxi", "$g_encountered_party", slot_center_player_relation),
 (ge,":guanxi", 大于的数字),    检查地点和玩家的关系
 (eq, "$soldier6", 0),  这个是针对于全局的,如果准备用slot版本可以换一个
 ],
 "存在感极低的功能名字",[ 结果
 (party_get_slot, ":wenhua", "$g_encountered_party", slot_center_culture),
 (store_faction_of_party, ":wenhua","$g_encountered_party"),
 (faction_get_slot,reg50,":wenhua",slot_faction_tier_2_troop),    (学来的检查文化代码,我这里用tier2是在自己的mod里一个势力搞了三条兵种树,tier2是正规军和村兵区别开) (实际上constant里面可以注册tier6789的,py里有预留位置,在script搜各国tier照葫芦画瓢就行了)
 (try_begin),(主攻俺寻思寻思出来的一个思路(为了显得自己不是纯缝合的大可爱),用于给不同的玩家)
 (this_or_next|eq, ":center_faction", "fac_player_supporters_faction"),(从分析村庄帖子里学来的如何检查玩家阵营)
 (eq, ":center_faction", "$players_kingdom"),  (如果玩家势力同属一个则什么都不会发生)(还可以把这一块顺序调换,比如你的mod里玩家有对应神器就优先选择有神器情况下能招募的兵,放在无事发生上面)
 (else_try),
 (main_party_has_troop,"trp_npc13"), (俺寻思出来的东西,在有特定npc的时候控制“别的东西”为一个兵种,可以改成任意东西,一种思路)
 (assign,reg50, "兵种"),
 (else_try),
 (store_random_in_range,reg50,0,10),(如果这个城市不是玩家所属势力,则给玩家塞别的东西,这是个百分比概率可以换成所有数字,下面跟上就可以了)
 (is_between,reg50,0,3),
 (assign,reg50, "兵种a"),
 (else_try),
 (is_between,reg50,3,6),
 (assign,reg50, "兵种b"),
 (else_try),
 (is_between,reg50,6,10),
 (assign,reg50, "兵种c"),
 (try_end),
 (party_add_members,"p_main_party",reg50,数字),   (添加变量的兵种)(同色部分属于一个东西,如果你的预设只是本文中的一部分,那么把不需要的同色删掉就可以了)
 (troop_remove_gold,"trp_player",钱),
 (troop_remove_item,"trp_player","物品"),
 (assign, "$soldier6", 1),   接上面同款颜色的代码,接下来你可以在trigger里面搞点便宜触发器或者不搞来制造一次性界面
 ]),
 
 
 
 潜水几年的第一帖,好歹是脱离纯参考阶段了
 
 
 
 2022/5/19更新 拓展部分  知识水平要求搞明白局部变量的相互关联,以及能看懂一部分代码
 
 slot版本(也就是每个据点独立计算招募cd)
 首先跑constant那里注册一个party的slot     搜索##  PARTY SLOTS            #############################能找到这个栏目
 之后将上方紫色的文字部分替换,首先是条件栏目里的检查全局变量(eq, "$soldier6", 0),
 改为
 (party_slot_eq,"$g_encountered_party",slot_你起的名字,预期数值), #用于检查,比如说如果你单纯的想写成cd那么这里可以设置为0 #注意,如果你准备听了我下方那个加量小修改,这里应该修改为大于等于正数,也就是party_slot_eq改为ge,预期数值为正数
 这个预期数值是根据你的后续意愿更改的,如果只是单纯的检查是否能招募可以简单的检测cd可以用0,下面那个招募后cd用1
 
 将下方触发后的便宜全局变量(assign, "$soldier6", 1),修改改为
 (party_set_slot,"$g_encountered_party",slot_你起的名字,预期数值),  #用于覆盖,例如你只想做单纯的cd的话,这个情况下预期数值改为1#注意,如果你准备听了我下方那个拓展,这里应该修改预期数值为0,
 而招募次数则应该写的复杂点,改为
 ###############
 (party_get_slot,局部变量,"$g_encountered_party",slot_你起的名字),
 (val_sub,局部变量,数值), #这里扣除局部变量,等同削减招募次数
 (party_set_slot,"$g_encountered_party",slot_你起的名字,局部变量),
 ###############
 同上所述,因为条件改为要求大于等于正数,所以这里扣除次数如果到了0那么是无法接着招募的
 
 
 之后在trigger写一个触发器
 (检查时间,检查间隔, 0.0,
 [],                                            ##单纯作为cd的话没必要设置条件,更深入的修改例如检查玩家是否属于某个势力这种情况下我认为应该作为条件添加在下方的try_for_range里,如果是作为间隔检查一类(例如玩家有物品可以加快cd这种情况)可以多写几个克隆的触发器用于分开检测,运用还是很多的
 
 这里仅做一个简单例子,也就是上面简单cd话题的延续
 [
 (try_for_range, ":cur_center", centers_begin, centers_end),  #循环一遍算“据点”的部队
 (party_get_slot, 局部变量, ":cur_center", slot_你起的名字), #检查slot
 (eq,局部变量,触发后的数值), #如果你是根据上面那个搞未触发0触发了1那么这里填1
 (party_set_slot, ":cur_center", slot_你起的名字,原本数值),  #同上,这里填0
 (try_end),
 ]),
 这个实际上可以再做一点小拓展,例如如果你想做一些小联动,例如储存募兵次数之类的,那么可以在这里修改一下
 将下文
 (eq,局部变量,触发后的数值),
 (party_set_slot, ":cur_center", slot_你起的名字,原本数值),
 
 改为
 (val_add,局部变量,你的预期数值),
 (party_set_slot, ":cur_center", slot_你起的名字,局部变量),
 #举个例子,如果你想把这个拓展用在招募兵种的数量上面,那么之后你在(party_add_members,"p_main_party",reg50,数字), 这里,可以在他下方再加两行
 
 
 (party_get_slot,局部变量,"$g_encountered_party",slot_你起的名字),
 (party_add_members,"p_main_party",reg50,局部变量),
 
 
 #这样就是储存每次触发增长数值,隔长时间募兵可以一次性多招募一些,如果你想要一个硬上限,可以在检查slot里改一下,在val_add前面加一行(lt,局部变量,你的预期上限),就是少于这个上限才加储存的可招募士兵
 因为触发条件是大于等于所以这样添加了才能触发(见上注)
 如果你想把这个拓展用于招募次数上也可以,设置上限和后续修改同上注释即可,就是隔的时间长一点会增加招募次数,两个拓展如果是一起用我建议你搞两个slot
 
 然后这两个拓展的具体修改的后续上面也写了
 
 | 
 评分
查看全部评分
 鲜花鸡蛋幼稚园殺手  在2022-2-12 13:57  送朵鲜花   并说:我非常同意你的观点,送朵鲜花鼓励一下 |