Skip to main content

将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 是可能的!

  1. 用 Python 的子集编写代码
  2. 编译成Mindustry指令
  3. 将结果复制到剪贴板
  4. 将代码直接导入正在运行的游戏中

到目前为止一切顺利,看起来您可以编写 Python 代码然后将其导入游戏。作为一个优秀的 Pythonista,你渴望使用你对闭包、类和装饰器的知识来编写 Mindustry 控制器,但不幸的是我不得不阻止你。您将无法使用大部分 Python。所有限制都来自 Mindustry 处理器架构:

  1. 没有数据结构,只允许标量值(浮点数或不透明对象)。唯一的例外是内存单元,它表现为固定大小的浮点数组。
  2. 您不能间接访问变量,没有指针,没有getattr.
  3. 前者的后续,不可能实现动态内存/堆栈(至少没有内存单元)。这使得列表、迭代器、类、闭包和其他事情变得不可能。
  4. 内置函数集非常有限,您只能调用游戏中可用的内容(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 个。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

minpiler-0.3.2.tar.gz (19.7 kB 查看哈希

已上传 source

内置分布

minpiler-0.3.2-py3-none-any.whl (17.8 kB 查看哈希

已上传 py3