骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
查看: 26483|回复: 13

[综合] 基础script完全共享计划

[复制链接]
鲜花(2241) 鸡蛋(8)
发表于 2013-12-2 13:52:47 | 显示全部楼层 |阅读模式
本帖最后由 rubik 于 2013-12-4 12:58 编辑

如题,MS的header_operations.py提供了很多直接的操作,也可称函数,但是依然有很多比较基础的,比较频繁会用到的函数是没有的,需要Modder自己写script来实现,比如header_operations.py里有一条:
player_has_item                 = 150 # (player_has_item,<item_id>),

这个只是针对玩家的,以判断玩家是否有某件物品。但很多时候,需要更广义一点的,即判断某个troop是否有某件物品。这个时候就需要写一个简单的script。

  ("cf_troop_has_item",
    [
      (store_script_param, ":troop_no", 1),
      (store_script_param, ":item_no", 2),
      
      (assign, ":has_item", 0),
      (troop_get_inventory_capacity, ":inv_size", ":troop_no"),
      (try_for_range, ":i_slot", 0, ":inv_size"),
        (troop_get_inventory_slot, ":cur_item", ":troop_no", ":i_slot"),
        (eq, ":cur_item", ":item_no"),
        (assign, ":has_item", 1),
        (assign, ":inv_size", 0), #break
      (try_end),
      (eq, ":has_item", 1),
  ]),

这样,就扩展到所有的兵种了。使用的时候直接引用即可,如:
(call_script, "script_cf_troop_has_item", ":troop_no", ":item_no"),

以上是引子,开这个帖子的目的是要发起一个计划:基础script完全共享计划。欢迎各位Modder能够积极贡献自己写的一些基础script。

回帖格式为:
script的具体作用
参数解释
具体内容
.....


script的具体作用
参数解释
具体内容
.....


每个script用分割线隔开,分割线代码为:[ hr] (去掉h前的空格)
script的具体内容最好折叠起来。








鲜花鸡蛋

ancienlee  在2018-8-29 00:59  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
但愿海波平  在2015-9-26 18:36  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
jdie  在2014-11-21 23:02  送朵鲜花  并说:鲜花送上,但建议LZ制作一个索引,这样共享的更有操作性
鲜花(2241) 鸡蛋(8)
 楼主| 发表于 2013-12-2 13:58:32 | 显示全部楼层
本帖最后由 rubik 于 2013-12-7 17:46 编辑

下面script的作用为:判断某个兵种是否有某件装备。
参数1代表兵种ID。
参数2代表物品ID。
(点击展开 / 收起)



下面script的作用为:获得一个部队里面有几个英雄。
参数1为部队的ID,绝大多数情况下,引用的时候填p_main_party(玩家部队),因为别的部队要么没有英雄,要么只有一个英雄。
参数2为是否排除受伤的英雄,引用的时候,填1代表排除受伤的,0代表不排除受伤的。
(点击展开 / 收起)



下面script的作用为:获取一个部队的满员率。
返回值为reg0,是乘过100的,范围通常为0~100,。这个script多用于AI部队,由于AI部队的人数上限是软上限,所以这个返回值很可能会超过100。
(点击展开 / 收起)



下面script的作用为:获得一个英雄(领主,国王,玩家等)的领地情况。有4个返回值,可根据自己MOD的需要来使用部分返回值,不必一次全用。
返回值reg0为英雄拥有领地的总积分,积分规则和Native一样:城镇积4分,城堡积2分,村子积1分。
返回值reg1为英雄拥有的城镇数量。
返回值reg2为英雄拥有的城堡数量。
返回值reg3为英雄拥有的村子数量。
(点击展开 / 收起)



下面script的作用为:获取战场里面,某一方弓箭手的比例。
参数1为是否是友军,填1的话,就是获取友军的弓箭手比例,填0的话就是获取敌军的弓箭手比例。
返回值为reg0,即弓箭手比例,范围0~100。
注:战场上,非敌即友,所以“友军”涵盖玩家部队以及和玩家站一边的所有友军部队。
(点击展开 / 收起)



