请选择 进入手机版 | 继续访问电脑版

骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY UU
精品包
查看: 22281|回复: 22

[osp代码] 装备附加奖励批量设置方法(含单slot多信息存储,slot、string批量设置相关方法)

[复制链接]

84

主题

1466

帖子

2365

积分

子爵[版主]

游小明
枢机主教

Rank: 7Rank: 7Rank: 7

UID
74938
第纳尔
10668
精华
3
互助
125
荣誉
100
贡献
167
魅力
539
注册时间
2008-4-28

维京征服正版勋章

鲜花(1154) 鸡蛋(0)
发表于 2009-8-6 14:52:46 | 显示全部楼层 |阅读模式
本帖最后由 aliang227 于 2009-8-6 18:18 编辑

本文1楼为 装备附加奖励批量设置各类方法介绍,以及本人所写代码的详细注解
      2楼为 装备附加奖励批量设置完整代码
      3楼为 扩展部分,如套装的实现



关于装备的附加奖励,比如四围、技能、熟练度等奖励,很多MOD中都已经实现过,首先总结一下我所知道的一些实现方法:

1,利用mod system自带的script:#script_game_get_skill_modifier_for_troop
它的注释是:# This script is called from the game engine when a skill's modifiers are needed,也就是受game engine 所调用的,而使用起来也是最方便的一种,以其中一例说明:
(点击展开 / 收起)


因此,要获得装备奖励,我们可以类比写下:
(点击展开 / 收起)


这种附加适用于所有troop,而且加成后技能颜色是绿色的,同时使用及定义时也特别方便,不过很遗憾,系统自带的这个script只有这一种,也就是,只能附加技能,如果装备需要另附加四围或者熟练度,需要另写代码,因此这类方法用途有限。

2,利用全局变量与触发器的搭配,检测装备奖励

可以参照 魔方 的此贴:如何编辑PY代码实现特殊装备或套装附加奖励(就像TLD里的那样)http://bbs.mountblade.com.cn/viewthread.php?tid=12385),
以及 oo 的此贴:让战友们也享受装备奖励的快感^^http://bbs.mountblade.com.cn/viewthread.php?tid=24162),

主要思想帖子里都说的很详细了,我简单的介绍一下,以oo的帖子为例,是运用三个触发器:

   触发器1,检测玩家部队是否有人装备特殊装备
   触发器2,检测已装备特殊装备的兵种,并赋予奖励,存储被奖励者ID
   触发器3,检测卸下特殊装备,或装备者更换时,扣除卸下者奖励,增加装备者奖励

代码写的很精彩,同时效用明显,但是使用时也有一定局限性:首先是单个装备的全局变量运用较多,且当需要奖励的装备数量过多时,批量定义会变得不方便;然后是,仅限于独一无二的装备,如果某种装备有多个时,检测将会不准确,只使其中之一生效。
因此此类方法更适合于极品装备不多且唯一的情况。

3,利用装备前缀增加附加属性

此类方法是由oo原创,也就是泡菜及自由王国中的晶石打造系统,将一些不常用或废弃的前缀利用,加以附上特性,达到奖励的效果,这里就不多谈了。
这种方法适合于批量装备的定义,以及无troop和item限制的奖励。不过不是太适用于某独特装备的附加属性设置。


===================================================


以上三种方法即为我所知对装备进行附加奖励的方法,各有各的特点。不过本人在水浒的制作中想实现装备奖励,但遇到阻碍,因为首先极品装备比较多,其次极品装备不唯一,再次装备奖励需要包含四围、技能和熟练度等方面,还有需要对每个所装备的兵种都生效,因此以上几种方法都不能满足我理想中的要求。所以本人经过长时间思考,写了一段符合自己要求的代码,这里给大家介绍一下,与此同时,也介绍一些单slot多信息存储,slot、string批量设置的思想与相关方法,希望能对各位MODDER有所帮助。

