/* Snake */ /* Implementing this task in Hopper-FLOW-MATIC++ */ /* The snake must catch a bite before time runs out, which decreases by 10 points every 800 milliseconds. The remaining time will be added to your total score. */ #include #include #include #define LIMIT_TIME 120 #define INF_TIME 80 //70 #define ONE_SECOND 1000 #define TOTAL_TIME 100 #define DECREMENT_TIME 10 #define COLOR_FOOD 232 #define BACK_FOOD 255 #define TIME_LEVEL 90000 //90000 // un minuto y medio #define TIME_CHALLENGE 40000 // 40 segundos #define TIME_LOST 30000 #define COLUMNA_PRINT 55 #define SIZE_INITIAL -7 #enum 1,N,E,S,W #enum 1,SPACE,FOOD,BORDER DEF-MAIN BREAK-ON STACK 16 MSET(C, quit, nHead, dir, Size, SCORE, counter, T, TPlay,TSound, ConsPrey,Consumed stage ) SET(len,0) SET( w, 50) SET( h, 28) SET( color food, COLOR_FOOD ) SET( back food, BACK_FOOD ) SET( TIME, 100 ) LET( Size := MUL(w,h) ) SET( LEVEL,1 ) SET( REAL LEVEL,1 ) FALSE(swPierde) TRUE(swExtra1,swExtra2) TRUE( tiles ) SET( back tiles,1 ), MSET(tile1, tile2) VOID( head back tiles ) MEM("\033[48;5;28m","\033[48;5;29m","\033[48;5;62m","\033[48;5;63m","\033[48;5;70m","\033[48;5;71m","\033[48;5;4m","\033[48;5;27m" ) MEM("\033[48;5;99m","\033[48;5;97m","\033[48;5;17m","\033[48;5;18m","\033[48;5;62m","\033[48;5;63m") APND-LST(head back tiles) [back tiles] GET(head back tiles), MOVE-TO(tile1) [PLUS-ONE(back tiles)] GET(head back tiles), MOVE-TO(tile2) VOID( big number, numL1, numL2, numL3 ) VOID( sounds ), SET( sound index, 1 ) MEM("Snake_music.wav","Snake_music_l3.wav","Snake_music_l5.wav","Snake_music_l4.wav","Snake_music_l6.wav") APND-LST(sounds) GOSUB( set score ) MSET(tBoard1,tmpLimit,Maze,wM,hM,SizeM) DIM( Size ) AS-ONES( board ), {board} MOVE-TO(tBoard1) // load and prepare maze for challenge stage: SET(i,1) LET( Maze := REPLICATE("3",50) ) PERF-UP(i,26,1) LET( Maze := CAT( Maze, CAT( CAT("3", REPLICATE("1",48) ), "3") ) ) NEXT LET( Maze := CAT( Maze, REPLICATE("3",50) )) GOSUB( prepare maze ) HIDE-CURSOR CLR-SCR SET( TLimit := LIMIT_TIME ) MEM(SIZE_INITIAL),GOSUB( start ) SET( time out, TIME_LEVEL) SYS( CAT(CAT("aplay fl/",[sound index]CGET(sounds)), "/dev/null 2>&1 &")) GOSUB( titles ) /* PLAY GAME!! */ SET(lives,3) WHILE( lives ) GOSUB( show ) GOSUB( put titles ) GOSUB( ready ), SLEEP(1.5) TIC( T ), TIC( TPlay ), TIC(TSound) KBD-FREE WHILE( NOT (quit) ) ON-TIME( TLimit ~= TPlay ){ GOSUB( show ) WHEN( KEY-PRESSED? ){ SCAN-CODE( C ) SELECT( C ) CASE( K_UP ) { dir = N, EXIT } CASE( K_RIGHT ){ dir = E, EXIT } CASE( K_DOWN ) { dir = S, EXIT } CASE( K_LEFT ) { dir = W, EXIT } CASE( K_ESC ) { quit = 1, EXIT } CASE( 32 ) { PAUSE, EXIT } SELEND } GOSUB( step ) } ON-TIME( ONE_SECOND ~= T ) { TIME-=DECREMENT_TIME, CLAMP(0,TOTAL_TIME,TIME) {TIME, 12, COLUMNA_PRINT} GOSUB( put time ) } ON-TIME( time out ~= TSound ){ GOSUB(LEVELCLEAR) } WEND COND( OR(EQ?(LEVEL,3),EQ?(LEVEL,6)) ) GOSUB(you lost),SLEEP(3) SET(quit,0), [nHead]{len}CPUT(board) LOCATE(1,1), FILL-BOX(" ",29,54) GOSUB( another play ) ELS GOSUB(you lost), SLEEP(3) --lives SET(quit,0) TRUE(swPierde) {len}GOSUB( start ) COND( IS-NOT-ZERO?(lives) ) SYS("aplay fl/Snake_music_vida_repechaje.wav /dev/null 2>&1 &") CEND CEND WEND /* GAME OVER */ GOSUB(game over ), SLEEP(7) SET-VIDEO-TEXT SHOW-CURSOR PRNL END RUTINES DEF-FUN( KILLSOUND ) SET( PID,0 ) LET( PID := ONLY-CHR("0123456789 ", EXEC( "pidof aplay" ))) COND( LEN(PID) ) SYS( CAT(CAT("kill ",PID), " /dev/null 2>&1")) CEND RET // initialize the board, plant a very first food item DEF-FUN( start, initial pos ) COND( NOT-EQ?(LEVEL,3) ) {tBoard1} MOVE-TO(board) {50,28},MUL(50,28), MOVE-TO( w, h, Size ) [1:w] {BORDER} CPUT(board) // top [ SUB(MUL(h,w),MINUS-ONE(w)) : end] {BORDER} CPUT(board) // bottom [1:w:end] {BORDER} CPUT(board) // left SET(i, 1) FOR( LE?(i, h), ++i ) [ MUL(i, w )] {BORDER} PUT(board) // right NEXT LET( time out:=TIME_LEVEL ) ELS TRASH(board) CEND SELECT(LEVEL) CASE(2){ SET(i,3) PERF-UP(i,5,1) // laterales extremos: [ADD(MUL(i,w),5):ADD(MUL(i,w),8)] {BORDER} CPUT(board) [ADD(MUL(i,w),SUB(w,7)):ADD(MUL(i,w),SUB(w,4))] {BORDER} CPUT(board) // laterales fondo [ADD(MUL(ADD(i,19),w),5):ADD(MUL(ADD(i,19),w),8)] {BORDER} CPUT(board) [ADD(MUL(ADD(i,19),w),SUB(w,7)):ADD(MUL(ADD(i,19),w),SUB(w,4))] {BORDER} CPUT(board) NEXT EXIT } CASE(3){ // challenge stage! SPLIT(Maze,board, "" ), VAL(board), MOVE-TO(board) [1:w] {BORDER}CPUT(board) SET(i,1) PERF-UP(i,19,1) GOSUB(plant) NEXT LET(time out := TIME_CHALLENGE) EXIT } CASE(4){ SET(i,3) PERF-UP(i,5,1) // laterales medios [ADD(MUL(ADD(i,9),w),5):ADD(MUL(ADD(i,9),w),8)] {BORDER} CPUT(board) [ADD(MUL(ADD(i,9),w),SUB(w,7)):ADD(MUL(ADD(i,9),w),SUB(w,4))] {BORDER} CPUT(board) // medio arriba [ADD(MUL(i,w),17):ADD(MUL(i,w),20)] {BORDER} CPUT(board) [ADD(MUL(i,w),31):ADD(MUL(i,w),34)] {BORDER} CPUT(board) // medio abajo [ADD(MUL(ADD(i,19),w),17):ADD(MUL(ADD(i,19),w),20)] {BORDER} CPUT(board) [ADD(MUL(ADD(i,19),w),31):ADD(MUL(ADD(i,19),w),34)] {BORDER} CPUT(board) NEXT EXIT } CASE(5){ SET(i,3) PERF-UP(i,5,1) // laterales extremos: [ADD(MUL(i,w),5):ADD(MUL(i,w),8)] {BORDER} CPUT(board) [ADD(MUL(i,w),SUB(w,7)):ADD(MUL(i,w),SUB(w,4))] {BORDER} CPUT(board) // laterales medios [ADD(MUL(ADD(i,9),w),5):ADD(MUL(ADD(i,9),w),8)] {BORDER} CPUT(board) [ADD(MUL(ADD(i,9),w),SUB(w,7)):ADD(MUL(ADD(i,9),w),SUB(w,4))] {BORDER} CPUT(board) // laterales fondo [ADD(MUL(ADD(i,19),w),5):ADD(MUL(ADD(i,19),w),8)] {BORDER} CPUT(board) [ADD(MUL(ADD(i,19),w),SUB(w,7)):ADD(MUL(ADD(i,19),w),SUB(w,4))] {BORDER} CPUT(board) // medio arriba [ADD(MUL(i,w),17):ADD(MUL(i,w),20)] {BORDER} CPUT(board) [ADD(MUL(i,w),31):ADD(MUL(i,w),34)] {BORDER} CPUT(board) // medio abajo [ADD(MUL(ADD(i,19),w),17):ADD(MUL(ADD(i,19),w),20)] {BORDER} CPUT(board) [ADD(MUL(ADD(i,19),w),31):ADD(MUL(ADD(i,19),w),34)] {BORDER} CPUT(board) NEXT EXIT } CASE(6){ SET(i,1) PERF-UP(i,29,1) GOSUB(plant) NEXT LET(time out := TIME_CHALLENGE) } CASE(7){ SET(i,3) PERF-UP(i,5,1) // laterales extremos: [ADD(MUL(i,w),5):ADD(MUL(i,w),8)] {BORDER} CPUT(board) [ADD(MUL(i,w),SUB(w,7)):ADD(MUL(i,w),SUB(w,4))] {BORDER} CPUT(board) // laterales medios [ADD(MUL(ADD(i,9),w),5):ADD(MUL(ADD(i,9),w),8)] {BORDER} CPUT(board) [ADD(MUL(ADD(i,9),w),SUB(w,7)):ADD(MUL(ADD(i,9),w),SUB(w,4))] {BORDER} CPUT(board) // laterales fondo [ADD(MUL(ADD(i,19),w),5):ADD(MUL(ADD(i,19),w),8)] {BORDER} CPUT(board) [ADD(MUL(ADD(i,19),w),SUB(w,7)):ADD(MUL(ADD(i,19),w),SUB(w,4))] {BORDER} CPUT(board) // medio arriba [ADD(MUL(i,w),17):ADD(MUL(i,w),20)] {BORDER} CPUT(board) [ADD(MUL(i,w),31):ADD(MUL(i,w),34)] {BORDER} CPUT(board) // medio medio [ADD(MUL(ADD(i,9),w),17):ADD(MUL(ADD(i,9),w),20)] {BORDER} CPUT(board) [ADD(MUL(ADD(i,9),w),31):ADD(MUL(ADD(i,9),w),34)] {BORDER} CPUT(board) // medio abajo [ADD(MUL(ADD(i,19),w),17):ADD(MUL(ADD(i,19),w),20)] {BORDER} CPUT(board) [ADD(MUL(ADD(i,19),w),31):ADD(MUL(ADD(i,19),w),34)] {BORDER} CPUT(board) NEXT EXIT } SELEND COND( NOT-EQ?(LEVEL,3) ) LET( nHead := MUL( w, SUB( SUB( h, 1 ), MOD(h,2) )) DIV-INTO(2) ) LET( dir := N ) ELS LET( nHead := ADD( MUL( w, 13 ), 26 ) ) LET( dir := N ) CEND [ nHead ] {initial pos} CPUT( board ) IF( swPierde, SRAND( ~SECONDS); FALSE(swPierde); {TIME_LOST} »» (time out),\ SRAND( 26785 ) ) GOSUB( plant ) RET DEF-FUN( you lost ) SET(i,1), SET(k,0), SET(n,1) FOR( LE?(i, h), ++i) SET(j,1) FOR( LE?(j, w), ++j) LET( k := [ n ] GET(board) ) COND( IS-NEG?( k )) LOCATE(i,j) PRN("\033[38;15;3m\033[48;5;9m~\OFF") CEND ++n NEXT NEXT SYS("aplay fl/Snake_dolor.wav /dev/null 2>&1 &") RET DEF-FUN( show ) SET(i,1) MSET(j, k) SET(n,1) LOCATE(1,1) FOR( LE?(i, h), ++i) SET(j,1),LOG-INV(tiles) FOR( LE?(j, w), ++j) LET( k := [ n ] GET(board) ) COND( IS-NEG?( k )) COND( NOT-EQ?(n,nHead) ) IF(GT?(k,-3),IF(tiles,{tile1},{tile2});{"\033[38;5;15m+\OFF"},"\033[38;5;6m\033[48;5;11m \OFF") ELS COND( EQ?(dir,N)) IF(tiles,"\033[38;5;9m\033[48;5;15mv\OFF","\033[38;5;9m\033[48;5;15m|\OFF") ELS-COND( EQ?(dir,S)) IF(tiles,"\033[38;5;9m\033[48;5;15m|\OFF","\033[38;5;9m\033[48;5;15m^\OFF") ELS-COND( EQ?(dir,E)) IF(tiles,"\033[38;5;9m\033[48;5;15m<\OFF","\033[38;5;9m\033[48;5;15m-\OFF") ELS IF(tiles,"\033[38;5;9m\033[48;5;15m-\OFF","\033[38;5;9m\033[48;5;15m>\OFF") CEND CEND ELS-COND( {k} IS-EQ?(BORDER)) {"\033[38;5;82m\033[48;5;57m \OFF"} ELS-COND( {k}IS-EQ?(FOOD) ) COLOR-FG(color food ),IF(tiles,{tile1},{tile2}) //back food) {"@\OFF"} ELS IF(tiles,{tile1},{tile2}) {" \OFF"} CEND PRN LOG-INV(tiles) ++n NEXT PRNL NEXT color food+=2, back food-=2, WHEN( EQ?(color food, PLUS-ONE(BACK_FOOD))){ LET( color food:=COLOR_FOOD) LET( back food:=BACK_FOOD) } RET // negative values denote the snake (a negated time-to-live in given cell) // reduce a time-to-live, effectively erasing the tail DEF-FUN( age ) MSET( r, jAge, jR ) CART( IS-NEG?( board ) ) »» (r), SET-RANGE(r) GET( board ) PLUS(1) »» (jAge) // this is necessary, because Hopper arrays begining in 1 CART( IS-ZERO?(jAge) ) »» (jR) COND( IS-ARRAY?(jR) ) SET-RANGE(jR), SET(jAge, 1), SET-RANGE(r) CEND // ****** {jAge} PUT(board), CLR-RANGE RET DEF-FUN( step ) LET( len := [nHead] GET(board) ) SELECT(dir) CASE (N){ nHead -= w, EXIT } CASE (S){ nHead += w, EXIT } CASE (W){ --nHead, EXIT } CASE (E){ ++nHead, EXIT } SELEND SELECT( [nHead]CGET(board)) CASE (SPACE){ --len, LET( len := IF( EQ?(len,0), 1, len) ) [nHead] { len }, CPUT(board) // keep in mind len is negative GOSUB( age ) EXIT } CASE (FOOD){ COND( NOT(OR(EQ?(LEVEL,3),EQ?(LEVEL,6)))) --len, LET( len := IF( IS-ZERO?(len), 1, len) ) ELS ++len // quita celda del cuerpo: suma vida! CEND [nHead] { len }, CPUT(board) WHEN(AND(NOT-EQ?(LEVEL,3),NOT-EQ?(LEVEL,6))){ GOSUB( plant ) } ADD(SCORE,TIME), MOVE-TO(SCORE) {SCORE, 4, COLUMNA_PRINT} GOSUB( put score ) LET( TIME := 100 ) ++counter, COND( EQ?( counter, 25 ) ) LET( TLimit := SUB( TLimit,5 )) CLAMP(INF_TIME, LIMIT_TIME, TLimit) LET( counter := 0 ) CEND WHEN( OR(EQ?(LEVEL,3),EQ?(LEVEL,6))){ ++Consumed stage } ++ConsPrey COLOR-FG(10) LOCATE(20,COLUMNA_PRINT) PRN("SPEED: ") LOC-ROW(21), PRN( ROUND(MUL(INV(TLimit),LIMIT_TIME),2), " M/S " ) LOC-ROW(23) PRN("CONSUMED PREY:") LOC-ROW(24) PRN(ConsPrey,"\OFF") LET( color food:=COLOR_FOOD) LET( back food:=BACK_FOOD) SYS("aplay fl/Snake_mascada.wav /dev/null 2>&1 &") TIC( T ),{TIME, 12, COLUMNA_PRINT} GOSUB( put time ) EXIT } CASE-NEGATIVE { GOSUB(KILLSOUND) SYS("aplay fl/Snake_mascada.wav /dev/null 2>&1") LET( quit := 1 ) EXIT } DEFAULT { GOSUB(KILLSOUND) SYS("aplay fl/Snake_golpe.wav /dev/null 2>&1") LET( quit := 1 ) } SELEND RET DEF-FUN( LEVELCLEAR ) GOSUB(KILLSOUND) GOSUB( level clear ) SYS("aplay fl/Snake_level_clear.wav /dev/null 2>&1") SLEEP(1) WHEN( OR( EQ?(LEVEL,3), EQ?(LEVEL,6))){ WHEN( EQ?(Consumed stage,20)){ GOSUB( show ) SYS( "aplay fl/Snake_bono.wav /dev/null 2>&1 &" ) GOSUB(GANA BONO),SLEEP(3) ADD(SCORE,1000), MOVE-TO(SCORE) {SCORE, 4, COLUMNA_PRINT} GOSUB( put score ) } } GOSUB( another play ) RET DEF-FUN( another play ) ++sound index, WHEN( EQ?(sound index,6)){ LET(sound index := 2) } back tiles+=2, WHEN( EQ?(back tiles,15)){ LET(back tiles:=1) } [back tiles] GET(head back tiles), MOVE-TO(tile1) [PLUS-ONE(back tiles)] GET(head back tiles), MOVE-TO(tile2) ++LEVEL, WHEN( GT?(LEVEL,7)){ LET(LEVEL:=1) } ++ REAL LEVEL COLOR-FG(15),LOCATE(26,COLUMNA_PRINT) SET-ITALIC, PRN("LEVEL: ",REAL LEVEL,"\OFF") LET( len := [nHead] GET(board) ) [1:Size] MEM(1) CPUT(board) CLR-INTERVAL MEM(len), GOSUB( start ) GOSUB( show ) COND( OR( EQ?(LEVEL,3), EQ?(LEVEL,6))) GOSUB(challenge stage) ELS GOSUB( ready ) CEND SLEEP(2) SYS( CAT(CAT("aplay fl/",[sound index]CGET(sounds)), "/dev/null 2>&1 &")) LET( TIME := TOTAL_TIME ) {TIME, 12, COLUMNA_PRINT} GOSUB( put time ) RET // put a piece of food at random empty position DEF-FUN( plant ) SET(r, 0) LOOP( search position ) LET( r := MOD( CEIL(RAND(MINUS-ONE(Size))), Size ) ) BACK-IF-NOT-EQ( [r] GET(board), SPACE, search position) [r] {FOOD} CPUT( board ) RET DEF-FUN( put titles ) LOCATE(2,COLUMNA_PRINT) PRN("\033[38;5;15mSCORE\OFF") {SCORE, 4, COLUMNA_PRINT} GOSUB( put score ) LOCATE(10,COLUMNA_PRINT) PRN("\033[38;5;11mTIME\OFF") {TIME, 12, COLUMNA_PRINT} GOSUB( put time ) COLOR-FG(15) LOCATE(26,COLUMNA_PRINT) SET-ITALIC, PRN("LEVEL: ",REAL LEVEL,"\OFF") LOCATE(27,COLUMNA_PRINT) SET-INVERSE, PRN("LIVES: ",lives,"\OFF") RET DEF-FUN( put time, B, posx, posy ) MSET( i,j,x ) MSET( sb, lsb,nB, p4 ) SET( k,1 ) LOCATE (posx, posy) FILL-BOX(" ",5,20) LET( sb := STR(B) ) LET( lsb := LEN(sb) ) SET( rx, posy ) LET( p4 := ADD( posx, 4 )) COLOR-FG(11) PERF-UP(k, lsb, 1) LET( nB := VAL( MID( 1, k, sb )) ) SET(x, 1), SET( i, posx ) FOR( LE?(i, p4), ++i ) SET( j, rx ) FOR( LE?(j, ADD( rx, 2 ) ), ++j ) LOCATE(i, j) PRN( STR-TO-UTF8(CHAR( [ PLUS-ONE(nB), x] CGET(big number) MUL-BY(219) ))) ++x NEXT NEXT rx += 4 NEXT PRN("\OFF") RET DEF-FUN( put score, SCORE, posx, posy ) MSET( ln,s, sp ) LET( sp := STR( SCORE )) LET( ln := LEN(sp)) LOCATE ( posx, posy ) FILL-BOX(" ",4,20) SET(i, 1) COLOR-FG(15) PERF-UP( i, ln, 1) LET( s := VAL( MID( 1, i, sp )) ) [ PLUS-ONE(s) ] LOCATE( posx, posy ), PRN ( STR-TO-UTF8( GET(numL1) )) LOC-ROW( PLUS-ONE(posx) ), PRN ( STR-TO-UTF8( GET(numL2) )) LOC-ROW( PLUS-TWO(posx) ), PRN ( STR-TO-UTF8( GET(numL3) )) posy += 2 NEXT PRN("\OFF") COND( swExtra1 ) COND( GE?(SCORE,5000) ) ++lives FALSE(swExtra1) SYS( "aplay fl/Snake_bono.wav /dev/null 2>&1 &" ) LOCATE(27,COLUMNA_PRINT) SET-INVERSE, PRN("LIVES: ",lives,"\OFF") CEND ELS-COND(swExtra2) COND( GE?(SCORE,10000) ) ++lives FALSE(swExtra2) SYS( "aplay fl/Snake_bono.wav /dev/null 2>&1 &" ) LOCATE(27,COLUMNA_PRINT) SET-INVERSE, PRN("LIVES: ",lives,"\OFF") CEND CEND RET DEF-FUN( set score ) {"┌┐"," ┐","┌┐","┌┐","┐┐","┌┐","┌┐","┌┐","┌┐","┌┐"} APND-LST(numL1) {"││"," │","┌┘"," ┤","└┤","└┐","├┐"," │","├┤","└┤"} APND-LST(numL2) {"└┘"," ┴","└┘","└┘"," ┘","└┘","└┘"," ┴","└┘","└┘"} APND-LST(numL3) {1,1,1,1,0,1,1,0,1,1,0,1,1,1,1} APND-ROW( big number ) {1,1,0,0,1,0,0,1,0,0,1,0,1,1,1} APND-ROW( big number ) {1,1,1,0,0,1,1,1,1,1,0,0,1,1,1} APND-ROW( big number ) {1,1,1,0,0,1,0,1,1,0,0,1,1,1,1} APND-ROW( big number ) {1,0,1,1,0,1,1,1,1,0,0,1,0,0,1} APND-ROW( big number ) {1,1,1,1,0,0,1,1,1,0,0,1,1,1,1} APND-ROW( big number ) {1,0,0,1,0,0,1,1,1,1,0,1,1,1,1} APND-ROW( big number ) {1,1,1,0,0,1,0,0,1,0,0,1,0,0,1} APND-ROW( big number ) {1,1,1,1,0,1,1,1,1,1,0,1,1,1,1} APND-ROW( big number ) {1,1,1,1,0,1,1,1,1,0,0,1,0,0,1} APND-ROW( big number ) RET DEF-FUN( ready ) {"\033[38;5;4m\033[48;5;11m"} LOC-COL(16) LOC-ROW(13); PRN( STR-TO-UTF8(" ▄ ▄▄ ▄ ▄▄ ▄ ▄ ")) LOC-ROW(14); PRN( STR-TO-UTF8(" █▄▀ █▀ █▄█ █ █ ▀▄▀ ")) LOC-ROW(15); PRN( STR-TO-UTF8(" ▀ ▀ ▀▀ ▀ ▀ ▀▄▀ ▀ ")) PRN("\OFF") RET DEF-FUN( level clear ) {"\033[38;5;4m\033[48;5;11m"} LOC-COL(17) LOC-ROW(12); PRN( STR-TO-UTF8( " ▄ ▄▄ ▄ ▄ ▄▄ ▄ ")) LOC-ROW(13); PRN( STR-TO-UTF8( " █ █▀ █ █ █▀ █ ")) LOC-ROW(14); PRN( STR-TO-UTF8( " ▀ ▀▀ ▀ ▀▀ ▀ ")) LOC-ROW(15); PRN( STR-TO-UTF8( " ▄ ▄ ▄▄ ▄ ▄ ")) LOC-ROW(16); PRN( STR-TO-UTF8( " █ █ █▀ █▄█ █▄▀ ")) LOC-ROW(17); PRN( STR-TO-UTF8( " ▀ ▀ ▀▀ ▀ ▀ ▀ ▀ ")) PRN("\OFF") RET DEF-FUN( challenge stage ) {"\033[38;5;4m\033[48;5;11m"} LOC-COL(9) LOC-ROW(12); PRN( STR-TO-UTF8( " ▄ ▄ ▄ ▄ ▄ ▄ ▄▄ ▄ ▄▄ ▄▄ ")) LOC-ROW(13); PRN( STR-TO-UTF8( " █ █▄█ █▄█ █ █ █▀ █ █ █ ▄ █▀ ")) LOC-ROW(14); PRN( STR-TO-UTF8( " ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀▀ ▀ ▀ ▀▀ ▀▀ ")) LOC-ROW(15); PRN( STR-TO-UTF8( " ▄ ▄ ▄ ▄ ▄▄ ▄▄ ")) LOC-ROW(16); PRN( STR-TO-UTF8( " ▀▄ █ █▄█ █ ▄ █▀ ")) LOC-ROW(17); PRN( STR-TO-UTF8( " ▀ ▀ ▀ ▀ ▀▀ ▀▀ ")) PRN("\OFF") RET DEF-FUN( GANA BONO ) {"\033[38;5;11m\033[48;5;196m"} LOC-COL(17) LOC-ROW(12); PRN( STR-TO-UTF8(" ▄ ▄ ▄ ▄ ▄ ▄ ")) LOC-ROW(13); PRN( STR-TO-UTF8(" █▄▀ █ █ █ █ █ █ ▀▄ ")) LOC-ROW(14); PRN( STR-TO-UTF8(" ▀▄▀ ▀ ▀ ▀ ▀ ▀ ")) LOC-ROW(15); PRN( STR-TO-UTF8(" ▄ ▄ ▄ ▄ ")) LOC-ROW(16); PRN( STR-TO-UTF8(" █ █ █ █ █ █ █ ")) LOC-ROW(17); PRN( STR-TO-UTF8(" █ ▄ ▀▄▀ ▀▄▀ ▀▄▀ ")) PRN("\OFF") RET DEF-FUN( game over ) {"\033[38;5;15m\033[48;5;9m"} LOC-COL(17) LOC-ROW(12); PRN( STR-TO-UTF8(" ▄▄ ▄ ▄ ▄ ▄▄ ")) LOC-ROW(13); PRN( STR-TO-UTF8(" █ ▄ █▄█ █ █ █ █▀ ")) LOC-ROW(14); PRN( STR-TO-UTF8(" ▀▀ ▀ ▀ ▀ ▀ ▀ ▀▀ ")) LOC-ROW(15); PRN( STR-TO-UTF8(" ▄ ▄ ▄ ▄▄ ▄ ")) LOC-ROW(16); PRN( STR-TO-UTF8(" █ █ █ █ █▀ █▄▀ ")) LOC-ROW(17); PRN( STR-TO-UTF8(" ▀ ▀ ▀▀ ▀ ▀ ")) PRN("\OFF") RET DEF-FUN( titles ) #define COLOR_INI 232 #define COLOR_FIN 255 SET(k,1) PERF-UP(k,2,1) SET(j,COLOR_INI), SET(jbg,COLOR_FIN) PERF-UP(j,COLOR_FIN,1) COLOR(j, jbg--) LOC-COL(17) LOC-ROW(12); PRN(STR-TO-UTF8(" ")) LOC-ROW(13); PRN(STR-TO-UTF8(" ▄ ▄ ▄ ▄ ▄ ▄▄ ")) LOC-ROW(14); PRN(STR-TO-UTF8(" ▀▄ █ █ █▄█ █▄ █▀ ")) LOC-ROW(15); PRN(STR-TO-UTF8(" ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀▀ ")) LOC-ROW(16); PRN(STR-TO-UTF8(" ▄ ▄ ▄▄ ▄▄ ▄▄ ")) LOC-ROW(17); PRN(STR-TO-UTF8(" ▀▄ █▄█ █▀ █▀ █ █ ")) LOC-ROW(18); PRN(STR-TO-UTF8(" ▀ ▀ ▀▀ ▀▀ ▀▄▀ ")) LOC-ROW(19); PRN(STR-TO-UTF8(" ")) MICROSECS(20000) NEXT SET(j,COLOR_FIN), SET(jbg,COLOR_INI) PERF-DOWN(j,COLOR_INI,1) COLOR(j, jbg++) LOC-COL(17) LOC-ROW(12); PRN(STR-TO-UTF8(" ")) LOC-ROW(13); PRN(STR-TO-UTF8(" ▄ ▄ ▄ ▄ ▄ ▄▄ ")) LOC-ROW(14); PRN(STR-TO-UTF8(" ▀▄ █ █ █▄█ █▄ █▀ ")) LOC-ROW(15); PRN(STR-TO-UTF8(" ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀▀ ")) LOC-ROW(16); PRN(STR-TO-UTF8(" ▄ ▄ ▄▄ ▄▄ ▄▄ ")) LOC-ROW(17); PRN(STR-TO-UTF8(" ▀▄ █▄█ █▀ █▀ █ █ ")) LOC-ROW(18); PRN(STR-TO-UTF8(" ▀ ▀ ▀▀ ▀▀ ▀▄▀ ")) LOC-ROW(19); PRN(STR-TO-UTF8(" ")) MICROSECS(20000) NEXT NEXT PRN("\OFF") RET DEF-FUN( prepare maze ) REPL(12,ADD(MUL(w, 3),20),"333333333333",Maze), MOVE-TO(Maze) REPL(12,ADD(MUL(w, 24),20),"333333333333",Maze), MOVE-TO(Maze) REPL(12,ADD(MUL(w, 6),7),"333333333333",Maze), MOVE-TO(Maze) REPL(12,ADD(MUL(w, 6),33),"333333333333",Maze), MOVE-TO(Maze) REPL(12,ADD(MUL(w, 21),7),"333333333333",Maze), MOVE-TO(Maze) REPL(12,ADD(MUL(w, 21),33),"333333333333",Maze), MOVE-TO(Maze) SET(i,7) PERF-UP(i,10,1) REPL(1,ADD(MUL(w, i),7),"3",Maze), MOVE-TO(Maze) REPL(1,ADD(MUL(w, i),44),"3",Maze), MOVE-TO(Maze) REPL(1,ADD(MUL(w, ADD(i,10)),44),"3",Maze), MOVE-TO(Maze) REPL(1,ADD(MUL(w, ADD(i,10)),7),"3",Maze), MOVE-TO(Maze) NEXT RET