下面script的作用为:判断一个兵种是否可以使用某件装备
参数1为兵种ID
参数2为物品ID
参数3为物品前缀
返回值为reg0,为1则是可以使用,为0则是不能使用
(点击展开 / 收起)



下面script的作用为:获取某兵种身上某种类型的装备的数量
参数1为兵种ID
参数2为物品类型
返回值为reg0,为该类型物品的数量
(点击展开 / 收起)



下面script的作用为:获取一个部队里的骑兵比例
参数1为部队ID
返回值为reg0,为骑兵比例,范围0~100
(点击展开 / 收起)



下面script的作用为:获取某个部队里某种士兵受伤的人数
参数1为部队ID
参数2为兵种ID
返回值为0,为该种士兵受伤的人数
(点击展开 / 收起)



下面script的作用为:判断两个部队是否完全相同
参数1为部队1
参数2为部队2
(点击展开 / 收起)



下面script的作用为:获取某个agent周围有多少个敌人
参数1为agent的ID
参数2为检测的距离
(点击展开 / 收起)



下面script的作用为:给某个部队按士兵阵营,等级,兵种优先级排序
参数1为部队ID
(点击展开 / 收起)



下面script的作用为:完全复制一个兵种的物品栏到另外一个兵种
参数1为来源兵种
参数2为目标兵种
(点击展开 / 收起)



下面script的作用为:一次性卖掉玩家部队里的所有俘虏(英雄除外),一般用在玩家同赎金经纪人的对话里
(点击展开 / 收起)



下面script的作用为:记录敌我双方英雄的杀敌和伤敌数据到字符串s0里面
(点击展开 / 收起)



下面script的作用为:获取某个兵种物品栏里随机的一件武器
参数1为兵种ID
返回值为reg0,为获取的武器ID,-1则表示兵种物品栏没有武器
(点击展开 / 收起)



下面script的作用为:兵种之间转让金钱
参数1为付钱方
参数2为收钱方
参数3为转让的数量
(点击展开 / 收起)



下面script的作用为:获取兵种的最大HP(native的标准算法)
参数1为兵种ID
返回值为reg0,为兵种的最大HP
(点击展开 / 收起)



下面script的作用为:整理某个兵种身上的食物
参数1为兵种ID,基本上就是trp_player。极个别MOD,领主部队也消耗食物,这个参数有就是领主的ID了
注:整理的方法为,把几份同种的不满份的食物尽量凑出满份的,腾出尽可能多的物品栏出来
(点击展开 / 收起)





评分

参与人数 1荣誉 +1 第纳尔 +20 互助 +2 收起 理由
Cain + 1 + 20 + 2 您的帖子很有价值!

查看全部评分

鲜花鸡蛋

亚历山大东征  在2014-5-18 23:16  送朵鲜花  并说:不占樓,送花
鲜花(585) 鸡蛋(44)
发表于 2013-12-2 18:54:28 | 显示全部楼层
本帖最后由 海涵狮心王理查 于 2015-6-25 12:58 编辑


script名前面的那个cf_有什么意义么?昨天写自己的脚本时编译出错,好像要加cf_。。新手不知道这个cf_是什么作用,求解释。。另外R大是否允许回复中进行提问?
很多功能我平常都是即用即写的,很少写成独立的script,刚刚开始写mod,所以这么做倒也没太麻烦,估计工作量上去后就不行了。。


按照战团自带的部队实力统计方式,比较两支部队的实力
参数1:部队1  参数2:部队2
输出:部队1的实力大于等于部队2时,reg0=1;部队1的实力小于部队2时,reg0=2
(点击展开 / 收起)

鲜花(2241) 鸡蛋(8)
 楼主| 发表于 2013-12-2 19:43:19 | 显示全部楼层
本帖最后由 rubik 于 2013-12-2 20:29 编辑
海涵狮心王理查 发表于 2013-12-2 18:54
script名前面的那个cf_有什么意义么?昨天写自己的脚本时编译出错,好像要加cf_。。新手不知道这个cf_是什 ...


cf是can fail的意思,字面意思是可能会失败,实际的作用是用一条script来作为判断条件,可能成立,也可能不成立。不成立的话,代码执行到这个script就会停止,后面的就不会执行了。

