- 积分
- 9246193
- 威望
- 181
- 魅力
- 183
- 经验
- 9232934
- 热心度
- 17
- 注册时间
- 2005-11-5
- 最后登录
- 2025-4-20
- 主题
- 569
- 回帖
- 5784
- 精华
- 42
- 阅读权限
- 200
成长值: 32695
TA的每日心情 | 无聊 2020-5-27 00:09 |
---|
签到天数: 24 天 连续签到: 2 天 [LV.4]狂狼人

管理员
精灵奇侠
  
- 积分
- 9246193
   
|

楼主 |
发表于 2005-12-6 19:46:00
|
显示全部楼层
到现在为止,我们设计的脚本仅能在英雄访问地图西北角的位置后才能起作用。不过,考虑到没有人会将他的英雄专门传送到那里。你当然可以将一个事件放置在地图上,提示玩家有这么个特殊的地方。但是我不会这么做。相反,我会在地图上放置一个全新的物体来设法吸引玩家的注意。如果你打开地图[wiki]编辑器[/wiki],请看工具栏中的“城镇”那个选项,在那里,你会找到很多新的物体图片,它们置于10个城镇图片的后面(9个城镇类型图,一个随机城镇图)。这些图片建筑绝大部分都是没有用脚本定义过的——这意味着如果你将它们置于地图上,即使你[wiki][wiki]WoG[/wiki]化[/wiki]了地图,它们也不会起任何作用。下面我们准备用其中的一个来配合我们的脚本。
在这个脚本中,我选择第三列的第四个物体。它看起来像一个五角星,每个点上有一个小方尖,中心有一个大方尖。将它放置在地图上,尽可能放置在离角落近的地方,注意不要让地图边界遮挡了图片。建议你打开工具栏中的“通过能力”选项,你会明显看到地图上那些红色的和黄色的方格。红色表示不可通过,黄色方格则是可以通过,并且可以作为一个物体的入口或者说触发器。 如下,如果C=没有障碍,R=红色,Y=黄色,那么你会看到,在地图编辑器中,这个物体看起来象下面的样子:
CCCCC
CRCRC
RCYCR
CCRCC
请务必将那个黄色的方格置于(2,2,0)。
现在,让我们对这个物体进行脚本定义来取代用事件来触发。如果你按照教程的方法实际操作,你可以删除地图上的那个事件点了——我不会再用到它了。
下面,我们将在对!?LE行进行修改用于对应那个黄色的方格。回顾一下,那个原始语句是:
!?LE0/0/0; [事件位于地图上层西北角]
那么,我们现在只要简单的更改一下黄色方块的位置(2,2,0),并将命令语句由LE改为OB即可:
!?OB2/2/0; [当位于(2,2,0)的物体被访问]
注意,这个OB触发器的用法与LE触发器的用法是一样的。如果你对LE语句没有问题,那么OB语句也同样没有问题。只要记住,LE代表的是Local Event,而OB代表的是Object,你就会知道何时使用它们了。如此,脚本就可以象先前我定义的那样运行,唯一不同的是我用一个图片建筑来替代事件。尽管如此,下面我将对以上语句做进一步的更改:
!$OB2/2/0; [当(2,2,0)的物体被访问后]
我将触发器的命令头进行了更改,即,将访问前触发器(!?)改成了访问后触发器(!$)。当前情况下,这个更改不会对脚本产生任何影响,但如果我们在访问建筑后又设置了脚本,它就有作用了——例如对该建筑添加一个居民,他可以允许你对选项做出高级选择,即,如果你愿意付出100金币,他可以让计数器访问数值翻倍,具体就是访问1次相当于5次,否则就是正常计数;或者,更进一步,我们将访问建筑后的该建筑替换成另一种建筑,比如星轴。当然这些都是你可选的——如果愿意的话,可以替换成任何[wiki]SoD[/wiki]中的具有某种功能的建筑,只要保证该建筑只有一个黄色触发器口,并且位于(2,2,0)。 (说白了,访问后触发器就是在物体在受到访问后触发后续脚本,而访问前触发器则是一经触发物体同时触发脚本——译者)
如果你运行地图,然后访问了这个星轴(且只是这个星轴),你会获得通常的+1的力量值(或者由于你的英雄曾访问过它而没有任何作用),且计数器将计数。
下面,让我们对某个生物进行脚本编辑,使其站立在星轴旁,拥有“[wiki]神[/wiki]奇的魔法属性”。我想基于脚本对生物属性的要求,仙女龙会是最佳的选择。不管怎样,让我们开始编写脚本:
!?OB2/2/0; [当访问(2,2,0)的物体]
这是一个简单的访问前触发器,看起来和访问后触发器很象,因为我们用的是同一个物体来触发。下面,我们需要编辑“是/否”按钮的代码。
首先,我们需要一个可以提供玩家回答的问题。如果AI玩家访问建筑可能会引发问题,所以,我们需要判断访问的玩家是人类还是AI。我们将使用OW接收器来做此处理。OW可以让你检查或者设置某个玩家(而不是一个英雄)的大部分东西。那么,我们来编程:
!!OW:C?y1; [获得当前玩家的颜色]
!!OW:Iy1/?y2; [判断玩家是否为AI]
这个C?选项用于检查当前玩家的颜色。你不能更改当前玩家的颜色,所以那个问号(?)是这个选项的一个组成部分。我将颜色储存于y1。接下来一行用到了I选项。它可以让你检查某个颜色的玩家是否是AI。选项后的第一个数字是被检查的颜色——在本例中,我们需要的颜色是当前英雄的,所以,我将y1放置于此。第二个数字中,1代表AI,而0代表人类。你可以用此来添加或者移除地图中的一个人类玩家!而本例中,我们只是需要读取它,所以,如果轮到AI行动,y2会获得1的值,否则y2的值为0。
现在我们可以设置问题了。由于涉及到与玩家交互信息的问题,我们需要再次调用IF接收器:
!!IF&y2=0:Q1/6/0/21/134/33/0/2^You notice a small stand
set up near the star axis. A faerie dragon
calls out to you, "Have fun with the nature of magic!
Only 100 gold will advance the magic counter five
times as much as it normally would when visiting the axis!"^;
(对话大意是:你看到一只仙女龙站在星轴旁,它向你招呼:“来玩玩吧!只要100金币,你可以让你的魔法计数器计数值翻5倍!”——译者)
如你所见,我将y2=0的条件添加到了IF语句后面,这样,如果AI玩家访问该点,将不会弹出提问。你可能注意到在该命令中又很多数字,一共有8个数字。我将分部叙述。如果你打开了ERM帮助文档,找到!!IF命令,然后点击“选项”并滚动到Q#1/#2/#3/#4/#5/#6/#7/#8^Text^部分,可以看到类似的信息。
首先是选项Q,这个是question的首字。紧接着是编号1,它是可以保存你答案的标志位(flag)。标志位有点象变量,但是它们只能储存俩个值:0(假)和1(真)。与变量不同的是,这里没有字母用于指示变量类型。举例来说,v变量1通常写为“v1”,z变量1则是“z1”,对于标志1,它就是1。当我们后续遇到标志的使用的时候,我会再次谈到这个问题。
接下来的六个编号用于在对话框中添加图片于显示文本的下方。每对编号数字与一个图片对应。第一个编号数字是图片的类型,而第二个是物体的亚类型。所有物体的类型和亚类型都可以通过IF:Q命令在“类型和亚类型图片索引”中找到(即,所有图片类型在帮助文档中均有索引列出)。
在本例中,我们用6/0设定第一幅图片。类型6代表一种资源——金币。而它的亚类型代表你可以获取的资源的数量。由于我将亚类型设置为0,因此将不会显示金币数量——仅仅是金币的图片。
第二幅图片对应的是21/134。类型21是怪物图片。它的亚类型代表具体的怪物类型。如果你点击帮助文件的链接,你可以看到怪物类型的列表。在本例中,亚类型134就是一只仙女龙。
第三幅图片对应的是33/0。类型33对应的是英雄主要技能状态,本例是魔法力量点。而它的亚类型代表力量值大小。用0,则不显示魔法力量值,只是显示图片。所有,当脚本运行的时候,在文本下面将有金币、仙女龙和魔法力量这三个图片显示。
最后的编号数字2,表示这是一个 是/否 类型的提问。当脚本运行,在图片下面会出现一组表示“接受”和“取消”的按钮。如果你选择接受,标志位将被置为真(1),否则的话,标志位置为0。
现在,我们需要检查玩家是否支付的起100金币。再次,我们用到了OW接收器,下面是代码:
!!OW:R-1/6/?y3; [检查当前英雄的金币数量]
这个R选项表示的是我们要对玩家的资源进行某些操作。后面的数字是我们要对具体颜色的玩家进行检查。对于红色玩家,这个值是0,蓝色是1,依此类推。查看 “格式E1”可以找到所有颜色对应的数字,从0到7,对应不同的玩家颜色。在本例中,我将玩家颜色设置为-1,这意味着我需要的是检查当前活动的玩家的颜色,而不论他属于那个颜色。我们其实已经检查了当前活动玩家的颜色(还记得它之前被存储在y1中么?),但我选择使用它用于阐明一种可能性:你需要检查每一个选项语法来看看-1是否可以用于表示当前玩家。某些时候-1会有其他用法。例如,-1有时候用于表示中立(未受雇佣)的颜色。
第二个数字6代表我们要检查的资源,在本例中是金币。最后一个数字是我们需要设置的金币数量。在本例中,我们使用了变量y3,而其前面的问号(?)表示我们只是读取这个数量而不是去设置它。 (请好好理解这个问号的用法——译者)
接下来,我们要检查玩家对问题回答的情况和他是否可以支付的起金币费用。我们将要给出一个合适的回复来对应每种情况。这里需要3个IF命令来实现——一个用于处理不进行任何回答(即选择“放弃”);一个用于处理回答“是”,且玩家有足够金币;最后一个用于处理玩家回答“是”但不能支付这笔费用:
!!IF&y2=0/-1:M^Disappointed, the dragon turns to another potential customer.^;
!!IF&y2=0/1/y3>=100:M^"Very good! I knew you'd want to do it!"^;
!!IF&y2=0/1/y3<100:M^"I'm glad you are interested, but you
don't seem to have the gold on hand. Do come again!"^;
这里,有个条件限制是所有的消息仅对人类玩家显示。这个条件检查了标志位——标志位1——对应于我们设置的玩家回答。在第一行中,标志位是负值,这意味着当我们遇到第一种情况的时候,需要将这个标志设置为“假”。在余下两行中,标志位是正值,表示我们需要将标志设置为“真”。第三行,我们加入了另一个条件检查——你是否有足够的金币?
在减少玩家的100金币前,我们还需要决定AI会如何做。让我们设定AI有50%的几率来支付这笔钱,那么,以下就是设定的两条命令:
!!VRy4:S0R1; [在随机数0到1之间选取y4的值]
!!IF&y2=1:V1/y4; [设置y4的值给标志位1]
你会看到在第一行里有一个新的我们未曾见过的选项——R选项。该选项用于产生从0到R之间的随机数(本例中是R=1),并赋值予先前的数(这里是y4)。所以,这里的VR接收器会先将y4置0,然后根据随机数赋予y4两个选择——0或1,而这样就达到了我们预设的效果了。
第二行命令你一定不会陌生,它再次调用了IF语句。这里,我们添加了一个判断条件:是否是AI回合。V选项是用于设置一个标志位(flag)的值。本例中,标志位1被设置为随机从0到1的数值(因为我们先前对y4进行了设置)。
到此,我们对AI的设置已经完成,下面,我来用OW命令来编写减少金钱的命令。
!!OW&1/y3>=100:R-1/6/d-100; [如果金钱量足够,减少当前玩家的100金币]
这里有两个条件限定我们必须弄清楚,第一个条件比较熟悉,就是对标志位的设定问题——要么是AI的随机数选择,要么是玩家选择“是”。第二个条件是,玩家需要有足够的金币。如前对力量值设定的命令一样,我们使用d这个操作数来减少当前玩家金币值100(这里,我们用的是-100来实现,相当于“添加”了一个负值)
我们只需要再做一些设置即可,并且注意这个支付金币的操作已经执行。由于我们还没有对变量v2进行设置,下面我将用到它:
!!VRv2:S0; [v2初始设置为0]
!!VRv2&1/y3>=100:+4; [如果支付金币成功,将v2设置为4]
(此处之所以这么设置,是出于让计数器数值翻5倍的考虑——译者)
需要注意的是,尽管玩家的金币数量更改了,我们希望y3依然保持着先前需要支付的数据值,因此,我们需要再次调用OW命令来检查一下,该部分的代码已经完成,但是,我们需要对部分代码进行修改,因为我们想让计数器计数,并能正确给出消息提示。来回顾一下脚本最初的语句吧:
!!VRv1:+1; [让v1加1]
!!VRy1:Sv1%10; [判断v1是否是10 的倍数]
在该部分脚本中,y1是计数器的单元数,提示何种消息,依据y1是否为0来判断。首先,我们对首行代码做如下修改:
!!VRv1:+1+v2; [添加1+v2给v1]
如果对金币的操作执行了,即v2的值为4,那么相当于对v1添加5,否则就只是加1。接下来,我们在y1计算完毕后添加如下一行:
!!VRy1&y1<=v2:S0; [如果10的倍数被跳过,将y1重新置0]
如果附加的5导致v1正好跳过了10的倍数,则意味着v2是4,那么y1就在1和4之间。所以,如果y1少于或等于v2,则意味着魔法状态需要更改——所以我们将y1置0。对代码的重置可以利用类似的方法。(这段话有点不太好理解,请仔细琢磨——译者)
好了,经过对文本消息的小小更改,整段代码就出来了:
ZVSE
!#VRv1:S0; [将变量置0]
** 访问后触发器
!$OB2/2/0; [当位于(2,2,0)的物体被访问后]
!!VRv1:+1+v2; [对v1添加(1+v2)的值]
!!VRy1:Sv1%10; [判断v1是否是10 的倍数]
<代码>!!VRy1&y1<=v2:S0; [如果10的倍数数字已跳过,重置y1]
!!IF&y1<>0:M^Welcome to the star axis. The magic counter is now %V1^; [如果没有发生任何变化,显示该信息]
!!VRy2:Sv1:10%3; [找出魔法世界更改类型(强态、弱态还是正常态)]
!!VRz-1&y2=0:S^return to normal.^; [访问次数为 30, 60, 90, ...]
!!VRz-1&y2=1:S^strengthen.^; [访问次数为 10, 40, 70,...]
!!VRz-1&y2=2:S^weaken.^; [访问次数为 20, 50, 80, ...]
!!IF&y1=0:M^The magic counter is now %V1 you feel the world's magic power %Z-1.^; [根据不同情况显示不同的消息]
** 战斗中规则如下
!?BA0;
!!BA:E?y1; [是否联机对战?]
!!FU1&y1=0:Pv1; [如果不是,继续运行下面脚本]
** 战斗前设置
!?FU1;
!!BA:H0/?v5; [获得进攻方英雄编号]
!!BA:H1/?v6; [获得防守方英雄编号]
!!VRx1::10%3; [获得魔法世界类型]
!!HEv5:F?y5/?y6/?y3/?y7; [获得进攻方四围数据]
!!HEv6&v6>0:F?y5/?y6/?y4/?y7; [获得防守方四围数据]
!!VRv3&x1=1:Sy3; [如果是强态魔法世界,魔法力量增强]
!!VRv3&x1=2:S1-y3; [如果是弱态魔法世界,魔法力量降至1]
!!VRv4&x1=1/v6>=0:Sy4; [如果是强态魔法世界,魔法力量增强]
!!VRv4&x1=2/v6>=0:S1-y4; [如果是弱态魔法世界,魔法力量降至1]
!!HEv5&x1<>0:Fd0/d0/dv3/d0; [修改进攻方魔法力量点数据]
!!HEv6&x1<>0/v6>=0:Fd0/d0/dv4/d0; [防御方同样处理]
** 战斗后脚本由此开始
!?BA1;
!!BA:E?y1; [判断是否联机战斗]
!!FU2&y1=0:Pv1; [如果不是,修复英雄数据更改]
!?FU2;
!!VRx1::10%3; [获得魔法世界更改类型get change type]
!!VRv3:*-1; [将英雄四维数据置负]
!!VRv4:*-1; [对防守方同样处理]
!!HEv5&x1<>0:Fd0/d0/dv3/d0; [保存进攻方力量数据]
!!HEv6&x1<>0/v6>=0:Fd0/d0/dv4/d0; [保存防守方]
** 访问前触发器
!?OB2/2/0; [当位于 (2,2,0)的物体被访问]
!!OW:C?y1; [获得当前玩家颜色]
!!OW:Iy1/?y2; [当前玩家是否AI?]
!!IF&y2=0:Q1/6/0/21/134/33/0/2^You notice
a small stand set up near the star axis. A faerie dragon calls
out to you, "Have fun with the nature of magic! Only 100 gold
will advance
the magic counter five times as much as it normally would when visiting the axis!"^;
!!OW:R-1/6/?y3; [检查当前玩家金币数量]
!!IF&y2=0/-1:M^Disappointed, the dragon turns to another
potential customer.^;
!!IF&y2=0/1/y3>=100:M^"Very good! I knew you'd want to do it!"^;
!!IF&y2=0/1/y3<100:M^"I'm glad you are interested,
but you don't seem to have the gold on hand. Do come again!"^;
!!VRy4:S0R1; [设置随机数]
!!IF&y2=1:V1/y4; [将标志位设置为随机数值]
!!OW&1/y3>=100:R-1/6/d-100; [金币数量足够,则减少100金币]
!!VRv2:S0; [初始化v2为0]
!!VRv2&1/y3>=100:+4; [如果交易成功将v2设置为4]
(未完,待续) |
|