跳转至

OlivaDice For OlivOS 自定义人物卡模板编写指南

For Ver.3.3.8(1058)

世界是属于每一个人的。要创造一个充满逻辑并尊重每一个人的世界。
——《Новый Элемент Расселения》A.D.1960 Москва

有关基础搭建的指引请参考【教程】手把手教你搭建青果骰

自定义人物卡模板

青果核心在底层将主骰表达式、检定规则、人物卡作成、技能初始化、技能分类等一系列会随着规则发生变化的设置,统合成了与人物卡绑定的人物卡模板功能,可以通过.st temp.st rule指令来进行切换。OlivaDice已经内置了defaultCOC7DND5EFATEDX3COC6等人物卡模板。
与此同时,人物卡模板还可以通过扩展文件的方式进行扩展,该部分的详细说明请查看人物卡模板文档,以下为可以用于template/目录的人物卡模板文件内容:

人物卡模板扩展文件
{
    "default": {
        "mainDice": "1D100",
        "customDefault": {
            "d": {
                "leftD": 1,
                "rightD": 100,
                "sub": {
                    "k": null,
                    "q": null,
                    "p": null,
                    "b": null
                },
                "subD": {
                    "p": 1,
                    "b": 1
                }
            }
        },
        "skill": {
            "属性": [
                "STR",
                "CON",
                "SIZ",
                "DEX",
                "APP",
                "INT",
                "POW",
                "EDU",
                "LUC",
                "SAN",
                "SANMAX",
                "HP",
                "HPMAX",
                "MP",
                "MPMAX"
            ],
            "技能": [
                "会计",
                "人类学",
                "估价",
                "考古学",
                "取悦",
                "攀爬",
                "计算机使用",
                "信用",
                "克苏鲁神话",
                "乔装",
                "闪避",
                "汽车驾驶",
                "电气维修",
                "电子学",
                "话术",
                "急救",
                "历史",
                "恐吓",
                "跳跃",
                "法律",
                "图书馆",
                "聆听",
                "锁匠",
                "机械维修",
                "医学",
                "博物",
                "导航",
                "神秘学",
                "操作重型机械",
                "说服",
                "精神分析",
                "心理学",
                "骑乘",
                "妙手",
                "侦查",
                "潜行",
                "游泳",
                "投掷",
                "追踪",
                "驯兽",
                "潜水",
                "爆破",
                "读唇",
                "催眠",
                "炮术",
                "母语"
            ]
        },
        "skillConfig": {
            "skipEnhance": [
                "STR",
                "CON",
                "SIZ",
                "DEX",
                "APP",
                "INT",
                "POW",
                "EDU",
                "LUC",
                "SAN",
                "SANMAX",
                "HP",
                "HPMAX",
                "MP",
                "MPMAX",
                "克苏鲁神话",
                "信用"
            ]
        },
        "init": {
            "STR": "3d6x5",
            "CON": "3d6x5",
            "SIZ": "(2d6+6)x5",
            "DEX": "3d6x5",
            "APP": "3d6x5",
            "INT": "(2d6+6)x5",
            "POW": "3d6x5",
            "EDU": "(2d6+6)x5",
            "LUC": "3d6x5"
        },
        "mapping": {
            "闪避": "{DEX}/2",
            "母语": "{EDU}",
            "SAN": "{POW}",
            "HP": "({CON}+{SIZ})/10",
            "HPMAX": "({CON}+{SIZ})/10",
            "MP": "{POW}/5",
            "MPMAX": "{POW}/5"
        },
        "synonyms":{
            "STR": ["力量", "STR"],
            "CON": ["体质", "CON"],
            "SIZ": ["体型", "SIZ"],
            "DEX": ["敏捷", "DEX"],
            "APP": ["外貌", "APP"],
            "INT": ["智力", "INT"],
            "POW": ["意志", "POW"],
            "EDU": ["教育", "EDU"],
            "LUC": ["幸运", "LUC"],
            "SAN": ["理智", "SAN","Sanity"],
            "SANMAX": ["理智上限", "SANMAX","SanityMAX"],
            "HP": ["生命值","HP","HitPoints"],
            "HPMAX": ["生命值上限","HPMAX","HitPointsMAX"],
            "MP": ["魔法","MP","MagicPoints"],
            "MPMAX": ["魔法上限","MPMAX","MagicPointsMAX"],
            "MOV": ["移动力","MOV"],
            "会计": ["会计","Accounting"],
            "人类学": ["人类学","Anthropology"],
            "估价": ["估价","Aooraise"],
            "考古学": ["考古学","Archaeology"],
            "取悦": ["取悦","魅惑","Charm"],
            "攀爬": ["攀爬","Climb"],
            "计算机使用": ["计算机使用","计算机","电脑","电脑使用","Computer_Use"],
            "信用": ["信用评级","CR","信誉","信用度","信用","信誉度","Credit_Rating"],
            "克苏鲁神话": ["克苏鲁神话","CM","克苏鲁","Cthulhu_Mythos"],
            "乔装": ["乔装","Disguise"],
            "闪避": ["闪避","Dodge"],
            "汽车驾驶": ["汽车驾驶","Drive_Auto"],
            "电气维修": ["电气维修","电器维修","Electical_Repair"],
            "电子学": ["电子学","Electronics"],
            "话术": ["话术","快速交谈","Fast_Talk"],
            "急救": ["急救","First_Aid"],
            "历史": ["历史","History"],
            "恐吓": ["恐吓","Intimidate"],
            "跳跃": ["跳跃","Jump"],
            "法律": ["法律","Law"],
            "图书馆": ["图书馆使用","图书馆","Library_Use"],
            "聆听": ["聆听","Listen"],
            "锁匠": ["锁匠","Locksmith"],
            "机械维修": ["机械维修","Mechanical_Repair"],
            "医学": ["医学","Medicine"],
            "博物": ["博物", "博物学","自然学","自然史","Natural_World"],
            "导航": ["导航","领航","Navigate"],
            "神秘学": ["神秘学","Occult"],
            "操作重型机械": ["操作重型机械","Operate_Heavy_Machinery"],
            "说服": ["说服","Persuade"],
            "精神分析": ["精神分析","Psychoanalysis"],
            "心理学": ["心理学","Psychology"],
            "骑乘": ["骑术","骑乘","Ride"],
            "妙手": ["妙手","Sleight_of_Hand"],
            "侦查": ["侦查","Spot_Hidden"],
            "潜行": ["潜行","Stealth"],
            "游泳": ["游泳","Swim"],
            "投掷": ["投掷","Throw"],
            "追踪": ["追踪","Track"],
            "驯兽": ["驯兽","Beast_Training"],
            "潜水": ["潜水","Diving"],
            "爆破": ["爆破","Demolitions"],
            "读唇": ["读唇","Read_Lips"],
            "催眠": ["催眠","Hypnosis"],
            "炮术": ["炮术","Artillery"]
        },
        "redirect": {
            "力量": "STR",
            "体质": "CON",
            "体型": "SIZ",
            "敏捷": "DEX",
            "外貌": "APP",
            "智力": "INT",
            "意志": "POW",
            "教育": "EDU",
            "幸运": "LUC",
            "理智": "SAN",
        },
        "showName": {
            "STR": "力量",
            "CON": "体质",
            "SIZ": "体型",
            "DEX": "敏捷",
            "APP": "外貌",
            "INT": "智力",
            "POW": "意志",
            "EDU": "教育",
            "LUC": "幸运"
        },
        "defaultSkillValue": {
            "会计": 5,
            "人类学": 1,
            "估价": 5,
            "考古学": 1,
            "取悦": 15,
            "攀爬": 20,
            "计算机使用": 5,
            "信用": 0,
            "克苏鲁神话": 0,
            "乔装": 5,
            "汽车驾驶": 20,
            "电气维修": 10,
            "电子学": 1,
            "话术": 5,
            "急救": 30,
            "历史": 5,
            "恐吓": 15,
            "跳跃": 20,
            "法律": 5,
            "图书馆": 20,
            "聆听": 20,
            "锁匠": 1,
            "机械维修": 10,
            "医学": 1,
            "博物": 10,
            "导航": 10,
            "神秘学": 5,
            "操作重型机械": 1,
            "说服": 10,
            "精神分析": 1,
            "心理学": 10,
            "骑乘": 5,
            "妙手": 10,
            "侦查": 25,
            "潜行": 20,
            "游泳": 20,
            "投掷": 20,
            "追踪": 10,
            "驯兽": 5,
            "潜水": 1,
            "爆破": 1,
            "读唇": 1,
            "催眠": 1,
            "炮术": 1
        },
        "checkRules": {
            "default": {
                "checkList": [
                    "success",
                    "hardSuccess",
                    "extremeHardSuccess",
                    "greatSuccess",
                    "fail",
                    "greatFail"
                ],
                "success": {
                    ".<=": ["$roll", "$skill"]
                },
                "fail": {
                    ".>": ["$roll", "$skill"]
                },
                "hardSuccess": {
                    ".<=": [
                        "$roll",
                        {
                            "./": ["$skill", 2]
                        }
                    ]
                },
                "extremeHardSuccess": {
                    ".<=": [
                        "$roll",
                        {
                            "./": ["$skill", 5]
                        }
                    ]
                },
                "greatSuccess": {
                    ".==": ["$roll", 1]
                },
                "greatFail": {
                    ".or": [
                        {
                            ".and": [
                                {
                                    ".<": ["$skill", 50]
                                },
                                {
                                    ".>=": ["$roll", 96]
                                },
                                {
                                    ".<=": ["$roll", 100]
                                }
                            ]
                        },
                        {
                            ".and": [
                                {
                                    ".>=": ["$skill", 50]
                                },
                                {
                                    ".==": ["$roll", 100]
                                }
                            ]
                        }
                    ]
                }
            }
        }
    }
}