首先介绍一下这段代码的基本思想,所有装备奖励的主体思想都是类似:
检测未装备,未奖励时,无动作——检测已装备,但未奖励时,给予奖励——检测已装备,已奖励时,无动作——检测未装备,已奖励时,扣除奖励
以前的奖励方法多用troop_has_item_equipped来检测,但是对于多种相同物品的装备检测很不方便,比如装备两把相同的极品枪,则需要用另外方法判定,同时,对于检测“变化”,也就是从无到有,从有到无,也不是很方便。而本人无意间在head_items.py里看到这段:
(点击展开 / 收起)
也就是说,利用troop_get_inventory_slot获取物品栏slot时,前9个分别对应了玩家现在的装备
因此,我同时给troop定义了类似slot
(点击展开 / 收起)
两者是分别对应的,一个是获取现在的装备,一个是将troop曾经的装备存储,当装备改变时,再检测改变的装备是否是特殊装备,如果是,则执行属性加成或减少。

而装备奖励繁多且乱的时候,收集起来批量设置也会方便很多,因此我也对item定义了如下slot:
(点击展开 / 收起)


这里介绍一下单slot多信息存储的方法,大家知道,slot一般用法是=0时为某条件,>0时为某条件;抑或为所有者存储某种数值,比如troop的各不相同的声望。但是,过多的slot对占有量会比较大,因此可以利用方法,在不影响可读性的条件下,给单slot定义某类相关的多信息,以 slot_item_add_attribute 为例:

在影响附加奖励时,四围奖励有两个信息:一个是属性id,也就是力量、敏捷、智力、魅力,分别对应ID为0,1,2,3;另一个是奖励的数值。而当我们存储时,可以将这两个信息同存在一个slot里,attribute的ID为0-3,一位数,奖励的数值是一位数以上,所以我们可以将奖励数值乘以10,再加上ID。

比如,我们需要给某种物品增加敏捷3点,也就是attribute的ID为1,奖励值为3,3×10=30,存于slot中就是31,如:
(item_set_slot,":item_id",slot_item_add_attribute,31),
而我们如何分别获取信息呢?可以分别利用store_mod取余数和store_div取除数,如:
(item_get_slot,":attribute",":item_id",slot_item_add_attribute),
(store_mod,":id",":attribute",10),   则id=1,即刚才存储的敏捷ID
(store_div,":value",":attribute",10),  则value=3,即刚才存储的奖励值3  [注:mod system里变量只存整数,小数部分是会自动舍去的]
这样就可以完成单个slot的多信息量存入与读取,上面的10就相当于位数分割,说明个位是一类值,十位以上是一类值。

再比如slot_item_add_skill,skill的ID是从0到41,所以我们需要把个位和十位存放ID,百位以上存放增量,再以
(store_mod,":id",":skill",100),   
(store_div,":value",":skill",100),
来获取,这里就要用100来进行分割获取了


这就是单个slot多信息量的存储方法,如果你愿意,单个slot可以存储3个或更多信息,不过我这里不大确定能存储的最大位数为多少。同时这种方法也适用于单个全局变量存储多个数值信息。但需要注意的是,最好确定低位变量的数值位数是固定的,这样才会方便进行分割位获取。


以上即为slot的定义,准备工作完毕,下面就在triggers.py里添加触发器了:

(点击展开 / 收起)

至此,触发器部分即已完毕,剩下的是物品的初始化部分,即赋给物品是否特殊,以及各奖励量,此部分可以在script.py中的初始化部分加入。不过,以上触发器由于全部是用局域变量以及slot构成,没有用到全局变量,因此加入是不必开档的,要想在途中加入此功能,只需要加入一个单次触发器即可,比如:

(点击展开 / 收起)

最后,不要忘记对quick_string.csv和string.csv中,对定义的string进行汉化。
至此,所有工作完毕。

