Bandera negra en Sinclair BASIC

Descripción del contenido de esta página

Proyecto abandonado de juego de simulación y aventuras para ZX Spectrum, escrito en Sinclair BASIC con el formato de BASin.

Iniciado en 2011-08-02.
Proyecto abandonado.
20% completado.

Para esta primera versión frustrada de Bandera negra tomé como base el código del programa original Jolly Roger y lo convertí al formato de BASin, el veterano entorno de desarrollo de Sinclair BASIC para Windows (en mi caso, ejecutado en Debian con ayuda de Wine).

El formato propio de BASin permite editar el código fuente con cualquier editor de texto, escribir metacomentarios, usar una notación nemónica para los códigos de los caracteres propios de la ZX Spectrum y usar etiquetas en las referencias a los números de línea. Esto compensaba en parte las muchas carencias del lenguaje original.

La plataforma de ejecución elegida (mediante el emulador Fuse) era:

La reescritura y comentado del código original para hacerlo más legible y así facilitar la traducción y las modificaciones progresaron rápidamente. Pero cuando los cambios en el código estaban muy avanzados, un error de BASin en la traducción de las etiquetas me hizo desistir. Era un fallo imposible de arreglar porque el autor, con quien me puse en contacto al respecto, había abandonado el programa en favor de un proyecto más moderno y ambicioso: SpecBAS.

El código de esta frustrada versión en Sinclar BASIC sirvió de base para una versión posterior en MasterBASIC, igualmente frustrada por otro motivo.

Listados

La última versión del programa principal no puede ser ejecutada sin modificar las fuentes porque como se ha explicado BASin no traduce diversas etiquetas. No obstante muestro el listado del programa principal y de otros dos auxiliares que fueron escritos directamente en el emulador.

zonesMaker

Este pequeño programa herramienta graba en el disquete zonas de atributos de la pantalla, que serán utilizadas para hacer borrados y otros efectos de pantalla durante el juego. El cargador del juego copia estos ficheros al disco RAM de la ZX Spectrum 128, para poder acceder a ellos rápidamente durante el juego.


  10 REM zonesMaker - Programa herramienta de
  20 REM "Bandera negra"
  30 REM Crea ficheros en disquete con bloques de atributos.
  40 REM (C) 2011 Marcos Cruz (programandala.net)
  50:
  60 REM 2010-08-05 Primera version
  70:
  80 CLS #
  90 POKE @0,0
 100 CLOSE #*
 110 ERASE d*"zonesList"
 120 OPEN #4;d1"zonesList"RND
 130:
 140 LET p=0: LET i=0: LET b=0: LET l=20: GO SUB 340
 150 LET p=0: LET i=0: LET b=0: LET l=6: GO SUB 340
 160 LET p=0: LET i=0: LET b=1: LET l=6: GO SUB 340
 170 LET p=0: LET i=0: LET b=0: LET l=4: GO SUB 340
 180 LET p=0: LET i=0: LET b=1: LET l=4: GO SUB 340
 190 LET p=1: LET i=1: LET b=0: LET l=13: GO SUB 340
 200 LET p=1: LET i=1: LET b=1: LET l=13: GO SUB 340
 210 LET p=5: LET i=5: LET b=0: LET l=3: GO SUB 340
 220 LET p=5: LET i=5: LET b=1: LET l=3: GO SUB 340
 230 LET p=6: LET i=6: LET b=0: LET l=5: GO SUB 340
 240 LET p=6: LET i=6: LET b=1: LET l=5: GO SUB 340
 250 LET p=6: LET i=6: LET b=0: LET l=13: GO SUB 340
 260 LET p=6: LET i=6: LET b=0: LET l=18: GO SUB 340
 270:
 280 CLS #
 290 CLOSE #*4
 300 PRINT "Lista de ficheros creados:"
 310 MOVE d*"zonesList" TO #2
 320 STOP 
 330:
 340 REM Subrutina
 350 REM Entrada: p,i,b,l
 360 LET f$="zp"+STR$ p+"i"+STR$ i+"b"+STR$ b+"l"+("0" AND (10 > l))+STR$ l
 370 PRINT : REM Esto inexplicablemente evita un curioso problema en Beta DOS: sin esto, la impresion en el disco incluye los caracteres de control de los atributos actuales. No se arregla de otra forma.
 380 BORDER p: PAPER p: INK i: BRIGHT b: CLS 
 390 SAVE OVER d*;f$CODE 22528,l*32
 400 PRINT #4;f$
 410 RETURN 
 420:
 430 SAVE OVER d*"zonesMaker"

Cargador

El cargador copia los ficheros de atributos de pantalla desde el disquete al disco RAM, utilizando el listado creado por zonesMaker en el fichero de datos zonesList:


  10 REM Cargador para
  20 REM "Bandera negra"
  30 REM (C) 2011 Marcos Cruz (programandala.net)
  40:
  50 REM 2011-08-05 Primera version
  60 REM 2011-08-06 Las zonas de color se leen de un fichero secuencial. Subrutinas.
  70 REM 2011-08-08 Incluida una pantalla. Reescrita una subrutina para evitar codigo duplicado.
  80:
  90 CLS #: BORDER 0: PAPER 0 : INK 7
 100 CLEAR 32767
 110:
 120 REM Pantalla de presentacion
 130:
 140 REM LOAD d*"jr1" SCREEN$ : REM provisional
 150 SAVE !"tmpScreen"SCREEN$ 
 160:
 170 REM Copiar al disco RAM las zonas de color cuyos ficheros fueron creados por el programa zonesMaker:
 180:
 190 DEF FN e(x)=USR 8: REM Fin de fichero en Beta DOS
 200 CLOSE #*4
 210 OPEN #4;d*"zonesList"RND
 220 IF FN e(4) THEN  GO TO 250
 230 INPUT #4;f$
 240 GO SUB 460: GO TO 220
 250 CLOSE #*4
 260:
 270 REM Copiar al disco RAM los juegos de caracteres y de graficos
 280:
 290 LET length=768: LET address=USR "a"-length
 300 LET f$="jr3": GO SUB 510
 310 LET f$="jr4": GO SUB 510
 320 LET f$="esRomChr": GO SUB 510
 330 LET length=168: LET address=USR "a"
 340 LET f$="jr6": GO SUB 510
 350 LET f$="bnUDG1": GO SUB 510
 360:
 370 REM Copiar al disco RAM las pantallas
 380:
 390 LET f$="scroll3": LET address=32768: LET lenght=6912: GO SUB 510
 400:
 410 REM Cargar el programa principal
 420:
 430 CLEAR USR "a"-768-1
 440 LOAD d*"bn2"
 450:
 460 REM Subrutina: cargar del disquete un fichero de zona de atributos y copiarlo al disco RAM
 470 REM Entrada: f$=fichero
 480:
 490 LET address=32768: LET length=VAL f$(LEN f$-1 TO )*32
 500:
 510 REM Subrutina: cargar del disquete un fichero de caracteres o UDG y copiarlo al disco RAM
 520 REM Entrada: f$,address,length
 530:
 540 LOAD d*;f$CODE address
 550 SAVE !f$CODE address,length
 560 RETURN 
 570:
 580 SAVE  OVER d*"bn0" LINE 10


Programa principal


gosub @romCharset:stop:rem Debug
rem "Bandera negra" (version A-20110811, en desarrollo)
rem Juego de simulación para ZX Spectrum 48
rem Copyright (C) 2011 Marcos Cruz (programandala.net)
rem Version traducida y remozada de "Jolly Roger", Copyright (C) 1984 bJones / Video Vault ltd.

################################################
# Acerca de este fichero

# Este programa escrito en Sinclair BASIC está en el formato
# BAS del entorno de desarrollo BASin y para editarlo se
# ha usado el editor Vim con la codificación Latin1.

# Procedimiento de trabajo que se ha seguido: Con BASin se
# lee el código fuente y se exporta a un fichero TAP con la
# herramienta provista para ello (Tape Image Builder).  El
# TAP se abre y carga en el emulador de ZX Spectrum y el
# programa se graba en la imagen de disquete de DISCiPLE/+D
# que contiene todos los ficheros del programa.

# Atención:
# Si BASin graba este programa de nuevo en formato BAS
# elimina los comentarios internos
# (las líneas que comienzan con el signo «#», que
# no forman parte del código en Sinclair BASIC).

################################################
# Tareas pendientes

# Eliminar el cálculo inicial del contenido de la matriz b().
# Se puede hacer en cada ocasión antes de desembarcar.

# Hay dos cálculos de daños del barco: tormenta y arrecifes. ¿Unificar en subrutina?

# Cambiar la medida del daño del barco (variable «damage»)
# por su estado, analógamente a la tripulación, y mostrarlo
# en forma de texto.

# Usar PAUSE en vez de bucles para las pausas que usan IF LEN INKEY$.

# Tabla de mejores puntuaciones; guardada en disquete.

# Hacer dos aspectos para el final: éxito y fracaso.

# Ampliar fn l$() y usarla en la negociación.

# Un programe herramienta que prepare y guarde las matrices
# en el disquete, para que el juego se ahorre la tarea, el
# código y el tiempo. (Quizá no merece la pena, porque hay
# variables que definir también y deberían duplicarse en
# ambos programas).

# Hacer que el número de doblones hallados varíe.

# Usar un juego de caracteres diferente para las palabras de
# los nativos.

# Hacer, si no está, que se reciban provisiones, munición y
# tropa tras vencer a un barco.

# Dibujar escorpión y pantano.

# Poder matar escorpión.

# Borrar serpiente y escorpión cuando mueran.

# Hacer variable el dibujo de provisiones.

# Poner la pista en el bocadillo.

# Reducir moral unas décimas cuando un hombre sea herido o
# muerto.

# Reducir la energía un número proporcional a la gravedad
# del ataque, no siempre 1.

# Informar de que no se puede desembarcar
# porque la isla ya ha sido visitada.

# Fallo: el barco sale con fondo negro cuando encalla.

# Revisar los rangos de doblones al comerciar.

# Informar de si hay muertos cuando el bote es alcanzado por
# error. Calcular 'alive' antes y después de herir a los
# hombres.

# Hacer el informe de tripulación accesible también en
# tierra.

# Justificar a la derecha los números del informe.

# Escribir una variante de la rutina de impresión de
# párrafos, para usar en el panel. (Unas variables pueden
# servir para cambiar la primera columna y el ancho de la
# rutina actual).

