2进制初级脚本

二进制初级读本

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

使用魔法、情节物品和任务
TUS在游戏的大部分地方使用十六进制。魔法书的内容,情节物品和物品标记只是我所知的在某一特定时刻使用二进制的仅有的一些方面。在开始设计前,这是一些你将要用到概念。
Binary—-基于两个数的系统(只有两个数字,0和1)
Decimal—-基于十个数的系统(十个数,0到9),我敢打赌你知道这个
Hexadecimal—-基于十六个数的系统(十六个数,0到F)
Bit—-在二进制系统中的一位
Nibble—-四个Bits
Byte—-两个Nibble或者八个Bits
Word—-十六或更多的Bits(那有很多概念但是让我们弄的简单一些)
Bitwise—-在二进制数中用单独的Bit处理问题
Boolean—-只用True和False处理(逻辑)
Operand—-进行算术计算并给出结果的标志
Comparator—-比较数值并给出是True还是False的标志
False—-0也代表False
True—-和False一样,但是数值是零以外的数(在一些语言中是-1)
Flag—-拥有True或者False值

(相互换算的方法省去,应该都知道)

逻辑关系
&&—-逻辑与,如果俩个值都不是0,返回True
||—-逻辑或,只要有一个值不是0,返回True
^^—-逻辑异或,只要有且只有一个值为1,返回True

UO中的64个魔法
TUS使用了32位BIT(MORE—-一到四环,MORE2—-5到8环)来表示这64种魔法。如果在一个特定的场所一个BIT为真,那么这个魔法就在你的魔法书中。看一下下面,第一环的第五个魔法(MAGIC ARROW)在MORE中第五个BIT为真。
0000 0000 0000 0000 0000 0000 0001 0000
注:在上面的表示中,每两组表示一环魔法,右边为最低位

好,如果你希望在一个人的魔法书中检查一个特定的魔法。你要的魔法是第一环的第七个魔法—-REACTIVE ARMOR(二进制是0100 0000,十六进制是040),这个人的MORE是0E5(简单一些,魔法书里只有一环魔法)。用IF语句来检查是否为0。

IF &040
1110 0101 (0E5) 魔法书MORE值
0100 0000 (040) 你要查的魔法


0100 0000 (040) 如果结果不为0,魔法存在

IF &40
1010 0101 (0A5)魔法书MORE值
0100 0000 (040)你要查的魔法


0000 0000 (000)结果为0所以魔法不存在

这种方法一次只能用来检验一个魔法,比如
IF &48
1110 0101
0100 1000


0100 0000 有一个魔法不存在,但是结果不为0

你可以用AND的方法来从一个人的书中去掉特定的魔法。只要在你不希望魔法存在的地方设定0,在其他地方设定1。在这个情况下,我们需要保存结果到MORE中来改变魔法书内容。
MORE=&0B7
1110 0101 (0E5)书
1011 0111 (所有除了REACTIVE ARMOR和HEAL的第一环魔法)


1010 0101 REACTIVE被移除了。

还可以使用OR来把HEAL加入到书中
MORE=|08
1110 0101 (0E5)书
0000 1000 魔法HEAL


1110 1101

情节物品(plot items)
tus用plot1和plot2两个变量来表示character。和more一样使用32bit数。
plot1是特别的——tus检查每一bit是否为1,然后用triggers file里的描述来关联。这是一种创造character classes和race的常用办法,而且并不是只有这一种用途。
尽管plot1使用32位bit,只有31位可用。除了第一位bit的其他位可以随意使用。Bit 0 (the first bit) is hard-coded to deal with advancement gates.(什么意思????)
TUSTRIG.SCP有一个关于种族和职业的样板,但是你不必一定要用到他们。
人们遇到的第一个困难是确定一个物品的16进制值是多少。这个很容易解决。举个例子,第16件物品的值是多少?可以简单的这样做,二进制代码1后面16个零。第12件物品是1后面12个零。然后只要转化到16进制就可以作为你的plot1的值了。下面是32位数,只有一位被置1,找到他所代表的物品然后转化成16进制。
0000 0001 0000 0000 0000 0000 0000 0000
在1后有24个零,所以是第24件物品,转化成16进制01000000,就是plot1的值,用它来代表第24件物品。
plot2和plot1一样的用法,但是无法自动触发。你可以用它来做任务或是任何一个小想法。