总结一下我这段代码的特点,本代码适用于极品装备比较多,极品装备不唯一,装备奖励需要包含四围、技能和熟练度等多方面,还有需要对每个所装备的兵种都生效,这样的情况,当然,它是向下包含的,即使你要求没有那么多,也可以用此代码实现装备奖励。
同时,这段代码的缺点是,针对对象多,虽然尽量节省,但还是定义了多个slot槽。虽然只有一个触发器,但进行了多次循环,因此对资源的损耗会显多一些。
当然,各位modder可以按照自己的需要进行调整,优化,比如如果只需要玩家及NPC得到奖励,则可以将troop的循环调小;如果觉得批量信息slot不够理解,可以自行拆开;如果有其他想法,比如装备的养成,属性增加;再比如注入某能量后附加属性增加,等等想法都可以按照自己需要实现。
如果要求并没有这么多,完全可以利用我之前介绍的三种方法来实现。
总之,MOD的功能不在多,而在于是否适合MOD的背景于MODDER的想法;代码是死的,人是活的;代码是有限的,创意是无限的。

希望本文能给各位MODDER有所帮助。

评分

参与人数 2荣誉 +4 第纳尔 +35 互助 +3 收起 理由
索伦 + 3 + 15 + 2 NND真NB
foxyman + 1 + 20 + 1 好东西呀

查看全部评分

84

主题

1466

帖子

2365

积分

子爵[版主]

游小明
枢机主教

Rank: 7Rank: 7Rank: 7

UID
74938
第纳尔
10668
精华
3
互助
125
荣誉
100
贡献
167
魅力
539
注册时间
2008-4-28

维京征服正版勋章

鲜花(1154) 鸡蛋(0)
 楼主| 发表于 2009-8-6 14:53:18 | 显示全部楼层
本帖最后由 aliang227 于 2009-8-6 15:36 编辑

装备附加奖励批量设置完整代码

本代码仅供各位modder和玩家学习和交流用,可自行使用,修改,但如果需要用在你的MOD中,请注明出处及作者,谢谢!


1,module_constants.py中增加:(建议放在相应ID位置,且请确认该ID未被使用)

(点击展开 / 收起)


2,module_triggers.py中增加

(点击展开 / 收起)


3,module_scripts.py中,script_game_start里增加:

(点击展开 / 收起)


或在module_triggers.py里增加

(点击展开 / 收起)


4,module_strings.py里增加:

(点击展开 / 收起)


5,game_strings.csv中添加汉化:

(点击展开 / 收起)


6,quick_strings.csv中添加汉化:
(点击展开 / 收起)


7,完成

84

主题

1466

帖子

2365

积分

子爵[版主]

游小明
枢机主教

Rank: 7Rank: 7Rank: 7

UID
74938
第纳尔
10668
精华
3
互助
125
荣誉
100
贡献
167
魅力
539
注册时间
2008-4-28

维京征服正版勋章

鲜花(1154) 鸡蛋(0)
 楼主| 发表于 2009-8-6 14:53:25 | 显示全部楼层
本帖最后由 aliang227 于 2009-8-11 15:02 编辑

拓展运用方法

拓展1:如何利用此代码思想实现套装功能?

不知大家有没有发现这段代码有个局限的地方,就是附加属性时,只能附加一种ID属性,也就是比如增加四围时,只能增加力量或敏捷中的一种,不能两种同时一起加。
那如果有MOD需要此功能应该如何做呢?一种方法是同时存在一个slot里,再留几位来判断;另一种方法是,增加slot种类。我这里再介绍除此以外的第三种,以套装形式实现。

我这里以最基本的套装功能为例,即套装共N件装备,当某兵种同时装备上这N件装备时,套装实现,属性附加;当兵种缺少其中之一时,套装条件不符合,附加属性扣去。

首先,要实现批量定义,还是需要定义slot:
物品增加slot:slot_item_special_kind = 10
兵种增加slot:slot_troop_special_ek = 159