总体介绍

作为一个配置文件,人物卡模板的格式采用了Json,这种格式的全名为:JavaScript Object Notation, JS对象简谱,是一种起源于编程语言JavaScript的序列化数据格式,其特点就在于,可以通过特定的文本格式表达一定程度的复杂数据结构,这种复杂的数据结构可以满足程序运行时复杂的功能设计与逻辑设计的需求,这也是我们为什么选择这样一种看起来不太直观的有点复杂的格式的原因,但是,相信我,跟随Json快速入门的引导,它很容易上手。

下面将会分为多个板块对人物卡模板的设计进行介绍,并介绍如何从头开始编写一个人物卡模板。

最小人物卡模板

人物卡模板有一个最小运行的限度,在骰子的运行中,一旦你的人物卡模板扩展文件缺少了以下范例的某一词条,青果骰都会在加载时对其进行补全,如果骰子已经加载了同名的人物卡模板,则会对其进行精细的替代,所以你应当将你的注意力放在你想要进行设置的部分,无需过多考虑你的人物卡模板是不是缺少了哪些你认为不需要的部分。

{
    "default": {
        "mainDice": "1D100",
        "customDefault": {},
        "skill": {},
        "skillConfig": {
            "skipEnhance": []
        },
        "init": {},
        "mapping": {},
        "synonyms":{},
        "redirect": {},
        "showName": {},
        "checkRules": {
            "default": {
                "checkList": []
            }
        }
    }
}

