El INK 0 de la primera linea está relacionado con el hecho de que, en cinta, al cargar ficheros aparece siempre en pantalla el nombre. Por comodidad, voy a meterlo todo en un disco +3, de manera que resulte más fácil y rápida la manipulación de los ficheros, de manera que este primer fichero se va a llamar "DISK" y el siguiente "TALLY_00.BAS". Los tres pokes que parecen en la primera línea manipulan algunas variables del sistema, cuando tenga un rato miraré de qué se trata.
El listado se va quedar así:
1000 BORDER 0:
PAPER 0:
INK 7:
CLS:
LOAD "TALLY_00.SCR" SCREEN$:
POKE 23570,1:
POKE 23659,3:
POKE 23624,0:
PAUSE PI-PI:
PAUSE 60
1002 GOSUB 6000
1004 CLS
1010 PRINT AT 6,10;"1-INSTRUCTIONS"; AT 6,11;"2-STAR NEW GAME";
AT 6,12;"3-CONTINUE LAST"
1020 LET A$=INKEY$:
IF INKEY$="1" THEN
GOSUB 8100
1030 IF INKEY$="2" THEN
LOAD "TALLY_00.BAS"
1040 IF INKEY$="2" THEN
LOAD "TALLYR_S.BAS"
1050 GOTO 1020
6000 RESTORE 8094:
FOR c=144 TO 150:
FOR n=0 TO 7:
READ r:
POKE USR CHR$ c+n,r:
NEXT n:
NEXT c:
RETURN
8094 DATA 0,136, 85, 34,136, 85, 34, 0,
255,255,255,255,255,255,255,255,
16, 56, 84, 16,124,146, 16, 0,
56,124,254,254,254,238,238, 0,
8, 28, 28, 62,126,127,255, 0,
0, 16, 16,146, 84, 56,124, 0,
0,170,254,124,124,124,124,124
8100 CLS :
PRINT AT 1,8;"INSTRUCTIONS"
8200 PRINT "You are to become the wizard
from Tallyron, from the
introduction, in search of the
Mace of Internal Power. "
8210 PRINT "You, as party leader will carry
the cash, from which you must
equip the party."
8220 PRINT "As a wizard, you are not allowed
to wear much armour or carry
large weapons, but you will be
able to find and use magic!"
8230 PRINT "The game is menu driven and it
is only necessary to read the
screen prompts carefully."
8300 PRINT "When within a village, you may
save your position."
8870 PRINT AT 21,0;"ANY KEY TO RETURN"
8880 IF INKEY$="" THEN
GO TO 8880
8890 RETURN
De esta manera, el listado del juego se nos queda así:
'###################################################################'PAUSE'################################################################### 1 FOR Q=1 TO 80: NEXT Q: RETURN
5 LET X=7:\ LET Y=10: STOP 6 BORDER 0: #PUNTO DE ARRANQUE (TALLY_00.bas) CLS : PRINT AT 10,0;"DATA IS LOADING" 8 LOAD "MAP" DATA A() 9 PRINT : PRINT "PLEASE WAIT" 10 GO TO 1000'INIT'###################################################################'MOV_LOOP'################################################################### 105 LET X1=X:\ LET Y1=Y:\ POKE 23658,8:\ BEEP .2,1:\ INPUT AT 0,0;"Which direction? "; LINE u$\{f0}:\ IF LEN u$<1 OR LEN u$>2 THEN GO TO 105'MOV_LOOP 110 IF U$="N" THEN LET X1=X-1:\ GO TO 128'CHECK_AGUA&GO 112 IF U$="S" THEN LET X1=X+1:\ GO TO 128'CHECK_AGUA&GO 114 IF U$="W" THEN LET Y1=Y-1:\ GO TO 128'CHECK_AGUA&GO 116 IF U$="E" THEN LET Y1=Y+1:\ GO TO 128'CHECK_AGUA&GO 118 IF U$="NE" THEN LET Y1=Y+1:\ LET X1=X-1:\ GO TO 128'CHECK_AGUA&GO 120 IF U$="NW" THEN LET Y1=Y-1:\ LET X1=X-1:\ GO TO 128'CHECK_AGUA&GO 122 IF U$="SW" THEN LET Y1=Y-1:\ LET X1=X+1:\ GO TO 128'CHECK_AGUA&GO 123 IF U$="SE" THEN LET Y1=Y+1:\ LET X1=X+1:\ GO TO 128'CHECK_AGUA&GO 124 IF U$="R" THEN GO SUB 1500:'REPORT GO SUB 1400:'MOVE_MENU&INPUT_(MOV+COMBAT) GO TO 128'CHECK_AGUA&GO 125 IF U$="I" THEN GO SUB 500:'BAR+LIMPIA_WIN2 GO SUB 3000:'SPELLS GO SUB 1:'PAUSE GO SUB 550:'LIMPIA_WIN3 GO TO 128'CHECK_AGUA&GO 126 IF U$="U" THEN GO SUB 500:'BAR+LIMPIA_WIN2 GO SUB 3500:'ITEMS GO SUB 1:'PAUSE GO SUB 550:'LIMPIA_WIN3 GO TO 128'CHECK_AGUA&GO 127 GO TO 105'MOV_LOOP'###################################################################'CHECK_AGUA&GO'################################################################### 128 IF A(X1,Y1,2)=0 THEN PRINT #0;"YOU CAN'T GO INTO THE WATER!":\ BEEP .5,4:\ BEEP 1,-4:\ GO TO 105'MOV_LOOP 129 LET X=X1:\ LET Y=Y1'###################################################################'ACTUALIZA_MAPA'################################################################### 150 FOR I=-1 TO 1:\ FOR Q=-1 TO 1:\ LET C=A(X+I,Y+Q,1):\ PRINT AT 2+I*2,2+Q*2; FLASH (NOT Q AND NOT I); BRIGHT 1;C$(C+1); AT 3+I*2,2+Q*2;C$(C+1):\ NEXT Q:\ NEXT I 170 LET C=A(X,Y,2) 175 PRINT AT 0,6;"YOUR PRESENT LOCATION IS;":\ PRINT AT 1,6;A$(C) 177 IF C<>16 THEN FOR N=2 TO 5: PRINT AT N,6;O$(6 TO 31): NEXT N: RETURN 230 PRINT AT 4,10;"BUT NOT FOR LONG!":\ FOR N=21 TO 60:\ BEEP .01,N+2:\ BEEP .01,N-2:\ BEEP .001,N:\ NEXT N:\ PRINT AT 4,10;" ":\ LET X=7:\ LET Y=10:\ GO TO 150'ACTUALIZA_MAPA'###################################################################'BAR+LIMPIA_WIN2'################################################################### 500 PRINT AT 6,0;"\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..":\ FOR N=7 TO 21:\ PRINT AT N,0;O$:\ NEXT N:\ RETURN'###################################################################'GOLD'################################################################### 510 LET z$=" Gold Pieces":\ IF GP=1 THEN LET z$=z$(1 TO 11) 520 PRINT AT 21,0;o$;AT 21,3;"You have ";GP;z$:\ RETURN'###################################################################'LIFE_FORCE'################################################################### 530 PRINT AT 10,0;"You already have 100% Life Force":\ GO SUB 9555'PRESS_ENTER_MSG 535 RETURN'###################################################################'LIMPIA_WIN3'################################################################### 550 FOR L=16 TO 21:\ PRINT AT L,0;O$:\ NEXT L:\ RETURN'###################################################################'INIT'###################################################################1000 GO SUB 8000'INIT_VARS1010 CLS: GO SUB 150'ACTUALIZA_MAPA1020 POKE 23658,8:\ IF A(X,Y,1)=3 THEN GO SUB 500:'BAR+LIMPIA_WIN2 GO SUB 1100:'VILLAGE_OP_PRINT&INPUT GO TO 10501022 IF A(X,Y,1)=7 THEN GO SUB 500:'BAR+LIMPIA_WIN2 GO SUB 5000:'DOOR GO TO 10401025 IF A(X,Y,3)=1 THEN GO SUB 500:'BAR+LIMPIA_WIN2 GO SUB 4000:'PIECE_METAL GO TO 10501030 IF A(X,Y,3)>2 THEN GO SUB 1300:'COMBAT_CHECK&INPUT GO SUB 500:'BAR+LIMPIA_WIN2 GO TO 10501035 IF A(X,Y,3)=2 THEN GO SUB 500:'BAR+LIMPIA_WIN2 GO SUB 4500:'HERMIT GO TO 10501040 GO SUB 1400'MOVE_MENU&INPUT_(MOV+COMBAT)1050 GO TO 1020'###################################################################'VILLAGE_OP_PRINT&INPUT'###################################################################1100 PRINT AT 8,8;"OPTIONS"1102 PRINT AT 6,0;"\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\.."1105 PRINT AT 7,0;O$;AT 10,8;"M)ove"1110 PRINT AT 12,8;"R)eport"1120 PRINT AT 14,8;"H)ealer"1130 PRINT AT 16,8;"G)uild of Magicians"1140 PRINT AT 18,8;"T)rading Post"1145 PRINT AT 20,8;"S)ave Position"1150 IF INKEY$<>"M" AND INKEY$<>"S" AND INKEY$<>"R" AND INKEY$<>"H" AND INKEY$<>"G" AND INKEY$<>"T" THEN GO TO 11501160 IF INKEY$="M" THEN GO SUB 500:'BAR+LIMPIA_WIN2 GO SUB 1400:'MOVE_MENU&INPUT_(MOV+COMBAT) RETURN1170 IF INKEY$="R" THEN GO SUB 1500:'REPORT RETURN1175 IF INKEY$="H" THEN GO SUB 1600:'HEALER RETURN1180 IF INKEY$="G" THEN GO SUB 1700:'MAGIC_GUILD RETURN1185 IF INKEY$="T" THEN GO SUB 1800:'TRADE_POST RETURN1190 IF INKEY$="S" THEN PRINT INVERSE 1;"Ready disk,then press any key":\ PAUSE 4E4:\ SAVE "tallyr_S" LINE 1010:\ BEEP 1,1:\ RETURN'###################################################################'COMBAT_CHECK&INPUT'###################################################################1300 IF A(X,Y,3)<3 THEN RETURN1301 LET T5=A(X,Y,3):\ LET M$=B$(T5):\ LET AC=M(1,T5):\ LET DAM=M(2,T5)1305 IF T5=5 OR T5=7 THEN LET M1=2:\ GO TO 13091306 IF T5=9 THEN LET M1=3:\ GO TO 13091308 LET M1=11309 DIM D(M1) #COMBAT_CHECK&INPUT_CONT1310 IF M1=0 THEN STOP1315 LET INIT=INT (RND*2):\ DIM U(M1):\ FOR N=1 TO M1:\ LET U(N)=100:\ NEXT N1317 GO SUB 1322:'ATTACK_MENU IF INIT THEN GO SUB 1360:'FIGHT/RUN_MENU&INPUT IF M1 AND L$<>"R" THEN GO SUB 2000'MONSTER_ATTACK1318 IF NOT INIT THEN GO SUB 2000:'MONSTER_ATTACK GO SUB 1360'FIGHT/RUN_MENU&INPUT1319 IF M1=0 THEN LET PRO=0:\ LET A1=INT (RND*M(4,T5)):\ GO SUB 500:'BAR+LIMPIA_WIN2 PRINT AT 13,0;"You find ";a1;" Gold Pieces!":\ GO SUB 1:'PAUSE LET GP=GP+A1:\ GO TO 500'BAR+LIMPIA_WIN21320 IF L$="R" THEN LET M1=0:\ GO TO 500'BAR+LIMPIA_WIN21321 GO TO 1317'###################################################################'ATTACK_MENU'###################################################################1322 FOR N=7 TO 14:\ PRINT AT N,0;O$:\ NEXT N1323 PRINT AT 6,0;"\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..":\ PRINT AT 7,0;O$ #ATTACK_MENU_CONT1325 PRINT AT 8,6;"YOU ARE ATTACKED BY:"1330 PRINT AT 10,6;"A) ";M$1335 IF M1=2 THEN PRINT AT 12,6;"B) ";M$1340 IF M1=3 THEN PRINT AT 14,6;"C) ";M$1345 PRINT AT 15,0;"\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\.."1355 RETURN'###################################################################'FIGHT/RUN_MENU&INPUT'###################################################################1360 IF A(X,Y,1)=7 THEN LET L$="F":\ GO TO 13851362 GO SUB 550'LIMPIA_WIN31365 PRINT AT 17,10;"OPTIONS"1370 PRINT AT 19,10;"F)ight"1375 PRINT AT 21,10;"R)un"1380 LET L$=INKEY$:\ IF L$<>"F" AND \{f0}L$<>"R" THEN GO TO 13801385 IF L$="F" THEN FOR N=16 TO 21:\ PRINT AT N,0;O$:\ NEXT N:\ GO SUB 2500'PLAYER_ATTACK1390 IF L$="R" THEN FOR N=16 TO 21:\ PRINT AT N,0;O$:\ NEXT N:\ GO SUB 1900'RUN1392 IF FLAG=1 THEN LET FLAG=0:\ GO SUB 1300'COMBAT_CHECK&INPUT1396 RETURN'###################################################################'MOVE_MENU&INPUT_(MOV+COMBAT)'###################################################################1400 PRINT AT 8,10;"NW N NE"1410 PRINT AT 11,10;"W";AT 11,18;"E"1414 PRINT AT 14,10;"SW S SE"1420 PLOT 100,681422 DRAW 30,301424 PLOT 130,681426 DRAW -30,301428 PLOT 115,641430 DRAW 0,381432 PLOT 95,831434 DRAW 40,01440 PRINT AT 16,2;"Enter the letter(s) of the direction you wish to move (or 'R' for report - 'I' to incant a spell - 'U' to use an item)"1450 GO SUB 105'MOV_LOOP1452 IF A(X,Y,1)=3 OR A(X,Y,1)>5 OR A(X,Y,3)>1 THEN RETURN1455 LET T5=INT (RND*50)+1:\ IF T5>9 THEN RETURN1460 LET M$=V$(T5):\ LET AC=M(1,T5+9):\ LET DAM=M(2,T5+9):\ LET M1=1:\ IF T5>5 THEN LET M1=21470 LET T5=T5+9:\ GO SUB 1309'COMBAT_CHECK&INPUT_CONT1495 RETURN'###################################################################'REPORT'###################################################################1500 GO SUB 500'BAR+LIMPIA_WIN21520 FOR Q=1 TO 3:\ PRINT AT Q*4+4,0;"Name ";N$(Q);TAB 20;"L.Force ";F(Q);"%"'"Weapon ";D$(Q);TAB 24;"A/C ";Z(Q)'"Armour ";E$(Q):\ IF NOT F(Q) THEN PRINT AT Q*4+4,20;" DECEASED "1530 NEXT Q1560 GO SUB 9555'PRESS_ENTER_MSG1570 GO SUB 500'BAR+LIMPIA_WIN2 #REPORT_CONT1580 PRINT AT 8,2;"SPELLS KNOWN | OTHER ITEMS"1585 PRINT AT 9,0;:\ FOR N=1 TO 6:\ PRINT TAB 1;N;" ";T$(N);TAB 15;"| ";P$(N):\ NEXT N1586 PRINT AT 17,3;"GOLD PIECES ";GP1588 PRINT AT 19,3;"EXP. POINTS ";EP1590 GO SUB 9555:'PRESS_ENTER_MSG GO SUB 500:'BAR+LIMPIA_WIN2 RETURN'###################################################################'HEALER'###################################################################1600 GO SUB 500'BAR+LIMPIA_WIN21605 PRINT AT 8,3;"WHO WISHES TO BE HEALED?"1610 PRINT AT 10,7;"0) NO-ONE"'':\ FOR N=1 TO 3:\ PRINT TAB 7;N;") ";N$(N)'':\ NEXT N1615 LET I$=INKEY$:\ IF I$<"0" OR I$>"3" THEN GO TO 16151617 IF I$="0" THEN RETURN1618 LET I=VAL I$1620 GO SUB 500:'BAR+LIMPIA_WIN2 PRINT AT 8,6;N$(I)1622 IF F(I)=100 THEN GO SUB 530:'LIFE_FORCE GO TO 16001625 IF F(I)=0 THEN GO TO 1680'RESURRECT1630 PRINT AT 13,0;"You may be healed for 1 Gold Piece per % Life Force"; AT 10,0;"Your Life Force is currently"'f(I);"%"; AT 17,0;"Enter no. of points to be healed"1635 INPUT AT 0,0; LINE F$\{f0}:\ FOR N=1 TO LEN F$:\ IF F$(N)<"0" OR F$(N)>"9" THEN GO TO 16351650 NEXT N:\ LET NR=VAL F$:\ LET T3=NR+F(I):\ IF T3>100 THEN GO TO 16351652 IF NR=0 THEN GO TO 16001655 IF NR>GP THEN GO SUB 9500:'CANT AFFORD GO TO 16301660 LET GP=GP-NR:\ LET F(I)=F(I)+NR1665 GO SUB 1500:'REPORT GO TO 1600'###################################################################'RESURRECT'###################################################################1680 PRINT AT 10,0;"I can resurrect you and restore you to 25% Life Force for 500 Gold Pieces"; AT 14,2;"Will you accept? (Y or N)"1690 IF INKEY$<>"Y" AND INKEY$<>"N" THEN GO TO 16901691 IF INKEY$="N" THEN RETURN1692 IF GP<500 THEN GO SUB 9500:'CANT AFFORD RETURN1693 LET GP=GP-500:\ LET F(I)=25:\ GO SUB 1500:'REPORT GO TO 1600'HEALER'###################################################################'MAGIC_GUILD'###################################################################1700 IF S=6 THEN LET G$="SPELLS":\ GO SUB 9550:'MAX_ALLOWED RETURN1701 GO SUB 500'BAR+LIMPIA_WIN21702 PRINT AT 9,10;"WELCOME";AT 12,5;"To our humble Guild";AT 14,10;N$(3);AT 16,5;"WIZARD of TALLYRON"1703 GO SUB 9555'PRESS_ENTER_MSG1704 GO SUB 500'BAR+LIMPIA_WIN21705 PRINT AT 8,6;"SPELLS AVAILABLE":\ LET T3=11710 PRINT AT 11,2;"1) ";X$((A(X,Y,2))-8);" (1st Level)"1715 IF EP>999 AND A(X,Y,2)<12 AND S2<2 THEN PRINT AT 12,2;"2) ";X$((A(X,Y,2))-3);" (2nd Level)":\ LET T3=21717 PRINT AT 20,2;"Press no. of spell required or '0' to leave."1720 IF INKEY$<>"0" AND INKEY$<>"1" AND INKEY$<>"2" THEN GO TO 17201722 IF INKEY$="0" THEN RETURN1725 IF INKEY$="2" AND T3=1 THEN GO TO 17201730 IF INKEY$="1" THEN LET S$(S+1)=X$((A(X,Y,2))-8):\ LET T$(S+1)=Y$((A(X,Y,2))-8):\ GO TO 17801735 IF INKEY$="2" THEN LET S$(S+1)=X$((A(X,Y,2))-3):\ LET T$(S+1)=Y$((A(X,Y,2))-3):\ LET S2=S2+11780 PRINT AT 16,0;"The command word for this spell is ";T$(S+1):\ LET S=S+11790 PRINT AT 20,0;O$;AT 21,0;O$:\ GO SUB 9555:'PRESS_ENTER_MSG GO SUB 1570:'REPORT_CONT IF S<>6 THEN GO TO 17041795 GO TO 1700'###################################################################'TRADE_POST'###################################################################1800 GO SUB 500'BAR+LIMPIA_WIN21805 PRINT AT 8,6;"WHO WISHES TO TRADE?":\ GO SUB 510'GOLD1810 PRINT AT 10,7;"0) NO-ONE"'':\ FOR N=1 TO 3:\ PRINT TAB 7;N;") ";N$(N)'':\ NEXT N1815 LET I$=INKEY$:\ IF I$<"0" OR I$>"3" THEN GO TO 18151817 IF I$="0" THEN RETURN1818 LET I=VAL I$1820 GO SUB 500:'BAR+LIMPIA_WIN2 PRINT AT 8,6;N$(I);AT 10,6;"DO YOU WANT TO BUY";AT 12,6;"0) Nothing";AT 14,6;"1) Weapons";AT 16,6;"2) Armour":\ IF I=3 THEN PRINT AT 18,6;"3) Other Items"1824 GO SUB 510'GOLD1825 LET I$=INKEY$:\ IF I$<"0" OR I$>"4" OR (I$="4" AND I<>3) THEN GO TO 18251830 IF I$="0" THEN GO TO 18001835 GO SUB 9000+VAL I$*100: GO TO 1820'###################################################################'RUN'###################################################################1900 LET V=INT (RND*10)+1:\ IF V>6 THEN PRINT AT 18,6;"YOU CAN'T ESCAPE":\ LET L$="":\ GO SUB 9555:'PRESS_ENTER_MSG RETURN1905 LET X1=X+INT (RND*11)-5:\ LET Y1=Y+INT (RND*11)-5:\ IF (X1=X AND Y1=Y) OR X1<3 OR X1>14 OR Y1<3 OR Y1>14 THEN GO TO 19051915 IF NOT A(X1,Y1,1) THEN GO TO 19051920 LET X=X1:\ LET Y=Y1:\ GO SUB 150:'ACTUALIZA_MAPA LET FLAG=1:\ RETURN'###################################################################'MONSTER_ATTACK'###################################################################2000 GO SUB 550:'LIMPIA_WIN3 FOR N=1 TO M12012 IF D(N) THEN PRINT AT 17,0;"The ";m$(3 TO )'" sleeps on...":\ GO TO 20302015 LET A1=INT (RND*(3-PRO)+1):\ IF F(A1)=0 THEN GO TO 20152020 LET A=INT (RND*20+1):\ IF A>=19-Z(A1) THEN LET DAM1=INT (RND*M(2,T5)+1):\ PRINT AT 17,0;N$(A1);AT 18,0;"has been hit":\ LET F(A1)=F(A1)-DAM1:\ IF F(A1)<1 THEN PRINT AT 19,0;"and is dead":\ LET F(A1)=0:\ IF NOT F(1) AND NOT F(2) THEN LET PRO=02025 IF A<19-Z(A1) THEN PRINT AT 17,0;"The ";M$(3 TO )'"has missed ";N$(A1)2030 GO SUB 1:'PAUSE GO SUB 550:'LIMPIA_WIN3 NEXT N2032 IF F(3)=0 THEN GO TO 9600'LOSE2035 PRINT AT 20,1;"DO YOU WANT A STATUS REPORT?"2040 IF INKEY$<>"Y" AND INKEY$<>"N" THEN GO TO 20402045 IF INKEY$="N" THEN RETURN2050 GO SUB 1500:'REPORT IF NOT INIT THEN GO SUB 1323'ATTACK_MENU_CONT2499 RETURN'###################################################################'PLAYER_ATTACK'###################################################################2500 FOR N=1 TO 3:\ LET B(N)=1:\ IF N<>3 THEN GO TO 25152510 GO SUB 550:'LIMPIA_WIN3 PRINT AT 17,11;N$(N);AT 19,6;"U)se an item";AT 20,6;"I)ncant a spell";AT 21,6;"A)ttack with weapons"2511 LET K$=INKEY$:\ IF K$<>"A" AND K$<>"I" AND K$<>"U" GO TO 25112512 IF K$="I" THEN GO SUB 3000:'SPELLS IF K$="I" THEN GO TO 25352513 IF K$="U" THEN GO SUB 3500:'ITEMS IF K$="U" THEN GO TO 25352514 IF K$="Z" THEN GO SUB 550:'LIMPIA_WIN3 GO TO 25102515 IF F(N)=0 OR M1=1 THEN GO TO 25352516 GO SUB 550:'LIMPIA_WIN3 PRINT AT 17,11;N$(N);AT 19,0;"Which monster will you fight?"2520 LET K$=INKEY$:\ IF K$<"A" OR K$>CHR$ (M1+64) THEN GO TO 25202530 LET B(N)= CODE K$-642535 NEXT N:\ GO SUB 550'LIMPIA_WIN32600 FOR N=1 TO 3:\ IF F(N)=0 OR B(N)=0 THEN GO TO 26202602 IF U(B(N))>0 THEN LET A=INT (RND*20+1):\ IF A>=19-AC OR D(B(N)) THEN LET DAM1=INT (RND*G(N)+1):\ PRINT AT 17,0;N$(N)'"hits the ";M$(3 TO ):\ LET U(B(N))=U(B(N))-DAM1:\ IF U(B(N))<1 THEN PRINT AT 19,0;"and kills it":\ LET U(B(N))=0:\ LET EP=EP+M(3,T5):\ GO TO 26152605 IF U(B(N)) AND A<19-AC AND NOT D(B(N)) THEN PRINT AT 17,0;N$(N)'"misses the ";M$(3 TO )2615 GO SUB 1:'PAUSE2620 GO SUB 550:'LIMPIA_WIN3 NEXT N2625 LET L1=M1:\ FOR N=1 TO M1:\ IF U(N)<1 THEN LET M1=M1-1:\ LET U(N)=0:\ IF N<L1 THEN LET U(N)=U(N+1):\ LET D(N)=D(N+1)2630 NEXT N:\ IF M1=0 AND A(X,Y,3)<>0 AND (X=13 AND Y=14) OR (X=14 AND Y=7) THEN LET A(X,Y,3)=1:\ RETURN2635 IF NOT M1 THEN LET A(X,Y,3)=02640 RETURN'###################################################################'SPELLS'###################################################################3000 IF NOT S THEN GO SUB 550:'LIMPIA_WIN3 PRINT AT 19,0;"You don't have any spells!":\ BEEP .75,4:\ BEEP 1.5,-4:\ LET K$="Z":\ RETURN3010 GO SUB 550:'LIMPIA_WIN3 PRINT AT 19,0;"Enter spell command word":\ INPUT LINE I$\{f0}:\ FOR i=6 TO 1 STEP -1:\ IF I$=T$(I) THEN LET S=S-1:\ GO TO 30303020 NEXT I:\ PRINT AT 21,0;"You don't know that spell!":\ BEEP .75,4:\ BEEP 1.5,-4:\ LET K$="Z":\ RETURN3030 FOR I=I TO 5: LET T$(I)=T$(I+1): NEXT I: LET T$(6)=""3040 FOR I=1 TO 8: IF Y$(I)=I$ THEN GO SUB 550:'LIMPIA_WIN3 GO SUB 3090+10*I: GO SUB 1:'PAUSE LET B(3)=0: RETURN3050 NEXT I'###################################################################3100*PRINT AT 17,0;"Who do you wish to cure?",,"1) ";N$(1),,"2) ";N$(2),,"3) ";N$(3)3101 LET L$=INKEY$:\ IF L$<"1" OR L$>"3" THEN GO TO 31013102 GO SUB 550:'LIMPIA_WIN3 LET I=VAL L$:\ IF F(I)=0 OR F(I)=100 THEN PRINT AT 19,0;"You cast the spell but it has noeffect!":\ RETURN3103 LET f(i)=f(i)+INT (RND*50+1):\ IF f(i)>100 THEN LET f(i)=1003104 PRINT AT 17,0;N$(I)'"feels better...":\ RETURN'###################################################################3110*PRINT AT 17,0;"You cast the spell...":\ IF NOT M1 THEN RETURN3111 FOR I=1 TO M1: GO SUB 1:'PAUSE GO SUB 550:'LIMPIA_WIN3 IF INT (RND*4+1)=1 AND T5<>7 AND T5<>16 AND T5<>17 AND T5<>19 THEN LET D(I)=1:\ PRINT AT 18,0;"The ";M$(3 TO )'"falls asleep.": GO TO 31133112 PRINT AT 18,0;"The ";M$(3 TO )'"is unaffected."3113 NEXT I:\ RETURN'###################################################################3120*IF NOT M1 OR T5=7 OR T5=16 OR T5=17 OR T5=19 THEN PRINT AT 19,0;"You cast the spell but it has noeffect!": RETURN3121 LET M1=0:\ PRINT AT 17,0;"The enemy runs away!": RETURN'###################################################################3130*IF NOT M1 THEN GO TO 31353131 IF M1=1 THEN LET L$="A":\ GO TO 31343132 PRINT AT 17,11;N$(3);AT 19,0;"Against which monster? "3133 LET L$=INKEY$:\ IF L$<"A" OR L$>CHR$ (M1+64) THEN GO TO 31333134 GO SUB 550:'LIMPIA_WIN3 IF T5<>19 AND INT (RND*4+1)=1 THEN LET u( CODE L$-64)=0:\ LET EP=EP+M(3,T5):\ PRINT AT 17,0;"The ";M$(3 TO )'"dies.":\ RETURN3135 PRINT AT 17,0;"The spell has no effect.":\ RETURN'###################################################################3140*IF F(1) OR F(2) THEN LET PRO=13141 PRINT AT 17,0;"You cast the spell...":\ RETURN'###################################################################3150*LET S2=S2-1:\ IF A(X,Y,1)<>6 THEN PRINT AT 17,0;"The spell has no effect!":\ RETURN3151 PRINT AT 17,0;"A door appears...":\ LET A(X,Y,1)=7:\ RETURN'###################################################################3160*LET S2=S2-1:\ IF NOT M1 THEN GO TO 31653161 IF M1=1 THEN LET L$="A":\ GO TO 31643162 PRINT AT 17,11;N$(3);AT 19,0;"Against which monster? "3163 LET L$=INKEY$:\ IF L$<"A" OR L$>CHR$ (M1+64) THEN GO TO 31633164 GO SUB 550:'LIMPIA_WIN3 IF T5<>19 THEN LET u( CODE L$-64)=0:\ LET EP=EP+M(3,T5):\ PRINT AT 17,0;"The ";M$(3 TO )'"dies.":\ RETURN3165 PRINT AT 17,0;"The spell has no effect!":\ RETURN'###################################################################3170*LET S2=S2-1:\ PRINT AT 17,0;"The fireball explodes!":\ FOR i=1 TO m1:\ IF T5<>19 THEN LET u(i)=U(I)-INT (RND*100+1):\ IF U(I)<=0 THEN GO SUB 1:'PAUSE GO SUB 550:'LIMPIA_WIN3 LET U(I)=0:\ LET EP=EP+M(3,T5):\ PRINT AT 17,0;"The ";M$(3 TO )'"dies."3171 NEXT I:\ RETURN'###################################################################'ITEMS'###################################################################3500 DIM J$(14):\ GO SUB 550:'LIMPIA_WIN3 IF NOT P THEN PRINT AT 19,0;"You don't have any items!":\ BEEP .75,4:\ BEEP 1.5,-4:\ LET K$="Z":\ RETURN3510 PRINT AT 19,0;"Enter item you wish to use.":\ INPUT LINE J$\{f0}:\ FOR i=6 TO 1 STEP -1:\ IF J$=P$(I) THEN LET P=P-1:\ LET P$(I)="":\ GO TO 35303520 NEXT i:\ PRINT AT 21,0;"You don't have one of those!":\ BEEP .75,4:\ BEEP 1.5,-4:\ LET K$="Z":\ RETURN3530 FOR I=I TO 5:\ LET P$(I)=P$(I+1):\ NEXT I:\ LET P$(6)=""3540 FOR I=1 TO 8:\ IF h$(I)=J$ THEN GO SUB 550:'LIMPIA_WIN3 GO SUB 3590+10*I: GO SUB 1:'PAUSE LET B(3)=0: RETURN3550 NEXT I'###################################################################3600*PRINT AT 17,0;"Administer potion to whom?",,"1) ";N$(1),,"2) ";N$(2),,"3) ";N$(3)3601 LET L$=INKEY$:\ IF L$<"1" OR L$>"3" THEN GO TO 36013602 GO SUB 550:'LIMPIA_WIN3 LET I=VAL L$:\ IF F(I)=0 OR F(I)=100 THEN PRINT AT 19,0;"It has no effect!":\ RETURN3603 LET f(i)=f(i)+50:\ IF f(i)>100 THEN LET f(i)=1003604 PRINT AT 17,0;N$(I)'"feels better...":\ RETURN3610*PRINT AT 17,0;"The vial explodes!":\ FOR i=1 TO m1:\ LET u(i)=U(I)-INT (RND*50+1):\ IF U(I)<=0 THEN GO SUB 1:'PAUSE GO SUB 550:'LIMPIA_WIN3 LET U(I)=0:\ LET EP=EP+M(3,T5):\ PRINT AT 17,0;"The ";M$(3 TO )'"dies."3611 NEXT I:\ RETURN'###################################################################3620*PRINT AT 17,0;"You can't use it at present.":\ LET P$(P+1)=H$(3):\ LET P=P+1:\ RETURN'###################################################################3630*IF A(X,Y,1)<>7 THEN PRINT AT 17,0;"You can't use it at present.":\ LET P$(P+1)=H$(4):\ LET P=P+1:\ RETURN3631 FOR Q=1 TO 6:\ PRINT AT Q,0;O$:\ NEXT Q:\ PRINT AT 0,0;"INSIDE ";A$(A(X,Y,2))'"YOU SEE THE MACE OF INTERNAL POWER DEFENDED BY ";B$(10)3632 LET M$=B$(10):\ LET AC=M(1,10):\ LET DAM=M(2,10):\ LET T5=19:\ LET M1=1:\ GO SUB 1309'COMBAT_CHECK&INPUT_CONT3633 CLS :\ PRINT AT 7,3; FLASH 1;"TOTAL SUCCESS!";AT 9,0;"You have saved TALLYRON. The Council of Evil is defeated.\{f0}":\ STOP3999 RETURN'###################################################################'PIECE_METAL'###################################################################4000 PRINT AT 13,0;"You have found a piece of metal."''"Do you wish to take it?"4010 LET I$=INKEY$:\ IF I$<>"Y" AND I$<>"N" THEN GO TO 40104020 IF I$="N" THEN GO SUB 500:'BAR+LIMPIA_WIN2 GO TO 1400'MOVE_MENU&INPUT_(MOV+COMBAT)4030 IF p=6 THEN GO SUB 500:'BAR+LIMPIA_WIN2 PRINT AT 17,0;"You can't carry any more!":\ GO SUB 1:'PAUSE GO SUB 500:'BAR+LIMPIA_WIN2 GO TO 1400'MOVE_MENU&INPUT_(MOV+COMBAT)4040 FOR Q=1 TO 1:\ FOR I=1 TO 1:\ LET P$(P+1)=H$(3):\ LET P=P+1:\ LET MET=MET+1:\ IF MET=3 THEN FOR I=1 TO P:\ IF P$(I)=H$(3) THEN FOR Q=I TO 5:\ LET P$(Q)=P$(Q+1):\ LET I=04050 NEXT Q:\ IF MET=3 THEN LET P$(6)=""4060 NEXT I:\ IF MET=3 THEN LET P=P-2:\ LET P$(P)=H$(4)4070 LET A(X,Y,3)=0:\ GO TO 500'BAR+LIMPIA_WIN2'###################################################################'HERMIT'###################################################################4500 PRINT AT 13,0;"You see a hermit who offers to sell you a piece of metal for the outrageous price of 100 goldpieces."''"Do you accept? (Y or N)"4510 LET I$=INKEY$:\ IF I$<>"Y" AND I$<>"N" THEN GO TO 45104520 IF I$="N" THEN GO SUB 500:'BAR+LIMPIA_WIN2 GO TO 1400'MOVE_MENU&INPUT_(MOV+COMBAT)4530 IF GP<100 THEN GO SUB 9500:'CANT_AFFORD GO SUB 500:'BAR+LIMPIA_WIN2 GO TO 1400'MOVE_MENU&INPUT_(MOV+COMBAT)4540 IF p=6 THEN GO SUB 500:'BAR+LIMPIA_WIN2 PRINT AT 17,0;"You can't carry any more!":\ GO SUB 1:'PAUSE GO SUB 500:'BAR+LIMPIA_WIN2 GO TO 1400'MOVE_MENU&INPUT_(MOV+COMBAT)4550 LET GP=GP-100:\ GO TO 4040'###################################################################'DOOR'###################################################################5000 PRINT AT 17,0;"You see a door.":\ GO SUB 1:'PAUSE GO TO 550'LIMPIA_WIN3'###################################################################'INIT_VARS'###################################################################8000 DIM B(3):\ LET MET=0:\ LET PRO=0:\ LET o$=" ":\ POKE 23658,8:\ LET X1=0:\ LET Y1=0'###################################################################8015 DIM F(3):\ FOR N=1 TO 3:\ LET F(N)=100:\ NEXT N'###################################################################8020 DIM Z(3):\ FOR N=1 TO 3:\ LET Z(N)=10:\ NEXT N'###################################################################8025 DIM D$(3,14):\ DIM E$(3,14):\ FOR N=1 TO 3:\ LET D$(N)="None":\ LET E$(N)="None":\ NEXT N8030 DIM P$(6,14):\ DIM S$(6,14):\ DIM T$(6,4):\ LET P=0'###################################################################8040 DIM H$(4,14):\ DIM H(4):\ LET H$(1)="HEALING POTION":\ LET H$(2)="VIAL OF FIRE":\ LET H$(3)="PIECE OF METAL":\ LET H$(4)="A KEY":\ LET H(1)=100:\ LET H(2)=1008045 DIM J(3):\ DIM K(3):\ DIM G(3)'###################################################################8050 LET S2=0:\ LET S=0:\ RESTORE 8055:\ DIM X$(8,14):\ DIM Y$(8,4):\ FOR N=1 TO 8:\ READ X$(N):\ READ Y$(N):\ NEXT N8055 DATA "Heal","SOTH","Sleep","TSUD","Fear","GERT","Stun","KRAC","Protection","SHEE","Dispel Magic","KEAR","Kill","MORT","Lightning Ball","BOOM"'###################################################################8060 DIM V$(9,11):\ FOR N=1 TO 9:\ READ V$(N):\ NEXT N8065 DATA "A Balrog","A Snake","A Giant Rat","A Troll","A Wolf","An Orc","A Zombie","A Skeleton","A Troll"'###################################################################8070 DIM M(4,19):\ FOR C=1 TO 4:\ FOR N=1 TO 19:\ READ M(C,N):\ NEXT N:\ NEXT C8075 DATA 0,9, 2, 4,10, 4, 7, 3, 7, 2,10, 8, 6, 7, 7, 9, 7, 6, 0, 0,0,100, 40,10, 40,20, 80,35,100,10,10, 40,20,35,30,20, 40,150, 0,0,250, 75,20, 75,30,150,35,250,20,25, 60,25,35,30,30, 60, 0, 0,0,500,100, 0,100, 0,300,50,300, 0, 0,100, 0,50, 0, 0,250, 0'##################################################################'TIPOS DE ESCENARIO'##################################################################8082 DIM A$(17,26):\ FOR N=1 TO 17:\ READ A$(N):\ NEXT N8083 DATA "THE PLAINS OF MERE","THE GREAT FOREST","THE MOUNTAINS OF SUNSET", "THE PLAINS OF LOST","THE FOREST OF DARKNESS","THE MOUNTAINS OF DISASTER", "THE PLAINS OF HOME","THE MARSHES OF DAWNING","THE VILLAGE OF TAUTREE", "THE VILLAGE OF TROCK","THE VILLAGE OF DHOVILLE","LOST TOWN", "THE VILLAGE OF SEAVILLE","THE CAVE OF THE BALROG","THE CAVE OF THE ORCS", "THE CAVE OF THE VORTEX","THE CASTLE OF FEAR"'###################################################################'DATA DE FUNCIÓN DESCONOCIDA8084 DATA "","A Hermits Hut","A Balrog","A Giant Spider","A Snake", "A Giant Crab","A Skeleton","A Manticore","An Orc","A BLACK KNIGHT"8085 DIM B$(10,14):\ FOR N=1 TO 10:\ READ B$(N):\ NEXT N'###################################################################8086 DATA "Heavy Cloak","Leather Armour","Chain Mail","Splint Mail", "Plate Mail","Plate Armour"8087 DIM Q$(6,14):\ FOR N=1 TO 6:\ READ Q$(N):\ NEXT N'###################################################################8088 DATA 25,40,130,200,400,5000, 9, 6, 4, 3, 2, 08089 DIM Q(2,6):\ FOR C=1 TO 2:\ FOR N=1 TO 6:\ READ Q(C,N):\ NEXT N:\ NEXT C'###################################################################8090 DATA "Dagger","Sabre","Mace","Sword","Battle Axe","2 Handed Sword"8091 DIM W$(6,14):\ FOR N=1 TO 6:\ READ W$(N):\ NEXT N'###################################################################8092 DATA 20,40,60,80,125,200, 20,50,60,80,100,1508093 DIM W(2,6):\ FOR C=1 TO 2:\ FOR N=1 TO 6:\ READ W(C,N):\ NEXT N:\ NEXT C'###################################################################8096 DATA 16,7,17,1,144,144, 16,4,17,7,145,145, 16,4,17,0,146,146, 16,2,17,6,147,147, 16,0,17,7,148,148, 16,4,17,6,149,149, 16,0,17,6,150,150, 16,0,17,6,150,1508097 DIM C$(8,6):\ FOR X=1 TO 8:\ FOR Y=1 TO 6:\ READ N:\ LET C$(X,Y)=CHR$ N:\ NEXT Y:\ NEXT X'###################################################################8098 LET FLAG=0:\ LET M1=0:\ LET G$="":\ LET x=7:\ LET y=10:\ LET GP=INT (RND*300+301):\ LET EP=0'###################################################################8895 CLS :
PRINT AT 18,0;"NEW GAME"8900 DIM N$(3,10):\ INPUT AT 0,0;"Enter your characters name"' LINE n$(3)8965 PRINT AT 20,6;N$(3)8970 PRINT AT 21,6;"IS THIS CORRECT?"8975 IF INKEY$<>"N" AND INKEY$<>"Y" THEN GO TO 89758980 IF INKEY$="N" THEN PRINT AT 20,0;o$;O$:\ GO TO 89008982 LET N$(1)="KARL":\ LET N$(2)="MARC"8999 RETURN'###################################################################'BUY_WEAPON'###################################################################9100*LET FL=0:\ GO SUB 500:'BAR+LIMPIA_WIN2 PRINT AT 8,5;"YOU MAY BUY : GP's";:\ GO SUB 510:'GOLD PRINT AT 9,6;9115 PRINT TAB 2;"0) Nothing";TAB 20;": 0":\ IF I=3 THEN LET T=1:\ GO TO 91259120 LET T=69125 FOR N=1 TO T:\ PRINT TAB 2;N;") ";W$(N);" :";TAB 22;W(1,N):\ NEXT N9130 LET I$=INKEY$:\ IF CODE I$>T+48 OR I$<"0" THEN GO TO 91309137 IF I$="0" THEN RETURN9140 IF D$(I,1)<>"N" THEN GO SUB 9400:'TRADE_IN_WEAPON GO SUB 510'GOLD9142 IF FL=1 THEN GO TO 91009145 LET D=VAL I$9150 IF W(1,D)>GP THEN GO SUB 9500:'CANT_AFFORD GO TO 91009155 LET J(I)=W(1,D):\ LET G(I)=W(2,D):\ LET GP=GP-J(I):\ LET D$(I)=W$(D):\ RETURN9199 RETURN'###################################################################'BUY_ARMOUR'###################################################################9200*LET FL=0:\ GO SUB 500:'BAR+LIMPIA_WIN2 PRINT AT 8,5;"YOU MAY BUY : GP's":\ GO SUB 510:'GOLD PRINT AT 9,6;9215 PRINT TAB 2;"0) Nothing";TAB 20;": 0":\ IF I=3 THEN LET T=1:\ GO TO 92259220 LET T=69225 FOR N=1 TO T:\ PRINT TAB 2;N;") ";Q$(N);" :";TAB 22;Q(1,N):\ NEXT N9230 LET I$=INKEY$:\ IF CODE I$>T+48 OR I$<"0" THEN GO TO 92309237 IF I$="0" THEN RETURN9240 IF E$(I)(1)<>"N" THEN GO SUB 9450:'TRADE_IN_ARMOR GO SUB 510'GOLD9242 IF FL=1 THEN GO TO 92009245 LET E=VAL I$9250 IF Q(1,E)>GP THEN GO SUB 9500:'CANT_AFFORD GO TO 92009255 LET K(I)=Q(1,E):\ LET GP=GP-K(I):\ LET E$(I)=Q$(E):\ LET Z(I)=Q(2,E):\ RETURN9299 RETURN'###################################################################'BUY_OTHER'###################################################################9300*IF P=6 THEN LET G$="ITEMS":\ GO SUB 9550:'MAX_ALLOWED RETURN9310 GO SUB 500:'BAR+LIMPIA_WIN2 PRINT AT 8,5;"YOU MAY BUY : GP's":\ GO SUB 510:'GOLD PRINT AT 11,0;9315 PRINT TAB 2;"0) NOTHING";TAB 20;": 0":\ FOR N=1 TO 2:\ PRINT TAB 2;N;") ";H$(N);" :";TAB 22;H(N):\ NEXT N9325 LET I$=INKEY$:\ IF I$<"0" OR I$>"2" THEN GO TO 93259330 IF I$="0" THEN RETURN9335 LET L=VAL I$:\ IF GP>=H(L) THEN LET P$(P+1)=H$(L):\ LET GP=GP-H(L):\ LET P=P+1:\ GO TO 93009345 GO SUB 9500:'CANT_AFFORD GO TO 9300'###################################################################'TRADE_IN_WEAPON'###################################################################9400*GO SUB 500:'BAR+LIMPIA_WIN2 PRINT AT 8,10;"TRADE IN";AT 10,0;"To buy this item you must trade in your ";D$(I); AT 13,0;"I'll give you ";INT (\{f0}J(I)/2);" Gold Pieces";AT 15,0; "Will you accept? (Y or N)"9410 IF INKEY$<>"Y" AND INKEY$<>"N" THEN GO TO 94109415 IF INKEY$="N" THEN LET FL=1:\ RETURN9420 LET D$(I)="None":\ LET GP=GP+INT (J(I)/2):\ RETURN'###################################################################'TRADE_IN_ARMOR'###################################################################9450 GO SUB 500:'BAR+LIMPIA_WIN2 PRINT AT 8,10;"TRADE IN";AT 10,0;"To buy this item you must trade in your ";E$(I); AT 13,0;"I'll give you ";INT (K(I)/2);" Gold Pieces"; AT 15,0;"Will you accept? (Y or N)"9460 IF INKEY$<>"Y" AND INKEY$<>"N" THEN GO TO 94609465 IF INKEY$="N" THEN LET FL=1:\ RETURN9470 LET Z(I)=10:\ LET E$(I)="None":\ LET GP=GP+INT (K(I)/2):\ RETURN'###################################################################'CANT_AFFORD'###################################################################9500 GO SUB 500'BAR+LIMPIA_WIN29510 PRINT AT 14,4; FLASH 1;" You can't afford it "9515 GO SUB 9555:'PRESS_ENTER_MSG PRINT AT 14,0;O$:\ RETURN'###################################################################'MAX_ALLOWED'###################################################################9550 GO SUB 500:'BAR+LIMPIA_WIN2 PRINT AT 12,6;"YOU HAVE SIX ";G$9555 PRINT AT 21,3;"PRESS <ENTER> TO CONTINUE" #PRESS_ENTER_MSG9560 IF INKEY$<>CHR$ 13 THEN GO TO 95559565 PRINT AT 21,0;O$:\ RETURN'###################################################################'LOSE'###################################################################9600 CLS :\ PRINT AT 9,11;N$(3):\ PRINT "CHOSEN WIZARD OF TALLYRON"''"YOU DIED WITHOUT COMPLETING YOURQUEST!":\ STOP
Como se puede ver, tenemos varios saltos calculados:
1835 GO SUB 9000+VAL I$*100
salta a 9100-9200-9300, no hay RETURNs extra, no se puede salir del rango
en este bloque hay sin embargo RETURNs extras en 9199 y 9299, sin función
creo ver un bug en la línea 1825:
IF I$<"0" OR I$>"4" OR (I$="4" AND I<>3) THEN GO TO 1825
esto significa que si pulsamos 4 al comerciar con el protagonista, salta a 9400, donde no está
previsto que llegue realmente. No hay opción cuatro en ningún menú. Si comerciamos con los
otros dos personajes, resulta que podemos pulsar 3 y nos lleva al menú de Items (9300).
Voy a modificar la línea tal que así:
IF I$<"0" OR I$>"3" OR (I$="3" AND I<>3) THEN GO TO 1825
Ahora funciona correctamente.
3040 GO SUB 3090+10*I
salta a 3100-3110-3120-3130-3140-3150-3160-3170, no hay RETURNs extra
aparentemente no puede cumplirse N>8
3540 GO SUB 3590+10*I
salta a 3600-3610-3620-3630, hay un RETURN extra en 3999, no tengo clara su función,
si podría ser que la variable "I" nunca llegara a valer 5 (línea 3640) o superiores
A los citados RETURN extra les vamos a plantar un STOP para ver si en alguna ocasión llegan a ser usados.
Como comenté en la anterior entrada (Nota 1), se puede mover aquí la presentación y la definición de los UDG, reduciendo algo el tamaño del fichero principal y mejorando algunos aspectos de la jugabilidad del juego (incluyendo un menú inicial de opciones, por ejemplo).
Vamos a darle un vistazo y un repaso profundo al programa cargador que viene en la versión distribuida en cinta y que podemos ver en la imagen de la derecha.Realmente, del listado original solo vamos a usar la línea 1000, todas las demás nos sobran.
Examinado el programa, veo que los autores usan los UDG para construir un sistema de primitivos tiles, junto a un ingenioso tilemapper en BASIC.
Los caracteres libres, si confirmo que no se usan en absoluto, podrían ser útiles para pequeños gráficos.
De cara a mejoras posibles futuras, una puramente visual y que no comporta mucha complicación es usar una fuente de texto que no sea la estándar del sistema. He buscado por ahí una fuente de texto alternativa, eso siempre mejora la presentación de un programa.La fuente la he sacado de PD Mountain Fonts, es la imagen de la derecha. En fondo rojo he marcado los caracteres que son usados en los textos del programa, en verde los que aparentemente no se usan.
Los UDG, definidos con el GO SUB 6000 del programa cargador, son como se ven a la derecha. Emplea sólo 7 UDG, y con ellos crea los 8 tiles de 2x2 que en la imagen se ven debajo del los UDG (el marco magenta lo he puesto solo para hacer bonito). Los 8 tiles son: 0-Mar
1-Pradera
2-Bosque
3-Ciudad
4-Montañas
5-Campo
6-Castillo
7-Castillo (2)
Las dimensiones 2 y 3 las vemos en las imágenes que hay debajo, ya las analizaré más adelante:
El tilemapper está basado la interacción de varias matrices. La principal es la matriz A(16x16x3), que almacena en A(X,Y,1) el mapa que se ve a la derecha. En la subrutina que imprime el mapa, se almacena en C el valor de A(X,Y,1), y se imprimen los gráficos con PRINT C$(C+1). En la matriz C$(8x6) están almacenados los 8 tiles con sus atributos de color (con una correspondencia +1 con respecto al número del tile en A). A continuación almacena en C el valor de A(X,Y,2,) e imprime A$(C). La matriz A$(17x26) almacena 17 textos de 26 caracteres, que son los que identifican el lugar tras el mensaje "Estás en..." durante el juego. La dimensión 1 de la matriz A es usada también en el bucle del movimiento, comprobando si el tile al que se salta es 0 responde "No puedes ir al mar", y podemos ver que también es consultada en varias otras ocasiones con diferentes funciones (el tile 6 del mapa es cambiado a 7 si en esa localización empleamos un hechizo, y ese valor es consultado también en el bucle de movimiento para imprimir o no el mensaje "Ves una puerta", por poner un ejemplo).
Para las siguientes versiones, vamos a eliminar la definición de los UDG del programa cargador. Lo que vamos a hacer es simplemente salvar los UDG como un fichero, y luego los cargamos directamente (desde el fichero "DISK").
La fuente la podemos cargar justo delante de los UDG, de esta manera, podremos más tarde salvar fuentes+UDG en un solo fichero y cargarlo a posteriori en un solo paso.
De momento, en esta Nota 2, lo vamos a dejar así.