这两者的用处是什么呢?slot_item_special_kind 是用来给装备赋予套装ID值的,如哪些物品为套装1部件,则将其此值置1。这个可以在给予特殊物品附加属性的初始化中定义。
slot_troop_special_ek 是用来确定兵种的套装装备情况,同样,单ID存储多信息量,末位代表兵种的属性是否已经附加,是则置1,否则置0;其他位存储此兵种现在装备的套装ID。

我们设现在共有套装2件,套装1共有部件4个,套装2共有部件5个。首先在初始化中,给你需要的装备定义,也就是将套装1的四个部件slot_item_special_kind值置1,套装2的5个部件slot_item_special_kind 值置2。然后添加触发器如下:
可在上述同一触发器中,紧贴(troop_set_slot,":troop_id",":old_inventory_slot",":now_item_id"),即可

(点击展开 / 收起)


以上即为最基本的套装功能实现,可以弥补只能单ID属性奖励的局限性,同时,更可以丰富MOD的游戏性。

当然,在实际加入时,可以再灵活运用下,比如,我这个只是最基本的套装,要集齐一套才有效果,如何实现集齐一部分也有加成呢? 再或者,现在每人只能装备一个套装,如果我要实现多套装并存,也就是,比如衣服是一套,双刀是一套,该如何实现呢?   这个留给大家自己思考吧。

至此,套装功能及单slot多信息存储功能全部介绍完毕,如果今后还有想到可以扩展的地方,再来补充。个人能力有限,难免会有疏漏,也希望大家批评指正。

41

主题

1894

帖子

1854

积分

骑士长

Rank: 5Rank: 5Rank: 5

UID
31436
第纳尔
6799
精华
3
互助
67
荣誉
65
贡献
313
魅力
157
注册时间
2007-7-23

原版正版勋章战团正版勋章杰出版主勋章骑士荣誉之战团汉化勋章

鲜花(5) 鸡蛋(0)
发表于 2009-8-6 15:12:53 | 显示全部楼层
建议代码部分使用代码框和折叠按钮

15

主题

293

帖子

218

积分

见习骑士

自由骑士
<

Rank: 3

UID
129119
第纳尔
401
精华
0
互助
16
荣誉
5
贡献
1
魅力
14
注册时间
2009-5-8

原版正版勋章战团正版勋章

鲜花(6) 鸡蛋(0)
发表于 2009-8-6 16:43:03 | 显示全部楼层
刚上来就看到此贴,牛人就是牛人啊.......  这次正好可以借着研究slot了

6

主题

173

帖子

142

积分

见习骑士

Rank: 3

UID
66838
第纳尔
127
精华
0
互助
8
荣誉
5
贡献
0
魅力
6
注册时间
2008-2-8
鲜花(0) 鸡蛋(0)
发表于 2009-8-9 03:43:59 | 显示全部楼层
感谢分享,好好学习

84

主题

1466

帖子

2365

积分

子爵[版主]

游小明
枢机主教

Rank: 7Rank: 7Rank: 7

UID
74938
第纳尔
10668
精华
3
互助
125
荣誉
100
贡献
167
魅力
539
注册时间
2008-4-28

维京征服正版勋章

鲜花(1154) 鸡蛋(0)
 楼主| 发表于 2009-8-11 15:08:26 | 显示全部楼层
扩展部分也已更新完毕,套装的实现功能在3楼给出了,以后想到什么扩展再来补充

另外,本帖关于slot的用法是属于原版代码中没有这样用过的,而灵活的掌握需要先对代码有一定熟悉程度,所以建议初学者先掌握好slot的基本用法,再研究此贴进行slot的高阶运用。

当然,如果你有一些更好的使用方法或心得及修正方法,也可以跟帖说明,大家一起学习。

42

主题

1459

帖子

859

积分

贵族[MOD作者]

Rank: 7Rank: 7Rank: 7

