DEFLNG W
	GOSUB Bienvenida
	GOSUB ArchivoEscrito
	GOSUB Principal
	GOSUB CierraArchivo
	END

ArchivoEscrito:
	CLS
	OKGrabacion$ = "no"
	WHILE OKGrabacion$ <> "s¡"
		INPUT "Complete DOS name of the file to store "; ArchivoEscrito$
		OPEN "R", #2, ArchivoEscrito$, 1
		FIELD #2, 1 AS e$
		IF LOF(2) <> 0 THEN
			BEEP: PRINT : PRINT "A file with that name already exists. Erase (E), try again ?"
			GOSUB EsperaTecla
			IF Tecla$ = "e" OR Tecla$ = "E" THEN
				CLOSE #2
				KILL ArchivoEscrito$
				OPEN "R", #2, ArchivoEscrito$, 1
				FIELD #2, 1 AS e$
				OKGrabacion$ = "s¡"
			ELSE
				CLOSE #2
			END IF
		ELSE
			OKGrabacion$ = "s¡"
		END IF
	WEND
	RETURN

Bienvenida:
	CLS : COLOR 7, 0
	PRINT "   This program builds the columns of a cloister in the CBB format."
	PRINT
	PRINT "   Copyright Jean-Luc Ancey, February 21st, 1997.": PRINT
	PRINT "   Strike a key when ready."
	GOSUB EsperaTecla
	RETURN

CabezaTipo:
	LineaEscrita$ = "<" + Tipo$ + ">": GOSUB GrabaUnaLinea
	RETURN

CierraArchivo:
	wByteEscrito = wByteEscrito + 1
	LSET e$ = CHR$(26)
	PUT #2, wByteEscrito
	CLOSE
	RETURN

ColaTipo:
	LineaEscrita$ = "": GOSUB GrabaUnaLinea
	RETURN

ColumnaAngulo:
	Tipo$ = "cilindros": GOSUB CabezaTipo
	x = 0
	y = 0
	z = Mike
	Posicion$ = "so"
	TamaX = Hotel: TamaY = Hotel: TamaZ = Bravo
	Exclusion$ = "inf,sup"
	NumPuntosXY = 5
	GOSUB GrabaVolumen
	GOSUB ColaTipo
	RETURN

Columnas:
	z = Mike
	Tipo$ = "conos": GOSUB CabezaTipo
	FOR GrupoDeCol = 1 TO Lima
		IF (GrupoDeCol - 1) <> (Lima - 1) / 2 THEN
			y = Hotel + Kilo / 3 + (GrupoDeCol - 1) * Kilo
			x = Delta / 2: GOSUB GrabaConoColumna
			x = Delta * 3 / 2: GOSUB GrabaConoColumna
		END IF
	NEXT GrupoDeCol
	GOSUB ColaTipo
      
	z = Mike
	Tipo$ = "cilindros": GOSUB CabezaTipo
	FOR GrupoDeCol = 1 TO Lima
		IF (GrupoDeCol - 1) <> (Lima - 1) / 2 THEN
			y = Hotel + Kilo / 3 + (GrupoDeCol - 1) * Kilo
			x = Delta / 2: GOSUB GrabaCilindroColumna
			x = Delta * 3 / 2: GOSUB GrabaCilindroColumna
		END IF
	NEXT GrupoDeCol
	GOSUB ColaTipo
     
	z = Mike + Bravo - Golf
	Tipo$ = "esferas": GOSUB CabezaTipo
	FOR GrupoDeCol = 1 TO Lima
		IF (GrupoDeCol - 1) <> (Lima - 1) / 2 THEN
			y = Hotel + Kilo / 3 + (GrupoDeCol - 1) * Kilo
			x = Delta / 2: GOSUB GrabaEsferaColumna
			x = Delta * 3 / 2: GOSUB GrabaEsferaColumna
		END IF
	NEXT GrupoDeCol
	GOSUB ColaTipo
     
	z = Oscar - Golf - November
	Tipo$ = "cubos": GOSUB CabezaTipo
	FOR GrupoDeCol = 1 TO Lima
		IF (GrupoDeCol - 1) <> (Lima - 1) / 2 THEN
			y = Hotel + Kilo / 3 + (GrupoDeCol - 1) * Kilo
			x = Delta / 2: GOSUB GrabaCuboColumna
			x = Delta * 3 / 2: GOSUB GrabaCuboColumna
		END IF
	NEXT GrupoDeCol
	GOSUB ColaTipo
	RETURN