人物卡模板名称

人物卡模板需要一个对应的名称,例如内置人物卡模板COC7的人物卡模板名称就是COC7,可以通过.st temp coc7指令来将当前人物卡设置为该人物卡模板。
对比上文最小人物卡模板中的内容,这个模板的名称便是default。你应当通过将在default的位置使用其它名称的方法来给自己的人物卡模板命名。

默认人物卡模板

需要注意的是,名为default的人物卡模板是特殊的,当用户创建了一个新的人物卡,并且没有第一时间立即为其指定人物卡模板时,default人物卡模板将会立即被应用于其上,也就是说,如果你的用户最频繁的使用某个规则,并且他们希望尽量减少使用人物卡模板的切换指令时,你可以使用并定义一个default人物卡模板,以替换内置的同名默认人物卡模板。
例如,你可以将DND5E的规则替换至default人物卡模板,这样你的骰子就会更多的表现为一个DND骰。
具体范例如下:

Dnd5e应用于default
{
    "default": {
        "mainDice": "1D20",
        "customDefault": {
            "d": {
                "leftD": 1,
                "rightD": 20,
                "sub": {
                    "k": null,
                    "q": null,
                    "p": null,
                    "b": null
                },
                "subD": {
                    "p": 1,
                    "b": 1
                }
            }
        },
        "skill": {
            "属性": [
                "STR",
                "DEX",
                "CON",
                "INT",
                "WIS",
                "CHA",
                "速度",
                "先攻"
            ],
            "状态": [
                "载重",
                "负重",
                "护甲等级"
            ],
            "技能": [
                "运动",
                "体操",
                "巧手",
                "隐匿",
                "调查",
                "奥秘",
                "历史",
                "自然",
                "宗教",
                "察觉",
                "洞悉",
                "驯兽",
                "医药",
                "生存",
                "游说",
                "欺瞒",
                "威吓",
                "表演"
            ],
            "物品": [
                "金币",
                "银币",
                "铜币",
                "铂金币",
                "白金币"
            ],
            "法术": [
                "亚比达奇凋死术",
                "吸收元素",
                "强酸箭",
                "酸液飞溅",
                "阿迦纳萨喷火术",
                "援助术",
                "警报术",
                "变身术",
                "化兽为友",
                "动物信使",
                "动物形态",
                "操纵死尸",
                "活化物体",
                "防生物护罩",
                "反魔场",
                "关怀术",
                "嫌恶",
                "秘法眼",
                "秘法门",
                "秘法魔掌",
                "秘法锁",
                "秘法武器",
                "秘法师魔法灵光",
                "艾嘉西斯之铠",
                "哈达之臂",
                "星界投影",
                "卜筮术",
                "生命灵光",
                "净化灵光",
                "活力灵光",
                "启蒙术"
            ]
        },
        "skillConfig": {
            "skipEnhance": [
                "STR",
                "DEX",
                "CON",
                "INT",
                "WIS",
                "CHA"
            ]
        },
        "init": {
            "STR": "4d6k3",
            "DEX": "4d6k3",
            "CON": "4d6k3",
            "INT": "4d6k3",
            "WIS": "4d6k3",
            "CHA": "4d6k3"
        },
        "synonyms":{
            "STR": ["力量", "STR", "Strength"],
            "DEX": ["敏捷", "DEX", "Dexterity"],
            "CON": ["体质", "CON", "Constitution"],
            "INT": ["智力", "INT", "Intelligence"],
            "WIS": ["感知", "WIS", "Wisdom"],
            "CHA": ["魅力", "CHA", "Charisma"],
            "运动": ["运动", "Athletics"],
            "先攻": ["先攻", "Initiative"],
            "速度": ["速度", "Speed"],

            "体操": ["体操", "Acrobatics"],
            "巧手": ["Sleight_of_Hand", "巧手", "手上功夫"],
            "隐匿": ["Stealth", "隐匿"],
            "奥秘": ["Arcana", "奥秘"],
            "历史": ["History", "历史"],
            "调查": ["Investigate", "调查"],
            "自然": ["Nature", "自然"],
            "宗教": ["Religion", "宗教"],
            "驯兽": ["Animal_Handling", "动物驯养", "驯兽"],
            "洞悉": ["Insight", "洞悉"],
            "医药": ["Medicine", "医药"],
            "观察": ["Perception", "察觉", "观察"],
            "生存": ["Survival", "生存", "求生"],
            "欺瞒": ["Deception", "欺瞒"],
            "威吓": ["Intimidation", "威吓"],
            "表演": ["Performance", "表演"],
            "游说": ["Persuasion", "游说"],

            "载重": ["载重", "Carring_Capacity"],
            "负重": ["负重", "Encumbrance"],
            "护甲等级": ["AC", "Armor_Class", "护甲等级"],

            "金币": ["Gold_Piece", "金币", "GP"],
            "银币": ["Silver_Piece", "银币", "SP"],
            "铜币": ["Copper_Piece", "CP", "铜币"],
            "铂金币": ["Electrum_Piece", "铂金币", "EP"],
            "白金币": ["Platium_Piece", "白金币", "PP"],

            "亚比达奇凋死术": ["亚比达奇凋死术", "ABI_DALZIM_S_HORRID_WILTING"],
            "吸收元素": ["吸收元素", "ABSORB_ELEMENTS"],
            "强酸箭": ["强酸箭", "ACID_ARROW"],
            "酸液飞溅": ["酸液飞溅", "ACID_SPLASH"],
            "阿迦纳萨喷火术": ["阿迦纳萨喷火术", "AGANAZZAR_S_SCORCHER"],
            "援助术": ["援助术", "AID"],
            "警报术": ["警报术", "ALARM"],
            "变身术": ["变身术", "ALTER_SELF"],
            "化兽为友": ["化兽为友", "ANIMAL_FRIENDSHIP"],
            "动物信使": ["动物信使", "ANIMAL_MESSENGER"],
            "动物形态": ["动物形态", "ANIMAL_SHAPES"],
            "操纵死尸": ["操纵死尸", "ANIMATE_DEAD"],
            "活化物体": ["活化物体", "ANIMATE_OBJECTS"],
            "防生物护罩": ["防生物护罩", "ANTILIFE_SHELL"],
            "反魔场": ["反魔场", "ANTIMAGIC_FIELD"],
            "关怀术": ["关怀术", "ANTIPATHY"],
            "嫌恶": ["嫌恶", "SYMPATHY"],
            "秘法眼": ["秘法眼", "ARCANE_EYE"],
            "秘法门": ["秘法门", "ARCANE_GATE"],
            "秘法魔掌": ["秘法魔掌", "ARCANE_HAND"],
            "秘法锁": ["秘法锁", "ARCANE_LOCK"],
            "秘法武器": ["秘法武器", "ARCANE_WEAPON"],
            "秘法师魔法灵光": ["秘法师魔法灵光", "ARCANIST_S_MAGIC_AURA"],
            "艾嘉西斯之铠": ["艾嘉西斯之铠", "ARMOR_OF_AGATHYS"],
            "哈达之臂": ["哈达之臂", "ARMS_OF_HADAR"],
            "星界投影": ["星界投影", "ASTRAL_PROJECTION"],
            "卜筮术": ["卜筮术", "AUGURY"],
            "生命灵光": ["生命灵光", "AURA_OF_LIFE"],
            "净化灵光": ["净化灵光", "AURA_OF_PURITY"],
            "活力灵光": ["活力灵光", "AURA_OF_VITALITY"],
            "启蒙术": ["启蒙术", "AWAKEN"]
        },
        "showName": {
            "STR": "力量",
            "DEX": "敏捷",
            "CON": "体质",
            "INT": "智力",
            "WIS": "感知",
            "CHA": "魅力",
        },
        "checkRules": {
            "default": {
                "checkList": [
                    "greatSuccess",
                    "greatFail"
                ],
                "greatSuccess": {
                    ".>=": ["$roll", 20]
                },
                "greatFail": {
                    ".<=": ["$roll", 1]
                }
            }
        }
    }
}