UID
117566
第纳尔
2866
精华
0
互助
48
荣誉
18
贡献
47
魅力
191
注册时间
2009-2-27

元老骑士勋章原版正版勋章战团正版勋章维京征服正版勋章骑士美德之英勇勋章[杰出会员活跃勋章]骑士美德之仁慈勋章[杰出会员互助勋章]汉匈决战正版勋章

鲜花(2) 鸡蛋(0)
发表于 2009-12-2 07:59:29 | 显示全部楼层
感谢老凉分享,学习了,写得很精彩,后果很严重。在这先跟你说一声,我沿用了,谢谢。

0

主题

10

帖子

3

积分

平民

Rank: 1

UID
176019
第纳尔
0
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2009-12-20
鲜花(0) 鸡蛋(0)
发表于 2010-1-13 15:02:23 | 显示全部楼层
牛人帖子必顶!!!!

15

主题

66

帖子

25

积分

随仆

Rank: 1

UID
365829
第纳尔
113
精华
0
互助
1
荣誉
0
贡献
0
魅力
0
注册时间
2011-1-18
QQ
鲜花(0) 鸡蛋(0)
发表于 2011-2-15 21:51:42 | 显示全部楼层
完全看不懂~~~

18

主题

2234

帖子

770

积分

骑士

Rank: 4Rank: 4

UID
194206
第纳尔
5756
精华
0
互助
16
荣誉
2
贡献
0
魅力
279
注册时间
2010-1-29

骑士美德之英勇勋章[杰出会员活跃勋章]

鲜花(24) 鸡蛋(0)
发表于 2011-3-15 09:56:12 | 显示全部楼层
源码不会,要是有TXT修改就好了

3

主题

20

帖子

11

积分

随仆

Rank: 1

UID
132799
第纳尔
287
精华
0
互助
1
荣誉
0
贡献
0
魅力
0
注册时间
2009-5-29

原版正版勋章战团正版勋章

鲜花(0) 鸡蛋(0)
发表于 2012-4-3 14:26:09 | 显示全部楼层
凉大,我按照2楼的方法一步一步的做了,为什么修改完以后没有效果呢?
我是在领军者1.230版本下改的,原版1.011。
我把添加到module_scripts.py或module_triggers.py中的中文字符删掉了,武器改成hunting_crossbow(猎弩,出身时候有)。在module_troops.py里添加了all_troops_end。在mod build时没有报错。
运行游戏也没有出错,但装备或取下猎弩时都没有奖励或惩罚。
请凉大帮我看看是什么原因?是否在module_constants.py添加的ID号需要改变?如何确认ID未被使用?
还有,这个代码在战团里是有效的吗?
先谢谢了!

3

主题

20

帖子

11

积分

随仆

Rank: 1

UID
132799
第纳尔
287
精华
0
互助
1
荣誉
0
贡献
0
魅力
0
注册时间
2009-5-29

原版正版勋章战团正版勋章

鲜花(0) 鸡蛋(0)
发表于 2012-4-5 00:03:47 | 显示全部楼层
我自己检查出问题了,就是定义物品前的井号忘删了。。。。。。
战团用没有问题。
我还有个问题,就是在contans.py里添加的:
slot_item_special = 6 。。。。。。
slot_troop_ek_item_0 = 150。。。。。。
后面的数字和新添加的程序有什么关联?
我改了一下,好像没有问题。是否可以随便写个数字?

101

主题

4514

帖子

3159

积分

男爵[离任版主]

世纪风云制作组[策划]

医院骑士团[KH]
战团ID:KH_Ranger

高级术士

Rank: 5Rank: 5Rank: 5

UID
162222
第纳尔
6191
精华
1
互助
181
荣誉
80
贡献
95
魅力
496
注册时间
2009-10-17

原版正版勋章战团正版勋章火与剑正版勋章维京征服正版勋章骑士美德之英勇勋章[杰出会员活跃勋章]骑士美德之仁慈勋章[杰出会员互助勋章]骑士美德之正义勋章[杰出会员荣誉勋章]骑士美德之诚信勋章骑砍中文站微博会员勋章霸主正版勋章元老骑士勋章