怎样使用情节物品
当你在使情节物品有效前,需要先用plot1来表示。你可以用一个GM账号来手动设定plot1(/SET PLOT1=XXX 然后点击物品)。使用物品和触发器或者其他脚本(SRC.PLOT1=XXX),一般情况下使用class gate,先让我们创建一个。

首先。创建一个月门,放在任何一个地方。
下面写一个触发器来设定PLOT1在他们通过月门时的响应(在TUSTRING.SCP中)。我在默认的class gate中用了020,一个warrior。
[TRIG 1234] //说明特定的触发器代码
ONTRIGGER=STEP //走入月门
IF <SRC.PLOT1>==0 //还没有职业
SRC.PLOT1==020 //设定为warrior
ELSE
SRC.MESSAGE HEY,YOU ALREADY HAVE A CLASS!
END IF

现在用/SET TYPE 1234 来设定月门的类型,然后点击月门。穿过他然后你的PLOT1的值会从0到20。再试一次他说你已经有一个职业了。

这个脚本有一个问题,必须PLOT1以前没有被设定过。如果你使用种族系统,你应该在人们选择职业之前就让他们选择了种族。你不得不在写trigger时把这些信息也加进去。这里有一个在运用race和class时使用plot1的假设方案。记住bit 0 是为advancement gates准备的。

种族(物品1到7)
1 human
2 elf
3 dwarf
4 troll
5 orc
6 lizardman
7 dragon

职业(物品8到15)
8 bard
9 cleric
10 mage
11 ranger
12 rogue
13 thief
14 unassigned
15 unassigned

0000 0000 0000 0000 0011 1111 1111 1111
unassigned 职业 种族
3f ff
你可以象上面这样在一开始就设定plot1的值。没有被定义的位可以以后再添加物品。
这里有一个例子,让一个人成为魔法师(第10个物品或者0100 0000 0000或者0400hex)

[trig xxxx]

ontrigger=step
if <src.plot1>&03f00 //在第三、四个nibble检查每一个bit来确定职业
src.message hey,you already have a class! //如果有一位为真
else
src.plot1=<src.plot1>|0400 //设定为魔法师
end if

继续努力
使用同样的plot1,让我们来设定一个任务。任务有4个完成阶段。在每一个阶段我们用一个bit来描述,这样我们就可以知道任务的完成状况。
先让我们来解决哪些bit来表示任务的各个阶段。这里我们分配16-19bit给任务
0000 0000 0000 1111 0011 1111 1111 1111
unassigned 任务1 职业 种族
f 3f ff
在前面的例子中我们已经知道了如何用and来检查任务的bit。为了进行任务还需要更多一点东西。如果你的script在某时检查出了一个bit,你不希望他在检查其余下面的比特前结束工作。你也不想让script象下面这样
if ((<src.plot1>&010000)&&!(<src.plot1>&020000)&&!(<src.plot1>&040000)&&!(<src.plot1>&080000))
更进一步,你可以用and。忽略所有你不想要的bit(种族、职业和其他高位bit我们都不需要了解),只要检查四种可能性:010000,030000,070000,0f0000。记住,我们没有把所有的bit都加进去。确定你在操作过程中没有修改到plot1其他部分。
为了开始我们的任务,必须和一个叫zaphod的npc交谈,打听一种著名的酒类。我可以使用”new”语音文件,但可以只要恰当使用tusspee.scp就可以了。
“new” speech file ZAPHOD.SCP