# Simplificar y embellecer el panel de control.

# Unificar el panel de control en tierra y en mar.

# Usar otro juego de caracteres.

# Embellecer tabla de puntuación final.

# Poner el informe de estado en la pantalla, no en el panel.

# Hacer que se muestre el nombre al anunciar la muerte de un
# tripulante (línea @chooseDeadOne, eventos hacia @islandEvents).

# Hacer que el jugador pueda poner nombre a los miembros de
# la tripulación.

# Que no aparezcan los comandos que no puedan usarse en cada
# situación.

# Cambiar el aspecto de las pantallas finales: negras y con calaveras.

# Hacer que el jugador pueda elegir nombre al capitán. 

# Añadir Fin a la lista de comandos

# Al embarcar, borrar panel antes de redibujar pantalla.

# Quitar el cartel con el nombre sobre la isla del tesoro;
# usar el panel.

# Hacer que el sol se imprima también al azar, pero no
# coincida con las nubes.

################################################
# Ficheros

# Los juegos de caracteres y de gráficos han sido copiados
# del disquete al disco RAM por el programa cargador y se
# cargan en memoria cuando se necesitan.

	let charset=usr "a"-val "768":\
	gosub @ramCharset:\
	gosub @udg1

################################################
# Funciones

# Dirección de los atributos de pantalla del primer carácter de una línea:
	def fn a(l)=val"22528"+l*cpl

# «doblón» o «doblones» según la cantidad:
	def fn d$(c)="dobl"+("ones" and (c> n1))+((o$+"n") and (c=n1))+"."

# Número en letra, para números de 1 a 5:
#def fn l$(n)=("un"and (n=n1))+("dos"and (n=n2))+("tres"and (n=n3))+("cuatro"and (n=n4))+("cinco"and n=n5))
#def fn l$ (n)="undostrescuatrocinco"(code(chr$ 1+chr$ 3+chr$ 6+chr$ 10+chr$ 15(l)) to code(chr$ 2+chr$ 5+chr$ 9+chr$ 15+chr$ 20)(l))
	def fn l$(n)=("     un    dos   tres  cuatrocinco"(l*6) to code(chr$ 8+chr$ 15+chr$ 21+chr$ 29+chr$ 34)(l)))and (l<6)+(str$ l and(l>5))

# Una letra en vídeo inverso:
	def fn v$(l$)=chr$ 20+chr$ 1+l$+chr$ 20+chr$ 0

