将python代码编译为Mindustry微处理器指令
项目描述
敏皮勒
允许更轻松地控制工业微处理器。您可以编写Python 的子集,而不是类似于汇编程序的 Mindustry 指令。将此视为重用 Python 语法而不是 Python 实现的努力。
警告:所有需要动态内存的东西都不起作用:任何数据结构(列表、字典等)、类、闭包、递归。此外,您不能使用任何 Python 内置函数(输入、评估、异常等)。Imports 什么都不做,使用它让 flake8 开心。说明如下。
基本原理
工业微处理器非常好且易于理解。它们对每单位时间的指令有明确的限制。它们可以对浮点数进行操作、引用对象 (null、常量字符串、@-objects、游戏中的单位)并触发几个影响游戏的命令。
这是一个示例程序,可根据时间在铅和钛之间切换卸载器输出:
read time cell1 0
op add time time 1
jump 4 lessThan time 300
set time 0
write time cell1 0
jump 8 greaterThan time 200
control configure unloader1 @titanium
end
control configure unloader1 @lead
这个程序相当简单,但是如果你在程序中间插入任何指令,你必须重写很多jump地址。
如果你想计算一些公式,比如说
2 + a * 2 + b + c * d * 3
你必须写:
op mul _r1 a 2
op add _r2 2 _r1
op add _r3 _r2 b
op mul _r4 c d
op mul _r5 _r4 3
op add result _r3 _r5
它变得无聊、容易出错并且很难修改。
如果您可以改为编写以下内容怎么办:
time = cell1[0]
time += 1
if time >= 300:
time = 0
cell1[0] = time
unloader1.configure(M.at.lead if time > 200 else M.at.titanium)
result = 2 + a * 2 + b + c * d * 3
使用 minpiler 是可能的!
- 用 Python 的子集编写代码
- 编译成Mindustry指令
- 将结果复制到剪贴板
- 将代码直接导入正在运行的游戏中
到目前为止一切顺利,看起来您可以编写 Python 代码然后将其导入游戏。作为一个优秀的 Pythonista,你渴望使用你对闭包、类和装饰器的知识来编写 Mindustry 控制器,但不幸的是我不得不阻止你。您将无法使用大部分 Python。所有限制都来自 Mindustry 处理器架构:
- 没有数据结构,只允许标量值(浮点数或不透明对象)。唯一的例外是内存单元,它表现为固定大小的浮点数组。
- 您不能间接访问变量,没有指针,没有
getattr. - 前者的后续,不可能实现动态内存/堆栈(至少没有内存单元)。这使得列表、迭代器、类、闭包和其他事情变得不可能。
- 内置函数集非常有限,您只能调用游戏中可用的内容(M.print、M.draw.clear 等)
无论如何,我希望 Minpiler 足够方便,让您在玩 Mindustry 时玩得开心。
如何使用
# Install packages
pip install minpiler pyperclip
# Compile your code into clipboard
python -m minpiler --clip yourfile.py
# now open processor building, press Edit button, Import from Clipboard
Pyperclip 是可选的,它只与--clip选项一起使用。
请参阅此存储库中的一组代码示例。
兼容性
Python >= 3.6 或兼容的 pypy3。
工业:目前仅测试了 121 个。
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。