主骰/mainDice

这个词条的值是一个字符串,其内容为具体的被应用于.r.ra指令的表达式,例如:

{
    "mycard": {
        "mainDice": "1D40"
    }
}
那么当你切换至该人物卡模板时,你的.r.ra都将以1D40作为主骰。

.nn 仑质
骰子: [仑质]已重命名为[仑质]

.st temp mycard
骰子: 人物卡[仑质]套用模板[mycard]

.r
骰子: [仑质]掷骰: 1D40=26

.ra 20
骰子: [仑质]进行技能[20]检定: 1D40=14 成功

默认补全/customDefault

这个词条用来指定基于onedice标准的表达式解析过程中的自动补全。
例如,常见的自动补全有将.rd补全为.r 1d100,但是在DND5E规则中,我们希望它被补全为.r 1d20,这种时候我们就需要自定义默认补全。
我们需要首先明白,对于AdBkC这样的表达式,其中d主运算符k子运算符AB分别为d左值右值C则为k子参数

我们先以DND5E为例

{
    "DND5E": {
        "mainDice": "1D20",
        "customDefault": {
            "d": {
                "leftD": 1,
                "rightD": 20,
                "sub": {
                    "k": null,
                    "q": null,
                    "p": null,
                    "b": null
                },
                "subD": {
                    "p": 1,
                    "b": 1
                }
            }
        }
    }
}