# Una opción del panel, activa o inactiva:
	def fn o$(o$,l,a)=o$ and not a+(o$(to l-1)fn v$(o$(l)+o$(l+1 to) and a

# Un texto $ centrado en una línea:
	def fn c$(l,t$)=chr$ 22+chr$ l+chr$ ((cpl-len t$)/2)+t$

# Nombre de un tripulante, sin espacios al final:
	def fn n$(m)=d$(m,2 to code(d$(m,1)))

# Cantidad completa de doblones:
	def fn q$(n)=fn l$(n)+" "+fn d$(n)

# Una cadena con la primera letra mayúscula (no se
# comprueba):
	def fn u$(t$)=chr$(code t$(1)-32)+t$(2 to)

################################################
# Constantes

# Números más habituales:
	let n0=not pi:let n1=sgn pi:let n2=val "2":let n3=int pi:let n4=val "4":let n5=val "5":let n6=val "6":let n7=val "7":let n8=val "8":let n9=val "9":let n10=val "10":let n32=code" "

# Vocales minúsculas acentuadas:
	let a$="#":let e$="$":let i$="%":let o$="&":let u$="'"
# Eñe minúscula y aperturas de interrogación y admiración:
	let n$="|":let q$="]":let x$="["

# Línea en blanco:
	let l$="                                "
# «capitán»:
	let c$="capit"+a$+"n"
# Nombre de la isla, provisional!!!:
	let t$="Calavera"
# Caracteres por línea:
	let cpl=n32
# Nombre del barco, provisional!!!:
	let b$="Furioso"

################################################
# Inicio

@start

	gosub @intro:\
	gosub @init:\
	cls

################################################
# En el barco

@aboard

	goto @scenery

################################################
# Subrutina
# Dibujar el mar y el barco

@seaAndShip

	gosub @seaAndSky:\
	goto @drawShipUp

################################################
# Selección de comando a bordo

# Ojo!!! El blogue en @scenery salta aquí.

@shipCommand

	for w=n1 to val "80"

	let k=code inkey$
# "n" o arriba:
	if k=110 or k=11 then goto @seaNorth
# "s" o abajo:
	if k=115 or k=n10 then goto @seaSouth
# "e" o derecha:
	if k=101 or k=n9 then goto @seaEast
# "o" o izquierda:
	if k=111 or k=n8 then goto @seaWest
# "i":
	if k=105 then gosub @report
# "a":
	if k=97 then goto @attackShip
# "t":
	if k=116 then gosub @crewReport
# "d":
	if k=100 then goto @disembarkIfPossible
# "F":
	if k=70 then beep .3,30: goto @theEnd

# Cabeceo del barco:
	if w=40 then gosub @drawShipDown
	if w=80 then gosub @drawShipUp

	next w

# ¿Tormenta?:
	if (int (rnd*n10)+n1)=n2 then gosub @storm

	goto @shipCommand

################################################
# Norte en el mar

@seaNorth

	if a(sPos+15)=n1 then goto @runAground
	let sPos=sPos+15: goto @scenery

################################################
# Sur en el mar

@seaSouth

	if a(sPos-15)=n1 then goto @runAground
	let sPos=sPos-15: goto @scenery

################################################
# Este en el mar

@seaEast

	if a(sPos+n1)=n1 then goto @runAground
	let sPos=sPos+n1: goto @scenery

################################################
# Oeste en el mar

@seaWest

	if a(sPos-n1)=n1 then goto @runAground
	let sPos=sPos-n1: goto @scenery

################################################
# Subrutina
# No se puede hacer eso

@impossible

	gosub @spanishCharset: gosub @wipePanel
	print at 18,n2; paper n0;"Lo siento, capit";a$;"n,";at 19,n2;"no puede hacer eso."
	goto @pause300

################################################
# Desembarcar

@disembarkIfPossible

	gosub @spanishCharset

# depuración!!!:
#let a(sPos)=treasureIsland

# Ojo!!! Aparente error del original,
# que impedia la escena de desembarco del bote
# en la isla del tesoro:

#if b(sPos)=n1 then goto @disembark
#if a(sPos)=treasureIsland then goto @enterTreasureIsland

# Error corregido:
	if b(sPos)=n1 or a(sPos)=treasureIsland then goto @disembark

# Ojo!!! Comprobar la lógica del salto aquí:
@impossibleAttack

	gosub @impossible
	gosub @shipPanel:goto @shipCommand

@disembark

	let supplies=supplies-(int (rnd*n2)+n1):\
	gosub @wipePanel:\
	gosub @seaAndSky

# Dibujar escena de desembarco:
	gosub @graphicCharset1
	print at n8,31; ink n4; paper n1;":";at n9,27;"HI :\::";at n10,25;"F\::\::\::\::\::\::";at 11,23;"JK\::\::\::\::\::\::\::"
	for z=n0 to val "20":\
		print at 11,z; ink n6; paper n1;" <>":\
		PAUSE n10:\
	next z

	if a(sPos)=treasureIsland then goto @enterTreasureIsland

# Crear mapa de la isla:
	gosub @islandMap

	goto @enterIslandLocation

################################################
# Comerciante nativo

@nativeTrader

	gosub @graphicCharset1
	for z=n3 to val "15": print at z,n0; ink n0; paper n6;l$: next z
	gosub @drawNative
	ink n0
	plot 100,100: draw 20,n10: draw n0,30: draw n2,n2: draw 100,n0: draw n2,-n2: draw n0,-60: draw -n2,-n2: draw -100,n0
	draw -n2,n2: draw n0,20: draw -20,n0
	ink n7
	let p=n4: let q=n4: gosub @palm2At
	gosub @wipePanel
	gosub @spanishCharset
	print at panelTop+n1,n3; paper n0;"Comerciante nativo"
	ink n0:let t$=x$+"Hola. Yo vender a t"+u$+"pista para tesoro.":gosub @nativeTell
	gosub @wipeNativeWords
	let price=int (rnd*n5)+n6
	print at n6,16; ink n0; paper n6;"Precio";at n7,16;"ser...";at n8,16;price;" ";fn d$(price);"."
	gosub @wipeNativeWords
	print at n6,16; ink n0; paper n6;q$+"Qu"+e$;at n7,16;" ofrecer t"+u$+",";at n8,16;"blanco?"
	print at 18,n3; paper n0;q$+"Qu"+e$+"oferta le haces?";at 19,n3;"Tienes ";fn l$(cash);" ";fn d$(cash);"."
	gosub @getOffer

	beep .2,n10: print at 18,14; paper n0;offer;" ";fn d$(offer);"."
	if offer>=price or offer=price-n1 then goto @acceptedOffer
	if offer<=(price-n4) then goto @rejectedOffer
	let z=int (rnd*n4)+n1
	if z=n1 then goto @L3400
	if z=n2 then goto @L3430
	gosub @wipeNativeWords: print at n6,16; ink n0; paper n6;x$;"Yo querer";at n7,16;"m";a$;"s!";at n5,19;x$;"No!";at n10,16;price-n1;" ";fn d$(price-n1);"."

@L3150

	beep .2,n10: print at 18,14; paper n0;"1 to 9.      "
	gosub @getOffer

	beep .2,n10: print at 18,14; paper n0;offer;" ";fn d$(offer);"."
	if offer>=(price-n2) then goto @acceptedOffer
	if offer<(price-n2) then goto @rejectedOffer
	gosub @spanishCharset

@L3400

	gosub @wipeNativeWords: let price=int (rnd*n6)+n3: print at n6,16; ink n0; paper n6;"T";u$;" darme";at n7,16;"um...";at n9,16;price;" ";fn d$(price);"."
	beep .2,n10: print at 18,14; paper n0;"de 1 a 9      ": gosub @getOffer:
	beep .2,n10: print at 18,14; paper n0;offer;" ";fn d$(offer);"."
	if offer>=price then goto @acceptedOffer
	if offer<price then goto @rejectedOffer

@L3430

	gosub @wipeNativeWords: let price=int (rnd*n6)+n3: print at n6,16; ink n0; paper n6;price;" ";fn d$(price);at n7,16;" ser";at n8,16;"precio bueno";at n10,16;"rostro p";a$;"lido."
	goto @L3150

################################################
# Subrutina
# Recibe la oferta del jugador (1-9)

@getOffer

	pause n0
	let offer=code inkey$-code "0"
	if offer<n1 or offer>n9 then beep .1,n10: goto @getOffer
	return

################################################
# Oferta rechazada

@rejectedOffer

	gosub @pause200
	gosub @wipeNativeWords
	print ink n0;paper n6;\
	at n6,16;x$;"Ser insulto!";\
	at n8,16;x$;"Fuera de";\
	at n9,16;"isla m";i$;"a!"
	gosub @wipeNativeWords

################################################
# Embarcar

@backToTheShip

	let b(sPos)=n0:\
	let day=day+n1:\
	goto @aboard

################################################
# Oferta aceptada

@acceptedOffer

	gosub @wipeNativeWords
	print ink n0;paper n6;\
	at n6,17;"  Ug...";\
	at n9,16;" Um... Pista..."
	gosub @wipePanel
	randomize
	print at 17,14; ink n0; paper n4;"Pista."
	let clue=int (rnd*n6)+n1
	if clue=n1 then print at 19,n1; paper n0;"Tomar camino ";path
	if clue=n2 then print at 19,n1; paper n0;"Girar en ";a$;"rbol ";tree
	if clue=n3 then print at 19,n1; paper n0;"Ir ";h$(ect);" en ";a$;"rbol."
	if clue=n4 then print at 19,n1; paper n0;"Atravesar poblado ";at 20,n10;f$(village)
	if clue=n5 then print at 19,n1; paper n0;"Ir ";g$(dir);" desde poblado."
	if clue=n6 then print at 19,n1; paper n0;"Dar ";pace;" paso";"s" and (pace>n1);" desde poblado."
	gosub @pause100
	gosub @wipeNativeWords: print at n6,17; ink n0; paper n6;"Entrar";at n7,16;"caminando hasta";at n9,16;" isla de";at n10,16;" tesoro."
	gosub @pause600
	let cash=cash-offer:\
	let score=score+val "200":\
	let trade=trade+n1
	goto @backToTheShip

################################################
# Comerciar

@trade

	if c(iPos)=nativeVillage then goto @nativeTrader
	gosub @impossible:\
	gosub @wipePanel:\
	gosub @islandPanel:goto @islandCommand

################################################
# Subrutina
# Borrar palabras del nativo

@wipeNativeWords

	gosub @pause50
	for z=n1 to val "500":\
		if len inkey$ then goto @wipeNativeWords01
	next z

@wipeNativeWords01

	paper n6:\
	for z=n5 to val "11":\
		print at z,16;"            ":\
	next z
	beep .15,int (rnd*n10)+11
	return

################################################
# Selección de comando en tierra

@islandCommand

	let k=code inkey$
# "n" o arriba:
	if k=110 or k=11 then goto @islandNorth
# "s" o abajo:
	if k=115 or k=n10 then goto @islandSouth
# "e" o derecha:
	if k=101 or k=n9 then goto @islandEast
# "o" o izquierda:
	if k=111 or k=n8 then goto @islandWest
# "c":
	if k=99 then goto @trade
# "b":
	if k=98 then goto @backToTheShip
# "i":
	if k=105 then gosub @report
# "m":
	if k=109 then gosub @attack
# "t":
	if k=116 then gosub @crewReport
# "F":
	if k=70 then beep .3,30: goto @theEnd
	goto @islandCommand

################################################
# Norte en tierra

@islandNorth

	if c(iPos+n6)=n1 then goto @islandCommand
	let iPos=iPos+n6:\
	goto @enterIslandLocation

################################################
# Sur en tierra

@islandSouth

	if c(iPos-n6)=n1 then goto @islandCommand
	let iPos=iPos-n6:\
	goto @enterIslandLocation

################################################
# Este en tierra

@islandEast

	if c(iPos+n1)=n1 then goto @islandCommand
	let iPos=iPos+n1:\
	goto @enterIslandLocation

################################################
# Oeste en tierra

@islandWest

	if c(iPos-n1)=n1 then goto @islandCommand
	let iPos=iPos-n1

################################################
# Entrar en un escenario de la isla

@enterIslandLocation

	gosub @wipePanel:\
	gosub @drawIslandScenery:\
	gosub @spanishCharset

	if c(iPos)=snake then \
		gosub @manInjured:\
		print at 19,n1; paper n0;"Una serpiente ha mordido a ";fn n$(injured);".":\
		goto @enterIslandLocation00

	if c(iPos)=nativeFights then \
		gosub @manInjured:\
		print at 19,n1; paper n0;"Un nativo intenta bloquear el paso y hiere a ";fn n$(injured);".":\
		goto @enterIslandLocation00

	if c(iPos)=dubloonsFound then \
		let dub=int (rnd*n2)+n1:\
		print at 19,n1; paper n0;"Encuentras ";fn l$(dub);" ";fn d$(dub);".":\
		let cash=cash+dub:\
		gosub @drawDubloons:\
		let c(iPos)=n4:\
		goto @enterIslandLocation00

	if c(iPos)=nativeAmmo then \
		print at 19,n1; paper n0;"Un nativo te da algo de munici";o$;"n":\
		let ammo=ammo+n1:\
		let c(iPos)=nativeFights:\
		goto @enterIslandLocation00

	if c(iPos)=nativeSupplies then \
		print at 19,n1; paper n0;"Un nativo te da provisiones.":\
		let supplies=supplies+n1:\
		let c(iPos)=nativeFights:\
		goto @enterIslandLocation00

	if c(iPos)=nativeVillage then \
		print at 19,n1; paper n0;"Descubres un poblado nativo."

	# falta crear constantes para estos casos!!!
	if c(iPos)=n4 or c(iPos)=n6 then \
		gosub @islandEvents

@enterIslandLocation00

	gosub @graphicCharset1
	for z=n1 to val "300":\
		if len inkey$ then goto @enterIslandLocation01
	next z

@enterIslandLocation01

	gosub @checkTheEnd:\
	gosub @islandPanel:goto @islandCommand

################################################
# Subrutina
# Eventos especiales en la isla

@islandEvents

	let event=int (rnd*11)+n1


	if event=n1 then \
		print at 19,n1; paper n0;"  Uno de la tripulaci";o$;"n se hunde ";at 20,n10;"en arenas movedizas.":\
		gosub @chooseDeadOne:\
		return

	if event=n2 then \
		print at 19,n1; paper n0;"  Uno de la tripulaci";o$;"n se hunde ";at 20,n10;"en un pantano.":\
		gosub @chooseDeadOne:\
		return

	if event=n3 then \
		gosub @manInjured:\
		print at 19,n1; paper n0;"A ";fn n$(injured);" le muerde";at 20,n7;"una ara";n$;"a.":\
		return

	if event=n4 then \
		gosub @manInjured:\
		print at 19,n1; paper n0;"A ";fn n$(injured);" le pica";at 20,n7;"un escorpi";o$;"n.":\
		return

	if event=n5 then \
		print at 19,n1; paper n0;"La tripulaci";o$;"n est";a$;" hambrienta.":\
		let morale=morale-n1:\
		return

	if event=n6 then \
		print at 19,n1; paper n0;"La tripulaci";o$;"n est";a$;" sedienta.":\
		let morale=morale-n1:\
		return

	if event=n7 then \
		let dub=int (rnd*n4)+n2:print at 19,n1; paper n0;"Encuentras ";fn l$(dub);" ";fn d$(dub);".":\
		let cash=cash+dub:\
		gosub @drawDubloons:\
		return

	if event=n8 then \
		print at 19,n1; paper n0;"Sin novedad, ";c$;".":\
		return

	if event=n9 or event=n10 then \
		print at 19,n2; paper n0;"La costa est";a$;" despejada, ";c$;".":\
		return

	if event=val "11" then \
		print at 19,n1; paper n0;"Sin novedad, ";c$;"."

	return

################################################
# Subrutina 
# Dibujar escenario de la isla

@drawIslandScenery

	load!"zp6i6b0l13"code fn a(n3)
	gosub @sunnySky
	if c(iPos-n6)=coast then gosub @drawBottomWaves
	if c(iPos+n6)=coast then gosub @drawHorizontWaves
	if c(iPos-n1)=coast then gosub @drawLeftWaves
	if c(iPos+n1)=coast then gosub @drawRightWaves
	if c(iPos)=nativeVillage then gosub @drawVillage
	if c(iPos)=dubloonsFound then \
		let p=n8:let q=n4:gosub @palm2At:\
		let p=n5:let q=14:gosub @palm2At
	if c(iPos)=nativeFights then \
		let p=n5:let q=14:gosub @palm2At:\
		let p=n8:let q=25:gosub @palm2At:\
		gosub @drawNative
	if c(iPos)=n4 then \
		let p=n8:let q=25:gosub @palm2At:\
		let p=n8:let q=n4:gosub @palm2At:\
		let p=n5:let q=16:gosub @palm2At
	if c(iPos)=snake then \
		let p=n5:let q=13:gosub @palm2At:\
		let p=n6:let q=n5:gosub @palm2At:\
		let p=n8:let q=18:gosub @palm2At:\
		let p=n8:let q=23:gosub @palm2At:\
		gosub @drawSnake
	if c(iPos)=n6 then \
		let p=n8:let q=23:gosub @palm2At:\
		let p=n5:let q=17:gosub @palm2At:\
		let p=n8:let q=n4:gosub @palm2At
	if c(iPos)=nativeSupplies then \
		gosub @drawSupplies:\
		gosub @drawNative:\
		let p=n4:let q=16:gosub @palm2At
	if c(iPos)=nativeAmmo then \
		gosub @drawAmmo:gosub @drawNative:\
		let p=n5:let q=20:\
		gosub @palm2At
	return

################################################
# Subrutina
# Dibujar olas en el horizonte

@drawHorizontWaves

	print at n3,n0; ink n7; paper n1;"  kl  mn     nm    klk   nm nm n":\
	return

################################################
# Subrutina
# Dibujar olas en primer plano

@drawBottomWaves

	print at 14,n0; paper n1; ink n7;"  kl     mn  mn    kl    kl kl  m     mn      klmn   mn m  mn   ":\
	return

################################################
# Subrutina
# Dibujar olas a la izquierda

@drawLeftWaves

	for z=n3 to 15:\
		print at z,n0; ink n7; paper n1;"  ":\
	next z
	print at n6,n0; ink n7; paper n1;"mn";at n10,n0;"kl";at 13,n0;"k";at n4,n0;"m";at n8,n1;"l"
	if c(iPos+n6)<>n1 then \
		gosub @graphicCharset2:\
		print at n3,n2; ink n6; paper n1;"A":\
		gosub @graphicCharset1
	if c(iPos+n6)=n1 then \
		gosub @graphicCharset2:\
		print at n4,n2; ink n6; paper n1;"A":\
		gosub @graphicCharset1
	if c(iPos-n6)=n1 then \
		gosub @graphicCharset2:\
		print at 13,n2; ink n6; paper n1;"C":\
		gosub @graphicCharset1
	return

################################################
# Subrutina
# Dibujar olas a la derecha

@drawRightWaves

	for z=n3 to val "15":\
		print at z,30; ink n7; paper n1;"  ":\
	next z
	print at n6,30; ink n7; paper n1;"mn";at n10,30;"kl";at 13,31;"k";at n4,30;"m";at n8,31;"l"
	if c(iPos+n6)=n1 then \
			gosub @graphicCharset2:\
			print at n4,29; ink n6; paper n1;"B":\
			gosub @graphicCharset1
	if c(iPos-n6)=n1 then \
			gosub @graphicCharset2:\
			print at 13,29; ink n6; paper n1;"D":\
			gosub @graphicCharset1
	if c(iPos+n6)<>n1 then \
			gosub @graphicCharset2:\
			print at n3,29; ink n6; paper n1;"B":\
			gosub @graphicCharset1
	return

################################################
# Subrutina
# Dibujar poblado

@drawVillage

	gosub @graphicCharset2
	print at 11,n4; ink n4; paper n6;"S\::T    S\::T ST  S\::T S\::T"
	print at 12,n4; ink n4; paper n6;"VUW  4 VUW 78  VUW VUW"
	print at n8,n4; ink n4; paper n6;"S\::T   S\::T    S\::T S\::T  S\::T "
	print at n9,n4; ink n4; paper n6;"VUW   VUW  4 VUW VUW  VUW"
	print at n5,n6; ink n4; paper n6;" S\::T    ST   S\::T";at n6,n6;" VUW    78   VUW   4"
	print at 12,n7; ink n0; paper n6;"X";at 12,17;"Y";at 12,22;"Z";at 12,26;"XY"
	print at n9,n8; ink n0; paper n6;"ZZ";at n9,13;"Y";at n9,24;"ZX";at n6,n10;"XYZ";at n6,17;"YX";at n6,26;"Z"
	gosub @graphicCharset1
	return

################################################
# Subrutina
# Dibujar una palmera en las coordenadas p,q

@palm2At 

	print ink n4; paper n6;\
	at p,q;"OPQR";\
	at p+n1,q;"S TU";\
	at p+n1,q+n1; ink n0;"N";\
	at p+n2,q+n1;"M";\
	at p+n3,q+n1;"L";\
	at p+n4,q+n1;"V":\
	return

################################################
# Subrutina
# Dibujar nativo

@drawNative

	print ink n0;paper n6;\
	at n10,n8; " _ \`";\
	at 11,n8;"}~.,";\
	at 12,n8;"{|\\?":\
	return

################################################
# Subrutina
# Dibujar municiones

@drawAmmo

	print ink n0;paper n6;\
	at 12,14; "hi":\
	return

################################################
# Subrutina
# Dibujar provisiones

@drawSupplies

	gosub @graphicCharset2:\
	print at 12,14; ink n0; paper n6;"90  9099 0009":\
	gosub @graphicCharset1:\
	return

################################################
# Subrutina
# Dibujar serpiente

@drawSnake

	gosub @graphicCharset2:\
	print ink n0;paper n6;\
	at 12,14; "xy":\
	gosub @graphicCharset1:\
	return

################################################
# Subrutina
# Dibujar doblones
# Entrada: dub=número de doblones

@drawDubloons

	gosub @graphicCharset2:\
	print ink n0;paper n6;\
	at 12,12; "vw vw vw vw vw vw vw vw"(to dub*3):
	\gosub @graphicCharset1:\
	return

################################################
# Combate naval

@shipBattle

	paper n1:cls:gosub @spanishCharset: 
	print at 21,n10; ink n7; paper n2;" Munici";o$;"n = ";ammo
	for z=n0 to val "21": print at z,n0; ink n0; paper n6;"________ ": next z
	print at n2,n0; ink n0; paper n7;"1";at n9,n0;"2";at 16,n0;"3"
	gosub @graphicCharset1
	for z=n3 to val "17" STEP n7
	print at z,n6; ink n2; paper n6;"cde";at z+n1,n6;"fg";at z+n1,n1;"hi"
	gosub @graphicCharset2: print at z-n1,n4; ink n0; paper n6;"1";at z,n4;"2";at z+n1,n4;"3": gosub @graphicCharset1
	next z
	let m=n6: let n=val "20"
	for z=n1 to val "30": gosub @drawWave: next z

@fireCommand

	gosub @moveShip
	if inkey$="1" then let o=n3: gosub @fire
	if inkey$="2" then let o=n10: gosub @fire
	if inkey$="3" then let o=val "17": gosub @fire
	goto @fireCommand

@fire

	print at o-n1,n9; ink n6; paper n1;"+";at o+n1,n9;"-"
	gosub @moveShip: print at o-n1,n9; ink n6; paper n1;" ";at o+n1,n9;" "
	print at o,n9; ink n6; paper n1;" j": gosub @moveShip
	for z=n9 to val "30"
	print at o,z; ink n6; paper n1;" j"
		if m=o and z=n or m=o-n1 and z=n or m=o-n2 and z=n then goto @sunk
		if m=o and z=n+n1 or m=o-n1 and z=n+n1 or m=o-n2 and z=n+n1 then goto @sunk
	next z
	print at o,30; paper n1;"  "
	let ammo=ammo-n1
	gosub @spanishCharset: print at 21,22; ink n7; paper n2;ammo: gosub @graphicCharset1
	if ammo<=n0 then goto @theEnd
	return

@drawWave

	print ink n5;\
	at int (rnd*20)+n1,int (rnd*20)+11;"kl":\
	return

@moveShip

	let ship=int (rnd*n4)+n1
	let n=n+(ship=n1 and n<28)-(ship=n2 and n>18)
	let m=m+(ship=n3 and m<17)-(ship=n4 and m>n1)
	print at m,n; ink n7; paper n1;" ab ";at m+n1,n;" 90 ";at m+n2,n-n1;" 678 ";at m-n1,n;"   ";at m+n3,n;"   "
	if ship=n5 then gosub @drawWave
	return

################################################
# Subrutina
# Barco hundido

@sunk

	print at m,n; ink n7; paper n1;"   ";at m+n1,n;" ab";at m+n2,n;" 90"
	print at m,n; ink n7; paper n1;"   ";at m+n1,n;"   ";at m+n2,n;" ab"
	print at m,n; ink n7; paper n1;"   ";at m+n1,n;"   ";at m+n2,n;"   "
	gosub @pause100
	if a(sPos)>=13 and a(sPos)<=16 then let sunk=sunk+n1: let score=score+val "1e3"
	if a(sPos)=13 then let a(sPos)=n10
	if a(sPos)=14 then let a(sPos)=n9
	if a(sPos)=15 then let a(sPos)=n8
	if a(sPos)=16 then let a(sPos)=n7
	let ammo=ammo-n1
	cls:goto @aboard

################################################
# Atacar barco

@attackShip

# ¿No se puede hacer eso?:
	if a(sPos)<13 or a(sPos)=21 or a(sPos)=treasureIsland then goto @impossibleAttack
# ¿No queda munición?:
	if ammo<=n0 then goto @noAmmoLeft
# ¿Combate naval?:
	if a(sPos)>=13 and a(sPos)<=16 then goto @shipBattle

################################################
# Atacar un bote propio

	gosub @wipePanel

	gosub @spanishCharset
	print at 19,n3; ink n5; paper n0;"Disparar por error a uno de tus propios";at 20,n8;"botes..."
# Pausa:
	gosub @pause400

	if not int(rnd*2) then print at 20,n3;"Por suerte el disparo no ha dado en el blanco.":goto @L6694

	print at 20,n3;"La bala alcanza su objetivo. Esto desmoraliza a la tripulaci";o$;"n."
	let morale=morale-n2

# Herir a un número aleatorio de hombres:
	for z=n1 to int(rnd*n2)+n2:\
		gosub @manInjured:\
	next z

@L6694 

	gosub @pause400
	gosub @shipPanel:goto @shipCommand

################################################
# Subrutina
# Herir a un marinero

@manInjured

	let injured=int (rnd*men)+n1:\
	if not s(injured) then goto @manInjured
	let s(injured)=s(injured)-n1:\
	goto @checkAlive

################################################
# No queda munición

@noAmmoLeft

	gosub @wipePanel
	gosub @spanishCharset:\
	print at 17,13; ink n0; paper n4;"Informe":\
	print at 19,n2; ink n5; paper n0;"No te queda munici";o$;"n."
	gosub @pause300:\
	goto @theEnd

################################################
# Matar

@attack

	if c(iPos)=n2 or c(iPos)=n4 or c(iPos)=n6 then \
		gosub @impossible:\
		gosub @islandPanel:\
		return

	gosub @wipePanel: gosub @spanishCharset
	print at 17,n1; ink n0; paper n4;"Atacas y matas"

	if c(iPos)=n5 then print at 19,n1; paper n0;"pero la serpiente mata a un hombre.": gosub @chooseDeadOne: goto @L6897
	if c(iPos)=n9 then print at 19,n1; paper n0;"pero un poblado entero es un";at 20,n1;"enemigo muy dif";i$;"cil. Tienes una baja.": gosub @chooseDeadOne: goto @L6898
	let kill=int (rnd*n5)+n1
	#let z=int (rnd*n2)+n2
	if kill>=n3 then \
		let dub=int(rnd*n2)+n2:print at 19,n1; paper n0;"Encuentras ";fn l$(dub);" ";fn d$(dub);" en el";at 20,n1;"cuerpo del nativo muerto.": let cash=cash+dub: goto @L6895
	if kill=n1 then \
		print at 19,n1; paper n0;"El nativo muere, pero";at 20,n1;"antes mata a uno de la tripulaci";o$;"n.": gosub @chooseDeadOne: goto @L6895
	if kill=n2 then \
		print at 19,n1; paper n0;"  El nativo tiene provisiones";at 20,n1;"escondidas en su taparrabos.": let supplies=supplies+n1

@L6895

	gosub @graphicCharset2: for z=n10 to val "13": print at z,n8; paper n6; ink n0;"t   ": next z
	print at n9,n8; paper n6; ink n0;"u": print at n10,n9; paper n0; ink n7;"nop";at 11,n9;"qrs": gosub @graphicCharset1

@L6897

	let c(iPos)=n4

@L6898

	gosub @pause160
	gosub @islandPanel: gosub @checkTheEnd
	return

################################################
# Tormenta

@storm

	gosub @wipePanel
	gosub @stormySky
	#gosub @spanishCharset: print ink n0; paper n1;bright n1;fn c$(panelTop,"TORMENTA")
	let damage=damage+int (rnd*40)+11:\
	if damage>100 then let damage=100
	print at 19,n1; paper n0;"Una tormenta causa destrozos en el barco.";at 20,n1;"El da";n$;"o total es del ";damage;" por ciento."
	gosub @graphicCharset1

# Efecto visual de lluvia:

	for z=n1 to val "70"
		print  ink n7; paper n5;\
		at n2,cloud0X;";;;;";\
		at n2,cloud1X;";;;":\
		pause n3
		print ink n7; paper n5;\
		at n2,cloud0X; "]]]]";\
		at n2,cloud1X;"]]]":\
		pause n3
		print ink n7; paper n5;\
		at n2,cloud0X; "[[[[";\
		at n2,cloud1X;"[[[":\
		pause n3
	next z
	print ink n7; paper n5;\
	at n2,cloud0X;"    ";\
	at n2,cloud1X;"   "

	gosub @checkTheEnd:\
	gosub @shipPanel:\
	return

################################################
# Dibujar el escenario

# Pendiente!!! Convertir en subrutina

@scenery

# Comprobar final del juego (esto no debe ir aquí!!!):
	gosub @checkTheEnd
# Dibujar paisaje de mar y el barco:
	gosub @seaAndShip

# Dibujar los detalles de cada escenario:
	if a(sPos)=n2 then \
		gosub @drawBigIsland5:\
		gosub @palm1At0419:\
		goto drawReefs
	if a(sPos)=n3 then \
		gosub @drawBigIsland4:\
		gosub @palm1At0414:\
		gosub @palm1At0419:\
		gosub @palm1At0424:\
		gosub @drawShark:\
		goto drawReefs
	if a(sPos)=n4 then \
		gosub @drawLittleIsland2:\
		gosub @palm1At0414:\
		goto drawReefs
	if a(sPos)=n5 then \
		gosub @drawLittleIsland1:\
		gosub @palm1At0424:\
		goto drawReefs
	if a(sPos)=n6 then \
		gosub @drawLittleIsland1:\
		gosub @palm1At0424:\
		goto drawReefs
	if a(sPos)=n6 then \
		gosub @drawLittleIsland2:\
		gosub @palm1At0414:\
		goto drawReefs
	if a(sPos)=n7 then \
		gosub @drawBigIsland3:\
		gosub @palm1At0419:\
		goto drawReefs
	if a(sPos)=n8 then \
		gosub @drawBigIsland2:\
		gosub @palm1At0414:\
		gosub @drawShark:\
		goto drawReefs
	if a(sPos)=n9 then \
		gosub @drawBigIsland1:\
		gosub @palm1At0424:\
		goto drawReefs
	if a(sPos)=n10 then \
		gosub @palm1At0424:\
		gosub @drawTwoLittleIslands:\
		goto drawReefs
	if a(sPos)=11 then \
		gosub @drawShark:\
		goto drawReefs
	if a(sPos)=13 then \
		gosub @palm1At0424:\
		gosub @drawTwoLittleIslands:\
		gosub @drawEnemyShip:\
		goto drawReefs
	if a(sPos)=14 then \
		gosub @drawBigIsland1:\
		gosub @palm1At0424:\
		gosub @drawEnemyShip:\
		goto drawReefs
	if a(sPos)=15 then \
		gosub @drawBigIsland2:\
		gosub @palm1At0414:\
		gosub @drawEnemyShip:\
		goto drawReefs
	if a(sPos)=16 then \
		gosub @drawBigIsland3:\
		gosub @palm1At0419:\
		gosub @drawEnemyShip:\
		goto drawReefs
	if a(sPos)=17 then \
		gosub @drawLittleIsland2:\
		gosub @palm1At0414:\
		gosub @drawBoat:\
		gosub @drawLittleIsland1:\
		gosub @palm1At0424:\
		goto drawReefs
	if a(sPos)=18 then \
		gosub @drawLittleIsland1:\
		gosub @palm1At0424:\
		gosub @drawBoat:\
		goto drawReefs
	if a(sPos)=19 then \
		gosub @drawBigIsland4:\
		gosub @palm1At0414:\
		gosub @palm1At0419:\
		gosub @palm1At0424:\
		gosub @drawBoat:\
		gosub @drawShark:\
		goto drawReefs
	if a(sPos)=20 then \
		gosub @drawBigIsland5:\
		gosub @palm1At0419:\
		gosub @drawBoat:\
		goto drawReefs
	if a(sPos)=21 then \
		gosub @drawShark

# Dibujar los posibles arrecifes:
@drawReefs
	if a(sPos+15)=n1 then \
		gosub @drawFarIslands
	if a(sPos-15)=n1 then \
		gosub @bottomReef
	if a(sPos-n1)=n1 then \
		gosub @leftReef
	if a(sPos+n1)=n1 then \
		gosub @rightReef

	if a(sPos)=treasureIsland then \
		gosub @drawTreasureIsland

# Panel de comandos a bordo:
	gosub @shipPanel
	goto @shipCommand

################################################
# Subrutina
# Dibujar una palmera en las coordenadas 4,19

@palm1At0419

	let gy=n4:let gx=19

################################################
# Subrutina
# Dibujar una palmera en las coordenadas gy,gx

@palm1At

	print at gy,gx; ink n4; paper n1;"OPQR";at gy+n1,gx;"S TU";at gy+n1,gx+n1; ink n6; "N";at gy+n2,gx+n1;"M";at gy+n3,gx+n1;"L":\
	return

################################################
# Subrutina
# Dibujar una isla grande

@drawBigIsland5

	print at n7,18; ink n4; paper n1;"HI A";at n8,17;"G\::\::\::\::BC";at n9,16;"F\::\::\::\::\::\::\::D";at n10,14;"JK\::\::\::\::\::\::\::\::E";at 11,13;"F\::\::\::\::\::\::\::\::\::\::\::C"
	return

################################################
# Subrutina 
# Dibujar una palmera en las coordenadas 4,24:

@palm1At0424

	let gy=n4:let gx=val"24":goto @palm1At

################################################
# Subrutina
# Dibujar una palmera en las coordenadas 4,14

@palm1At0414

	let gy=n4:let gx=val"14":goto @palm1At

################################################
# Subrutina 
# Dibujar una isla grande:

@drawBigIsland4

	print at n7,16; ink n4; paper n1;"WXYA";at n8,14;":\::\::\::\::\::\::C F\::\::D";at n9,13;":\::\::\::\::\::\::\::\::B\::\::\::E";at n10,12;"F\::\::\::\::\::\::\::\::\::\::\::\::\::\::C":\
	return

################################################
# Subrutina 
# Dibujar una isla pequeña:

@drawLittleIsland2

	print at n8,14; ink n4; paper n1;":\::\::C";at n7,16;"A";at n9,13;":\::\::\::\::D";at n10,12;"F\::\::\::\::\::E":\
	return

################################################
# Subrutina 
# Dibujar una isla pequeña:

@drawLittleIsland1

	print at n8,23; ink n4; paper n1;"JK\::C";at n9,22;":\::\::\::\::D";at n10,21;"F\::\::\::\::\::E":\
	return

################################################
# Subrutina 
# Dibujar una isla grande:

@drawBigIsland3

	print at n7,21; ink n4; paper n1;"Z123";at n8,19;":\::\::\::\::\::C";at n9,18;":\::\::\::\::\::\::\::D";at n10,15;"F\::B\::\::\::\::\::\::\::\::E";at 11,13;"JK\::\::\::\::\::\::\::\::\::\::\::\::C":\
	return

################################################
# Subrutina
# Dibujar una isla grande

@drawBigIsland2

	print at n7,17; ink n4; paper n1;"Z123";at n8,14;"F\::B\::\::\::\::\::C";at n9,13;"G\::\::\::\::\::\::\::\::\::D";at n10,12;"F\::\::\::\::\::\::\::\::\::\::E":\
	return

################################################
# Subrutina
# Dibujar una isla grande

@drawBigIsland1

	print at n7,20; ink n4; paper n1;"HI A";at n8,19;"G\::\::B\::\::\::C";at n9,18;"F\::\::\::\::\::\::\::\::D";at n10,16;"JK\::\::\::\::\::\::\::\::\::E":\
	return

################################################
# Subrutina
# Dibujar dos islas pequeñas

@drawTwoLittleIslands

	print at n6,17; ink n4; paper n1;"WXY  A";at n7,16;"A   A   F\::C";at n8,15;":\::\* :\::\* G\::\::\::D";at n9,14;"G\::\::\::D   F\::\::\::\::E";at n10,13;"F\::\::\::\::E":\
	return

################################################
# Subrutina
# Dibujar arrecifes en primer plano

@bottomReef

	print at 14,n2; ink n0; paper n1;" A  HI   HI       HI  HI  A";at 15,n0;"WXY  :\::\::\*     Z123     :\::\::\*":\
	return

################################################
# Subrutina
# Dibujar horizonte de islas

@drawFarIslands

	print at n2,n0; ink n4; paper n5;"Z123 HI A Z123 HI A Z123 HI Z123":\
	return

################################################
# Subrutina
# Dibujar arrecifes a la izquierda

@leftReef

	print at 13,n0; ink n0; paper n1;"HI";at 11,n1;"A";at n4,n0;"A";at n8,n0;"WXY";at n6,n1;"HI":\
	return

################################################
# Subrutina
# Dibujar arrecifes a la derecha

@rightReef

	print at n4,30; ink n0; paper n1;"HI";at n6,28;"A";at n7,29;"WXY";at n9,31;"A":\
	return

################################################
# Subrutina
# Dibujar barco enemigo

@drawEnemyShip

	print ink n6; paper n1;\
	at n4,11;" ab";\
	at n5,11;" 90";\
	at n6,11;"678":\
	return

################################################
# Subrutina
# Dibujar el bote de desembarco

@drawBoat

	print at n7,11; ink n6; paper n1;"\#201":\
	return

################################################
# Subrutina
# Dibujar aleta de tiburón

@drawShark

	print at 13,18; ink n7; paper n1;"\s":return

################################################
# Subrutina
# Dibujar la isla del tesoro

@drawTreasureIsland 

	gosub @graphicCharset1: print at n7,16; ink n4; paper n1;"A A   HI";at n8,13;"F\::\::\::B\::\::\::B\::\::B\::\::\::C";at n9,12;"G\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::D";at n10,n10;"JK\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::E"
	print at 11,n9; ink n4; paper n1;":\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::C";at 12,n8;"F\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::D"
	print at 13,n8; ink n1; paper n4;" HI Z123  HI A  A A  A ";at 14,20;"B\::\::\::\::B"
	print at 13,31; ink n4; paper n1;"E"
	gosub @palm1At0419: gosub @palm1At0424: gosub @palm1At0414

# Cofre del tesoro:
	gosub @udg2:print at n9,22; ink n0; paper n4;"\A\B":gosub @udg1
# Quitar este rótulo!!! Anunciarlo en el panel:
	gosub @spanishCharset: print at 11,13; ink n7; paper n2;t$
	gosub @graphicCharset1

	return

################################################
# Subrutina
# Informe

@report 

	gosub @saveScreen:gosub @wipePanel:gosub @spanishCharset
	print ink n7; paper n0;at 4,n1'"Hombres:",alive'"D";i$;"as:",day'"Hundimientos:",sunk'"Da";n$;"os %:",damage'"Moral:",morale'"Provisiones:",supplies'"Doblones:",cash'"Munici";o$;"n:",ammo
	for z=n1 to val "600"
		if len inkey$ then goto @reportEnd
	next z

@reportEnd

# Restaurar pantalla y regresar:
	goto @restoreScreen

################################################
# Subrutina
# Panel de comandos

# Nota!!! Esta rutina sustituye a las dos originales.

@shipPanel
@islandPanel
@panel

	gosub @spanishCharset
	print ink n7;\
	print at 17,16;fn o$("Informe",1,1)
	print at 18,16;fn o$("Tripulaci"+o$+"n",1,1)

	let possibleDisembarking=b(sPos)=n1 or a(sPos)=treasureIsland
	print at 19,16;fn o$("Desembarcar",1,possibleDisembarking)
	let possibleEmbarking=not possibleDisembarking
	print at 19,16;fn o$("emBarcar",3,possibleEmbarking)

	let possibleAttacking=1
	print at 20,16;fn o$("Atacar",1,possibleAttacking)
	let possibleTrading=c(iPos)=n9
	print at 21,16;fn o$("Comerciar",1,possibleTrading)
	#goto @directionsMenu

################################################
# Subrutina
# Panel de comandos a bordo

# Obsoleto!!!

#@shipPanel

	#gosub @spanishCharset
	#print ink n7;\
	#at 17,16;fn v$("I")+"nforme";\
	#at 19,16;fn v$("T")+"ripulaci"+o$+"n";\
	#at 18,16;fn v$("D")+"esembarcar";\
	#at 20,16;fn v$("A")+"tacar barco"

################################################
# Subrutina
# Menú de direcciones

#@directionsMenu

	print paper n7; ink n0;\
	at panelTop,29; "N";\
	at panelBottom,29;"S";\
	at panelTop+n1,28;"O E":\
	plot 233,27: draw ink n0;n6,n0:\
	plot 236,24: draw ink n0;n0,n7:\
	return

################################################
# Selección de comando

# Nota!!! Este módulo sustituirá a los dos existentes.
# Pendiente!!!

@command

################################################
# Subrutina
# Informe de tripulación

@crewReport

	gosub @saveScreen:\
	gosub @wipePanel:\
	gosub @spanishCharset

	print ink n7;paper n2;\
	at n1,n10;"Tripulaci";o$;"n";\
	at n4,n1;"Nombre";\
	at n4,18;"Condici";o$;"n"

	for z=n1 to men:\
		print ink n5;\
		at z+n5,n1;fn n$(z);\
		at z+n5,18;fn u$(s$(s(z)+n1)):\
	next z

	gosub @graphicCharset1

	for z=n1 to val"700"
		if len inkey$ then goto @crewReportEnd
	next z

@crewReportEnd

# Restaurar pantalla y regresar:
	goto @restoreScreen

################################################
# Encallar

@runAground

	gosub @graphicCharset1:\
	gosub @wipeSea:\
	gosub @drawFarIslands:\
	gosub @bottomReef:\
	gosub @leftReef:\
	gosub @rightReef

	print at n8,14; ink n7;"\a\b\c";at n9,14;"\d\e\f";at n10,14;"\g\h\i"
	print at n10,17; ink n0; paper n1;"WXY     A";at n6,19;"A   Z123";at 11,n6;"A   HI";at n4,n5;"Z123    HI";at n8,n7;"H\..I  A"
	gosub @wipePanel
	let damage=damage+int(rnd*20)+10:\
	if damage>100 then let damage=100
	gosub @spanishCharset:\
	print at 19,n5; ink n5; paper n0;x$;"Has encallado!";at 20,n8;damage;"% de da";n$;"os."
	if damage=100 then print at 20,n7; ink n5; paper n0;"TOTAL"
	print ink n0; paper n4;fn c$(17,"INFORME")
	gosub @manInjured
	gosub @chooseDeadOne
	let morale=morale-int (rnd*n4)+n1
	gosub @pause300
	if damage=100 then goto @theEnd
	gosub @shipPanel
	goto @scenery

################################################
# Subrutina
# Borrar panel de comandos

@wipePanel

	load!"zp0i0b0l06"code fn a(panelTop-n1):return

################################################
# Subrutina
# Dibujar el barco con la proa elevada

@drawShipUp

	print paper n1;ink n7;\
	at shipY,shipX;"\a\b\c";\
	at shipY+n1,shipX;"\d\e\f";\
	at shipY+n2,shipX;"\g\h\i":\
	return

################################################
# Subrutina
# Dibujar el barco con la popa elevada

@drawShipDown

	print paper n1;ink n7;\
	at shipY,shipX;"\j\k\l";\
	at shipY+n1,shipX;"\m\n\o";\
	at shipY+n2,shipX;"\p\q\r":\
	return

################################################
# Subrutina
# Dibujar cielo de tormenta, las nubes y el sol

@stormySky

	load!"zp5i5b0l03"code fn a(n0):\
	let noStorm=n0:\
	goto @finishTheSky

################################################
# Subrutina
# Dibujar mar y cielo

@seaAndSky

	gosub @wipeSea

# Dibujar olas:
	gosub @graphicCharset1:\
	paper n1:ink n5
	for z=n1 to val"15":\
		print\
		at int (rnd*12)+n4,int (rnd*28)+n1;"kl";\
		at int (rnd*12)+n4,int (rnd*28)+n1;"mn":\
	next z

################################################
# Subrutina
# Dibujar cielo despejado, las nubes y el sol

@sunnySky

	load!"zp5i5b1l03"code fn a(n0):let noStorm=n1

################################################
# Final de dos subrutinas (@sunnySky y @stormySky)
# Dibujar el cielo, las nubes y el sol:

@finishTheSky

	gosub @graphicCharset2:\
	print paper n5;bright noStorm;\
	at n0,26; ink n6; "AB";\
	at n1,26;"CD"
	let cloud0X=int (rnd*n9)+n1:\
	let cloud1X=int (rnd*n9)+val"13"
	print ink n7; paper n5;bright noStorm;\
	at n0,cloud0X;"EFGH";\
	at n1,cloud0X;"IJKL";\
	at n0,cloud1X;"MNO";\
	at n1,cloud1X;"PQR"
	gosub @graphicCharset1:\
	return

################################################
# Subrutina
# Borrar mar

@wipeSea

	load!"zp1i1b0l13"code fn a(n3):return

################################################
# Subrutina
# Dibujar compás sobre el mar

# Anulada!!!
	#gosub @spanishCharset
	#print at 11,29; ink n7;" N ";at 15,29;" S ";at 12,29;"   ";at 13,29;"O E";at 14,29;"   "
	#plot 243,78
	#draw n0,-20
	#plot 241,68
	#draw n4,n0
	#return

################################################
# Subrutina
# Preparación del juego

@init

	load!"zp0i0b0l20"code fn a(n2)
	print ink n7; paper n0; flash n1;\
	fn c$(val "10","Espera a que prepare el barco...")
	randomize

	# El mapa consta de 135 casillas (9 filas de 15 columnas)
	let locations=val"135":\
	dim a(locations)

	let reef=n1
# Rodear el mapa con arrecifes:
# norte:
	for z=n1 to 16: let a(z)=reef: next z
# sur:
	for z=120 to locations: let a(z)=reef: next z
# este:
	for z=30 to 105 step 15: let a(z)=reef: next z
# oeste:
	for z=31 to 106 step 15: let a(z)=reef: next z

# Poner un tipo de isla al azar en cada casilla
# (códigos de 2 a 21):
	for z=17 to 119:\
		if a(z)<>reef then let a(z)=int (rnd*20)+n2
	next z

# La isla del tesoro es el tipo de isla 22:
	let treasureIsland=val"22"
# Elegir el lugar de la isla del tesoro:
	let a(int(rnd*11)+94)=treasureIsland

# Elegir la posición del barco en el mapa:
	let sPos=int (rnd*11)+32

# Nota!!! Aún no está clara la función de la matriz B().
# Parece que guarda un marcador para ciertos tipos de islas.
	dim b(locations)
	for z=17 to 119:\
		if a(z)<>reef and a(z)<>11 and a(z)<>12 and a(z)<>21 then let b(z)=n1
	next 

# Coordenadas del gráfico del barco:
	let shipY=n9:let shipX=n4
# Líneas superior e inferior del panel:
	let panelTop=val"17":let panelBottom=val"21"

# Nombres de los miembros de la tripulación:
	restore @menNamesData:\
	let lenght=n0
	for z=n1 to men:\
		read z$:if len z$>lenght then let lenght=len z$
	next z
	dim d$(men,lenght)

# Pendiente!!! Hacer que los diez tripulantes sean elegidos
# al azar de entre muchos más nombres, y cada vez en
# diferente orden.
# Inacabado!!!

	for z=n1 to men
@retryMan
		restore #menNamesData
		read z$:if not len z$ then goto @retryMan
		let d$(z)=chr$(len z$+1)+z$
	next z

# Inacabado!!!
@menNamesData

	data "Jacobo Gorri"+o$+"n"
	data "Guille 'El Chico'"
	data "Quique Morgano"
	data "Edu 'El Ingl"+e$+"s'"
	data "Juan Plata 'El largo'"
	data "Bartolom"+e$+" Robertos"

	data "Julen Terrador"
	data "Jer"+o$+"nimo el Tuerto"
	data "Ricardo Borriquero"
	data "Benito Pistola"
	data "Barbanegra"
	data "Pedro Pistolas"
	data "Felipe Llejo"
	data "Vicente Rador"
	data "Caracortada"
	data "Pedro Medario"
	data ""

# Grados de estado físico de los miembros de la tripulación:

	dim s$(n5,13)
	restore @menStatusData
	for z=n1 to n5: read s$(z): next z

@menStatusData

	data "muerto","herido grave","herido leve","magullado","en forma"

# Indicadores de estado físico de la tripulación (0-4):
	dim s(men)
	for z=n1 to men: let s(z)=n4: next z

# Constantes de códigos usados en el mapa de las islas:
	# Faltan códigos!!!
	let coast=n1
	let dubloonsFound=n2
	let nativeFights=n3
	let snake=n5
	let nativeSupplies=n7
	let nativeAmmo=n8
	let nativeVillage=n9

# Pistas:
	let path=int (rnd*n4)+n1
	let tree=int (rnd*n4)+n1
	let village=int (rnd*n10)+n1
	let ect=int (rnd*n2)+n1
	let dir=int (rnd*n4)+n1
	let pace=int (rnd*n9)+n1

# Nombres de los poblados:
	restore @villageNamesData
	dim f$(n10,n9)
	for z=n1 to n10:\
		read f$(z):\
	next z

# Los nombres de poblados
# son palabras compuestas en esperanto,
# de significado gracioso:
# Incompleto!!!

@villageNamesData

	data "Mislongo","Ombreto","Figokesto","Miseduka","Topikega","Fibaloto","!!!Manplata","!!!Figarbaro","Ursorelo","Kukumo"

# Puntos cardinales para las pistas:
	dim g$(n4,n5)
	let g$(n1)="norte": let g$(n2)="sur": let g$(n3)="este": let g$(n4)="oeste"

# Izquierda y derecha para las pistas:
	dim h$(n2,n9)
	let h$(n1)="izquierda": let h$(n2)="derecha"

# Variables de la trama:
	let men=n10:\
	let sunk=n0:\
	let cash=n5:\
	let morale=n10:\
	let alive=men:\
	let ammo=n2:\
	let supplies=n10:\
	let damage=n0:\
	let score=n0:\
	let trade=n0:\
	let day=n0:\
	let find=n0

	return

################################################
# Subrutina
# Comprobar las condiciones del final del juego

@checkTheEnd

	gosub @checkAlive
	if morale<=n0 then goto @theEnd
	if damage>=100 then goto @theEnd
	if supplies<=n0 then goto @theEnd
	#if cash<n0 then goto @theEnd
	return

################################################
# Subrutina
# Comprobar si todos miembros de la tripulación han muerto

@checkAlive

	let alive=men
	for z=n1 to men:let alive=alive-not s(z):next z
	if not alive then goto @theEnd
	return

################################################
# Subrutina
# Crear mapa de la isla

@islandMap

	dim c(30)
	restore @islandData
	for z=n1 to 18:read w:let c(w)=n1:next z

	for z=n8 to 23:\
		if c(z)<>n1 then let c(z)=int (rnd*n5)+n2
	next z

	let c(int (rnd*n4)+20)=nativeVillage:\
	let c(int (rnd*n4)+14)=nativeAmmo:\
	let c(int (rnd*n4)+n8)=nativeSupplies
	# Posición inicial en la isla:
	let iPos=int (rnd*n4)+n8

	return

@islandData

	data n1,n2,n3,n4,n5,n6,n7,12,13,18,19,24,25,26,27,28,29,30

################################################
# Subrutina
# Panel de comandos en tierra

# Obsoleto!!! 

#@islandPanel

	#gosub @spanishCharset: gosub @directionsMenu
	#print ink n7;\
	#at 17,16;fn v$("C")+"omerciar";\
	#at 19,16;fn v$("I")+"nforme";\
	#at 18,16;fn v$("M")+"atar";\
	#at 20,16;"em"+fn v$("B")+"arcar"
	#return

################################################
# Subrutina
# Elegir un miembro de la tripulación para que muera

@chooseDeadOne

	for z=n1 to men
		if s(z) then let s(z)=n0: return
	next z
	goto @checkAlive

################################################
# Desembarcar en la isla del tesoro

@enterTreasureIsland

	gosub @pause20
	# Pistas acertadas:
	let find=n0

	cls : gosub @sunnySky
	gosub @wipeIsland
	gosub @graphicCharset2:\
	print ink n4; paper n6;\
	at n3,n0; " 5     6       45     6       5"
	for z=n0 to 24 STEP n8:\
		print ink n0; paper n6;\
		at n3,z+n3;":\*";\
		at n4,z+n2;":\::\::\*";\
		at n5,z+n1;":\::\::\::\::\*";\
		at n6,z;":\::\::\::\::\::\::\*":\
	next z
	gosub @spanishCharset:\
	print at n7,n0; ink n7; paper n2;"   1       2       3       4    "
	# cambiar esto por un fichero de atributos!!!
	for z=n8 to 21:\
		print at z,n0; ink n7; paper n0;l$:\
	next z
	gosub @graphicCharset1:\
	print at 17,n1; ink n5; paper n0;"xy                         pq   vs                         rs   wu                         tu"
	plot 25,44:draw 20,n10:draw n0,30:draw n2,n2:draw 100,n0:draw n2,-n2:draw n0,-60:draw -n2,-n2:draw -100,n0:draw -n2,n2:draw n0,19:draw -20,n0
	plot 220,44:draw -15,n5:draw n0,20:draw -n2,n2:draw -30,n0:draw -n2,-n2:draw n0,-40:draw n2,-n2:draw 30,n0:draw n2,n2:draw n0,14:draw 15,n0
	gosub @spanishCharset:\
	print at 14,n7; paper n0;q$;"Qu";e$;" camino";at 16,n8;c$;"?";at 15,23; flash n1;"?"
	gosub @getOption: print at 15,23; paper n0;option: beep .2,30
	gosub @pause100: if option=path then let find=find+n1
	gosub @spanishCharset: print at 14,n7; paper n0;q$;"Qu";e$;" ";a$;"rbol";at 16,n8;c$;"?";at 15,23;"? "
	gosub @wipeIsland: print at n7,n0; ink n0; paper n6;" 1       2       3       4": gosub @graphicCharset1: for z=n2 to 26 STEP n8: let p=n3: let q=z: gosub @palm2At: next z
	gosub @getOption: gosub @spanishCharset: print at 15,23; paper n0;option: beep .2,30
	gosub @pause100: if option=tree then let find=find+n1
	print at 14,n7; paper n0;"Izquierda Derecha";at 16,n8;"I=1  D=2 ";at 15,23;"? "
	gosub @getOption: gosub @spanishCharset: print at 15,23; paper n0;option: beep .2,30
	gosub @pause100: if option=ect then let find=find+n1
	gosub @wipeIsland: for z=n3 to n7: print at z,n1; ink n0; paper n6;z-n2;"  ";f$(z-n2): next z
	for z=n3 to n7: print at z,12; ink n0; paper n6;z+n3;"  ";f$(z+n3): next z
	print at n7,12; ink n0; paper n6;"0  ";f$(n10)
	gosub @graphicCharset2: print at n5,27; ink n4; paper n6;"S\::T";at n6,27;"VUW"
	gosub @spanishCharset: print at 14,n7; paper n0;" Poblado  ";at 13,n7;q$;"Cu";a$;"l";at 16,n8;" ";c$;".";at 15,23;"? "
	gosub @getOption: gosub @spanishCharset: print at 15,23; paper n0;option: beep .2,30
	gosub @pause100: if option=village then let find=find+n1
	print at 13,n7; paper n0;q$;"Qu";e$;" camino";at 14,n7;c$;"?";at 16,n7;"1N 2S 3E 4O";at 15,23;"? "
	gosub @getOption: print at 15,23; paper n0;option: beep .2,30
	gosub @pause100: if option=dir then let find=find+n1
	print at 13,n7; paper n0;q$;"Cu";a$;"ntos";at 14,n7;"pasos,";at 16,n7;c$;"?";at 15,23;"? "
	gosub @getOption: print at 15,23; paper n0;option: beep .2,30
	gosub @pause100: if option=pace then let find=find+n1
	if find=n6 then \
		print at 13,n7; paper n0;x$;"Hemos encontrado ";at 14,n7;"el oro, ";at 16,n7;c$;"!": goto @treasureFound
	if find<n6 then \
		print at 13,n7; paper n0;x$;"Nos hemos";at 14,n7;" equivocado ";at 16,n7;c$;"!"
	gosub @pause100
	goto @theEnd

################################################
# Subrutina
# Obtener un dígito pulsado
# Salida: variable 'option' con el número del dígito (0-9)

@getOption

	pause n0:let option=code inkey$-code"0"
	if option<n1 or option>n9 then beep .1,n10: goto @getOption
	return

################################################
# Subrutinas
# Pausas

@pause600

	let wait=val"600":goto @pause

@pause400

	let wait=val"400":goto @pause

@pause300

	let wait=val"300":goto @pause
	
@pause200

	let wait=val"200":goto @pause

@pause160

	let wait=val"160":goto @pause

@pause100

	let wait=val"100":goto @pause

@pause20

	let wait=val"20"

@pause
	for z=n1 to wait:next z:return

################################################
# Subrutina
# Borrar la tierra

@wipeIsland

	load!"zp6i6b0l05"code fn a(n3):return

################################################
# Subrutina
# Seleccionar el juego de caracteres de la ROM

@romCharset

	poke val"23606",not pi:\
	poke val"23607",val"60":\
	return

################################################
# Subrutina
# Hacer residente el juego de caracteres 1
# (que contiene gráficos)

@graphicCharset1

	load!"jr3"code charset
# Provisional!!! Para poder alternar cómodamente con el juego en ROM durante la depuración:
	goto @ramCharset

################################################
# Subrutina
# Hacer residente el juego de caracteres 2
# (que contiene gráficos)

@graphicCharset2

	load!"jr4"code charset
# Provisional!!! Para poder alternar cómodamente con el juego en ROM durante la depuración:
	goto @ramCharset

################################################
# Subrutina
# Hacer residante el juego de caracteres 3
# (copia del estándar pero castellanizado)

@spanishCharset

	load!"esRomChr" code charset
# Provisional!!! Para poder alternar cómodamente con el juego en ROM durante la depuración:
# ...sigue en @ramCharset y retorna.

################################################
# Subrutina
# Seleccionar el juego de caracteres residente

@ramCharset

	randomize charset-val"256":poke val"23606",peek val"23670":poke val"23607",peek val"23671":randomize:return

################################################
# Subrutina
# Seleccionar grupo de GDU principal

@udg1

	load!"jr6" code usr "a":return

################################################
# Subrutina
# Seleccionar grupo de GDU secundario

# Este conjunto de GDU solo contiene el gráfico del cofre
# del tesoro en las posiciones «A» y «B», porque en ZX
# Spectrum 128 los GDU «T» y «U» (que era su posición
# original en el grupo de GDU principal) no son accesibles.

@udg2

	load!"bnUDG1" code usr "a":return

################################################
# Fin del juego

@theEnd

	gosub @pause20

# Quitar esta cortinilla!!!:
	for z=n0 to 21: print at z,n0; paper n6; ink n0;l$: beep .001,z+n9: next z
	gosub @graphicCharset1: for z=n1 to 15 STEP n7: let p=z: let q=27: gosub @palm2At: let q=n1: gosub @palm2At: next z

	gosub @spanishCharset:\
	print ink n7; paper n2;fn c$(n3,"FIN DEL JUEGO")
	if supplies<=n0 then \
		let p$="Las provisiones se han agotado.":\
		gosub @tell
	if morale<=n0 then \
		let p$="La tripulaci"+o$+"n se ha amotinado.":\
		gosub @tell
	if ammo<=n0 then \
		let p$="La munici"+o$+"n se ha terminado.":\
		gosub @tell
	if not alive then \
		let p$="Toda tu tripulaci"+o$+"n ha muerto.":\
		gosub @tell
	if damage=100 then \
		let p$="El barco est"+a$+" muy da"+n$+"ado y es imposible repararlo.":\
		gosub @tell
	if find=n6 then \
		let p$="Lo lograste, "+c$+".":\
		gosub @tell
	if cash<=n0 then \
		let p$="No te queda dinero.":\
		gosub @tell

	print at 21,n0; paper n2;"Pulsa una tecla para ver tus puntos"
	pause n0:beep .2,30
	for z=n0 to 20:\
		print at z,n5; paper n6;"                      ":\
	next z

	print at 21,n0; paper n2;"Pulsa cualquier tecla para jugar";at n0,13;"Puntuaci"+o$+"n"

	print at n2,n10; paper n4; ink n7;"Barcos hundidos";at n5,n6;"Negocios con ";e$;"xito";at n8,n6;"Direcciones correctas";at 11,n6;"D";i$;"as que has sobrevivido";at 14,n6;"Puntos por el tesoro";at 17,n10; flash n1;"Puntuaci";o$;"n total"
	print at n4,13; ink n0; paper n6;"x 1000  puntos";at n7,13;"x 200   puntos";at n10,13;"x 1000  puntos";at 13,13;"x 200   puntos";at 16,16;"puntos"
	print at n4,n8; paper n6; ink n0;sunk;at n7,n8;trade;at n10,n8;find;at 13,n8;day
	let score=score+(find*val"1e3")
	let score=score+(day*val"200")
	if find=n6 then print at 16,11; paper n6; ink n0;"4000": let score=score+val"4e3": goto @theEnd01
	print at 16,11; paper n6; ink n0;"0"

@theEnd01

	print at 19,12; paper n6; ink n0;score;" puntos"
	for z=n1 to 50: next z
	pause n0
	goto @start

################################################
# Subrutina
# Introducción al juego

@intro

	border n0: paper n0: ink n7: bright n0: flash n0:cls

	#gosub @skullBorder

	gosub @spanishCharset
	let p$="Eres el "+c$+" del barco pirata "+b$+". Un viejo marinero te ha contado que existe una isla llamada "+t$+", que esconde un fabuloso tesoro. Pero por desgracia nadie sabe d"+o$+"nde est"+a$+" exactamente y hay muchas islas en esa zona.":gosub @tellCR
	let p$="Los nativos de las islas vecinas conocen pistas para llegar al tesoro. Deber"+a$+"s comerciar con ellos para que te las digan.":gosub @tellCR
	let p$="Cuando encuentres la isla "+t$+", sigue las pistas. Pero ten cuidado...":gosub @tellCR

	print fn c$(val "20","Pulsa cualquier tecla"):pause val"6e3"

	return

################################################
# Subrutina
# Imprimir borde de calaveras de decoración: 

@skullBorder

	gosub @graphicCharset2
	let gc=n2:gosub @skullLine:\
	let gc=n1

################################################
# Subrutina
# Imprimir línea de calaveras en canal gc

@skullLine

	print#gc;at n0,n0;paper n0;ink n7;bright n1;\
	"  nop  nop  nop  nop  nop  nop  "'\
	"  qrs  qrs  qrs  qrs  qrs  qrs  ":\
	return

################################################
# Hallazgo del tesoro

@treasureFound

	gosub @pause100
	load!"zp5i5b1l03"code fn a(n0):\
	load!"zp6i6b0l18"code fn a(n4)
	gosub @sunnySky
	for z=n7 to 22 STEP n5:\
		let p=n5: let q=z: gosub @palm2At:\
	next z
	let p=n7: let q=n3: gosub @palm2At
	let p=n7: let q=26: gosub @palm2At
# Cofre del tesoro:
	gosub @udg2:\
	print at 13,n8; ink n0; paper n6;\
	"pq          xy                  rs          vs                  tu      "\
	+"\A\B"+"    wu":\
	gosub @udg1
	let p=11: let q=28: gosub @palm2At
	let p=11: let q=n0: gosub @palm2At
	gosub @graphicCharset2: print at 17,13; ink n1; paper n6;"l\::m"
	gosub @spanishCharset
	print at 21,n0; ink n7; paper n2;x$+"Capit"+a$+"n, somos ricos!"
	gosub @pause200
	goto @theEnd

################################################
# Subrutina 
# Imprimir párrafo formateado en la posición actual
# Entrada: texto en p$

@tell

	if len p$<=cpl then goto @tellEnd

	for z=cpl to n1 step -n1
		if p$(z)=" " then \
			print p$(to z-n1):\
			let p$=p$(z+n1 to):\
			goto @tell
	next z

@tellEnd

	print p$:\
	return

################################################
# Subrutina 
# Imprimir párrafo formateado, con separación posterior
# Entrada: texto en p$

@tellCR

	gosub @tell:print:return

################################################
# Subrutina 
# Imprimir párrafo formateado en bocadillo de nativo
# Entrada: texto en p$

@nativeTell

	let tw=cpl:let ty=n6:let tx=16:let tw=10

################################################
# Subrutina 
# Imprimir párrafo formateado en una zona
# Entrada:
#   p$=text
#   tw=anchura máxima
#   ty=línea superior
#   tx=columna izquierda

@tellZone

	if len p$<=tw then goto @tellZoneEnd

	for z=tw to n1 step -n1
		if p$(z)=" " then \
			print at ty,tx;p$(to z-n1):\
			let p$=p$(z+n1 to):\
			let ty=ty+n1:\
			goto @tellZone
	next z

@tellZoneEnd

	print at ty,tx;p$:\
	return

################################################
# Demo de caracteres (para depuración)

@showCharsets

	cls
	gosub @spanishCharset: print '"UDG 1":gosub @udg1:gosub @showUdg
	gosub @spanishCharset: print '"UDG 1":gosub @udg2:gosub @showUdg

	gosub @romCharset: print '"Tipo 1 (en @graphicCharset1)": gosub @graphicCharset1: gosub @ramCharset:gosub @showASCII

	gosub @romCharset: print '"Tipo 2 (en @graphicCharset2)": gosub @graphicCharset2:gosub @ramCharset:gosub @showASCII

	gosub @romCharset: print '"Tipo 3 (en @spanishCharset)":gosub @spanishCharset: gosub @ramCharset:gosub @showASCII

	gosub @romCharset:stop

@showASCII

	for z=n32 to val"127": print chr$ z;: next z: return

@showUdg

	for z=val"144" to val"164": print chr$ z;: next z:return

################################################
# Subrutina
# Salvar la pantalla

@saveScreen

	erase!"tmpScreen":save!"tmpScreen"screen$:return

################################################
# Subrutina
# Restaurar la pantalla

@restoreScreen

	load!"tmpScreen"screen$:return

################################################
# Probar gráficos (para depuración)

# Juego de caracteres con gráficos:
	gosub @graphicCharset1:gosub @ramCharset
# Imprimir gráfico:
	gosub 7310:rem graphic
# Restaurar juego de caracteres en ROM:
	gosub @romCharset
	stop

################################################
# Grabación en DISCiPLE o +D con Beta DOS

save over d*"bn2" line val"11"


Páginas relacionadas

Glosario

BASIC
Beginner's All-Purpose Symbolic Instruction Code (código polivalente de instrucciones simbólicas para principiantes)
DOS
Disk Operating System (sistema operativo de disco)
Fuse
Free Unix Spectrum Emulator (emulador de Spectrum libre para Unix)
MBim
MasterBASIC improved (MasterBASIC mejorado)
RAM
Random Access Memory (memoria volátil de lectura y escritura)
SBim
S*BASIC improved (S*BASIC mejorado)
Wine
Wine Is Not an Emulator (Wine no es un emulador)