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.

Etiquetas:

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:

Bertie

Efecto final cuando se acaban las tres vidas disponibles:

Bertie

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


Descargas

Páginas relacionadas

Bertie's face
[Proyecto durmiente:] Juego escrito en Ace Forth para Jupiter Ace.