主运算符名称

范例中的d即为指定要进行修改的主运算符为d,同理,它还可以是acf等。

左值默认leftD/右值默认rightD

用于表述左右值的默认值,当其不为null的整数时,将会在表达式中没有时进行补全,例如.rd+2d+d40将在这个人物卡模板下被补全为.r 1d20+2d20+1d40

子运算符补全/sub

子运算符会对主运算符的逻辑进行各种修饰与更改,大多数时候,我们会希望一个1d100仅仅具有1d100的功能,但在某些情况下,我们会希望2d100能被自动补全为2d100k1,即便我们没有在表达式中输入k这个子运算符,这时候,你就需要将该条目中的对应参数调整为不为null的整数,例如1

子参数默认/subD

除了自动补全子运算符以外,我们可能还会认为在大多数情况下输入子参数是很麻烦的,我们会希望将1d100p自动补全为1d100p1,那么你就会需要这个条目,你可以通过将p指定为不为null的整数,例如1,来实现这种补全,相反,当其为null时,输入1d100p这样的表达式将会向用户提示格式错误。

技能注册表/skill

这个条目用于注册人物卡的技能,通常来说,你的规则书会涉及一系列的已经确定的通用技能或属性,通过这个条目,你就可以实现对这些人物卡内容的分类,没有在这些分类上的额外自定义的技能,将会被划分到其它类别。

