MCFPP设计稿——布尔值类型
在其他语言中,布尔值是一个很简单的东西——一个比特位,足以表示真假。但是在mc中,布尔值的使用只会和execute if
有关,而execute if
又有繁杂的子命令,这就导致在mcfpp中,布尔值的设计变成了一个相当复杂的工作。需要在保证统一性的前提下,又不失精确性。也就是说,要把所有execute if
所有子命令所用的条件类型都在mcfpp统一为一个bool
类型的变量,当然在编译器中要区分开来。
Contents
基本API设计
class BasicBool
基本的布尔值变量。所有的布尔值类都继承于此类。此类定义了布尔值类型能够执行的所有操作,例如布尔计算,储存等
class ScoreBool
计分板布尔类型,最简单的,也是最常用最灵活的布尔值类型。使用计分板储存布尔值,然后利用execute if scores
进行判断。ScoreBool的行为和MCInt类似,或者说几乎完全一样,因为它的本质就是一个MCInt,只是可以使用布尔操作,并且只有0、1两个值。其他所有的布尔类型都要求能够被储存转换为计分板布尔类型。
class BiomeBool
生物群系布尔类型。由内置函数checkBiome(Biome biome)
和Pos.checkBiome(Biome biome)
来返回。前者直接使用上下文,后者使用指定的坐标上下文。
class BlockBool
checkBlock(Block block)
和Pos.checkBlock(Block block)
class BlocksBool
类似
class DataBool
nbt类型的内置函数nbt.contains(string key)
或者nbt.exsit()
返回。
nbt test = {a: 1, list: [{key: apple, value: red},{key: banana, value: yellow}]}; //execute if data storage default:test {}.a bool b1 = test.contains("a"); //execute if data storage default a.list[{key:"apple"}] bool b2 = test.a.list[{key:"apple"}].exist();
class DimensionBool
判断维度的谓词。类似前面的。
class EntityBool
entity.exsit()
返回
class FunctionBool
函数返回类型,在MCFPP中仅次于计分板布尔类型,用于作为函数的返回值为布尔类型时候的返回值,有时候也作为复杂表达式的计算值。
class ItemBool
类型ItemSlot
的函数ItemSlot.check(ItemPredicate predicate)
。这两种类型参见命令函数设计
class LoadedBool
略
class PredicateBool
另一种数据包中相当重要的布尔值类型。谓词这种json文件的具体设计尚未确定,但是基本可以确定这种类型由Predicate.check()
返回。
布尔操作
取反
直接if和unless修改就好了,非常简单
和
execute
天然支持多个条件子命令并列。
或
根据 a∥b=!(!a&&!b) 进行计算。但是这就意味着,表达式会返回一个函数布尔值类型
# 假设原来条件都是if,这里就要取反 execute unless unless unless run return 0 return 1
赋值与编译器跟踪
作为成员的布尔值永远只能是计分板布尔值。
除了计分板类型以外,所有类型的布尔值类型编译器都未知。有一个例外,就是NBT的判断,这个编译器也是可以知道的。如果编译器知道确切的值,则默认返回的是一个计分板布尔类型,而不是原类型。
nbt test = {a: 1, list: [{key: apple, value: red},{key: banana, value: yellow}]}; bool b1 = test.contains("a"); //这里返回ScoreBool test.toDynamic(); //停止跟踪test变量 bool b2 = test.contains("a"); //这里返回DataBool