>Р?ђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярђџџџџџџЯќџЬџџЬџџџџџЬќџџџџџџџЯќџџџџџџџџџџЬџџЬџџярТќЯџџџџЯџЯЬЬџЯџџЬЬЯќЬЯќќџџџџЯџџЬЬџЬЬЯЬќЯЬЬџЯџџярТќЯџџџџЯџџЬџџЯџЯЬџЯЬЯЯЬЬџџџџЯџЯЬџЯџЬЯќЯџЬџџЯџџярђЬќџЬџџЯџџЬџџЯџџЯЬЯќЯЯЯЯџЬџџЯџџЯЬЯџЬЯќџџЬџџЯџџярђЯџџЬџџЯќџЯЬџЬџЯЬќџЬќЯЯЯџЬџџЯќЯЬќџЬЬЯќџџЯЬџЬџџярђџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџЬџџџџџџџџџџярџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярџџџџџџџџџџЬџџџџџџџџЬџџџџџЬЬџџќџџџџџџџџџџџџџџџџярџЬЬџџџџџџџЬџџЬќџЬЬџЬџџЬќџџЬџЯџџџџџџџџџџџџџџџџџярЯЬџџџџџџџџЬџЯќЯЯЬџџЬџџџџџЯќџЯџџџџџџџџџџџџџџџџџя """рџЯЬџџџџџџџЬџЯќЯЯЬџџЬџџЬќџџџџЯџџџџџџџџџџџџџџџџџя """рЯЬќџЬЬџЬЬџЯЬџЬќџЬЬџЯЬџџџџЯќџџќџЬЬџЬЬџЬЬџЬЬџЬЬџя """рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя """рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя """рџџџџџџџџџџџџџЬџџџџџџџџџџџџџџџџџџџџџџџџџЯЬќџџџџя """рџџџЯќЯЯЬќџЬЬџЬџџџџџџџџџџџџџџџџџџџџџџЯќЬџџЬџЯџџя """рџџџЯќЯЯќЯЯџЬџџџџџџџџџџџџџџџџџџџџџџџџџЬќџЬќџЬќџярџџџџЬќЯќЯЯџЬџЬџџџџџџџџџџџџџџџџџџџџЬџџЬќЯќџџЯџџярџЬЬџЯџЯЬќџЬЬџЬџџЬЬџЬЬџЬЬџЬЬџЬЬџЬЬџЬџЯќЬЯЬЬџџџџя0333рџџџџџџЯќџџџЬџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя0333р@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя0333рџџџџџџџџџџџџџЯќџџџџЬџџЬќџџџџЬџџЬќџџџџЬЬџџќџџџџя0333р@џЬЬЯЬќџџџЯџЬџЬќџЯџџЬџЯЯЯџџџЯЬЬЯќЬџЬќџџЬџЯџџџџџя0333рЯЬџЯќЯџџџЯџЬџЯќџЬќџЬџЯЯЬџџџџЬџЯЬЯџџџџЯќџЯџџџџџя0333р@џЯЬЯќЯџЬџџЬЬџЯќџЯџџЬџЯџџџЬџџЬџЯќЯџЬќџџџџЯџџџџџя0333рЯЬќЯЬќџЬџџџЬџЬЬџџџџЯЬџЬќџЬџџЯЬџЬќџџџџЯќџџќџЬЬџяр@џџџЯќџџџџџЬќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяDDDDф00џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяDDDDф@џџџџџџџџџџџџџЬџџџџџџџџџџџџџЯЬќџџџџЬџџџџџџџџџџџяDDDDф0џџџџџџЯЬќџЬЬџЬџЯЬќџџџЯќЬџЬЬџџЬџџџџЬџџЯџџЬЬЯЬќџяDDDDф00@џџџџџџЯќЯЯџЬџџџЯќЯџџџџЬќЯЬџџЬќџЬќџЬџџЬќЯЬџЯќЯџяDDDDф3@џџџџџџЯќЯЯџЬџЬџЯќЯџЬџџЬќџЯЬЯќџџџџџЬџџЯџџЯЬЯќЯџяDDDDф003@џЬЬџЬЬЯЬќџЬЬџЬџЯЬќџЬџЯќЬЯЬќЯЬЬџџџџЯЬџџџЯЬќЯЬќџяDDDDфџџџџџџЯќџџџЬџџџЯќџџџџџџџџџџџџџџџџџџџџџџџџџЯќџџяDDDDф@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяDDDDфџџџџџџџЯќџџџџЬџџЬќџџџџЬџџЬќџџџџЬЬџџќџџџџџџџџџџяр@џџџЯџЬџЬќџЯџџЬџЯЯЯџџџЯЬЬЯќЬџЬќџџЬџЯџџџџџџџџџџџяPUUUрџџџЯџЬџЯќџЬќџЬџЯЯЬџџџџЬџЯЬЯџџџџЯќџЯџџџџџџџџџџџяPUUUр0@џЬџџЬЬџЯќџЯџџЬџЯџџџЬџџЬџЯќЯџЬќџџџџЯџџџџџџџџџџџяPUUUр000џЬџџџЬџЬЬџџџџЯЬџЬќџЬџџЯЬџЬќџџџџЯќџџќџЬЬџЬЬџЬЬџяPUUUр0@џџџџЬќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяPUUUр0џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяPUUUр@џџџџџџџќџџќџџќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяPUUUр03ЯЬќџЬЬџЯџџЯџџЯџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяр@ЯќЯЯџЬџЯџџЯџџЯџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярЯќЯЯџЬџЯџџЯџџЯџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя`fffр@ЯЬќџЬЬџќџџќџџќџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя`fffрЯќџџџЬџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя`fffр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя`fffрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя`fffр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя`fffрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя`fffр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяpwwwрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяpwwwр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяpwwwрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяpwwwр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяpwwwрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяpwwwр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяpwwwрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя€ˆˆˆр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя€ˆˆˆрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя€ˆˆˆр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя€ˆˆˆрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя€ˆˆˆр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя€ˆˆˆрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя€ˆˆˆр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя™™™рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя™™™р@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя™™™рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя™™™р@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя™™™рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя™™™р@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя™™™рџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя ЊЊЊр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя ЊЊЊрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя ЊЊЊр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя ЊЊЊрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя ЊЊЊр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя ЊЊЊрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя ЊЊЊр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяАЛЛЛрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяАЛЛЛр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяАЛЛЛрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяАЛЛЛр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяАЛЛЛрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяАЛЛЛр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяАЛЛЛрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяРЬЬЬр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяРЬЬЬрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяРЬЬЬр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяРЬЬЬрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяРЬЬЬр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяРЬЬЬрџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяРЬЬЬр@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяр@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяанннр@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяанннр@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяанннр@@@@@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяанннр@@@@@@@@@@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяанннр@@@@@@@@@@@@@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяанннр@@@@@@@@@@@D@@@@@@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяанннр@@@@@@@@@@@DDD@@@@@@@@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяр@@@@@@@@DD@DDDDDD@@@@@@@D@@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяр@@@@@@@@DDDDDDDDDDD@@@@@DDD@@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярюююр@@@@@@@DDDDDDDDDDDDDD@@@DDDDD@@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярюююр@@@@@@@DDDDDDDDDDDDDDDD@DDDDDDD@@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярюююр@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярюююр@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярюююр@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярюююр@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярюююр@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяр@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџяр@@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя№џџџр@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя№џџџр@@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя№џџџр@@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя№џџџр@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя№џџџр@@@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя№џџџрDDD@@@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџя№џџџрDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@@џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџярDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD@@@8-- title: MagicScript -- author: Sava -- desc: Very magical stack-based programming language -- license: MIT License -- version: 0.1 -- script: lua w=240 h=136 wrX=w-h selX=wrX-10 selected=3 grid={} cursor=0 elements={} t=0 function BOOT() trace("start") grid={} for i=1, h do grid[i]={} for j=1, h do grid[i][j]=0 end end for i=1, 15 do elements[i] = {name="Element #"..i, update=function(x, y)end, code=""} end elements[4].code = "v.t0=?(___q:____.x1+sp.y1+l@.t0=?(___pq:p.xs1-l+sp.y1+l@.t0=?(___pq)))" elements[9].code = "v.t0=?(___q:1#=?(>.t0=?(___pq):<.t0=?(___pq)))" end --[[ t - get type of last (only for part) x - get x of last (only for part) y - get y of last (only for part) ! - push not last | - push or last 2 & - push and last 2 = - push equal last 2 / - push last > secondlast \ - push last < secondlast ?() - if + - push add last 2 - - push negate last * - push mult last 2 r - push reciprocal of last <>v^ - push part in that dir 1234567890 - push number (continuous) , - number separator (multi-number push) - - pop $ - copy last s - swap last 2 parts on grid --]] --[[ [Element #1] vt0=?(___s) --]] keys = { {keyC="a", shifted="A"}, {keyC="b", shifted="B"}, {keyC="c", shifted="C"}, {keyC="d", shifted="D"}, {keyC="e", shifted="E"}, {keyC="f", shifted="F"}, {keyC="g", shifted="G"}, {keyC="h", shifted="H"}, {keyC="i", shifted="I"}, {keyC="j", shifted="J"}, {keyC="k", shifted="K"}, {keyC="l", shifted="L"}, {keyC="m", shifted="M"}, {keyC="n", shifted="N"}, {keyC="o", shifted="O"}, {keyC="p", shifted="P"}, {keyC="q", shifted="Q"}, {keyC="r", shifted="R"}, {keyC="s", shifted="S"}, {keyC="t", shifted="T"}, {keyC="u", shifted="U"}, {keyC="v", shifted="V"}, {keyC="w", shifted="W"}, {keyC="x", shifted="X"}, {keyC="y", shifted="Y"}, {keyC="z", shifted="Z"}, {keyC="0", shifted=")"}, {keyC="1", shifted="!"}, {keyC="2", shifted="@"}, {keyC="3", shifted="#"}, {keyC="4", shifted="$"}, {keyC="5", shifted="%"}, {keyC="6", shifted="^"}, {keyC="7", shifted="&"}, {keyC="8", shifted="*"}, {keyC="9", shifted="("}, {keyC="-", shifted="_"}, {keyC="=", shifted="+"}, {keyC="[", shifted="{"}, {keyC="]", shifted="}"}, {keyC="\\", shifted="|"}, {keyC=";", shifted=":"}, {keyC="'", shifted="\""}, {keyC="`", shifted="~"}, {keyC=",", shifted="<"}, {keyC=".", shifted=">"}, {keyC="/", shifted="?"}, {keyC=" ", shifted=" "}, {keyC=" ", shifted=" "}, {keyC="enter", shifted="enter"}, {keyC="backspace", shifted="backspace"}, {keyC="delete", shifted="delete"} } t=0 function TIC() mx, my, left, _, right = mouse() if btnp(0) then cursor=cursor-15 cursor=math.max(cursor, 0) end if btnp(1) then cursor=cursor+15 cursor=math.min(cursor, elements[selected+1].code:len()) end if btnp(2) then cursor=cursor-1 cursor=math.max(cursor, 0) end if btnp(3) then cursor=cursor+1 cursor=math.min(cursor, elements[selected+1].code:len()) end for i=1, #keys do if keyp(i) and t ~= 0 then if keys[i].keyC == "backspace" then if cursor > 0 then elements[selected+1].code=elements[selected+1].code:sub(1, cursor-1)..elements[selected+1].code:sub(cursor+1) cursor=cursor-1 end elseif keys[i].keyC == "enter" then elements[selected+1].update = compile(elements[selected+1].code) else elements[selected+1].code=elements[selected+1].code:sub(1, cursor)..keys[i].keyC..elements[selected+1].code:sub(cursor+1) cursor=cursor+1 end end end if left and inGrid(mx-wrX, my) then grid[mx-wrX][my]=selected+1 end cls(0) line(wrX-1, 0, wrX-1, h, 14) for i=0, 14 do rect(selX-1, math.floor(i*h/15), 10, h/15, i+1) if i == selected or (mx >= selX-1 and mx < selX+9 and my >= i/15*h-1 and my < (i+1)/15*h-1) then if left then selected = i cursor=math.min(cursor, elements[selected+1].code:len()) end else rectb(selX, i*h/15, 9, h/15, 0) end end line(selX-1, 0, selX-1, h, 14) rect(0, 0, selX-1, h, 15) local e = elements[selected+1] for i=1, e.code:len(), 15 do print(e.code:sub(i, i+14), 1, 1+i//15*7, 12, true) end rect(cursor%15*6, cursor//15*7, 1, 7, t//15%2==0 and 2 or 15) for t=0, 3 do for i=1+t//2%2, h-1, 2 do for j=1+t%2, h-1, 2 do if grid[i][j] ~= 0 then x=i y=j elements[grid[i][j]].update(i, j) end end end end for i=1, h do for j=1, h do pix(i+wrX-1, j-1, grid[i][j]) end end t=t+1 end function compile(str) local keywords = { ["v"]="st[#st+1]=get(x, y+1)\n", ["^"]="st[#st+1]=get(x, y-1)\n", ["<"]="st[#st+1]=get(x+1, y)\n", [">"]="st[#st+1]=get(x-1, y)\n", ["+"]="st[#st+1]=st[#st]+st[#st-1]\n", ["-"]="st[#st+1]=-st[#st]\n", ["*"]="st[#st+1]=st[#st]*st[#st-1]\n", ["r"]="st[#st+1]=1/st[#st]\n", ["%"]="st[#st+1]=st[#st]%st[#st-1]\n", ["#"]="st[#st+1]=math.random(0, st[#st])\n", ["\\"]="st[#st+1]=st[#st] < st[#st-1]\n", ["/"]="st[#st+1]=st[#st] > st[#st-1]\n", ["$"]="st[#st+1]=copy(st[#st])\n", ["_"]="table.remove(st)\n", ["!"]="st[#st+1]=not st[#st]\n", ["|"]="st[#st+1]=st[#st] or st[#st-1]\n", ["&"]="st[#st+1]=st[#st] and st[#st-1]\n", ["="]="st[#st+1]=st[#st] == st[#st-1]\n", ["w"]="grid[st[#st].x][st[#st-1].y]=st[#st-2]", ["q"]="grid[st[#st].x][st[#st].y], grid[st[#st-1].x][st[#st-1].y] = grid[st[#st-1].x][st[#st-1].y], grid[st[#st].x][st[#st].y]\n", ["p"]="st[#st+1]=get(x,y)\n", ["?"]="if st[#st] then\n", ["~"]="while st[#st] do\n", [":"]="else\n", [")"]="end\n", ["@"]="st[#st+1]=get(st[#st],st[#st-1])\n", ["o"]="table.remove(st2)\n", ["s"]="st2[#st2+1]=st[#st]\n", ["l"]="st[#st+1]=st2[#st2]\n", ["c"]="st[#st+1]=st[#st](st[#st-1], st[#st-2], st[#st-3])\n", ["T"]="trace(st[#st])\n", ["m"]="st[#st+1]=math\n", [","]="" } local res = "local st = {get(x,y)} local st2 = {}\n" local num = "" local skipto = 0 for i=1, str:len() do if i >= skipto then local c = str:sub(i, i) --res=res.." trace('"..c.."')\n" if keywords[c] then if num:len() ~= 0 then res=res.."st[#st+1]="..num.."\n" num="" end res=res..keywords[c] elseif tonumber(c) then num=num..c elseif c == "." then local s, e = string.find(str, "%.%[.-%]", i) if not s then s = i+1 e = i+1 else s=s+2 e=e-1 end --trace(str:sub(s, e)) if s then local r = str:sub(s, e) res=res.."st[#st+1]=st[#st]."..r.."\n" skipto=e end end end end trace(res) local func, err = load(res) if not func then trace(err, 2) exit() end return func end function get(x, y) return {x=x,y=y,t=inGrid(x, y) and grid[x][y] or 16} end function inGrid(x, y) return x and y and x > 0 and x <= h and y > 0 and y <= h end function copy(arr) if type(arr) ~= "table" then return arr end local c = {} for i, v in pairs(arr) do if type(v) == "table" then c[i] = copy(v) else c[i] = v end end return c end function lerp(a, b, t) return a+(b-a)*t end