例如如下:

{
    "DND5E": {
        "skill": {
            "属性": [
                "STR",
                "DEX",
            ],
            "状态": [
                "载重",
                "负重",
                "护甲等级"
            ],
            "技能": [
                "运动",
            ]
        }
    }
}
那么当你使用.st show时,就可以有如下效果

人物卡[仑质]:
<属性>
STR:17 DEX:11
<状态>
载重:12 负重:13 护甲等级:6
<技能>
运动:14
<其它>
测试:2

技能配置表/skillConfig

这个条目用来给技能进行配置,会涉及很多类型的逻辑变化,例如跳过成长检定等。

跳过成长检定/skipEnhance

在一些规则中,有些技能在成功后不需要被标记为可成长,也不需要.en指令进行自动成长,所以这时,就需要将这些技能添加进该条目的数组中,这样就可以应用跳过成长检定的逻辑。

{
    "COC7": {
        "skillConfig": {
            "skipEnhance": [
                "STR",
                "CON",
                "SIZ",
                "DEX",
                "APP",
                "INT",
                "POW",
                "EDU",
                "LUC",
                "SAN",
                "SANMAX",
                "HP",
                "HPMAX",
                "MP",
                "MPMAX",
                "克苏鲁神话",
                "信用"
            ]
        }
    }
}

自动车卡/init

你或许经常使用.coc或者.dnd指令进行车卡,在青果骰中,你可以使用.st init指令进行自动车卡,而这个条目则是用于具体设置进行自动车卡时所需要使用的表达式。

{
    "COC7": {
        "init": {
            "STR": "3d6x5",
            "CON": "3d6x5",
            "SIZ": "(2d6+6)x5",
            "DEX": "3d6x5",
            "APP": "3d6x5",
            "INT": "(2d6+6)x5",
            "POW": "3d6x5",
            "EDU": "(2d6+6)x5",
            "LUC": "3d6x5"
        }
    }
}

技能自动映射/mapping

有时候,某些技能的值是由其它一个或多个技能的值通过某种方式计算得到的,而非随意的无关数字,这时候,你就需要通过这个条目来让这些自动计算的技能依照表达式完成计算,计算会在表达式可以正确计算时立即完成,并将结果值写入对应的技能中。

{
    "COC7": {
        "mapping": {
            "闪避": "{DEX}/2",
            "母语": "{EDU}",
            "SAN": "{POW}",
            "HP": "({CON}+{SIZ})/10",
            "HPMAX": "({CON}+{SIZ})/10",
            "MP": "{POW}/5",
            "MPMAX": "{POW}/5"
        }
    }
}

同义词/synonyms

通常,即便是同一个规则,或因翻译版本,或因地域不同,或因习惯差异,对于同一个技能名称或许会有多种称呼,例如侦查侦察取悦魅惑等,这些称呼在广大用户之间无法短期内实现统一,所以这个条目提供了这样一种定义同义词的方法,这些被绑定的词将会被视作同等的一个技能。