用一条script来作为判断条件和用一个header_operations.py提供的操作作为判断条件是一回事,只不过很多情况下,需要写比较复杂的一些判断,这不是header_operations.py提供的一条操作或几条操作就能实现的,而是需要很多操作和各种判断写到一条script才能实现。

编译的过程中如果提到cf,首先要确定自己是否真要写一条can fail的script,如果不是的话,可以用下列结构把整个代码主体给括进去。
(try_begin),

(try_end),
这样,一定不会fail,这条script执行完后,后面的代码可以继续执行。

鲜花鸡蛋

海涵狮心王理查  在2013-12-2 20:14  送朵鲜花  并说:多谢R大指点@_@
鲜花(585) 鸡蛋(44)
发表于 2013-12-3 19:34:50 | 显示全部楼层
rubik 发表于 2013-12-2 19:43
cf是can fail的意思,字面意思是可能会失败,实际的作用是用一条script来作为判断条件,可能成立,也可 ...

顺带想问一下关于slot的问题,r大教程里说一个对象可以有256个slot,但前几天试图启用slot时发现party的slot编号已经到了三百多,是我理解错了还是现在slot上限不是256个了?

点评

那是多少了啊?难道达到了65536?  发表于 2015-1-6 12:14
不是256了  发表于 2013-12-9 18:12

鲜花鸡蛋

邓禾盛  在2016-7-27 08:01  送朵鲜花  并说:泡菜统率力的槽就达到了500,实际上槽上限应该是21亿左右
鲜花(1885) 鸡蛋(61)
发表于 2013-12-3 22:10:22 | 显示全部楼层
支持.占个楼等有空再来编辑.

鲜花(179) 鸡蛋(2)
发表于 2015-9-2 21:49:37 来自手机 | 显示全部楼层
本帖最后由 sheng1021z 于 2015-9-3 14:55 编辑

好了,昨天占楼,今日来编辑一个吧,这个脚本我是应用于多方面的。
例如处决领主,将不想要的领主清空等等。
  # script_get_troop_clear #清除兵种
  # Input: arg1 = troop_id
  ("get_troop_clear",
  [
    (store_script_param_1, ":clear_lord"),#第一个参数,也就是将要清除的兵种
(try_begin),
      (troop_slot_eq,":clear_lord",slot_troop_chujue, 1),#这一句,我是为了方便我自己引用而加,你们加不加无所谓
      (store_troop_faction,":l_fac", ":clear_lord"), #获取兵种阵营
   (faction_get_slot, ":l_fac_leader", ":l_fac", slot_faction_leader),#获取阵营的领导者
   (try_for_range,":cur_center", centers_begin, centers_end),#循环所有中心
     (store_faction_of_party,":cur_faction",":cur_center"),#获取中心的阵营
  (eq, ":cur_faction", ":l_fac"),#如果与兵种阵营相同
  (party_slot_eq,":cur_center",slot_town_lord, ":clear_lord"),#兵种是该中心领主
  (call_script,"script_give_center_to_lord", ":cur_center",":l_fac_leader", 0),#把中心给阵营的领导者
   (try_end),
      (call_script,"script_change_troop_faction", ":clear_lord","fac_no_faction"),#改变兵种的阵营
   (troop_set_slot,":clear_lord",slot_troop_occupation,slto_inactive),#设置兵种是不活跃的
   (troop_set_note_available, ":clear_lord",0),#设置兵种信息不可用
   (troop_set_faction, ":clear_lord", "fac_no_faction"),#设置兵种阵营
   (troop_set_slot,":clear_lord",slot_troop_renown, -1),#设置兵种声望
   (troop_set_slot, ":clear_lord", slot_troop_father, -1),#无父亲
   (troop_set_slot, ":clear_lord", slot_troop_mother, -1),#无母亲
   (troop_set_slot, ":clear_lord", slot_troop_guardian, -1),
   (troop_set_slot, ":clear_lord", slot_troop_spouse, -1),
   (troop_set_slot, ":clear_lord", slot_troop_betrothed, -1),
   (troop_set_slot, ":clear_lord", slot_troop_prisoner_of_party, -1),#没有被俘虏
   (troop_set_slot, ":clear_lord", slot_troop_wealth, 0),#财富是0
      (troop_get_slot,":lord_party", ":clear_lord", slot_troop_leaded_party),#获取兵种领导的队伍
   (try_begin),
     (party_is_active,":lord_party"),#队伍是活跃的
  (neq, ":lord_party", "p_main_party"),#不等于玩家队伍
  (remove_party,":lord_party"),#将队伍清除
     (troop_set_slot,":clear_lord",slot_troop_leaded_party, -1),#设置兵种不可以带兵
   (try_end),
(try_end),

]),

