Bertie
Descripción del contenido de la página
Juego de demostración incluido en Abersoft Forth, formateado para facilitar su lectura y con unas pequeñas modificaciones.
Abersoft Forth, el Forth que más usé con la ZX Spectrum, traía un juego de demostración llamado Bertie. Desgraciadamente no era una maravilla ni aprovechaba las capacidades de Forth. Los gráficos eran bloques de 2x2 caracteres que se movían a saltos de 2 caracteres.
Tampoco el código fuente servía para aprender, porque estaba escrito de forma muy densa y sin un solo comentario, comprimido en ocho bloques del disco RAM.
Muchos años después, en 2009, extraje el código fuente del fichero original. Lo maqueté en un fichero de texto para poder leerlo mejor y entender cómo funcionaba. Por ejemplo, descubrí que el programa modificaba una variable del sistema para cambiar los colores de impresión y hacía la detección de choques comprobando dichos atributos en la esquina superior izquierda de cada gráfico. Aproveché para hacer una modificación: le cambié las teclas de control por las teclas habituales de muchos juegos de la Spectrum (5, 6, 7, 8).
En enero de 2010 tuve la idea de hacer una versión de Bertie para la computadora Jupiter Ace. Al poco de examinar el código con atención descubrí y corregí un error: el desconocido programador (posiblemente John Jones-Steel, autor de Abersoft Forth) se había «comido» dos palabras en una expresión, alterando con ello el movimiento de uno de los gráficos en la cuarta pantalla del juego.
En principio la tarea de traducir un programa de Abersoft Forth a Ace Forth parecía fácil porque la ZX Spectrum tiene más capacidades gráficas que la Jupiter Ace. Pero entender y reescribir con buen estilo Forth el denso y oscuro código original de Bertie resultó un desafío. El resultado está en avanzado estado de desarrollo y se llamará Bertie's Face.
En esta página publico este sencillo juego con mis modificaciones y formateado para facilitar su lectura.
Pantallazos
La primera pantalla con todos los elementos del juego: los bloques que forman el laberinto, las dos formas locas, la llave, la cerradura y el sonriente Bertie:
Efecto final cuando se acaban las tres vidas disponibles:
Código fuente
Los caracteres recuadrados representan caracteres gráficos definidos por el usuario (A-U); los caracteres gráficos de bloques se representan con su equivalente en Unicode.
\ Bertie
\ This is the demo game bundled with Abersoft Forth
\ (for the Sinclair ZX Spectrum)
\ Modified by Marcos Cruz (http://programandala.net):
\ Changes
\ 2009-05-23 Control keys changed to: 5 6 7 and 8.
\ 2010-01-18 Bug fixed in SHMOVE .
\ 2010-03-03 Unnecessary word removed in GO .
\ 2010-03-10 Bug discovered but not fixed: the shapes can destroy the key.
: RND
23670 @ 75 U* 75 0 D+ OVER OVER U< - - 1 - DUP 23670 !
U* SWAP DROP
;
: RANDOM
23672 @ 23670 !
;
6 BORDER 5 PAPER CLS
: GR
1 - 8 * UDG 1 - + DUP 8 +
DO
I C! -1
+LOOP
;
0 3 12 16 46 42 78 64 1 GR
0 192 48 8 116 84 114 2 2 GR
65 65 44 39 17 12 3 0 3 GR
130 130 52 228 136 48 192 0 4 GR
0 0 0 0 0 0 0 1 5 GR
0 28 54 34 54 124 224 192 6 GR
3 7 14 28 56 52 8 0 7 GR
128 0 0 0 0 0 0 0 8 GR
255 255 252 248 240 240 248 252 9 GR
255 255 63 31 15 15 31 63 10 GR
254 254 252 252 248 240 255 255 11 GR
127 127 63 63 31 15 255 255 12 GR
224 CONSTANT 208
0 7 7 7 7 127 127 127 13 GR
0 208 208 208 208 254 254 254 14 GR
127 127 127 7 7 7 7 0 15 GR
254 254 254 208 208 208 208 0 16 GR
0 8 28 60 127 63 31 15 17 GR
0 16 56 124 254 252 248 240 18 GR
15 31 63 127 60 28 8 0 19 GR
240 248 252 254 124 56 16 0 20 GR
170 85 170 85 170 85 170 85 21 GR
0 VARIABLE MX
0 VARIABLE MY
0 VARIABLE DX
0 VARIABLE DY
RANDOM
0 VARIABLE KX
0 VARIABLE KY
7 PAPER 7 BORDER CLS
0 VARIABLE KEY?
1 VARIABLE MAZE
0 VARIABLE SCORE
3 VARIABLE LIVES
3 PAPER 4 INK
: PRMAN
1 INK MX @ MY @ OVER 1+ OVER AT ." CD" AT ." AB"
;
: PRBLANK
1 INK MX @ MY @ OVER 1+ OVER AT 2 SPACES AT 2 SPACES
;
: PRMAZE
MAZE @ 5 * 5 + 0 DO 10 RND 2 * 14 RND 2 * OVER 1+
OVER AT ." UU" AT ." UU" LOOP 7 PAPER 10 RND 2 * DX ! 30 DY ! DX
@ DY @ OVER 1+ OVER 2 INK AT ." KL" AT ." IJ" 8 RND 2 * 4 + KX
! 16 KY ! KX @ KY @ OVER 1+ OVER 3 INK AT ." GH" AT ." EF"
57 23693 C! 2 0 AT ." " 3 0 AT ." "
;
: TUNE1
1000 500 DO 10 I BLEEP 50 +LOOP
;
: TUNE2
500 1000 DO 10 I BLEEP I -5 / +LOOP
;
PRMAZE PRMAN
: PAUSE
32767 0 DO LOOP
;
: NMAZE
5 0 DO TUNE1 TUNE2 LOOP 1 MAZE +! PAUSE 0 MX ! 0 MY !
;
: TUNE3
1500 500 DO 50 I BLEEP 100 +LOOP 400 600 DO 30 I BLEEP
-25 +LOOP 10 0 DO TUNE2 LOOP
;
6 BORDER TUNE3
0 VARIABLE CX
0 VARIABLE CY
0 VARIABLE SX
0 VARIABLE SY
: FIN
50 0 DO 127 87 PLOT 255 RND 175 RND DRAW LOOP
CLS
10 0 DO TUNE1 LOOP
5 9 AT ." You scored " 2 INK SCORE @ .
1 INK 7 7 AT ." You reached maze " 3 INK MAZE @ .
1 INK 9 5 AT ." To replay type......." 235 23693 C!
11 11 AT ." ▞▀▘▗▀▚"
12 11 AT ." ▌▗▄▐ ▐"
13 11 AT ." ▚▄▌▝▄▞"
57 23693 C! TUNE3 QUIT
;
: CRASH
10 0 DO
256 0 DO
I 254 OUTP
LOOP
LOOP
6 BORDER -1 LIVES +!
LIVES @ 0= IF FIN ENDIF
0 MX ! 0 MY ! 18 SX ! 28 SY !
PAUSE CLS
28 23693 C!
PRMAZE PRMAN TUNE3
;
: Z 0 23672 ! ;
: A
10000 23672 @ - 75 / SCORE +!
SCORE @ 0< IF 0 SCORE ! ENDIF
;
: CHECK
MX @ DUP 0< IF CRASH ENDIF
20 > IF CRASH ENDIF
MY @ DUP 0< IF CRASH ENDIF
30 > IF CRASH ENDIF
MX @ MY @ ATTR
CASE
231 OF CRASH ENDOF
28 OF CRASH ENDOF
58 OF
KEY? @ 0=
IF CRASH
ELSE
0 KEY? ! 100 SCORE +! NMAZE
CLS A 28 23693 C! PRMAZE PRMAN Z
ENDIF
ENDOF
59 OF 1 KEY? ! TUNE1 10 SCORE +! ENDOF
ENDCASE
;
: DOWN 2 MX +! ;
: LEFT -2 MY +! ;
: RIGHT 2 MY +! ;
: UP -2 MX +! ;
: MOVE
INKEY PRBLANK
CASE
53 OF LEFT ENDOF
56 OF RIGHT ENDOF
55 OF UP ENDOF
54 OF DOWN ENDOF
49 OF QUIT ENDOF
ENDCASE
CHECK PRMAN TUNE2
;
: PRSC
0 23659 C!
15 23693 C!
21 0 AT CR
." Score:" SCORE @ . 3 SPACES
." Maze:" MAZE @ . 3 SPACES
." Lives:" LIVES @ .
57 23693 C!
2 23659 C!
;
: PRBLCS
57 23693 C! CX @ CY @ OVER 1+ OVER
AT 2 SPACES AT 2 SPACES
SX @ SY @ OVER 1+ OVER
AT 2 SPACES AT 2 SPACES
;
: PRSHAPE
231 23693 C! CX @ CY @ OVER 1+ OVER
AT ." OP" AT ." MN"
SX @ SY @ OVER 1+ OVER
AT ." ST" AT ." QR" 57 23693 C!
;
: SHMOVE
KEY? @ 0=
IF
3 INK KX @ KY @ OVER 1+ OVER
AT ." GH" AT ." EF"
2 INK DX @ DY @ OVER 1+ OVER
AT ." KL" AT ." IJ"
ENDIF
PRBLCS MAZE @ 4 <
IF
2 CY ! 28 SY ! 3 RND 1 - 2 * CX +! 3 RND 1
- 2 * SX +!
ELSE
MAZE @ 5 > IF 26 CY ! ENDIF
( Bug: )
( MAZE 4 = IF 16 CY ENDIF )
( 2010-01-18 Fixed: )
MAZE @ 4 = IF 16 CY ! ENDIF
MX @ SX @ = IF 20 SX ! ENDIF
23672 @ 3 MOD 0=
IF
MX @ SX @ > IF 2 SX +! ELSE -2 SX +! ENDIF
ENDIF
MAZE @ 4 >
IF
MX @ CX @ > IF 2 CX +! ELSE -2 CX +! ENDIF
ENDIF
MY @ SY @ > IF 2 SY +! ELSE -2 SY +! ENDIF
MAZE @ 5 >
IF
MY @ CY @ > IF 2 CY +! ELSE -2 CY +! ENDIF
ENDIF
ENDIF
SX @ DUP 0< IF 0 SX ! ENDIF
20 > IF 20 SX ! ENDIF
SY @ DUP 0< IF 0 SY ! ENDIF
28 > IF 28 SY ! ENDIF
CX @ DUP 0< IF 0 CX ! ENDIF
20 > IF 20 CX ! ENDIF
CY @ DUP 0< IF 0 CY ! ENDIF
28 > IF 28 CY ! ENDIF
PRSHAPE
;
: GAME
BEGIN
CHECK MOVE PRSC SHMOVE
AGAIN
;
: INST
CLS 1 INK
9 2 AT ." Do you want instructions" 7 INK
KEY
KEY 89 = IF
2 BORDER 2 PAPER 7 INK CLS
." ▛▀▖▛▀▐▀▚▝▜▀▝▜▀▐▀▘" CR
." ▙▄▘▙▖▐▄▞ ▐ ▐ ▐▄" CR
." ▌ ▌▌ ▐▝▖ ▐ ▐ ▐" CR
." ▀▀ ▀▀▝ ▝ ▝ ▝▀▀▝▀▘" CR CR CR
6 INK ." The object of the game is to" CR
." gain as many points as"
CR ." possible by picking up the" CR ." key and using it to"
." unlock" CR ." the door. " 1 BRIGHT ." BUT" 0 BRIGHT
." you must" CR ." avoid the shapes which" CR ." are trying"
." to catch you." CR ." At each new maze the shapes" CR
." become more difficult to avoid." CR CR
." Press any key to continue" 2 INK KEY
CR CR 5 INK ." Controls:" 7 INK CR CR
4 SPACES ." 5 Left" 7 SPACES ." 8 Right" CR CR
4 SPACES ." 6 Down" 7 SPACES ." 7 Up" CR CR CR
5 INK ." Scores:" CR 7 INK CR
." Picking up the key scores" CR 20 SPACES ." 10 points" CR CR
." Unlocking the door scores" CR 19 SPACES ." 100 points" CR CR
." If you complete a maze quickly you will get bonus points"
CR ." depending on your time" CR CR CR
." Press any key to continue"
2 INK KEY
ENDIF
7 PAPER 6 BORDER 1 INK CLS
;
: GO
( Unnecessary word: )
( [COMPILE] 0 MX ! )
( 2010-03-03 Fixed: )
INST 0 MX ! 0 MY ! 1 MAZE ! 3 LIVES ! 0 SCORE !
10 CX ! 10 SX ! 2 CY ! 28 SY ! CLS 28 23693 C! PRMAZE PRMAN
RANDOM Z GAME
;
GO