{
    "COC7": {
        "synonyms": {
            "取悦": ["取悦", "魅惑", "Charm"],
            "计算机使用": ["计算机使用", "计算机", "电脑", "电脑使用", "Computer_Use"],
            "信用": ["信用评级", "CR", "信誉", "信用度", "信用", "信誉度", "Credit_Rating"],
            "克苏鲁神话": ["克苏鲁神话", "CM", "克苏鲁", "Cthulhu_Mythos"],
            "电气维修": ["电气维修", "电器维修", "Electical_Repair"],
            "话术": ["话术", "快速交谈", "Fast_Talk"]
        }
    }
}

重定向/redirect

这个条目也通常用于解决同义词问题,但是这个条目最主要的功能是将一个技能重新定向至另一个技能,这并不是多个技能之间的等同,而是彻底将作为键的技能视作了作为值的技能。

{
    "COC7": {
        "redirect": {
            "力量": "STR",
            "体质": "CON",
            "体型": "SIZ",
            "敏捷": "DEX",
            "外貌": "APP",
            "智力": "INT",
            "意志": "POW",
            "教育": "EDU",
            "幸运": "LUC",
            "理智": "SAN",
        }
    }
}

展示名/showName

这个条目的逻辑与重定向相反,所以经常与其配合使用,它用于在展示人物卡技能时,替代原本可能不是很美观的,用于人物卡模板编写的技能名称,但需要注意的是,这个条目只会修改显示结果,不会调整指令响应和实际数据,所以最好不要将展示名设置的过于难以理解和联想。

{
    "COC7": {
        "showName": {
            "STR": "力量",
            "CON": "体质",
            "SIZ": "体型",
            "DEX": "敏捷",
            "APP": "外貌",
            "INT": "智力",
            "POW": "意志",
            "EDU": "教育",
            "LUC": "幸运"
        }
    }
}

技能默认值/defaultSkillValue

对于特定的规则,我们有时会希望一些技能即便没有录入,也存在一个不为0的默认值,例如COC7中,我们会希望会计的默认值是5,而不是0,这时候,你就需要使用这个条目。在这个条目中进行了规定的技能,将会在被读取时自动检测是否存在已经录入的值,如果没有,则会录入一个默认值。

{
    "COC7": {
        "defaultSkillValue": {
            "会计": 5,
            "人类学": 1,
            "估价": 5,
            "考古学": 1,
            "取悦": 15
        }
    }
}

检定规则/checkRules

检定规则是跑团中的重要一环,然而不同的规则中对检定的规定千差万别,所以本条目可以对检定的判定规则进行设计,以实现规则书中的效果。

检定规则范例
{
    "COC7": {
        "checkRules": {
            "default": {
                "checkList": [
                    "success",
                    "hardSuccess",
                    "extremeHardSuccess",
                    "greatSuccess",
                    "fail",
                    "greatFail"
                ],
                "success": {
                    ".<=": ["$roll", "$skill"]
                },
                "fail": {
                    ".>": ["$roll", "$skill"]
                },
                "hardSuccess": {
                    ".<=": [
                        "$roll",
                        {
                            "./": ["$skill", 2]
                        }
                    ]
                },
                "extremeHardSuccess": {
                    ".<=": [
                        "$roll",
                        {
                            "./": ["$skill", 5]
                        }
                    ]
                },
                "greatSuccess": {
                    ".==": ["$roll", 1]
                },
                "greatFail": {
                    ".or": [
                        {
                            ".and": [
                                {
                                    ".<": ["$skill", 50]
                                },
                                {
                                    ".>=": ["$roll", 96]
                                },
                                {
                                    ".<=": ["$roll", 100]
                                }
                            ]
                        },
                        {
                            ".and": [
                                {
                                    ".>=": ["$skill", 50]
                                },
                                {
                                    ".==": ["$roll", 100]
                                }
                            ]
                        }
                    ]
                }
            },
            "C0": {
                "greatSuccess": {
                    ".==": ["$roll", 1]
                },
                "greatFail": {
                    ".or": [
                        {
                            ".and": [
                                {
                                    ".<": ["$skill", 50]
                                },
                                {
                                    ".>=": ["$roll", 96]
                                },
                                {
                                    ".<=": ["$roll", 100]
                                }
                            ]
                        },
                        {
                            ".and": [
                                {
                                    ".>=": ["$skill", 50]
                                },
                                {
                                    ".==": ["$roll", 100]
                                }
                            ]
                        }
                    ]
                }
            }
        }
    }
}

