It's due to the inclusion of a new keyword: COLOR used to extract or define the colors of functions/expressions/etc in the [Symb] view.
Here's a slightly modified source code that will make the game work on newer firmware:
Code:
//
// BRICKS V0.2
// By Kevin Barbier (kevin@kevin-barbier.org)
//
//
// Globals variables
//
// ---- KEY CONFIG ----
LEFT_KEY:=14;
RIGHT_KEY:=15;
DOWN_KEY:=21;
MAX_DOWN_KEY:=30;
ROTATE_KEY:=19;
PAUSE_KEY:=0;
HELP_KEY:=3;
CHOOSE_KEYS_KEY:=9;
RESET_TO_DEFAULT_KEYS_KEY:=13;
RESET_GAME_KEY:=10;
QUIT_KEY:=4;
// --------------------
SCORE_NB_LINES:=0;
SCORE_NB_POINTS:=0;
BRICK_SIZE:=12;
BRICK_COLORS:={[255, 0, 0], [0, 255, 0], [0, 0, 255], [255,255,0], [255,0,255], [0,255,255]};
BRICKS_TAB_W:=10;
BRICKS_TAB_H:=20;
BRICKS_TAB:=[[-1,-1],[-1,-1]];
NB_SHAPES:=7;
NB_ORIENTATIONS:=4;
SHAPES_MAX_W:=4;
SHAPES_MAX_H:=4;
SHAPES_W:={4,1,4,1,
2,2,2,2,
3,2,3,2,
3,2,3,2,
3,2,3,2,
3,2,3,2,
3,2,3,2};
SHAPES_H:={1,4,1,4,
2,2,2,2,
2,3,2,3,
2,3,2,3,
2,3,2,3,
2,3,2,3,
2,3,2,3};
// Bar, square, half cross, Z left, Z rigth, L left, L rigth
SHAPES:={
[[1,1,1,1],[0,0,0,0],[0,0,0,0],[0,0,0,0]],
[[1,0,0,0],[1,0,0,0],[1,0,0,0],[1,0,0,0]],
[[1,1,1,1],[0,0,0,0],[0,0,0,0],[0,0,0,0]],
[[1,0,0,0],[1,0,0,0],[1,0,0,0],[1,0,0,0]],
[[1,1,0,0],[1,1,0,0],[0,0,0,0],[0,0,0,0]],
[[1,1,0,0],[1,1,0,0],[0,0,0,0],[0,0,0,0]],
[[1,1,0,0],[1,1,0,0],[0,0,0,0],[0,0,0,0]],
[[1,1,0,0],[1,1,0,0],[0,0,0,0],[0,0,0,0]],
[[0,1,0,0],[1,1,1,0],[0,0,0,0],[0,0,0,0]],
[[1,0,0,0],[1,1,0,0],[1,0,0,0],[0,0,0,0]],
[[1,1,1,0],[0,1,0,0],[0,0,0,0],[0,0,0,0]],
[[0,1,0,0],[1,1,0,0],[0,1,0,0],[0,0,0,0]],
[[1,1,0,0],[0,1,1,0],[0,0,0,0],[0,0,0,0]],
[[0,1,0,0],[1,1,0,0],[1,0,0,0],[0,0,0,0]],
[[1,1,0,0],[0,1,1,0],[0,0,0,0],[0,0,0,0]],
[[0,1,0,0],[1,1,0,0],[1,0,0,0],[0,0,0,0]],
[[0,1,1,0],[1,1,0,0],[0,0,0,0],[0,0,0,0]],
[[1,0,0,0],[1,1,0,0],[0,1,0,0],[0,0,0,0]],
[[0,1,1,0],[1,1,0,0],[0,0,0,0],[0,0,0,0]],
[[1,0,0,0],[1,1,0,0],[0,1,0,0],[0,0,0,0]],
[[1,0,0,0],[1,1,1,0],[0,0,0,0],[0,0,0,0]],
[[1,1,0,0],[1,0,0,0],[1,0,0,0],[0,0,0,0]],
[[1,1,1,0],[0,0,1,0],[0,0,0,0],[0,0,0,0]],
[[0,1,0,0],[0,1,0,0],[1,1,0,0],[0,0,0,0]],
[[0,0,1,0],[1,1,1,0],[0,0,0,0],[0,0,0,0]],
[[1,0,0,0],[1,0,0,0],[1,1,0,0],[0,0,0,0]],
[[1,1,1,0],[1,0,0,0],[0,0,0,0],[0,0,0,0]],
[[1,1,0,0],[0,1,0,0],[0,1,0,0],[0,0,0,0]]
};
//
// Functions declarations
//
INIT_SCREEN();
INIT_BRICKS_TAB();
DRAW_SCREEN();
DRAW_BASE_SCREEN();
DRAW_BRICKS_TAB();
DRAW_CURRENT_MOVING_SHAPE();
FLIP_SCREEN();
GET_NEW_COLOR();
GET_NEW_SHAPE_TYPE();
GET_NEW_ORIENTATION();
WAIT_KEY();
WAIT_MS();
X_TO_SCRPOS();
Y_TO_SCRPOS();
DRAW_BRICK();
GET_SHAPE();
DRAW_SHAPE();
COPY_SHAPE_TO_BRICKS_TAB();
TST_SHAPE_CAN_MOVE();
REMOVE_LINES();
GET_LEVEL();
GET_SPEED();
PAUSE();
HELP();
CHOOSE_KEYS();
CHOOSE_KEY();
RESET_TO_DEFAULT_KEYS();
RESET_GAME();
QUIT();
//
// BRICKS()
//
// Main function, entry point
//
EXPORT BRICKS()
BEGIN
LOCAL X:=3;
LOCAL Y:=1;
LOCAL CURRENT_SHAPE_TYPE:=GET_NEW_SHAPE_TYPE();
LOCAL NEXT_SHAPE_TYPE:=GET_NEW_SHAPE_TYPE();
LOCAL ORIENTATION:=GET_NEW_ORIENTATION();
LOCAL colour:=GET_NEW_COLOR();
LOCAL BEGIN_TICKS;
LOCAL TURN_TIME:=GET_SPEED();
SCORE_NB_LINES:=0;
SCORE_NB_POINTS:=0;
INIT_SCREEN();
IF BRICKS_TAB(1,1)==-1 THEN
INIT_BRICKS_TAB(); END;
WHILE 1 DO
DRAW_SCREEN(CURRENT_SHAPE_TYPE, X, Y, ORIENTATION, colour, NEXT_SHAPE_TYPE);
BEGIN_TICKS:=TICKS;
WHILE TICKS<BEGIN_TICKS+TURN_TIME DO
// Quit
IF ISKEYDOWN(QUIT_KEY)<>0 THEN
IF QUIT()==1 THEN RETURN 0; END;
END;
// Left
IF ISKEYDOWN(LEFT_KEY)<>0 AND X>1 THEN
IF TST_SHAPE_CAN_MOVE(CURRENT_SHAPE_TYPE, X-1, Y, ORIENTATION)<>0 THEN
X:=X−1;
DRAW_SCREEN(CURRENT_SHAPE_TYPE, X, Y, ORIENTATION, colour, NEXT_SHAPE_TYPE);
WAIT_MS(TURN_TIME/10);
END;
END;
// Right
IF ISKEYDOWN(RIGHT_KEY)<>0 THEN
IF TST_SHAPE_CAN_MOVE(CURRENT_SHAPE_TYPE, X+1, Y, ORIENTATION)<>0 THEN
X:=X+1;
DRAW_SCREEN(CURRENT_SHAPE_TYPE, X, Y, ORIENTATION, colour, NEXT_SHAPE_TYPE);
WAIT_MS(TURN_TIME/10);
END;
END;
// Down
IF ISKEYDOWN(DOWN_KEY)<>0 THEN
WAIT_MS(TURN_TIME/10);
BREAK;
END;
// Max down
IF ISKEYDOWN(MAX_DOWN_KEY)<>0 THEN
WHILE TST_SHAPE_CAN_MOVE(CURRENT_SHAPE_TYPE, X, Y+1, ORIENTATION)<>0 DO
Y:=Y+1;
END;
WAIT_MS(TURN_TIME/5);
BREAK;
END;
// Rotate
IF ISKEYDOWN(ROTATE_KEY)<>0 THEN
LOCAL NEW_ORIENTATION:=ORIENTATION;
IF NEW_ORIENTATION<4 THEN
NEW_ORIENTATION:=NEW_ORIENTATION+1;
ELSE
NEW_ORIENTATION:=1;
END;
IF TST_SHAPE_CAN_MOVE(CURRENT_SHAPE_TYPE, X, Y, NEW_ORIENTATION)<>0 THEN
ORIENTATION:=NEW_ORIENTATION;
END;
DRAW_SCREEN(CURRENT_SHAPE_TYPE, X, Y, ORIENTATION, colour, NEXT_SHAPE_TYPE);
WAIT_MS(250);
END;
// Pause
IF ISKEYDOWN(PAUSE_KEY)<>0 THEN
PAUSE();
END;
// Help
IF ISKEYDOWN(HELP_KEY)<>0 THEN
HELP();
END;
// Choose keys
IF ISKEYDOWN(CHOOSE_KEYS_KEY)<>0 THEN
CHOOSE_KEYS();
END;
// Reset to default keys
IF ISKEYDOWN(RESET_TO_DEFAULT_KEYS_KEY)<>0 THEN
RESET_TO_DEFAULT_KEYS();
END;
// Reset game
IF ISKEYDOWN(RESET_GAME_KEY)<>0 THEN
RESET_GAME();
TURN_TIME:=GET_SPEED();
Y:=1;
X:=3;
CURRENT_SHAPE_TYPE:=NEXT_SHAPE_TYPE;
NEXT_SHAPE_TYPE:=GET_NEW_SHAPE_TYPE();
colour:=GET_NEW_COLOR();
ORIENTATION:=GET_NEW_ORIENTATION();
END;
END;
IF TST_SHAPE_CAN_MOVE(CURRENT_SHAPE_TYPE, X, Y+1, ORIENTATION)<>0 THEN
Y:=Y+1;
ELSE
COPY_SHAPE_TO_BRICKS_TAB(CURRENT_SHAPE_TYPE, X, Y, colour, ORIENTATION);
REMOVE_LINES();
TURN_TIME:=GET_SPEED();
IF Y==1 THEN
WAIT(3);
BREAK;
ELSE
Y:=1;
X:=3;
CURRENT_SHAPE_TYPE:=NEXT_SHAPE_TYPE;
NEXT_SHAPE_TYPE:=GET_NEW_SHAPE_TYPE();
colour:=GET_NEW_COLOR();
ORIENTATION:=GET_NEW_ORIENTATION();
END;
END;
END;
END;
//
// INIT_BRICKS_TAB()
//
// Initialize the matrix who contain the game
//
INIT_BRICKS_TAB()
BEGIN
BRICKS_TAB:=[
[1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1],
[1,1,1,1,1,1,1,1,1,1,1,1,1,1]
];
FOR I FROM 1 TO BRICKS_TAB_H DO
ADDROW(BRICKS_TAB, [0,0,0,0,0,0,0,0,0,0,1,1,1,1], 1);
END;
END;
//
// INIT_SCREEN()
//
INIT_SCREEN()
BEGIN
DIMGROB_P(G1, 320, 240);
END;
//
// DRAW_SCREEN()
//
// Draw all screen: decoration, game tab and current moving shape
//
// X: logical position
// Y: logical position
//
DRAW_SCREEN(CURRENT_SHAPE_TYPE, X, Y, ORIENTATION, colour, NEXT_SHAPE_TYPE)
BEGIN
DRAW_BASE_SCREEN(NEXT_SHAPE_TYPE);
DRAW_BRICKS_TAB();
DRAW_CURRENT_MOVING_SHAPE(CURRENT_SHAPE_TYPE, X, Y, ORIENTATION, colour);
FLIP_SCREEN();
END;
//
// DRAW_BASE_SCREEN()
//
// Draw decorations, score, lines, level and next shape
//
// NEXT_SHAPE_TYPE: type of the next shape
//
DRAW_BASE_SCREEN(NEXT_SHAPE_TYPE)
BEGIN
RECT_P(G1, 0, 0, 319, 239, 0, RGB(225,225,225));
RECT_P(G1, 100, 0, 220, 239, 0, RGB(255,255,255));
FOR I FROM 0 TO 5 DO
LINE_P(G1, 99−I, 0, 99−I, 239, RGB(I*40, I*40, I*40));
END;
FOR I FROM 0 TO 5 DO
LINE_P(G1, 221+I, 0, 221+I, 239, RGB(I*40, I*40, I*40));
END;
TEXTOUT_P("Lines", G1, 30, 10, 0);
TEXTOUT_P(SCORE_NB_LINES, G1, 45, 30, 0);
TEXTOUT_P("Score", G1, 30, 100, 0);
TEXTOUT_P(SCORE_NB_POINTS, G1, 45, 120, 0);
TEXTOUT_P("Level", G1, 30, 190, 0);
TEXTOUT_P(GET_LEVEL(), G1, 45, 210, 0);
TEXTOUT_P("Next", G1, 250, 10, 0);
DRAW_SHAPE(NEXT_SHAPE_TYPE, 13, 5, 100, 100, 100, 1);
END;
//
// DRAW_BRICKS_TAB()
//
// Draw the game matrix
//
DRAW_BRICKS_TAB()
BEGIN
FOR I FROM 1 TO BRICKS_TAB_H DO
FOR J FROM 1 TO BRICKS_TAB_W DO
IF BRICKS_TAB(I, J)<>0 THEN
R:=BRICK_COLORS(BRICKS_TAB(I, J), 1);
G:=BRICK_COLORS(BRICKS_TAB(I, J), 2);
B:=BRICK_COLORS(BRICKS_TAB(I, J), 3);
DRAW_BRICK(J, I, R, G, B);
END;
END;
END;
END;
//
// DRAW_CURRENT_MOVING_SHAPE()
//
// X: logical position
// Y: logical position
//
DRAW_CURRENT_MOVING_SHAPE(CURRENT_SHAPE_TYPE, X, Y, ORIENTATION, colour)
BEGIN
R:=BRICK_COLORS(colour, 1);
G:=BRICK_COLORS(colour, 2);
B:=BRICK_COLORS(colour, 3);
DRAW_SHAPE(CURRENT_SHAPE_TYPE, X, Y, R, G, B, ORIENTATION);
END;
//
// FLIP_SCREEN()
//
// Flip double buffer
//
FLIP_SCREEN()
BEGIN
BLIT_P(G0, G1);
END;
//
// GET_NEW_COLOR()
//
// Return: a random new color
//
GET_NEW_COLOR()
BEGIN
RETURN RANDINT(1, SIZE(BRICK_COLORS));
END;
//
// GET_NEW_SHAPE_TYPE()
//
// Return: a random new shape type
//
GET_NEW_SHAPE_TYPE()
BEGIN
RETURN RANDINT(1, NB_SHAPES);
END;
//
// GET_NEW_ORIENTATION()
//
// Return: a random new orientation
//
GET_NEW_ORIENTATION()
BEGIN
RETURN RANDINT(1, NB_ORIENTATIONS);
END;
//
// WAIT_KEY()
//
// ID: ID of the key to wait
//
WAIT_KEY(ID)
BEGIN
WHILE GETKEY<>ID DO
END;
END;
//
// WAIT_MS()
//
WAIT_MS(MS)
BEGIN
LOCAL BEGIN_TICKS:=TICKS;
WHILE TICKS<BEGIN_TICKS+MS DO
A+A;
END;
END;
//
// X_TO_SCRPOS()
//
// Convert a logical position to an absolute screen position
//
// X: logical position
//
// Return: absolute screen position for X
//
X_TO_SCRPOS(X)
BEGIN
RETURN 100+((X-1)*BRICK_SIZE);
END;
//
// Y_TO_SCRPOS()
//
// Convert a logical position to an absolute screen position
//
// Y: logical position
//
// Return: absolute screen position for Y
//
Y_TO_SCRPOS(Y)
BEGIN
RETURN (Y-1)*BRICK_SIZE;
END;
//
// DRAW_BRICK()
//
// Draw a single brick at the logical position X,Y
//
// X: logical position
// Y: logical position
//
DRAW_BRICK(X, Y, R, G, B)
BEGIN
X:=X_TO_SCRPOS(X);
Y:=Y_TO_SCRPOS(Y);
RECT_P(G1, X, Y, X+BRICK_SIZE, Y+BRICK_SIZE, 0, RGB(R,G,B));
END;
//
// GET_SHAPE()
//
// Return: shape structure from the shape type
//
GET_SHAPE(SHAPE_TYPE, ORIENTATION)
BEGIN
RETURN SHAPES((SHAPE_TYPE-1)*NB_ORIENTATIONS+ORIENTATION);
END;
//
// DRAW_SHAPE()
//
// X: logical position
// Y: logical position
//
DRAW_SHAPE(SHAPE_TYPE, X, Y, R, G, B, ORIENTATION)
BEGIN
FOR I FROM 1 TO SHAPES_MAX_H DO
FOR J FROM 1 TO SHAPES_MAX_W DO
LOCAL CURRENT_SHAPE:=GET_SHAPE(SHAPE_TYPE, ORIENTATION);
IF CURRENT_SHAPE(I, J)<>0 THEN DRAW_BRICK(X+(J-1), Y+(I-1), R, G, B); END;
END;
END;
END;
//
// COPY_SHAPE_TO_BRICKS_TAB()
//
// X: logical position
// Y: logical position
//
COPY_SHAPE_TO_BRICKS_TAB(SHAPE_TYPE, X, Y, colour, ORIENTATION)
BEGIN
FOR I FROM 1 TO SHAPES_MAX_H DO
FOR J FROM 1 TO SHAPES_MAX_W DO
LOCAL CURRENT_SHAPE:=GET_SHAPE(SHAPE_TYPE, ORIENTATION);
IF CURRENT_SHAPE(I, J)<>0 THEN BRICKS_TAB(Y+(I-1), X+(J-1)):=colour; END;
END;
END;
END;
//
// TST_SHAPE_CAN_MOVE()
//
// X: logical position
// Y: logical position
//
TST_SHAPE_CAN_MOVE(SHAPE_TYPE, X, Y, ORIENTATION)
BEGIN
LOCAL CURRENT_SHAPE:=GET_SHAPE(SHAPE_TYPE, ORIENTATION);
FOR I FROM 1 TO SHAPES_MAX_H DO
FOR J FROM 1 TO SHAPES_MAX_W DO
IF (CURRENT_SHAPE(I, J)<>0) AND (BRICKS_TAB(Y+(I-1), X+(J-1))<>0) THEN
RETURN 0;
END;
END;
END;
RETURN 1;
END;
//
// REMOVE_LINES()
//
// Remove completed lines
//
REMOVE_LINES()
BEGIN
LOCAL FLAG:=0;
LOCAL NB_NEW_LINES:=0;
FOR I FROM 1 TO BRICKS_TAB_H DO
FLAG:=1;
FOR J FROM 1 TO BRICKS_TAB_W DO
IF BRICKS_TAB(I, J)==0 THEN
FLAG:=0;
BREAK;
END;
END;
IF FLAG==1 THEN
DELROW(BRICKS_TAB, I);
ADDROW(BRICKS_TAB, [0,0,0,0,0,0,0,0,0,0,1,1,1,1], 1);
NB_NEW_LINES:=NB_NEW_LINES+1;
END;
END;
SCORE_NB_LINES:=SCORE_NB_LINES+NB_NEW_LINES;
SCORE_NB_POINTS:=SCORE_NB_POINTS+((NB_NEW_LINES^2)*10);
END;
//
// GET_LEVEL()
//
// Return: the level compute from score
//
GET_LEVEL()
BEGIN
RETURN ROUND(SCORE_NB_POINTS/500,0);
END;
//
// GET_SPEED()
//
// Return: the current speed for moving shape
//
GET_SPEED()
BEGIN
LOCAL SPEED:=800-(100*GET_LEVEL());
IF SPEED<100 THEN SPEED:=100; END;
RETURN SPEED;
END;
//
// PAUSE()
//
PAUSE()
BEGIN
WAIT_MS(1000);
WAIT_KEY(PAUSE_KEY);
WAIT_MS(1000);
END;
//
// HELP()
//
HELP()
BEGIN
MSGBOX("BRICKS V0.2");
MSGBOX("DEFAULTS KEYS: Left [A], Right [B], Down [G], Max down [ENTER], Rotate [DEL], Pause [APPS], Quit [ESC],");
MSGBOX("Choose custom keys [VIEWS], Reset to default keys [MENU], Reset game [CAS]");
END;
//
// CHOOSE_KEYS()
//
// Choose custom keys
//
CHOOSE_KEYS()
BEGIN
MSGBOX("Left");
LEFT_KEY:=CHOOSE_KEY();
MSGBOX("Right");
RIGHT_KEY:=CHOOSE_KEY();
MSGBOX("Down");
DOWN_KEY:=CHOOSE_KEY();
MSGBOX("Max down");
MAX_DOWN_KEY:=CHOOSE_KEY();
MSGBOX("Rotate");
ROTATE_KEY:=CHOOSE_KEY();
END;
//
// CHOOSE_KEY()
//
CHOOSE_KEY()
BEGIN
LOCAL KEY:=-1;
WHILE (KEY==-1) OR (KEY==0) OR (KEY==3) OR (KEY==9) OR (KEY==13) OR (KEY==4) OR (KEY==10) DO
KEY:=GETKEY();
END;
RETURN KEY;
END;
//
// RESET_TO_DEFAULT_KEYS()
//
RESET_TO_DEFAULT_KEYS()
BEGIN
C:=MSGBOX("Are you sure to reset keys to default?", 1);
IF C==1 THEN
LEFT_KEY:=14;
RIGHT_KEY:=15;
DOWN_KEY:=21;
MAX_DOWN_KEY:=30;
ROTATE_KEY:=19;
END;
END;
//
// RESET_GAME()
//
RESET_GAME()
BEGIN
C:=MSGBOX("Are you sure to reset game?", 1);
// Don't save, reset
IF C==1 THEN
INIT_BRICKS_TAB();
END;
END;
//
// QUIT()
//
QUIT()
BEGIN
C:=MSGBOX("Are you sure to quit?", 1);
// If want to quit, ask if save the game
IF C==1 THEN
D:=MSGBOX("Do you want to save game?", 1);
// Don't save, reset
IF D==0 THEN
INIT_BRICKS_TAB();
END;
END;
RETURN C;
END;