总体代码就这么简单。

评分

参与人数 1第纳尔 +20 互助 +1 收起 理由
蛋清 + 20 + 1 原创内容,值得鼓励!

查看全部评分

鲜花鸡蛋

但愿海波平  在2015-9-26 18:39  送朵鲜花  并说:我非常同意你的观点,送朵鲜花鼓励一下
鲜花(1444) 鸡蛋(50)
发表于 2015-10-5 13:03:45 | 显示全部楼层
本帖最后由 蛋清 于 2015-10-25 16:31 编辑

#添加国家初始军队
  # script_simple_party_add
  # Input: arg1 = faction_id
  ("simple_party_add",
    [
      (store_script_param_1, ":fac"),
          (store_script_param_2, ":party"),
        (faction_get_slot,":t1",":fac",slot_faction_tier_1_troop),
        (faction_get_slot,":t2",":fac",slot_faction_tier_2_troop),
        (faction_get_slot,":t3",":fac",slot_faction_tier_3_troop),
        (faction_get_slot,":t4",":fac",slot_faction_tier_4_troop),
                   (store_random_in_range,":p1",10,20),
                   (store_random_in_range,":p2",5,10),
                   (store_random_in_range,":p3",15,20),
                   (store_random_in_range,":p4",5,10),
          (party_force_add_members,":party",":t1",":p1"),
          (party_force_add_members,":party",":t2",":p2"),
          (party_force_add_members,":party",":t3",":p3"),
          (party_force_add_members,":party",":t4",":p4"),
     ]),


很无聊的script,用于给指定队伍按等级阶梯刷新对应国家的士兵

评分

参与人数 1魅力 +1 收起 理由
ヤ鋆╮哥メ + 1 文章不错,继续努力!

查看全部评分

鲜花鸡蛋

1105903081  在2016-1-16 21:07  送朵鲜花  并说:我非常同意能和你请教下各阵营兵种是如何调用的吗?我给(某个意淫王国)加了文化、兵种模板、领主以及城堡等,但是打开游戏后领主都不招兵了,一个人呆在城堡里不动。你的观点,送朵鲜花鼓励一下
鲜花(54) 鸡蛋(0)
发表于 2015-10-18 23:28:43 | 显示全部楼层
rubik 发表于 2013-12-2 19:43
cf是can fail的意思,字面意思是可能会失败,实际的作用是用一条script来作为判断条件,可能成立,也可 ...

R大, 当script里有判断条件时(不用try...括起来), 判断条件失败时, 我实测加不加cf的话, 后面的都不执行了
好像cf 没有实际意义    难道 仅表示这个script是可以失败的, 你回答是这个意思吗
代码如下, 去掉cf,后面的(assign, ":damage_value", 0),同样不执行
(try_begin),#test
        (assign, ":test", 1),
        (call_script, "script_cf_can_fail", ":test"),
        (assign, ":damage_value", 0),       
(try_end),
("cf_can_fail",
[
        (store_script_param_1, ":parent"),
        (gt,":parent", 10),
]),
鲜花(2241) 鸡蛋(8)
 楼主| 发表于 2015-10-18 23:41:30 | 显示全部楼层
本帖最后由 rubik 于 2015-10-18 23:44 编辑
丶飘丶零丶 发表于 2015-10-18 23:28
R大, 当script里有判断条件时(不用try...括起来), 判断条件失败时, 我实测加不加cf的话, 后面的都不执行了 ...

