160 lines
3.9 KiB
Python
160 lines
3.9 KiB
Python
import sys
|
|
import json
|
|
import random
|
|
import logger
|
|
|
|
this = sys.modules[__name__]
|
|
|
|
this.encoded = None
|
|
this.pattern = None
|
|
this.values = {
|
|
"stack": 0,
|
|
"stack2": 0,
|
|
"stack3": 0,
|
|
"stack4": 0,
|
|
"stack5": 0,
|
|
"stack6": 0,
|
|
"stackr": 0,
|
|
"stackg": 0,
|
|
"stackb": 0,
|
|
"r": 0,
|
|
"g": 0,
|
|
"b": 0,
|
|
"tick": 0,
|
|
"index": 0
|
|
}
|
|
|
|
|
|
def constant(target, arg, index):
|
|
return (arg, index)
|
|
|
|
|
|
def add(target, arg, index):
|
|
return (target + arg, index)
|
|
|
|
|
|
def sub(target, arg, index):
|
|
return (target - arg, index)
|
|
|
|
|
|
def mult(target, arg, index):
|
|
return (target * arg, index)
|
|
|
|
|
|
def div(target, arg, index):
|
|
return (target / arg, index)
|
|
|
|
|
|
def mod(target, arg, index):
|
|
if arg <= 0:
|
|
return target
|
|
return (target % arg, index)
|
|
|
|
|
|
def rand(target, arg):
|
|
return random.randrange(0, 255)
|
|
|
|
|
|
def jnz(target, arg, index):
|
|
if target != 0:
|
|
return (target, arg)
|
|
else:
|
|
return (target, index)
|
|
|
|
|
|
def jez(target, arg, index):
|
|
if target == 0:
|
|
return (target, arg)
|
|
else:
|
|
return (target, index)
|
|
|
|
|
|
def _apply(index, target, arg, func):
|
|
if type(arg) is int:
|
|
print("{} {} {} {}".format(index, func.__name__, target, arg))
|
|
return func(target, arg, index)
|
|
elif type(arg) is str and arg in this.values:
|
|
print("{} {} {} {}".format(
|
|
index, func.__name__, target, this.values[arg]))
|
|
return func(target, this.values[arg], index)
|
|
|
|
|
|
def apply(index, targets, args, func):
|
|
for target in range(len(targets)):
|
|
if this.values[targets[target]['channel']] != None:
|
|
if target < len(args):
|
|
val, jump = _apply(
|
|
index, this.values[targets[target]['channel']], args[target], func)
|
|
if val != this.values[targets[target]['channel']]:
|
|
this.values[targets[target]['channel']] = val
|
|
return jump
|
|
else:
|
|
val, jump = _apply(
|
|
index, this.values[targets[target]['channel']], 0, func)
|
|
if val != this.values[targets[target]['channel']]:
|
|
this.values[targets[target]['channel']] = val
|
|
return jump
|
|
|
|
|
|
this.instructions = {
|
|
"CONSTANT": constant,
|
|
"ADD": add,
|
|
"SUBTRACT": sub,
|
|
"MULTIPLY": mult,
|
|
"DIVIDE": div,
|
|
"MODULO": mod,
|
|
"RANDOM": rand,
|
|
"JNZ": jnz,
|
|
"JEZ": jez
|
|
}
|
|
|
|
|
|
def default(index, tick):
|
|
return (((index + tick) * 5) % 255, (tick * 42) % 255, (tick * 50) % 255)
|
|
|
|
|
|
def pat(index, tick, previous_values):
|
|
this.values['tick'] = tick
|
|
this.values['index'] = index
|
|
if this.pattern != None:
|
|
for i in range(len(this.pattern)):
|
|
if i < len(this.pattern):
|
|
name = this.pattern[i]['instruction']['name']
|
|
targets = this.pattern[i]['instruction']['targets']
|
|
args = []
|
|
if 'args' in this.pattern[i]['instruction']:
|
|
args = this.pattern[i]['instruction']['args']
|
|
if this.instructions[name] != None:
|
|
jump = apply(i, targets, args, this.instructions[name])
|
|
#print("{} {} {}".format(jump, i, len(this.pattern)))
|
|
if jump != i and jump <= len(this.pattern):
|
|
i = jump - 1
|
|
r = this.values["r"]
|
|
g = this.values["g"]
|
|
b = this.values["b"]
|
|
this.values["r"] = 0
|
|
this.values["g"] = 0
|
|
this.values["b"] = 0
|
|
this.values["stack"] = 0
|
|
if r > 255:
|
|
r = 255
|
|
elif r < 0:
|
|
r = 0
|
|
if g > 255:
|
|
g = 255
|
|
elif g < 0:
|
|
g = 0
|
|
if b > 255:
|
|
b = 255
|
|
elif b < 0:
|
|
b = 0
|
|
print("final color: {}", (r, g, b))
|
|
return (r, g, b)
|
|
else:
|
|
return default(index, tick)
|
|
|
|
|
|
def parse(str):
|
|
this.encoded = str
|
|
logger.debug(this.encoded)
|
|
this.pattern = json.loads(this.encoded)
|