梁羽生家园

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2633|回复: 2

[教程] 金水修改简易教程之大地图事件

[复制链接]

102

主题

3010

帖子

2万

积分

梁学精英

Rank: 10Rank: 10Rank: 10Rank: 10

积分
23521
声望
19311 声
银两
265247 两
帖子
3010
精华
24
阅读权限
50
注册时间
2007-5-29
最后登录
2019-10-11
发表于 2014-3-10 22:42 | 显示全部楼层 |阅读模式

家园需要梁迷共同建设

您需要 登录 才可以下载或查看,没有帐号?注册

x

场景事件的修改这里就不赘述了,可以参见以下帖子:
SetD和GetD:http://www.txdx.net/thread-518105-1-1.html
事件编辑实例详解:http://www.txdx.net/thread-492241-1-1.html

当然金水还是有着一些区别的,如这里ModifyEvent函数,是以前的instruct_3和SetD两个函数的结合,这在综述里面讲过。
而第二个链接里面的OEVENTLUA函数,金水里是没有的。因为苍炎是以lua为核心的,而金水的pascal 对于调用事件提供了太多便利,可以参照我在综述里面的讲解。

子场景的事件,由于金水的引擎已经提供了全面的支持,包括接口函数,数据存储以及修改器等等,其实是很好做的。但大地图上的触发事件则需要我们另辟蹊径了。
子场景事件的触发方式有三种,一是对话触发,也就是面向指定方向按空格或点鼠标,二是使用物品触发,三是走过固定位置触发。
而关于大地图事件,这里给出两个思路,也算是两个小小的系统吧:

A、大地图随机事件
在大地图上走动,有一定几率随机触发一些事件,这个系统是很有用的,可以做成随机遇到商人,或者随机遇敌,或者触发某些支线,随机遇敌的话又可以加入护送任务里面,这样玩起来就更加多元化。
一开始我们的思路是添加一个全局计时器,没过一段时间都可以进行一次判断,决定是否触发事件。这个思路也是可以实现的,有兴趣的可以试试,但这样太消耗资源了。
参考了其他一些mod的制作,发现有像慕容老恭的《山寨江湖》那样,每次按键就进行判断的,这是一个不错的思路。
但具体到金水里面,我们就没必要再在lua里进行按键判断了,这样也停费资源的。我们可以直接将这一部分添加到行走函数里,在按键行走时顺便判断大地图事件的触发,这样资源消耗就能小上不少,也便于操作。
具体方法是这样的:
先在kys_main的Walk函数下面添加变量声明:
  1. trigger_rand:longint;  //用于判断的随机数
  2. trigger_count:integer;  //统计步数,间隔一定步数才触发
  3. trigger_str: WideString;    //调用的脚本路径
复制代码


然后在行走函数的事件轮询里写进如下代码:
  1. while SDL_PollEvent(@event) >= 0 do //事件轮询
  2. begin
  3. ……
  4. //大地图触发事件
  5.     trigger_str :='f1';
  6.     if walking>0 then  //只有行走过程中才会触发
  7.     begin
  8.        trigger_count :=trigger_count+1;
  9.        if (trigger_count mod 100 =0)then //每走100步才会进行判断
  10.        begin
  11.           trigger_count:=0;
  12.           trigger_rand:=random(100);
  13.           if trigger_rand>70 then //有30%概率触发
  14.           begin
  15.              ExecScript(AppPath +'script/MMap_Trigger.lua', trigger_str); //调用指定脚本的指定函数
  16.           end;
  17.       end;
  18. end;
  19. ……
  20. end //轮询结束
复制代码

以上是pascal的部分,然后我们就可以随意在指定的lua脚本里随意编辑自己想要触发的事件了。
例如:
  1. function f1()
  2. Talk(0,"啊,踩到狗屎了!",-2,0,0,0);
  3. pause();
  4. end
复制代码

效果图(走了N多步之后的某次):

                               
登录/注册后可看大图

当然我们还可以添加更多更丰富的脚本,也可以添加更多判断条件,如果要传递数据的话,就要涉及到得全局变量赋值了,通过在kys_script里注册相应接口函数就可实现,这里先不讲。

B、大地图挖宝
或者也可称作大地图使用物品触发事件。
目标:在大地图上指定区域使用指定物品,有一定几率挖到随机宝物。
难点:金水的设定中,除了药直接磕改变属性之外,是不存在在任意地方使用其他物品触发事件这一设定的。
但研究useitem函数发现,我们没必要修改pascal源程序。因为这里实际上提供了一个接口,即:
  1. //如某属性大于0, 直接调用事件
  2.       if Ritem[inum].UnKnow7 > 0then
  3.        CallEvent(Ritem[inum].UnKnow7)
复制代码

也就是只要Ritem[inum].UnKnow7大于0,我们就可以随时使用该物品,并调用Ritem[inum].UnKnow7这个值所对应的lua脚本序号。
首先是准备工作,我们需要给主角一个道具,这里设为“铁铲”。在添加物品的时候顺便设定其UnKnow7的值:
  1. PutItemPro(1090,195,44); --将铁铲的UnKnow7设定为1090,44是这一属性的地址,可以自己试验出来
  2. GetItem(195,1); --给予物品