cf_是起提示作用的,不加的话,也有判断的效果,不成立的时候,后面也不执行。 加上cf_,自己调用这个script的时候,一眼就看出这个带有判断性,不会和那些不会fail的script搞混。另外,加上cf_,可以避免每次都报错。
鲜花(273) 鸡蛋(0)
发表于 2016-1-13 20:59:25 | 显示全部楼层
rubik 发表于 2013-12-2 13:58
下面script的作用为:判断某个兵种是否有某件装备。
参数1代表兵种ID。
参数2代表物品ID。

R 大,能不能 吧你,战斗的适合,杀死敌人,根据NPC智力来获取额外经验,和 根据武器大师等级,来获取额外熟练度的代码!我想用力啊参考学习,作战时的代码写法, 我是刚入门基本,不选出来的话,在众多代码里面,完全找不出来是哪一条!
鲜花(50) 鸡蛋(3)
发表于 2016-7-29 20:26:01 | 显示全部楼层
本帖最后由 邓禾盛 于 2016-7-29 23:11 编辑

":var_stack" #获取"p_main_party"的堆数量(暨最大堆ID+1) #第二次循环时获取俘虏堆数量
":var_i" #循环变量
":var_trp" #兵种
":var_amount" #兵种数量
":var_aim" #目标城堡
":var_type" → 参数2 #放置的方法,若为0则全部放置,为1时不放置非俘虏,为2时不放置俘虏。

把主角部队的成员含俘虏(英雄类除外),全部转移进目标城堡
("move_troop_from_main_party_to_aim",
[
(store_script_param_1,":var_aim"),
(store_script_param_2,":var_type"),
(try_begin),
  (neg|eq,":var_type",1)
  (party_get_num_companion_stacks,":var_stack","p_main_party"),
  (try_for_range,":var_i",0,":var_stack"),
    (party_stack_get_troop_id, ":var_trp","p_main_party",":var_i"),
    (try_begin),
      (neg|troop_is_hero,":var_trp"),
      (party_stack_get_size,":var_amount","p_main_party",":var_i"),
      (party_remove_members,"p_main_party",":var_trp",":var_amount"),
      (party_add_members,":var_aim",":var_trp",":var_amount"),
    (try_end),
  (try_end),
(try_end),
(try_begin),
  (neg|":var_type",2),
  (party_get_num_prisoner_stacks, ":var_stack","p_main_party"),
  (try_for_range,":var_i",0,":var_stack"),
    (party_get_prisoner_stack_troop, ":var_trp","p_main_party",":var_i"),
    (try_begin),
      (neg|troop_is_hero,":var_trp"),
      (party_get_prisoner_stack_size,":var_amount","p_main_party",":var_i"),
      (party_remove_prisoners,"p_main_party",":var_trp",":var_amount"),
      (party_add_prisoners,":var_aim",":var_trp",":var_amount"),
    (try_end),
  (try_end),
(try_end),
]),


下面这个是部队显示性格,额这个已经是直接能复制进魔球的程度了

(try_for_parties,":var_0"),
(1652,":var_1",":var_0",0),
(assign,":var_3","str_personality_archetypes"),
(try_begin),
(1507,":var_1"),
(troop_get_slot,":var_2",":var_1",52),
(store_add,":var_4",":var_3",":var_2"),
(party_set_extra_text,":var_0",":var_4"),
(try_end),
(try_end),
鲜花(7) 鸡蛋(0)
发表于 2017-9-3 12:51:20 | 显示全部楼层
rubik 发表于 2013-12-2 13:58
下面script的作用为:判断某个兵种是否有某件装备。
参数1代表兵种ID。
参数2代表物品ID。

怎样判断阵营是否处于战争中?
鲜花(7) 鸡蛋(0)
发表于 2017-9-10 20:15:12 | 显示全部楼层
rubik 发表于 2013-12-2 13:58
下面script的作用为:判断某个兵种是否有某件装备。
参数1代表兵种ID。
参数2代表物品ID。

骑马与砍杀中 判断是否小于的 lt 是不是有什么问题呢,如果是有问题那么要判断是否小于的时候该怎么版呢?
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站 ( 鄂ICP备07001403号 )

GMT+8, 2018-9-19 03:55 , Processed in 0.450623 second(s), 57 queries , Gzip On, Memcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表