EsperaTecla:
	Tecla$ = ""
	WHILE Tecla$ = ""
		Tecla$ = INKEY$
	WEND
	RETURN

GrabaCilindroColumna:
	Posicion$ = "c"
	TamaX = Alfa: TamaY = Alfa: TamaZ = Bravo
	Exclusion$ = "inf,sup"
	NumPuntosXY = 5
	GOSUB GrabaVolumen
	RETURN

GrabaConoColumna:
	Posicion$ = "c"
	TamaX = Delta: TamaY = Delta: TamaZ = Echo
	Exclusion$ = "inf"
	NumPuntosXY = 5
	GOSUB GrabaVolumen
	RETURN

GrabaCuboColumna:
	Posicion$ = "c"
	TamaX = Charlie: TamaY = Charlie: TamaZ = Golf
	Exclusion$ = "sup"
	GOSUB GrabaVolumen
	RETURN

GrabaEsferaColumna:
	Posicion$ = "cgrav"
	TamaX = Charlie: TamaY = Charlie: TamaZ = Foxtrot * 2
	Exclusion$ = "sup"
	NumPuntosXY = 5
	NumPuntosZ = 5
	GOSUB GrabaVolumen
	RETURN

GrabaUnaLinea:
	PRINT LineaEscrita$
	LineaEscrita$ = LineaEscrita$ + CHR$(13) + CHR$(10)
	FOR a = 1 TO LEN(LineaEscrita$)
		wByteEscrito = wByteEscrito + 1
		LSET e$ = MID$(LineaEscrita$, a, 1)
		PUT #2, wByteEscrito
	NEXT a
	LineaEscrita$ = ""
	RETURN

GrabaVolumen:
	LineaEscrita$ = "Posi "
	Valor = x: GOSUB TradValorCadena
	LineaEscrita$ = LineaEscrita$ + Cadena$
	Valor = y: GOSUB TradValorCadena
	LineaEscrita$ = LineaEscrita$ + "," + Cadena$
	Valor = z: GOSUB TradValorCadena
	LineaEscrita$ = LineaEscrita$ + "," + Cadena$
	IF Posicion$ <> "" THEN
		LineaEscrita$ = LineaEscrita$ + "," + Posicion$
	END IF
	LineaEscrita$ = LineaEscrita$ + " Tama "
	Valor = TamaX: GOSUB TradValorCadena
	LineaEscrita$ = LineaEscrita$ + Cadena$
	Valor = TamaY: GOSUB TradValorCadena
	LineaEscrita$ = LineaEscrita$ + "," + Cadena$
	Valor = TamaZ: GOSUB TradValorCadena
	LineaEscrita$ = LineaEscrita$ + "," + Cadena$
	IF Exclusion$ <> "" THEN
		LineaEscrita$ = LineaEscrita$ + " Excl " + Exclusion$
	END IF
	IF Tipo$ <> "cubos" THEN
		Valor = NumPuntosXY: GOSUB TradValorCadena
		LineaEscrita$ = LineaEscrita$ + " Punt " + Cadena$
		IF Tipo$ = "esferas" THEN
			Valor = NumPuntosZ: GOSUB TradValorCadena
			LineaEscrita$ = LineaEscrita$ + "," + Cadena$
		END IF
	END IF
	GOSUB GrabaUnaLinea
	RETURN

LeeUnaLinea:
	LineaLeida$ = ""
	FinDeLinea$ = "no"
	WHILE FinDeLinea$ = "no" AND wByteLeido < LOF(1)
		wByteLeido = wByteLeido + 1
		GET #1, wByteLeido
		IF l$ <> CHR$(13) THEN
			IF l$ <> CHR$(10) THEN LineaLeida$ = LineaLeida$ + l$
		ELSE
			FinDeLinea$ = "s¡"
		END IF
	WEND
	RETURN

Mike:
	Tipo$ = "cubos": GOSUB CabezaTipo
	x = 0: y = 0: z = 0
	Posicion$ = "so"
	TamaX = Hotel: TamaY = Juliet: TamaZ = Mike
	Exclusion$ = ""
	GOSUB GrabaVolumen
	y = India - Hotel
	Posicion$ = "no"
	TamaY = Juliet - Hotel
	Exclusion$ = "n"
	GOSUB GrabaVolumen
	GOSUB ColaTipo
	RETURN