ON=Hi
ON=Hello
ON=Heya
ON=Hail
SAY HIC wanna dink uf my Pan Galactic Gargle Blaster?
ON=Pan Galactic Gargle Blaster
SAY Ish my own suc… sok…sekret respee. Get me a Zogon deshtrukter from Bart an I’ll teesh it to ya.
SRC.PLOT1=<SRC.PLOT1>|010000 // 设定这个bit让bart知道你已经接下了任务。
ON=teesh
ON=sekret
SAY Huh? Talk good er don tok et all.
ON=destructor
ON=teach
ON=secret
IF (<SRC.PLOT1>&0F0000)==030000 //前两位bit被置1,在继续进行前在下面检查BART
IF <RESTEST 1 zogon_destructor>
SRC.CONSUME=1 zogon_destructor
SRC.NEWITEM=blaster_recipe_book
SRC.ACT.BOUNCE
SRC.PLOT1=<SRC.PLOT1>|040000 // 置第三位,这样无法得到另外的处方
SAY Gascon would pay bigtime for that recipe!
ELSE
SAY Iwanna Zogon deshtruktor first ya weenie!
ENDIF
ELSEIF (<SRC.PLOT1>&0F0000)=010000 //只有第一位被置,还没有和bart交谈
SAY Washa matter, youz gotsa tok to Bart firsh!
ELSEIF (<SRC.PLOT1>&0F0000)>0 // 已经得到处方
SAY Goway ya greedy git!
ELSE //还没有得到任务
SAY Da Pan Galactic Gargle Blaster is besht dink inna galakshy!
ENDIF

“New” speech file BART.SCP

ON=zaphod sent me
ON=Zogon destructor
SAY Zaphod wants a destructor? That can only mean one thing.
IF (<SRC.PLOT1>&0F0000)==010000 //只有一位被置,无法进行第二次
SRC.NEWITEM=Zogon_destructor
SRC.ACT.BOUNCE
SRC.PLOT1=<SRC.PLOT1>|020000 // 置两位使他可以继续进行
SAY Give that to him – excuse me while I ready my fallout shelter
ELSEIF (<SRC.PLOT1>&0F0000)>0 // 超过一位,已经进行了
SAY I already gave you one, no destructor for you!
ELSE //一位都没有,还没有接到任务
SAY Are you crazy! Get outa here before I call the watch
ENDIF

“New” speech file GASCON.SCP

ON=Pan Galactic Gargle Blaster
IF (<SRC.PLOT1>&0F0000)==070000 //前三位被置
IF <RESTEST 1 blaster_recipe_book>
SRC.CONSUME 1 blaster_recipe_book
SRC.NEWITEM=POTION_OF_BOOZE_RESISTANCE
SRC.ACT.BOUNCE
SRC.PLOT1=<SRC.PLOT1>|080000 //置第四位,任务完成
SAY Wow! This is great, use that potion before attempting to actually DRINK a Pan Galactic Gargle Blaster
ELSE
SAY Hey, you don’t have the recipe! Get lost!
ENDIF
ELSE
SAY Zaphod is the only one that knows how to make a Pan Galactic Gargle Blaster, I wish I could get the recipe!
ENDIF

不要认为这个例子是所能做出的最好的。这只是一个为了展示bit位检查功能而匆匆做成的。
我们用了四位来表示一个任务,这样,即使使用了plot2,我们最多只能做12个任务,这并不足够。怎样更加有效的使用这些bit呢?
可以在每一个任务中都使用同样的4位bit。用其他44个bit来表示到底是正在做还是已经完成了任务。这样我们可以做22个任务。
00 00 00 00 00 00 0000 0011 1111 1111 1111
(两位一组,按 任务进度 职业 种族
一位被置,表示开始做任务,第二位被置,表示 完成任务)

这样实际上我们用了6位来表示一个任务,因此这个任务最多可以有六个阶段。完全可以用更多或更少的位来表示任务进度。

这样有一个问题。如何在进行一个任务的同时进行其他任务?我们进行其他任务时会改变bit位的值,使任务进度变得混乱。这是个缺点。

如果你另外为每一个种族和职业都设定了不同的方案,那么上面的任务总数就会变得更多:22*6*8

留言

还没有留言,来坐个沙发吧。

留个言

留个言