显然我做不到也不可能将信号处理和负载生成做成拼接组件的模式,模拟器其中一个重要意义就是不再需要在游戏内一点点接线改组件,因此我选择了执行代码的方式来替代拼接组件。
所以需要那么一点点的代码能力,代码区域需要使用JavaScript编写,但只是很简单的运算代码和条件判断代码,更复杂的代码是不需要的,因为就算你写了复杂代码也没法转换成游戏内的组件,只有简单运算和简单判断可以转换成组件
刚开始使用此模拟器时可以使用预设的模板代码并在模板代码的基础上进行修改,你既然能够研究电路,相信很快也能学会简单的代码编写。
在任何代码区域中,如果你需要记录旧的值,即模拟内存组件的效果,可以使用memory变量,通过设置memory变量的属性来保存值,当然请只设置简单的数字或字符串,不然你也没法搬进游戏用。因为代码如果没有值会直接报错,而不像游戏一样只是不参与运算,所以需要确保每个memory中保存的值都初始化之后才使用
还有一个shareMemory变量,用法和memory是一样的,但是memory不能在负载生成和信号处理之间互通,如果有特殊需求的需要互通内存的可以使用shareMemory
if (!memory.x) memory.x = 1; // 这里确保x是有值的
memory.y = memory.x + 1; // 这时候y使用了上一帧的x的值进行运算
memory.x = 各种运算后的结果; // 这时候x更新为这一帧的运算结果
对于负载生成代码,你会得到一个deltaTime参数,deltaTime是这一帧距离上一帧经过的"现实时间",单位是秒。(这个"现实时间"指的是1倍数情况下的时间,开启模拟器倍数后"现实时间"仍然是一样的)
同时你需要将生成的负载值设置到output.load中
// 这是一个0.5Hz锯齿波的示例
if (!memory.factor) memory.factor = 0; // 这里确保factor是有值的
memory.factor = (memory.factor + deltaTime * 0.5) % 1; // 每帧增加0.5倍的帧耗时,但确保不超过1
output.load = memory.factor * 1000; // 将factor作为比例系数乘1000,使负载在0~1000波动
对于信号代码,你会得到一个signal参数,代表游戏中反应堆的信号接口,signal.in是反应堆输入的信号,signal.out是反应堆输出的信号,你可以通过下表了解都有哪些的信号
代码变量 | 对应游戏内反应堆信号 |
signal.out.power | 功率输出 |
signal.out.load | 负载输出 |
signal.out.temperature | 温度输出 |
signal.out.allHeatPotential | 燃料输出 |
signal.out.fuelRodDurabilityRate | 燃料剩余百分比 |
signal.in.fissionRate | 设置裂变速率 |
signal.in.turbineOutput | 设置涡轮输出 |
你需要将涡轮输出设置到signal.in.turbineOutput中,将裂变速率设置到signal.in.fissionRate中
// 这是一个涡轮输出拉满,裂变随负载变化的示例,这个示例不考虑是否能正确跟随负载,仅作为一个代码编写示例
const maxPower = 3000;
signal.in.turbineOutput = 100;
signal.in.fissionRate = (signal.out.load / maxPower) * 10 + 10;
以下是一部分游戏内的组件对应的代码
组件 | 代码 |
加法组件 | a + b |
减法组件 | a - b |
乘法组件 | a * b |
除法组件 | a / b |
模组件 | a % b |
否组件 | !a |
幂组件 | Math.pow(a, b) |
平方根组件 | Math.sqrt(a) |
任意运算组件限制最大值 | Math.min(a, 最大值) |
任意运算组件限制最小值 | Math.max(a, 最小值) |
等于组件 | a == b |
大于组件 | a > b |
上整组件 | Math.ceil(a) |
下整组件 | Math.floor(a) |
整组件 | Math.round(a) |
绝对值组件 | Math.abs(a) |
信号检查组件 | a == 目标信号 ? 输出 : 伪输出 |
内存组件 | memory.a = a |
与组件 | a && b |
或组件 | a || b |
异或组件 | (a && !b) || (!a && b) |
正弦组件 | Math.sin(a) |
余弦组件 | Math.cos(a) |
正切组件 | Math.tan(a) |
连接组件 | `${a}分隔符${b}` |