默认检定规则/default

对于每个规则,都应当有一个默认检定规则,后续的各种功能,包括村规,也需要基于这个规则进行。检定规则中将会包含两种条目,即checkList和其它条目。

检定顺序/checkList

对于检定规则,将会存在各种结果,例如大成功失败等,这个条目将以一个数组规定这些检定结果的判定顺序,当其中一个条件满足后,将不会继续向下进行判定。这个数组中的条目将对应检定规则/checkRules中的其它条目。

检定结果

青果骰目前已经内置了许多检定结果,并且后续将会加入在人物卡模板中自定义检定结果的方法。
内置的检定结果列举如下:

检定结果列表
条目名 检定结果
success 成功
fail 失败
greatSuccess 大成功
greatFail 大失败
hardSuccess 困难成功
extremeHardSuccess 极难成功
fate01 -2 拙劣
fate02 -1 差劲
fate03 +0 二流
fate04 +1 一般
fate05 +2 尚可
fate06 +3 良好
fate07 +4 极佳
fate08 +5 卓越
fate09 +6 惊异
fate10 +7 史诗
fate11 +8 传奇
表达方式

为了计算检定结果,在这一部分提供了一种基于Json格式的,名为GJson的表达计算过程的结构,需要将相关的逻辑用这一结构进行编写,目前已经提供了如下运算符:

检定运算符列表
符号 参数类型 功能
.and 对象/数组 当其包含的条件全部为真时,则为真,否则为假
.or 对象/数组 当其包含的条件至少一个为真时,则为真,否则为假
.== 数组 当数组中第一个值等于第二个值时,为真,否则为假
.> 数组 当数组中第一个值大于第二个值时,为真,否则为假
.< 数组 当数组中第一个值小于第二个值时,为真,否则为假
.>= 数组 当数组中第一个值不小于第二个值时,为真,否则为假
.<= 数组 当数组中第一个值不大于第二个值时,为真,否则为假
.+ 数组 将数组中第一个值与第二个值相加
.- 数组 将数组中第一个值与第二个值相减
.* 数组 将数组中第一个值与第二个值相乘
./ 数组 将数组中第一个值与第二个值相除取商
.% 数组 将数组中第一个值与第二个值相除取余
.node 成功 向上一级传递本级的所有参数,特殊情况下才需要使用
变量

理所当然的,要判断检定结果,仅有运算符是不够的,还需要有能够将掷骰结果、技能值等参数引入计算的变量,所有的变量都以$作为开头,列举如下:

检定运算变量列表
符号 参数类型 功能
$skill 数字 技能值
$roll 数字 掷骰结果数值
组织方式

通常情况下,比方说,假设我们要进行一个简单的大小比较时,我们希望技能值小于掷骰结果时判定成功,那么我们可以这样编写:

{
    ".<": ["$skill", "$roll"]
}

如果在此基础上,我们还希望掷骰结果不能被10整除,即为除以10的余数要大于0,也就是说,需要这两个条件同时满足才能达到判定条件,我们可以这样编写:

{
    ".and": {
        ".<": ["$skill", "$roll"],
        ".>": [
            {
                ".%": ["$roll", 10]
            },
            0
        ]
    }
}

在此基础上,我们可能还需要确保掷骰结果小于技能值的两倍,这时候你会发现,在对象.and的内部出现了两个键同时为.<的情况,这在Json当中不是正确的格式,所以你需要将.and的参数改为数组后,这样编写:

{
    ".and": [
        {
            ".<": ["$skill", "$roll"]
        },
        {
            ".>": [
                {
                    ".%": ["$roll", 10]
                },
                0
            ]
        },
        {
            ".<": [
                "$roll"
                {
                    ".*": ["$skill", 2]
                }
            ]
        }
    ]
}

村规检定规则

除了default以外条目将会被作为村规检定规则进行加载,可以通过.st rule [规则名]的指令进行切换,村规加载将会在默认规则的模板上进行替换加载,所以你在编写时只需要重点关注并编写村规与默认规则的不同之处即可。