鲜花(110) 鸡蛋(0)
发表于 2012-4-5 00:17:04 | 显示全部楼层
我自己检查出问题了,就是定义物品前的井号忘删了。。。。。。
战团用没有问题。
我还有个问题,就是在contans.py里添加的:
slot_item_special = 6 。。。。。。
slot_troop_ek_item_0 = 150。。。。。。
后面 ...
zy05111 发表于 2012-4-5 00:03


只要不和现有同类slot的数字重复即可。同类是指,都是troop的slot,或者是party的slot

3

主题

20

帖子

11

积分

随仆

Rank: 1

UID
132799
第纳尔
287
精华
0
互助
1
荣誉
0
贡献
0
魅力
0
注册时间
2009-5-29

原版正版勋章战团正版勋章

鲜花(0) 鸡蛋(0)
发表于 2012-4-6 19:45:03 | 显示全部楼层
谢谢14楼的回答。还有一个问题:

请问这两个slot都是troop的slot吗(同类的)?
slot_troop_days_on_mission = 150
slot_troop_ek_item_0=150

"slot_troop_days_on_mission = 150 "是在领军者constants.py里本来就有的的,和slot_troop_ek_item_0=150好像不冲突。

0

主题

32

帖子

10

积分

随仆

Rank: 1

UID
751504
第纳尔
38
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2012-4-15
QQ
鲜花(0) 鸡蛋(0)
发表于 2012-8-10 11:23:27 | 显示全部楼层
我承认我看不懂

2

主题

31

帖子

9

积分

平民

Rank: 1

UID
1422866
第纳尔
82
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2013-6-19
鲜花(0) 鸡蛋(0)
发表于 2013-6-20 22:13:13 | 显示全部楼层
很好[img]
[/img]

2

主题

31

帖子

9

积分

平民

Rank: 1

UID
1422866
第纳尔
82
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2013-6-19
鲜花(0) 鸡蛋(0)
发表于 2013-6-20 22:13:35 | 显示全部楼层
很好[img]
[/img]

0

主题

26

帖子

8

积分

平民

Rank: 1

UID
1684348
第纳尔
159
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2013-11-23
鲜花(7) 鸡蛋(0)
发表于 2014-4-5 22:22:46 | 显示全部楼层

0

主题

26

帖子

8

积分

平民

Rank: 1

UID
1684348
第纳尔
159
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2013-11-23
鲜花(7) 鸡蛋(0)
发表于 2014-4-5 22:23:05 | 显示全部楼层

1

主题

6

帖子

2

积分

平民

Rank: 1

UID
2189428
第纳尔
56
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2014-9-20
鲜花(0) 鸡蛋(0)
发表于 2014-10-5 14:29:46 | 显示全部楼层
完全看不懂……
作为一名光荣的伸手党员……
在那遥远的地方,
有只慢羊羊,
你妈叫你回家吃饭了!

表示看不懂英文区。
有同感的请举爪!!!!!

10

主题

188

帖子

56

积分

扈从

Rank: 2Rank: 2

UID
3070326
第纳尔
643
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2019-4-25

战团正版勋章

鲜花(0) 鸡蛋(0)
发表于 2019-10-22 23:27:41 | 显示全部楼层
套装系统加进了水浒吗?还有这么多触发器是不是闪退的原因,以前没有想到会有那么多神器?

5

主题

29

帖子

9

积分

平民

Rank: 1

UID
3131813
第纳尔
71
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2020-1-29
鲜花(1) 鸡蛋(0)
发表于 2020-2-28 13:50:46 | 显示全部楼层
顶一个,很早以前就想找这个接口了,今天无意中找到了
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2021-12-7 05:26 , Processed in 0.169471 second(s), 46 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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