MCFPP设计稿——布尔值类型

在其他语言中,布尔值是一个很简单的东西——一个比特位,足以表示真假。但是在mc中,布尔值的使用只会和execute if有关,而execute if又有繁杂的子命令,这就导致在mcfpp中,布尔值的设计变成了一个相当复杂的工作。需要在保证统一性的前提下,又不失精确性。也就是说,要把所有execute if所有子命令所用的条件类型都在mcfpp统一为一个bool类型的变量,当然在编译器中要区分开来。

基本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天然支持多个条件子命令并列。

根据 ab=!(!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

类似文章

发表回复