91m2中随机抽取装备功能(适用跑酷、抽奖、随机给祖玛一件等等)

2016-09-26 19:46:29来源:CSDN作者:q1027458229人点击

这个功能在91m2中的原型是:

1、通过M2管理器资源文件配置,Gamelib.TryGetResource(资源文件名)  返回 TStrings对象。

2、通过D盘mirServer路径来获取,TStrings对象.LoadFromFile(本地路径);

因为返回值都是TStrings对象,因此该功能,只适合随机从其中取一个字符串而已。。

假如我的文本中配置的数据是这样的。。
力量戒指

裁决之杖

那就是有1/2的几率出力量,1/2的几率出裁决。

此时有问题了,如果我想设置4/5的几率出力量,1/5的几率出裁决怎么弄?是不是得这样写:

力量戒指

力量戒指

力量戒指

力量戒指

裁决之杖

此时问题又来了,如果想设置500/1000的几率随机出一个沃玛,300/1000的几率随机出一个祖玛,150/1000的几率出圣战,50/1000的几率出雷霆,怎么办?

很显然,这样的设置法就不行了。

这个时候要设置怎么设置呢?我想八成都是这样干的?

if random(1000)<500 thenbegin      抽一个沃玛给玩家      exit;end;if random(1000)<500 thenbegin      抽一个沃玛给玩家      exit;end;if random(5)<3 thenbegin      抽一个祖玛给玩家      exit;end;if random(4)<3 thenbegin      抽一个圣战给玩家      exit;end;抽一个雷霆给玩家;

这样虽然可以实现,但是本来就应该是同一个文本内实现的,为什么要干这么多事??难道日后我想把沃玛取消,把战神加上,我还得改代码?再发布?

因此:我就封装了一个工具类,直接使用,各种方便。

工具类的核心代码不需要关心,只要大家会调用、使用就行了。

核心调用方法就2个function


//推荐使用这个,通过本地路径随机获取。参数1:相对路径文件   参数2:是否调试random信息    参数3:文件格式分隔符
function getRandomItemByResource(resource : string; isDebug : boolean ; splitStr : string = ' ' ) : TRandomItem;


//不推荐,通过m2版本管理器资源文件随机获取。参数1:相对路径文件   参数2:是否调试random信息    参数3:文件格式分隔符

function getRandomItemByPath(path : String ; isDebug : boolean ; splitStr : string = ' ') : TRandomItem;


废话不多说直接上代码。

procedure Main(Npc: TNormNpc; Player: TPlayObject; Args: TArgs);const S = [[/%s//%s]];varstr1 , str2 : string;item1,item2 : TRandomItem;begin   //参数1:全路径是:D:/MirServer/Mir200/Envir/配置数据/抽取奖励/随机抽取物品.txt,这个文件路径自己随便建,调用的时候对了就行了。        //参数2:是是否调试,如果true则控制台会打印日志。如果false,则不会打印。确认无问题后,这里使用false.      //参数3:分割符          //     如果文件格式是   裁决之杖,1,1   则分割符传','  , 推荐使用这一种      //     如果文件格式是   裁决之杖 1 1   则分割符传' '      //     可以定义任何格式的 比如 裁决之杖#1#1  裁决之杖$1$1  裁决之杖@1@1 等等,只要分割符传的和自己定义的一致,就可以解析。      //     文件格式 物品名称,出现几率,中奖之后给几个 如果某一行什么都没有,则不会解析这行。如果这行只有名称没有后面的数字,则默认都是1.     //返回值:物品对象。    //      .name是物品名字。    //      .chance是几率对使用者没啥用    //      .number是给几个。用户可用可不用。		item1 := RandomGetItemUtil.getRandomItemByPath('配置数据/抽取奖励/随机抽取物品.txt',true,',');     item2 := RandomGetItemUtil.getRandomItemByResource('抽奖物品',true,',');    if item1 = nil then    begin    		str1 := '路径:本地没文件'	;	      end    else    begin        str1 := '路径:你抽到了【'+item1.name+'】!'	;	     end;    if item2 = nil then    begin    		str2 := '资源文件:本地没文件'	;	      end    else    begin        str2 := '资源文件:你抽到了【'+item2.name+'】!'	;	     end;    npc.Say(player,format(S,[str1,str2]));        if item1 <> nil then    begin      	FreeAndNil(item1);    end;        if item2 <> nil then    begin      	FreeAndNil(item2);    end;end;


具体的代码下载地址是:[点击打开链接]


觉得不错的,可以订阅我的博客,我会不定期的更新实用脚本啊,方便各位91m2开发者,快速开发脚本!

麻烦和感谢大家注册个号,用CSDN下载我的文档一下。并且在我的博客文章上给些好评啊,谢谢大家的支持!我会一直前进的。




最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台