701 lines
23 KiB
Plaintext
701 lines
23 KiB
Plaintext
/* 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 <flow.h>
|
|
#include <flow-term.h>
|
|
#include <keys.h>
|
|
|
|
#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 >/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 >/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 >/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 >/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 >/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 >/dev/null 2>&1")
|
|
LET( quit := 1 )
|
|
EXIT
|
|
}
|
|
DEFAULT {
|
|
GOSUB(KILLSOUND)
|
|
SYS("aplay fl/Snake_golpe.wav </dev/null >/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 >/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 >/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 >/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 >/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 >/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
|