b from https://yaya-cout.github.io/Upsilon-Workshop/view/12e1515d-01ee-4100-bb5e-3d1d68b051e7 compressed, might work on Epsilon, but unsure.
from kandinsky import fill_rect as F,draw_string as D from ion import keydown as K from time import sleep as S,monotonic as M from random import randint as R,choice as C from micropython import const as A W=range F(0,0,320,222,'k') dim=A((13,9)) cs=A(24) oX=A(3) oY=A(4) palExt=A(("#00a028","#30c858","#98dc40","#107c20",(0,64,0),"#b87448","#804418","#485460","#687488","#8890a8","#605460","#185800","#a0f4d0","#189cd8","#1090c8","#682020","#281828","#a81c28","#98acb0","#787088","#c0dcc8","#403048","#d08858","k","#700000","k","#280c18","#482020","#b00c20","#583418","#783400","#703c30","#684028","#785030","#d03410","#285cc0","#805c40","#905830","#905c50","#987048","#c86c20","#b87448","#18b430","#a09078","#b89070","#d8a860","#f0d090","#f0f8f0")) pal1=A(39) pal2=A(31) tilesExt=A((b"\xe0\17", b"\x80\2\1\xe0\0\1\xa0\1\1\xe0\0\1\x80\4\1\xe0\0\1\xe0\0\1\x80\2", b"\x80\1C@#B \3\x82\1\0\3\xa2\1\0\3!\2\1\2\1\3\xc1\1\3\xc1\1\3\xc1\1", b"C\x80\1B#@\x82\1\3 \xa2\1\3\0\1\x82\1\3\0A\xe2\0\3\xa1\1\2\3\xc1\1\3", b"\4\3A\3!\4#\1\xe3\0\4\xc3\1\0\4#\4C \xe4\0\3\4\0C\6\5$\0#\6\5\26% #\6\26\6\26", b"A\3!\3\4\1\xa3\1\4\xc3\1\4C\4#\4\0#\xe4\0 $\5\6C\0\26\5\26\5\6#\0\26\6\26\6# ", b"A\3\1C\1\xe3\0BC\x82\1#\xa2\1#!\2\1\2\1\3\xc1\1\3\xc1\1\3\xc1\1", b"C!\3!B\x83\1\x82\1C\xa2\1#\1\x82\1#A\xe2\0\3\xa1\1\2\3\xc1\1\3", b" H\xe0\0\bI\b \a\b\xe9\0\a\0\a()(')()\aH\tH\a\0\a\xe8\0\a\x80\2", b"\xe0\3\1\xc0\1\v\1\xa0\1\v\xc0\1\v\0\1\x80\1\v\1\xa0\1\v\xc0\1", b"\v\1\xe0\0\1\0\v\1+\1\0\v\0\6\v%+\5\v\6\xc5\1\6E&%\xe6\4%&", b"\6\xc5\1\6\xc5\1\6E&%\xe6\4%&\0\6\xa5\1 \6\x85\1", b"\x80\1\1 \1\v\1+\0\v\0\v\5\v%\v\5\v\x85\2&%&\5\x86\4%&%\6", b"\x85\4&%&\5\x86\4%&%\6\xe5\3", b"\xc0\5\1\xa0\1\1\v\xc0\1\v\x80\1\1\0\v\xa0\1\1\v\xc0\1\v", b"\xc0\1\v\1\v\0\1+\1+\5+%\v\6\xc5\1\6%&E\xc6\4%\xe6\0", b"\xc5\1\6\xc5\1\6%&E\xc6\4%\xe6\0\xa5\1\6\0\x85\1\6 ", b"\5\xb7\1\5\xf7\r", b"\b\xe0\0\1\0\b\a\v\1+\0\v\a('H'\xa5\1\b\aH'H\xa6\1\bG\xa8\1%&%\b", b"\x88\1G\b\xa5\1\xe8\0'H\a\xa6\1G\x88\1\a\b%&%('('\b\a\xa5\1\a", b"\xa0\2\v\0+@\v\5\v%\v\5\0\v\xa5\1\vE,\5\16\v\5\fN\f\16\0\v\f\16-\16\r\v\5\16\x8d\1", b"\xe0\1K\0\v\0+E\v\5\v\xa5\2\f\16\f\5\f%\f\xae\1\f\16\x8d\1.\x8d\2", b"\xa0\2\v \v \5\v\5+\5\v\0\xa5\1\v\0\16\5,E\v\16\fN\f\5\v\r\16-\16\f\v\0\x8d\1\16\5\v", b"\v\f\16\x8d\1\0\v.\xed\0\v\5\f\x8d\1\v\5\16\x8d\1\0\v\f\x8d\1\0\v\16\x8d\1\v\5\f\x8d\1\0\v\f\x8d\1", b"\xed\17", b"\x8d\1\16\f\v\xed\0.\v\0\x8d\1\f\5\v\x8d\1\16\5\v\x8d\1\f\v\0\x8d\1\16\v\0\x8d\1\f\5\v\x8d\1\f\v\0", b"\v\5\16\x8d\1\v\f.\xed\0\0\v\f\x8d\1\v\5\16\x8d\1\0\v\f\x8d\1\v\5\16\x8d\1\0+\16\r\f\v\r@K\0\v", b"\xed\v\v\f-+\f\v\0K \v\0", b"\x8d\1\16\5\v\xed\0.\f\v\x8d\1\f\v\0\x8d\1\16\5\v\x8d\1\f\v\0\x8d\1\16\5\v\r\v\f\r\16+\0\v\0K@", b"\xcd\r\v\xad\1\v\0", b"\x8d\1\16\v\0\xad\1\5\v\x8d\1\16%\x8d\1\16\f\5\xad\1\16\f\xcd\1\16\xed\3", b"\0\v\16\x8d\1\v\5\f\x8d\1%\16\x8d\1\5\f\16\x8d\1\f\16\xad\1\16\xcd\5", b"\x8f\2%&%/%&%/%&%/%&\5\20/%&%/%&%/%&%\17", b"\22\tR\t2\21\22Q\22Q\22Q\x121)R\t2\21\22Q\22Q\22Q\x121\22\t2)2\xef\1", b"\6%\6%\6%&\5&\5\6\xe5\1\6%\6%\6%&\5&\5\6\xe5\1\xef\1\21\22Q\x121", b"\x90\2\xb6\x010\26\xe6\0\x160\26\xe5\0\x160\26F\20\x160\26\xe5\0\x160\26\xe6\0\x160\xb6\1\20", b"2\23\xf2\0\x93\2\22\x134\22\x134\22\23R\x132\xf3\1\24\22\x1342\x132\23\xf2\0\23\xf0\1", b"P*P\xf5\1\xb0\1*5*\xf5\0*\xb0\1\xf5\0*5\xf0\1\24\22\x1342\23", b"\20\xf1\0\r\21\20\6\xb0\1\xa6\2\xb7\1\6\xf7\1\4\xb7\1D\xea\0D\xaa\1\4", b"\4\xaa\1$\xaa\1$\xaa\1\4\20\4\xea\0\4\20\6\xb0\1\xa6\4\xad\1\6", b"\xc7\5\2\xc7\1\2\xc7\1\2\xc7\1\2\xc7\1\2\xc7\1\2", b"\xc7\1\2\xc7\1\2\xc7\1\2\xc7\1\2\xc7\1\2\xc7\1\2\xc7\1\2\xc7\1\2", b"\xe7\17", b"\xe7\1\xe2\1\xf7\t\xe3\1", b"\x91\1\r1\xed\x011\r\x91\1\xed\1\xb1\1\r\21\xed\x011\r\x91\1\xed\1", b"\xe2\1\xe7\r", b"\xe7\3\2\xc7\1\2\xc7\1\2\xc7\1\2\xc7\1\2\xc7\1\2\xc7\1", b"\2\xc7\1\2\xc7\1\2\xc7\1\2\xc7\1\2\xc7\1\2\xc7\1\2\xc7\1\2\xc7\1", b'\2\16\a\16\a\16\a"\16\a\16\a\16\a"\16\1\16\a\16\a"\16\1\16\a\16\a"\16\a\16\a\16\a"\16\a\16\a\16\a"\16\a\16\a\16\a\x82\2', b"\21\xe3\1\21\xb5\1\3\xd5\1\3\xd5\1\3\xd5\1\3\xd5\1\3\xd5\1\3\xd5\1", b"\3\xd5\1\3\xd5\1\3\xd5\1\3\xd5\1\3\26\xb5\1\3\21\xb6\1#\xb1\1\r\3\21\x83\1", b"\x91\1\r1-\xe3\0-\21\3\xf5\0\3\21\r\3\xf5\0\3\r\21\3\xf5\0\3\21\r\3\21#\21\3\r1\r\x91\1\xed\1", b"\xc3\1\21\xb5\1\21\3\xd5\1\3\xd5\1\3\xd5\1\3\xd5\1\3\xd5\1\3\xd5\1\3", b"\xd5\1\3\xd5\1\3\xd5\1\3\xd5\1\3\xb5\1\26\3\xb6\1\21\3\xb1\1\xc3\1\21\3\r", b"\21\xa3\1\21\3\xb5\1#\xb5\1#\21\4\3\22\3\21#\21\4\v\22\25\21#\21\4\v\22\25\21#\21\xf5\0\21#\21\xe3\0\21\3", b"\xc1\5\5\xa1\1\5\f\x81\1\5\f\24\x81\1\5\24\f\x81\1\5\24\t\xe1\0\5\17\t\f", b"\xe1\0\f\24\t\23\x81\1\24\f\23\x81\1\f\24\23\x81\1\f\5\23\xe1\0\17%\23\xe1\0\5\17\f\23\xe1\0\f\17\t\23\x81\1\t\f\23", b"\xe1\0\5\17\t\f\x81\1\5\24\t\x81\1\5\24\f\x81\1\5\f\24\xa1\1\5\f\xc1\1\5\xe1\3", b"\x81\2\17\f!\5\b\1\t\fO,\t\f\t,/\5\f4\xec\0\5\17\f\24L\5\t,\17\24,\5,\xf3\1", b"\xf3\17", b"\xf3\1\f\17\24,\5L\24L\5\t\f4\xec\0\5\17\f\t,/\5\f\t\fO,\t\1\17\f!\5\b\x81\2", b"!\bE!\t\17\f\t\b\f\b\5\t\f\xe1\0\f\b\f\xa1\1\f\24\xa1\1\t\f\xa1\1\t\f\xa1\1\f\xf3\1", b"\xe1\3\5\xc1\1\f\5\xa1\1\24\f\5\x81\1\f\24\5\x81\1\t\24\5\x81\1\f\t\17\5\xe1\0", b"\23\t\24\f\xe1\0\23\f\24\x81\1\23\24\f\x81\1\23\5\f\x81\1\23%\17\xe1\0\23\f\17\5\xe1\0\23\t\17\f\xe1\0\23\f\t\x81\1", b"\f\t\17\5\xe1\0\t\24\5\x81\1\f\24\5\x81\1\24\f\5\x81\1\f\5\xa1\1\5\xc1\5", b"\xe1\17", b"\xd3\2\17\f\5,3\f\17\f\5\t\f3\17L\5\x0f3\5\t/\5\f\23\5O,\t\23)\f%\b\1\23,\5\xe1\0", b"\23,\5\xe1\0\23)\f%\b\1\23\5O,\t3\5\t/\5\f3\17L\5\x0f3\f\17\f\5\t\fS\17\f\5,\xf3\1", b"\xf3\1,\5\f\17S\f\t\5\f\17\f3\17\5L\x0f3\f\5/\t\x053\t,O\5\23\1\b%\f)\23\xe1\0\5,\23", b"\xe1\0\5,\23\1\b%\f)\23\t,O\5\23\f\5/\t\x053\17\5L\x0f3\f\t\5\f\17\f3,\5\f\17\xd3\2")) chnkTiles=A((0,b'\a\6\a\6\a\6\a\6\a\6\a\6\a\6\a\5\4\5\4\5\4\5\4\5\4\6\a\5\0\1\x80\3\2\a\6\3\1\x80\1\1\x80\1\1\4\6\a\5\xc0\3\1\2\a\6\3\x80\1\1\x80\2\4\6\a\5\xc1\0\xc0\2\1\2\a\6\3\xc0\0\1\x80\2\1\4\6\4\5\xc0\2\1\xc0\0\2\a',0,0, b'\6\a\6\a\6\a\6\a\n\f\t\xc0\0\4\6\a\6\a\6\a\5\v\r\n\f\t\2\a\6\a\6\a\5\2\3\0\v\r\n\4\6\a\5\4\6\3\4\5\0\2\3\v\2\a\5\xc0\0\4\5\0\2\3\4\6\3\4\6\3\0\x81\1\0\4\5\1\4\5\2\3\5\xc0\1\xc1\0\0\1\0\1\4\6\3\xc0\0\x81\1\xc0\0\x81\1\2\a\5\xc1\0\xc0\0\1\0\xc1\0\0\1',b'\0\b\x80\1\1\x80\2\4\5\b\xc0\4\16\xcc\2\22\x8c\2\17\xcd\2\23\x8d\2\20\1\2\3\xc0\0\1\0\1\xc0\0\x81\1\0\4\6\3\0\2\3\1\0\1\2\3\2\3\1\4\5\2\a\6\3\2\3\4\5\4\5\1\0\1\4\5\4\5\4\5\xc0\0\1\2\1\0\x81\2\x80\1\1\0\4',b'\0\16\f\17\r\20\4\6\a\6\a\6\a\f\17\r\20\0\2\3\4\5\4\5\4\5\r\20\xc0\0\2\a\5\0\1\xc0\0\1\xc0\0\1\xc0\0\4\6\3\0\2\3\2\3\2\0\2\3\1\2\a\6\3\4\5\4\5\4\2\a\5\1\4\5\4\5\1\0\1\xc0\0\4\6\3\xc1\0\x80\1\1\0\2\3\2\3\4\5\2\3\2\3\2\3\2\a\5\4\6\3\2\a\5\4\5\4\5\4\5\2\3',b'\6\a\6\a\6\a\6\a\6\a\6\a\6\4\5\4\5\4\5\4\5\4\5\4\6\a\1\xc0\0\1\x80\1\xc1\0\0\2\a\6\3\xc0\0\2\3\0\x81\1\0\4\6\a\5\b\0\4\6\3\2\3\xc0\0\1\4\6\1\0\b\0\4\5\4\6\3\xc1\0\2\a\3\xc1\1\0\1\4\5\1\0\4\xc6\0\3\0\2\3\xc0\0\1\2\3\0\2\a\4\5\0\4\5\1\2\3\4\5\1\4\6', b'\4\6\3\xc0\0\xc1\1\0\x81\1\2\a\5\1\0\1\x80\1\1\x80\1\4\6\3\1\0\xc1\0\xe5\1\0\1\2\a\5\xc0\1\xe4\0#$\1\0\4\6\3\xc0\1\xc1\0\xc0\1\2\a\6\3\0\1\2\3\1\0\1\0\1\4\6\3\5\xc0\0\4\6\3\x81\1\0\2\a\5\1\x80\1\4\5\xc0\0\1\0\4\6\3\0\xc1\0\x80\2\1\0',b'\xc1\0\0\1\0\1\0\1\0\1\xc0\0\2\0\1\x80\1\xc1\0\2\3\xc1\0\0\4\1\2\3\xc1\0\0\1\4\6\3\x80\1\1\4\5\0\xc1\1\4\5\x80\1\1\x80\1\x81\1\0\xc1\0\0\xc1\0\xc0\0\xa2\2\xc1\1\xc0\0\xc1\0! \xa1\1\xc0\1\1\0\x81\1\xc0\0\x81\1\x80\1\xc1\0\xc0\0\1\0\1\xc0\0\xc1\0\xc0\0\24\25',b'\a\6\a\6\3\2\3\0\2\3\2\a\6\5\4\5\4\5\4\5\2\a\5\4\5\4\0\1\xc0\0\xc1\0\0\4\6\3\0\1\2\0\1\24\25\26\0\xc1\0\4\6\3\0\4\0\24\37\30\36\25\26\1\0\4\5\xc1\0\0\27\xd8\1\36\26\1\xc0\1\1\27\x98\2\36\xd5\0\26\0\2\0\27\xd8\3\31\1\4\25\37\xd8\3\31\0\2',b'\3\b\0\2\3\1\4\6\3\b\0\2\a\5\1\0\4\5\1\2\a\5\xc0\0\4\6\3\1\2\3\xc0\0\4\5\0\1\2\3\4\5\2\a\6\3\0\x81\1\0\4\5\2\0\4\6\a\6\3\0\2\3\0\1\2\a\0\2\a\5\4\6\3\4\5\0\1\4\6\3\4\5\1\0\4\5\1\2\3\0\2\a\5\1\x80\1\xc1\0\0\4\5\0\4\6\3\2\3\0\1\xc0\2\2\a', b'\2\a\5\1\xc0\0\x81\1\0\x81\1\4\6\3\0\xc1\0\xc0\1\2\3\0\2\a\5\1\xc0\0\2\3\0\1\4\5\0\4\6\3\x80\1\4\5\xc1\0\0\1\0\6\a\6\3\xc0\0\x81\1\0\1\0\1\4\5\4\5\1\x80\1\1\0\1\0\1\x8c\3\t\0\x81\1\0\xcd\1\21\xcd\0\n\x8c\2\1\0\xc1\1\0\v\x8d\2',b'\xc1\0\0\xc1\0\0\1\x80\1\1\32\30\1\0\x81\1\2\3\x80\1\xc1\0\27\0\1\0\1\2\a\5\0\xc1\0\0\1\32\x81\1\0\4\5\xc0\0\2\3\xc1\1\xc0\0\1\x80\1\1\4\5\xc1\0\xc0\0\xc1\1\0\1\x80\1\1\0\1\xc0\0\16\x8c\4\t\f\22\17\x8d\4\n\r\23\20\xc1\0\0\1\xc0\0\xc1\0\0\v',b'\x98\4\35\34\0\4\30\35\x9b\3\34\x80\1\33\34\xc1\1\xc0\0\1\0\1\0\x81\4\xc0\0\x81\1\xc0\0\1\xc0\0\xc1\0\0\1\x80\1\1\0\1\0\xc1\0\xc0\0\xc1\0\x80\1\1\0\1\0\1\xc0\0\1\xc0\1\1\0\x8c\3\t\x80\1\xc1\0\x8d\3\n\x8c\2',b'\5\4\5\0\xc1\0\xc0\0\xc1\0\0\4\6\xc0\0\2\3\2\3\0\2\3\2\3\0\4\xc0\0\4\5\4\5\0\4\5\4\5\2\3\xc0\1\xc1\0\xc0\0\x81\1\4\5\0\1\x80\1\1\xc0\0\x81\1\2\3\xc0\0\xc1\1\0\1\xc0\0\1\4\5\0\x81\1\0\1\xc0\0\xa5\1\2\3\xc1\0\x80\1\1\0\1$#$\4\5\xcc\1\17\0\1\0\1\0\1\2\3', b'\0\b\x80\1\xc1\0\v\x8d\2\0\1\xc0\0\x81\1\0\xc1\0\b\xc1\0\0\1\xc0\0\xc1\0\0\b\1\xc0\0\xc1\0\xcc\0\22\xcc\4\xcd\0\23\xcd\4\1\0\1\0\1\xc0\0\1\0\1\b\1\xc0\0\b\xc0\0\1\0\1\xc0\0\1\0\xc1\0\xcc\2\t\b\0\1\xc0\0\1\xcd\2\n\xcc\2',b'\r\23\20\0\1\xc0\0\1\0\1\xc0\0\v\0\1\0\xc1\0\b\xc1\1\xc0\0\b\1\0\1\x80\1\16\xcc\5\17\xcd\5\20\xc0\1\xc1\0\0\1\xc0\1\1\0\1\0\1\0\1\xc0\0\xc1\0\xc0\0\b\xc0\0\x81\1\xc0\0\16\xcc\3\t\1\0\f\17\xcd\3\n\xcc\0', b'\xcd\1\21\xcd\3\b\xc0\0\1\xc0\1\b\xc0\0\1\2\xcc\2\t\xc1\0\x80\1\4\xcd\2\n\x8c\1\22\xcc\0\1\0\1\xc0\0\1\v\x8d\1\23\xcd\0\0\b\1\xc0\1\xc1\0\xc0\0\2\3\xc0\1\1\0\x81\1\xc0\0\4\5\1\0\xc1\2\16\xcc\5\17\xcd\1',b'\xcd\1\20\xc1\2\4\5\2\3\x81\1\0\xc1\0\0\1\0\2\3\4\5\1\0\b\1\0\xc1\0\2\3\4\5\xcc\0\t\xc0\0\1\b\0\1\4\5\xc0\0\xcd\0\n\xcc\4\2\3\v\xcd\4\4\5\0\1\b\xc1\0\0\1\0\b\0\1\x8c\6\x8d\6', 0,0,0,0,0,0,0,0, b"\xa4\3\2\x85\2\b$\3&\r\xe6\x000\t$\3\r\v\16\r\x86\1\t$\3\6\f\17\r\x86\1\t$\3\6\r\xa6\1\0\t$\3\xe6\1\1\tD\x87\1\nG\xc4\3",b"\2\xa5\2\b\4\3\0&\xf0\0F\t\4\3\1\x86\2\t\4\3\xa6\1\rF\t\4\3\xa6\1\v\16\r\6\t\4\3\x86\1\r\f\17\r\6\t$G\n\xa7\1\xe4\6",0,0, b"\x9b\4\21T\27\24\30[\x114\37\x95\1\35\30;\22\x95\2\31;\22\x95\2\31;\22\x95\2\31;\22\x95\2\31;\23\26\36\25\34\x96\1\32\xfb\0\22\25\31\xdb\1",b"[\21\x94\1\30\x9b\1\21\37\x95\1\35\24\30[\22\xf5\1\31[\23\x96\1\x1e5\31\x9b\2\x125\31\xdb\1\21\24\37\25\34\32\33\21\x94\1\37U\31;\22\x95\2\31;\22\25\34\xd6\1\32;",b"\33\21\xb4\1\30\xfb\0\21\37\xb5\1\x1d4\30\33\22\xb5\2\31\33\23\36U\x1c6\x1e5\31;\23V\32\21\24\x1f5\31\xfb\0\x114\37\xf5\0\31\xfb\0\22\xb5\1\34\32[\21\37\xf5\0\34\26\32\xfb\0\x125\x1c6\32\xfb\0",b"\x84\a\2\xa5\1\b\x84\1\3\x86\1\20\t\x84\1\3\x86\1\0\t\x84\1\3\x86\1\1\t\xa4\1'\nG\x84\a", b"\x114\37\25\35\xd4\1\22\xf5\2\22\xb5\1\34\x96\1\22U\x1c6\32\21T\30\22U\35T\37U\35\23\36\xd5\2\33\22\x95\2\34\26\33\x136\36U\x1c6\32\x9b\1\23V\32\xfb\0",b"\37\25\31\xbb\x025\31\xbb\x026\32\21\xb4\1\30\xfb\0\21\37\xb5\1\35\30\x1b4\37\xf5\1\31\33\xd5\2\31\33V\36\xf5\0\x1c6\32\xfb\0\23\xf6\0\32\x9b\4",b"\33\21\x1f5\31\xfb\1\22U\35\27\24\30\x9b\1\22\xb5\1\35\30\xfb\0\23\36\xb5\1\35\30\xfb\0\22\xd5\1\31\xfb\0\23\36\xb5\1\31\x9b\1\23\26\x1e5\34\26\32\xdb\1\x136\32\x9b\4")) collTile=A((b'\2\3\4\5\6\7\x08\n\x0b\x0c\r\x0f\x10\x11\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f !"#$%',b'\0\1\2\3\4\5\7\x08\t\n\x0b\x0c\x0e\x0f\x10\x11\x12\x13\x14\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f')) doorTiles=A((b'\x11 #',b'\n\x17')) del A def Im(rle,x0,y0,w,pal,zx=3,zy=3,itransp=-1,ismap=0): mmap=b"";i,x=0,0;x0,y0=int(x0),int(y0);nvals=pal if ismap else len(pal)-1;nbits=0 while nvals:nvals>>=1;nbits+=1 maskval=(1<<nbits)-1;maskcnt=(0xFF>>nbits>>1)<<nbits while i<len(rle): v=rle[i];mv=v&maskval;c=(v&maskcnt)>>nbits if v&0b10000000 or nbits==8:i+=1;c|=rle[i]<<(7-nbits+(nbits==8)) c+=1 if ismap:mmap+=c*(mv.to_bytes(1,"big")) while c: cw=min(c,w-x) if mv!=itransp and not ismap:F(x0+x*zx,y0,cw*zx,zy,pal[mv]) c-=cw;x=(x+cw)%w;y0+=(x==0 and zy) i+=1 return mmap def lines(txt): words=iter(txt.split());lines,cur=[],next(words) for word in words: if len(cur)+1+len(word)>17:lines.append(cur);cur=word else:cur+=" "+word lines.append(cur);return lines kDelay={} def Kt(key,val=None,delay=.1): kp=(val if val!=None else K(key)) if not key in kDelay:kDelay[key]=0 if kp and M()-kDelay[key]>delay:kDelay[key]=M();return 1 return 0 def dialog(txt,side): txt2=lines(txt);x=60;y=10+side*122;F(x,y+5,200,70,(177,55,30));F(x+5,y,190,80,(177,55,30));F(x+5,y+10,190,60,(253,223,190));F(x+10,y+5,180,70,(253,223,190)) for i in W(min(3,len(txt2))): for j in W(len(txt2[i])):D(txt2[i][j],x+15+j*10,y+12+i*20,(177,55,30),(253,223,190));S(.01) while K(4):0 while 1-K(4):0 for i in W(max(0,len(txt2)-3)): for k in W(1,6): for j in(0,1):D(txt2[i+1+j]+" "*(17-len(txt2[i+1+j])),x+15,y+32+j*20-k*4,(177,55,30),(253,223,190));F(x+15,y+49+j*20-k*4,170,5,(253,223,190)) S(.01) for j in W(len(txt2[i+3])):S(.01+(txt2[i+3][j]=='.')*.5);D(txt2[i+3][j],x+15+j*10,y+52,(177,55,30),(253,223,190)) while K(4):0 while 1-K(4):0 wrd.dChnk();p.dOnMap() ent=[] class Npc: def __init__(s,w,bigX,bigY,x,y,rle,pal,f):ent.append(s);s.w=w;s.bigX,s.bigY=bigX,bigY;s.x,s.y=x,y;s.rle=rle;s.pal=pal;s.func=f;s.questProg=0 def d(s):Im(s.rle,oX+s.x*cs,oY+s.y*cs,8,s.pal,3,3,0) def act(s): r=s.func(s) if r==2:raise Exception("Merci d'avoir joue.") def papy(s): if s.questProg==0:dialog("Coucou fiston, j'ai une mauvaise nouvelle... Notre village est menace car j'ai perdu les pierres magiques... Retrouves-les. Une est dans mon sac, mais je l'ai perdu dans une grotte.",s.y<4);s.questProg=1 elif s.questProg==1: if items[1]in p.inv:dialog("Tu l'as retrouve, merci ! Je te donne la pierre... Maintenant, retrouves les autres pierres ! Une etait tombee dans le lac...",s.y<4);items[8].add(1);items[1].add(-1);s.questProg=2 else:dialog("Retrouve mon sac, il est dans une grotte.",s.y<4) elif s.questProg==2: if items[9]in p.inv:dialog("Tu as retrouve la pierre ! Je ne sais pas ou est la derniere",s.y<4);s.questProg=3 else:dialog("Retrouve la pierre dans le lac",s.y<4) elif s.questProg==3: if items[10]in p.inv:dialog("Le village est sauve ! Ou pas... combat final dans l'ep. 2 !",s.y<4);return 2 else:dialog("Cherche dans le village, il te manque la derniere pierre.",s.y<4) def pecheur(s): if s.questProg==0: if items[8]in p.inv:s.questProg=1;dialog("Tu veux que je peche une pierre ? J'ai perdu ma canne a peche...",s.y<4) else:dialog("Salut ! j'adore ce lac... J'y pechait avant...",s.y<4) elif s.questProg==1: if items[7]in p.inv:dialog("Tu as retrouve ma canne ! Je peche pour une pomme",s.y<4);s.questProg=3 else:dialog("Je ne peux pas pecher sans canne",s.y<4) elif s.questProg==3: if items[0].nb>0: prob=C((6,6,6,6,9));items[0].add(-1);items[prob].add(1);dialog("Merci ! Pechons"+" ... "*11+"J'ai peche un"+(" poisson"if prob==6 else"e pierre bizarre"+", je te l"+"ea"[prob==9]+" donne."),s.y<4) if prob==9:s.questProg=4 else:dialog("Tu n'as pas de pomme...",s.y<4) elif s.questProg==4:dialog("Merci pour ma canne !",s.y<4) def vieille(s): if s.questProg==0: if items[9]in p.inv:dialog("On cherche une pierre magique ? Je l'ai, et tu l'as pour deux pots de confiture differents. Compris ?",s.y<4);s.questProg=1 else:dialog("Bonjour ! Je vis toute seule dans cette maison, sans compagnie...",s.y<4) elif s.questProg==1: if items[4].nb>0 and items[5].nb>0:dialog("C'est pour moi ? Merci ! Tiens, la pierre",s.y<4);items[10].add(1);s.questProg=2 else:dialog("Je veux 2 pots de confiture differents, rien d'autre.",s.y<4) elif s.questProg==2:dialog("La confiture etait delicieuse !",s.y<4) def confiture(s): if s.questProg==0: if ent[3].questProg==1:dialog("Mamie veut de la confiture ? Il me faut un pot et 5 charbons par confiture.",s.y<4);s.questProg=1 else:dialog("Bonjour ! Je suis un cuisinier.",s.y<4) elif s.questProg==1: if items[3].nb>0 and items[2].nb>5: prob=R(4,5);txt=items[prob].name;items[prob].add(1);dialog("Un pot et des charbons ? Parfait ! ... ... ... Voila, de la "+txt,s.y<4) if items[4].nb>0 and items[5].nb>0:s.questProg=2 else:dialog("Desole, il me faut un pot et 5 charbons pour la confiture",s.y<4) elif s.questProg==2:dialog("J'ai trouve le materiel, tiens !",s.y<4);items[R(4,5)].add(1) """ def verrier(s): if s.questProg==0:dialog("Je suis un verrier de passage. Pour 8 poissons, je te fait un pot.",s.y<4);s.questProg=1 elif s.questProg==1: if ent[3].questProg==2:return 1 elif items[6].nb>7:dialog("C'est parti ! "+" ... "*15+"Et voila !",s.y<4);items[3].add(1);items[6].add(-8) """ Npc(0,2,3,5,2,b"\x101 \x012\1\0\1\23\22\23\1\0\1\4\25\4\1\20\1\4\25\4\1\0\1\26\27\26\21\x057\5\1\0\1\b\21\b\1\0",(0,"k",(152,64,48),(104,32,32),(168,28,40),(248,200,168),(160,172,72),(72,68,112),(200,104,48)),pecheur) Npc(1,0,2,7,3,b"H\31\20\1\2\v\2\1\b\1\33\1\b\1\33\1\0\1\4\5\16\5\4\t\3\36\3\1\0\1\a\t\a\1\0",(0,"k",(192,220,200),(248,168,136),(168,148,120),(144,108,104),(48,40,48),(168,24,40)),papy) Npc(1,3,3,7,3,b"\b\31\20\1\32\1\b\1\33\1\b\1\4\r\4\1\0\1\2\35\2\t\5\3\16\3\5\1\0\1\36\1\b\1\a\t\a\1\0",(0,"k",(72,68,112),(40,48,80),(240,128,128),(248,168,144),(224,56,48),(96,84,96)),confiture) Npc(1,1,2,8,3,b"\20\t \1\n\1\20\1\2\v\2\1\b\1\33\1\b\1\33\1\0\1\3\34\3\t\3\5\16\5\3\t/\1",(0,"k",(192,220,200),(152,64,48),(144,92,168),(232,128,152),(224,176,232),(104,56,112)),vieille) class Item: def __init__(s,rle,pal,name="",ig=0):s.nb=0;s.rle=rle;s.pal=pal;s.name=name;s.isGem=ig def d(s,x,y): if s.isGem:Im(gemRle,x,y,8,s.pal,3,3,0) else:Im(s.rle,x,y,8,s.pal,3,3,0) def add(s,nb): s.nb=min(s.nb+nb,99) if s.nb==0:p.inv.remove(s) elif not s in p.inv:p.inv.append(s) c=(248,240,224) items=(Item(b"\20\t \1\2\3\1\20\1\4\2\3\4\1\0\1\4\5\6\24\t\4\6\34\t,\1\0\1\34\1\20\31\b",(0,"k","#682020","#189060","#d01818","#f8f0e0","#e03830"),"pomme"), Item(b"\b\31\20\1\32\1\0\1\3\22\4\2\t\3\5\23\1\0\1\3\5\2\f\2\t\3\5\32\1\0\1\5\32\1\b!\0",(0,"k","#e05030","#682020","#281828","#b03428"),'sac'), Item(b"H\21\30\1\2\v\1\b\1\22\3\2\4\0\1\2\3\n\t\f\1\2\31\4\0\4\t\24\20\f\30",(0,(24,16,24),(32,28,24),(40,52,40),(0,4,0)),'charbon'), Item(b"\0)\0\1*\1\0\1\3\f\3\1\0\1\3\34\3\t\3\34\3\t\v\f\v\1\0\1\33\1\20\31\b",(0,"k",(248,104,24),(152,172,176),(192,220,200))), Item(b"\0)\0\1*\1\0\1\3\f\3\1\0\1\3\34\3\t\5\36\5\t\r\16\r\1\0\1\35\1\20\31\b",(0,"k",(248,104,24),(152,172,176),(192,220,200),(192,28,80),(232,80,120)),'confiture de framboise'), Item(b"\0)\0\1*\1\0\1\3\f\3\1\0\1\3\34\3\t\5\36\5\t\r\16\r\1\0\1\35\1\20\31\b",(0,"k",(248,104,24),(152,172,176),(192,220,200),(240,148,16),(240,192,32)),"confiture d'orange"), Item(b"\20\31\20\1\2\v\4\1\0\1\2\23\4\t\2\v\2\v\1\0\1\v\2\3\1\0\1\n\v\1\20\1\2\t \1 ",(0,"k",(72,152,224),(40,48,80),(72,68,112)),'poisson'), Item(b"\0\t \1\2\3\1\30\1\3\n\1\20\1\3\1\n\1\b\1\4\t\n\1\0\1\5\21\n\t\v\6\t\2\1\0\21\b\1\0",(0,"k",(152,64,48),(168,148,120),(168,28,40),(224,232,224),(120,112,136)),'canne a peche'), Item(0,(0,"k",c,(32,176,248),(128,116,152)),ig=1), Item(0,(0,"k",c,(240,192,32),(240,148,16)),ig=1), Item(0,(0,"k",c,(232,80,120),(192,28,80)),ig=1)) del c gemRle=b"\20\t \1\2\3\1\20\1\n\v\1\0\1\22\23\t\23\24\1\0\1\v\f\1\20\1\3\4\1 \t\20" potSprite=b"\b\31\20\1\32\1\0\t\32\21\2\31\3\t\4\25\2\3\t\23\24\1\0\1\34\1\20\31\b" potPal=(0,"#482020","#d8a860","#905830","#b87448","#f0d090") class Chest: def __init__(s,w,bigX,bigY,x,y,it,probs,unique=0):ent.append(s);s.w=w;s.bigX,s.bigY=bigX,bigY;s.x,s.y=x,y;s.items=it;s.probs=probs;s.unique=unique def d(s): if type(s.items)==int and type(s.probs)==int:items[s.items].d(oX+s.x*cs,oY+s.y*cs) else:Im(potSprite,oX+s.x*cs,oY+s.y*cs,8,potPal,3,3,0) def act(s): item=(s.items if type(s.items)==int else C(s.items));prob=(s.probs if type(s.probs)==int else C(s.probs));items[item].add(prob);txt='Tu as '+("trouve "if type(s.items)==int and type(s.probs)==int else"casse la jarre ! Dedans il y avait ")+str(prob)+" "+items[item].name+("s"if prob>1 else"");dialog(txt,s.y<4);wrd.curEnt.remove(s);wrd.dTile(s.x,s.y) if s.unique:ent.remove(s);del s Chest(1,0,2,8,2,0,(1,2)) Chest(1,1,2,10,1,(0,6),(1,2,3)) Chest(1,1,2,10,2,0,(1,2)) Chest(1,3,3,4,4,(0,6),(1,2)) Chest(1,3,3,4,3,0,(1,2)) Chest(1,1,4,5,4,2,1) Chest(1,1,4,7,3,2,1) Chest(1,1,4,9,5,2,1) Chest(1,1,3,4,1,1,1,1) Chest(1,2,3,3,2,7,1,1) class World: def __init__(s):s.wrd=1;s.bigX,s.bigY=0,2;s.curChnk=b'';s.curEnt=[];s.decompCur() def decompCur(s): pal=pal1 if 1-s.wrd else pal2;s.curChnk=Im(chnkTiles[s.wrd*20+s.bigY*4+s.bigX],0,0,13,pal,ismap=1);s.curEnt=[] for i in ent: if i.bigX==s.bigX and i.bigY==s.bigY and i.w==s.wrd:s.curEnt.append(i) def dTile(s,x,y):Im(tilesExt[s.curChnk[x+y*dim[0]]+38*s.wrd],oX+x*cs,oY+y*cs,8,palExt[24*s.wrd:24+s.wrd*30],3,3) def dChnk(s): for i in W(dim[0]*dim[1]):s.dTile(i%dim[0],i//dim[0]) for i in s.curEnt:i.d() def moveChnk(s,x,y):s.bigX+=x;s.bigY+=y;s.decompCur();s.dChnk() def collDoor(s,p): s.wrd=1-s.wrd;s.decompCur() for i in W(len(s.curChnk)): if s.curChnk[i]in doorTiles[s.wrd]:p.x=i%dim[0];p.y=i//dim[0];break s.dChnk();p.dOnMap() wrd=World() class Player: def __init__(s):s.x=6;s.y=4;s.dir=[0,1];s.inv=[];s.pal=("k","#682020","#484470","#984030","#906c68","#c86830","#e09048","#c0dcc8",0);s.sprites=(b"\x180(\x006\0\b\0U\0\b\0\1\23\1\0\30\x003\0\b\0\27\22\27\20\x032\3\0\b\0\4\20\4\0\b",b"\x180(\x006\0\b\0U\0\b\x001\0\30\x003\0\b\0\27\22\27\20\x012\1\0\b\0\2\20\2\0\b",b"\x180(\x006\0\b\0U\0\b\0\23\21\0\30\x003\0\b\0\a\2\a\2\27\20\x012\5\0\b\0\4\20\4\0\b",b"\x180(\x006\0\b\0U\0\b\0\21\23\0\30\x003\0\b\0\27\2\a\2\a\20\x052\1\0\b\0\4\20\4\0\b") def d(s,x,y,z):Im(s.sprites[round(2.5*s.dir[0]**2+.5*s.dir[0]+.5*s.dir[1]**2-.5*s.dir[1])],x,y,8,s.pal,z,z,8) def dOnMap(s):s.d(oX+s.x*cs,oY+s.y*cs,3) def hide(s):wrd.dTile(s.x,s.y) def Inv(s): F(30,35,260,152,(177,55,30));F(35,30,250,162,(177,55,30));F(217,40,68,58,(253,223,190));F(222,35,58,68,(253,223,190));F(217,113,68,69,(253,223,190));F(222,108,58,79,(253,223,190));F(35,40,177,142,(253,223,190));F(40,35,167,152,(253,223,190));s.d(235,53,4);i1,i2=0,0 for i in s.inv: if i.isGem:i.d(224+(i2%2)*30,118+i2*15);i2+=1 else:i.d(60+(i1//4)*70,47+(i1%4)*35);D("x"+str(i.nb),85+(i1//4)*70,49+(i1%4)*35,(177,55,30),(253,223,190));i1+=1 while K(4):0 while 1-K(4):0 wrd.dChnk();s.dOnMap() def Coll(s,hori,verti): if s.x+hori in(-1,dim[0])or s.y+verti in(-1,dim[1]):return 0 if wrd.curChnk[s.x+hori+(s.y+verti)*dim[0]]in collTile[wrd.wrd]: if wrd.curChnk[s.x+hori+(s.y+verti)*dim[0]]in doorTiles[wrd.wrd]:return 2 else:return 1 else: for i in wrd.curEnt: if i.x==s.x+hori and i.y==s.y+verti:return i return 0 def up(s,pK,pKold): hori=Kt(3,('r'in pK))-Kt(0,('l'in pK));verti=Kt(2,('d'in pK))-Kt(1,('u'in pK));ok=('o'in pK and not'o'in pKold);moved=0;oldDir=s.dir.copy() if hori: s.dir=[hori,0] if s.x+hori in(-1,dim[0]):wrd.moveChnk(hori,0);s.x-=(dim[0]-1)*hori;moved=1 elif not s.Coll(hori,0):s.hide();moved=1;s.x+=hori elif verti: s.dir=[0,verti] if s.y+verti in(-1,dim[1]):wrd.moveChnk(0,verti);s.y-=(dim[1]-1)*verti;moved=1 elif not s.Coll(0,verti):s.hide();moved=1;s.y+=verti if moved or s.dir!=oldDir:s.dOnMap() if ok: coll=s.Coll(*s.dir) if type(coll)!=int:coll.act() elif coll==2:wrd.collDoor(s) else:s.Inv() p=Player() items[3].add(5) wrd.dChnk() p.dOnMap() pKold="" while 1: pK="" if K(4):pK+='o' if K(0):pK+='l' if K(1):pK+='u' if K(2):pK+='d' if K(3):pK+='r' p.up(pK,pKold);pKold=pK