statically typed high level mindustry logic language
pip install mlogpp
python -m mlogpp <file(s) to compile> [options]
-o:f,--output-file- output to file-o:s,--output-stdout- output to stdout-o:c,--output-clip- output to clipboard (default)-v,--verbose- output more information-l,--lines- print line numbers when output is stdout-a,--assembly- compile as mlog++ assembly-V,--version- print version and exit
Block message1
print("Hello, World!")
printflush(message1)Prints Hello, World!
const x = 5
const let y = "constant"
const num a, b
a = 5
b = 3for (num i = 1; i < 11; i += 1) {
print(i)
if (i < 10) {
print(", ")
}
}
Block message1
printflush(message1)Prints 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
for (i : 1..5) {
print(i + 1)
print(" ")
}
Block message1
printflush(message1)Prints 2 3 4 5
function length(num x, num y) -> num {
return sqrt(x * x + y * y)
}
print(length(3, 4))
Block message1
printflush(message1)Prints 5
Block cell1, message1
cell1[0] = 10
print(cell1[0])
printflush(message1)Prints 10
ubind(@mega)
ucontrol.move(@thisx, @thisy)Makes all @mega units move to the processor
num a = 0
# use let for type inference
let b = 0
function test(num x) {
let a = x
b = x
}
test(10)
print(a)
print(" ")
print(b)
Block message1
printflush(message1)Prints 0 10
Block message1
struct Vec2 {
num x
num y
static size = 2
static get_size() {
return Vec2::size
}
function increase_x(self, num n) {
self.x += n
}
}
let vec = Vec2(10, 20)
vec.increase_x(5)
# static properties can be accessed
# using `.` from an instance
# or using `::` from the type
vec.y += vec.size + Vec2::get_size()
print(vec.x)
print(" ")
print(vec.y)
printflush(message1)Prints 15 24
${LOOP_LENGTH = 2 + 3}
i = 0
loop_start:
i += 1
print(i)
print("\n")
:loop_start (i < ${LOOP_LENGTH})
Block message1
printflush(message1)Prints 1 2 3 4 5
- variables
num x = 1 - type inference
let x = 2 - constants
const x = 2
const num y = 3
const let z = 5 - types
num,strBlock,Unit,BlockType,UnitType,ItemType,LiquidType,Controller,Team
- comments
# comment - memory cell access
cell1[0] = cell1[1] - functions
function f(num x, num y) -> num { return x + y } - subcommands
ucontrol.move(1, 2) - if / else
if (a == b) { print("a") } else { print("b") } - while loops
while (a > b) { b += 1 } - for loops
for (num i = 0; i < 10; i += 1) { print(i) } - ranges
for (i : 5) { print(i) } - break / continue
- native functions
ubind(@mega) - constants
const VALUE = 30 - inline python subset
${x = 7 ^ 2}
print(${y = x // 2})
${"cell" + x}[0] = y - output from builtin functions directly to new variables (can be constants)
ulocate.building(core, true, x: num, y: num, building: const Block) - structures with inheritance
struct Vec2 { num x, y }
struct Vec3 : Vec2 { num z } - colors for effects
effect.hit(x, y, %_35adc8)
-
read
result,cell,position- Read data from
cellatpositiontoresult
- Read data from
-
write
data,cell,position- Write
datatocellatposition
- Write
-
draw
operation,arg0...arg5- Add a draw
operationto the draw buffer - Operations:
- clear
red,green,blue - color
red,green,blue,alpha - stroke
width - line
x1,y1,x2,y2 - rect
x,y,width,height - lineRect
x,y,width,height - poly
x,y,sides,radius,rotation - linePoly
x,y,sides,radius,rotation - triangle
x1,y1,x2,y2,x3,y3 - image
x,y,image,size,rotation
- clear
- Add a draw
-
drawflush
display- Flush the draw buffer to
display
- Flush the draw buffer to
-
print
message- Add
messageto the draw buffer
- Add
-
printflush
message- Flush the draw buffer to
message
- Flush the draw buffer to
-
getlink
result,n- Put the
nth link toresult
- Put the
-
control
command,block,arg0...arg2- Control
block - Commands:
- enabled
block,enabled - shoot
block,x,y,shoot - shootp
block,unit,shoot - config
block,configuration - color
block,red,green,blue
- enabled
- Control
-
radar
filter0...filter2,sort,block,order,result- Find a unit near
blockand store it inresult - Filters:
- any
- enemy
- ally
- player
- attacker
- flying
- boss
- ground
- Sort:
- distance
- health
- shield
- armor
- maxHealth
- Find a unit near
-
sensor
result,block,parameter- Get
parameterofblockand store it inresult
- Get
-
op
operation,result,op0,op1- Perform a mathematical operation
- Operations:
- Basic: add, sub, mul, div, idiv (integer division), mod, pow, lessThan, lessThanEq, greaterThan, greaterThanEq, max, min, abs, log, log10, floor, ceil, sqrt, sin, cos, tan, asin, acos, atan, equal, notEqual
- Bitwise: shl (shift left), shr (shift right), or, and, xor, not
- Special:
- strictEqual - doesn't coerce types
- land - logic and
- angle - angle of vector
- len - length of vector
- noise - simplex noise
- rand - random number
-
wait
time- Wait
timeseconds
- Wait
-
lookup
type,result,id- Look up
typebyid - Types:
- block
- unit
- item
- liquid
- Look up
-
end
- End the program
-
jump
position,condition,op0,op1- Jump to
positionifconditionis met - Conditions:
- equal
- notEqual
- lessThan
- lessThanEq
- greaterThan
- greaterThanEq
- strictEqual
- always
- Jump to
-
ubind
type- Bind next unit of type
typeand store it in@unit
- Bind next unit of type
-
ucontrol
command,op0...op4- Control the bound unit
- Commands:
- idle
- stop
- move
x,y - approach
x,y,radius - boost
enable - pathfind
- target
x,y,shoot - targetp
unit,shoot - itemDrop
to,amount - itemTake
from,item,amount - payDrop
- payTake
takeUnits - mine
x,y - flag
value - build
x,y,block,rotation,configuration - getBlock
x,y,type,building - within
x,y,radius,result
-
uradar
filter0...filter2,sort,___,order,result- Same as radar, except
blockis replaced by@unit
- Same as radar, except
-
ulocate
type,arg0...arg2,outx,outy,found,building- Locate block of type
type - Types:
- ore
___,___,oreType - building
group,enemy,___ - spawn
___,___,___ - damaged
___,___,___
- ore
- Building groups:
- core
- storage
- generator
- turret
- factory
- repair
- rally
- battery
- reactor
- Locate block of type
-
mathematical functions (replacement for
op):- mod
- pow
- and, or, xor, not
- max, min
- abs
- log, log10
- ceil, floor
- sqrt
- sin, cos, tan
- asin, acos, atan