复制代码


这里我新建了一个oldevent_1090.lua文件,添加如下代码:
  1. clear();
  2. CurScene=GetCurrentScence();  --获取当前场景
  3. if CurScene>0 then  --只有在大地图才能触发
  4.    Talk(0,"一般只有野外才能挖东西吧。。。",-2,0,0,0);
  5. else
  6.   x,y=getmainmapposition(); --获取大地图坐标
  7.   if getrolepro(0,21)>10 then --体力大于10才能触发
  8.      if x>=357 and x<=359 andy>=234 and y<=236 then --在指定矩形区域内才能触发
  9.        rand=math.random(100);
  10.       if rand<=30 then
  11.           Talk(0,"挖到东西了",-2,0,0,0);
  12.           randitem=math.random(198)-1; --物品序号从0开始,所以要减1
  13.          GetItem(randitem,1);        
  14.       else Talk(0,"居然什么都没有挖到。。。",-2,0,0,0);
  15.       end
  16.       clear();
  17.       putrolepro(getrolepro(0,21)-10,0,21) --扣除体力
  18.       ShowString(250, 200, "一番忙碌之后,体力下降10点",0xFF00,0xFF00);
  19.       pause();
  20.      else Talk(0,"这个地方什么也没有",-2,0,0,0);
  21.      end
  22.   else Talk(0,"没有体力了,我得休息一会儿",-2,0,0,0);
  23.   end
  24. end
复制代码

效果如下:

                               
登录/注册后可看大图


这个挖宝系统也还是比较粗糙的,因为没有藏宝图相关的东西,但添加藏宝图的话,又涉及到藏宝图显示的问题,以及全局变量的读写问题,这里先不细讲。

其实这两个系统是不一定非要用在大地图上的,只不过它相对于原版的子场景事件触发方式有了一定的改变。因而也可以去掉大地图的限制,在子场景中使用。

顺带提一下这里的lua程序用到的函数:
PutItemPro:改变指定物品的指定属性,三个参数分别为要赋的值,物品编号,属性编号
Getrolepro:获取人物的某项属性,两个参数依次为人物序号,属性序号
Putrolepro:改变人物的某项属性,三个参数依次为要赋的值,人物序号,属性序号

ShowString:屏幕上显示字符串,五个参数,前两个是显示的位置坐标,第三个是要显示的字符串,第四个和第五个是颜色。为什么有两个颜色参数呢?因为ShowString为了将字体加粗,采用了生成两个一样的字,错开一定位置重叠的方法,来达到加粗的效果,因而这两个颜色参数依次对应两行重叠的字。这里的颜色参数采用16进制数字标识,0xFF0000即为纯红,0xFF00为纯绿,0xFF为纯蓝,每两位16进制分别表示0~255的RGB值。
如果想设定更详细的参数,如字体大小,字体类型等等,那就不能用这个函数了,得研究一下更底层的一些函数。

Talk:这是相对于原版加强了的对话函数,很容易用,总共六个参数。程序中的注释有一些错误,经尝试如下:
6个参数可以是5个数字,一个字符串,也可以是4个数字,2个字符串,数字和字符串之间任意排列。
第一个数字参数是对话人物的序号,用来设置人物头像,序号参看Rrole列表,头像参看\resource\head\。
第一个字符串参数是对话字符串,可以在其中添加^0,^1等标示符来对文字着色,其中^0是白色,^1是黄色,其他颜色可以自己尝试。
第二个字符串参数是指定姓名字符串,可以显示指定的姓名,而不显示对应序号的人物姓名。当这个值为大于等于0的数字的时候,表示显示指定序号的人物姓名,为-2的时候,自动采用头像序号对应的姓名。为数字时,它作为第二个数字参数。
倒数第三个数字为显示模式,即头像显示在左还是右,0时为左,1时为右。
倒数第二个数字为是否显示头像,0时显示去,其他不显示
最后一个数字为对话颜色,这个也可以在字符串里设置,此处颜色序号参照颜色标识,一般设为0,即为白色。

3

主题

330

帖子

5348

积分

一派掌门

Rank: 22Rank: 22Rank: 22Rank: 22

积分
5348
声望
3976 声
银两
20503 两
帖子
330
精华
0
阅读权限
100
注册时间
2010-9-24
最后登录
2017-5-17
发表于 2014-3-11 20:34 | 显示全部楼层
辛苦辛苦……看过了……
梁羽生家园,梁迷网络的家http://www.yushengbbs.net

0

主题

1

帖子

3

积分

初入梁门

Rank: 1

积分
3
声望
2 声
银两
28 两
帖子
1
精华
0
阅读权限
5
注册时间
2019-10-9
最后登录
2019-10-10
发表于 2019-10-9 17:04 | 显示全部楼层
就看看,不说话。












                               
登录/注册后可看大图

梁羽生家园,梁迷网络的家http://www.yushengbbs.net
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|家园基金|梁羽生家园 ( 鄂ICP备16023429号-1 )

GMT+8, 2019-10-20 15:14 , Processed in 0.109375 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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