November:
	Tipo$ = "cubos": GOSUB CabezaTipo
	x = 0: y = 0: z = Oscar - November
	Posicion$ = "so"
	TamaX = Hotel: TamaY = Juliet: TamaZ = November
	Exclusion$ = ""
	GOSUB GrabaVolumen
	y = India - Hotel
	Posicion$ = "no"
	TamaY = Juliet - Hotel
	Exclusion$ = "n"
	GOSUB GrabaVolumen
	GOSUB ColaTipo
	RETURN

Principal:
	CLS
	wByteEscrito = 0: wByteLeido = 0
	GOSUB Variables
	GOSUB Principal2
      
	LineaEscrita$ = "": GOSUB GrabaUnaLinea
	LineaEscrita$ = "Rotz -90": GOSUB GrabaUnaLinea
	Valor = India: GOSUB TradValorCadena
	LineaEscrita$ = "Posi 0," + Cadena$ + ",0": GOSUB GrabaUnaLinea
	LineaEscrita$ = "": GOSUB GrabaUnaLinea
	GOSUB Principal2
	LineaEscrita$ = "": GOSUB GrabaUnaLinea
	LineaEscrita$ = "Fin": GOSUB GrabaUnaLinea
	LineaEscrita$ = "": GOSUB GrabaUnaLinea
     
	LineaEscrita$ = "": GOSUB GrabaUnaLinea
	LineaEscrita$ = "Rotz -180": GOSUB GrabaUnaLinea
	Valor = India: GOSUB TradValorCadena
	LineaEscrita$ = "Posi " + Cadena$ + "," + Cadena$ + ",0": GOSUB GrabaUnaLinea
	LineaEscrita$ = "": GOSUB GrabaUnaLinea
	GOSUB Principal2
	LineaEscrita$ = "": GOSUB GrabaUnaLinea
	LineaEscrita$ = "Fin": GOSUB GrabaUnaLinea
	LineaEscrita$ = "": GOSUB GrabaUnaLinea
     
	LineaEscrita$ = "": GOSUB GrabaUnaLinea
	LineaEscrita$ = "Rotz 90": GOSUB GrabaUnaLinea
	Valor = India: GOSUB TradValorCadena
	LineaEscrita$ = "Posi " + Cadena$ + ",0,0": GOSUB GrabaUnaLinea
	LineaEscrita$ = "": GOSUB GrabaUnaLinea
	GOSUB Principal2
	LineaEscrita$ = "": GOSUB GrabaUnaLinea
	LineaEscrita$ = "Fin": GOSUB GrabaUnaLinea
	LineaEscrita$ = "": GOSUB GrabaUnaLinea
	RETURN

Principal2:
	GOSUB Mike
	GOSUB Columnas
	GOSUB ColumnaAngulo
	GOSUB November
	RETURN

TradValorCadena:
	Cadena$ = STR$(Valor)
	IF LEFT$(Cadena$, 1) = " " THEN
		Cadena$ = MID$(Cadena$, 2, LEN(Cadena$) - 1)
	END IF
	IF LEFT$(Cadena$, 2) = "-." THEN
		Cadena$ = "-0" + RIGHT$(Cadena$, LEN(Cadena$) - 1)
	END IF
	IF LEFT$(Cadena$, 1) = "." THEN
		Cadena$ = "0" + Cadena$
	END IF
	RETURN

Variables:
	Lima = 7:   'Tiene que ser impar
       
	Hotel = .6
	Kilo = 2
	Mike = .9
	November = .3
	Oscar = 2.5
       
	Bravo = Oscar - Mike - November
	Delta = Hotel / 2
	Charlie = Delta
	Foxtrot = Charlie * 2 / 6
	Golf = Charlie / 6
	Echo = Delta * 9 / 6
	Alfa = Delta * 4 / 6
	India = (Lima - 1) * Kilo + 2 * (Kilo / 3) + 2 * Hotel
	Juliet = ((Lima - 3) / 2) * Kilo + 2 * (Kilo / 3) + Hotel
	RETURN


    Source: geocities.com/siliconvalley/way/4179

               ( geocities.com/siliconvalley/way)                   ( geocities.com/siliconvalley)