Código fuente original comentado de "The Wizard of Tallyron":
0 DEF FN t(s)=USR 65323: DEF FN k(l)=USR 64985: DEF FN c(l,m)=USR 64898: DEF FN i(s$,r$)=USR 64668: DEF FN s(o,s$)=USR 64425: DEF FN b(s,f,n)=USR 64240: DEF FN d(s,f)=USR 64194: DEF FN r(s,f,n,i)=USR 63384: DEF FN h(o,s)=USR 63279: DEF FN l(l)=USR 62775: DEF FN v(o)=USR 62847: DEF FN m(o)=USR 62469 1 REM 2 REM 3 REM 4 REM The Wizard of Tallyron by Mike Turner & the Star Dreams team. *STAR DREAMS 1986 For the background
story you require a
copy of Computer & Video Games magazine
April 1986
Las líneas superiores solo aparecen en la versión distribuida en cinta. La larga serie de funciones
definida en la línea 0 nos indica que los autores emplearon alguna de las muchas utilidades existentes
para extender el editor BASIC con ayudas para el programador y luego se olvidaron de eliminar la línea,
que resulta del todo inútil. El resto del código es igual en el listado publicado y en el distribuido en cinta:
5 LET X=7: LET Y=10 6 INK 0: #PUNTO DE ARRANQUE (TALLYSON) PAPER 7: CLS : PRINT AT 10,0;"DATA IS LOADING" 8 LOAD "MAP" DATA A() 9 PRINT : PRINT "PLEASE WAIT" 10 GO TO 1000'INIT'###################################################################'LIMPIA_WIN1'################################################################### 100 FOR N=2 TO 5: PRINT AT N,6;O$(6 TO 31): NEXT N: RETURN'###################################################################'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 FOR Q=1 TO 100: NEXT Q: 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 FOR Q=1 TO 100: NEXT Q: 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 GO TO 100'LIMPIA_WIN1 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 GO SUB 6000'SET_UDG #PUNTO DE ARRANQUE (TALLYSON_S)1020 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'###################################################################1099 REM \{vi} Village Options \{vn}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 CLS : PRINT "Ready tape,then press any key": PAUSE 4E4: SAVE "tallyron" LINE 1010: BEEP 1,1: RETURN'###################################################################'COMBAT_CHECK&INPUT'###################################################################1299 REM \{vi} Combat \{vn}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 RETURN1315 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!": FOR Q=1 TO 100: NEXT Q: 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 REM \{vi} Fight or Run \{vivn}1361 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 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)'###################################################################1399 REM \{vi} Move \{vn}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'###################################################################1499 REM \{vi} Report \{vn}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'###################################################################1599 REM \{vi} Healer \{vn}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 REM \{vi} Resurrection \{vn}1685 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'###################################################################1699 REM \{vi} Magicians Guild \{vn}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'###################################################################1799 REM \{vi} Trading Post \{vn}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'###################################################################1899 REM \{vi} Run \{vn}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 REM \{vi} Monsters Attack \{vn}2010 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 FOR Q=1 TO 100: NEXT Q: 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 REM \{vi} Players Attack \{vn}2505 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 FOR Q=1 TO 100: NEXT Q2620 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: FOR Q=1 TO 100: NEXT Q: 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:\ FOR Q=1 TO 100:\ NEXT Q:\ 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 FOR Q=1 TO 100: NEXT Q: 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\: FOR Q=1 TO 100: NEXT Q: 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 FOR Q=1 TO 100: NEXT Q: 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!":\ FOR Q=1 TO 100:\ NEXT Q:\ 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!":\ FOR Q=1 TO 100:\ NEXT Q:\ 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.": FOR Q=1 TO 100: NEXT Q: GO TO 550'LIMPIA_WIN3'###################################################################'SET_UDG'###################################################################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'###################################################################'INIT_VARS'###################################################################7999 REM \{vi} Set up \{vn}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'###################################################################'UDG'###################################################################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,1248095 GO SUB 6000:'SET_UDG PAPER 0: INK 7'###################################################################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=08099 REM \{vi} Instructions\{vn}8100 BORDER 0: 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. When this is done, the whole game is saved making it unnecessary to load the original version beforehand."8870 PRINT AT 21,0;"ANY KEY TO START"8880 IF INKEY$="" THEN GO TO 88808890 IF INKEY$="Y" THEN GO TO 81008895 PRINT AT 20,0;O$;AT 21,0;O$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"8996 CLS : GO SUB 150'ACTUALIZA_MAPA8999 RETURN'###################################################################'BUY_WEAPON'###################################################################9100* REM \{vi} Buy Weapons \{vnvn}9110 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* REM \{vi} Buy Armour \{vnvn}9210 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* REM \{vi} Buy Other Items \{vnvn}9305 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 REM \{vi} Trade in weapon \{vivn}9405 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 REM \{vi} Trade in armour \{vivn}9455 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 REM \{vi} Can't Afford It \{vn}9505 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 REM \{vi} Max Allowed \{vn}9552 GO SUB 500:'BAR+LIMPIA_WIN2 PRINT AT 12,6;"YOU HAVE SIX ";G$9554 REM \{vi} Press Return \{vn}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 REM \{vi} Lose \{vn}9605 CLS : PRINT AT 9,11;N$(3): PRINT "CHOSEN WIZARD OF TALLYRON"''"YOU DIED WITHOUT COMPLETING YOURQUEST!":\ STOP
Las líneas 9996 y siguientes solo son usadas por el programador; como con la línea 0, se olvidaron
de eliminarlas y son del todo inútiles:
9996 ERASE "m";1;"TALYMASTER"9997 SAVE *"m";1;"TALYMASTER" LINE 99989998 CLOSE #2: INK 0: PAPER 7: CLS : PRINT "Ready to save main program and data. Press any key"9999 PAUSE 0: CLEAR : SAVE "tallyron" LINE 6: BEEP 1,2: LOAD *"M";1;"MAP" DATA A(): SAVE "MAP" DATA a()
Posibles mejoras del código:
Las líneas marcadas en fondo azul con tinta magenta (y también con tinta blanca) son líneas que se pueden omitir del código sin que afecte al programa. Ya he comentado el caso de las líneas 0, 1, 2, 3, 4, 9996, 9997, 9998 y 9999. Deberían haber sido eliminadas del código fuente, ahorrando unos pocos byes.
Todos los REMs deben también salir fuera, eso es bastante elemental en un programa en BASIC. Hay algunos REMs (línea 1680 por ejemplo) están colocados en la línea destino de un salto (GOTO/GOSUB), por lo que podemos mover la línea siguiente a esta posición.
Los otros tres casos son las líneas 5, 1310 y 8890, que aparentemente podrían ser gazapos. Por una de ellas no pasa el flujo del programa en ningún momento (línea 5), en otra pasa el flujo pero jamás puede complirse su condición (IF M1=0, línea 1310), y la tercera parece no tener ningún sentido (línea 8890). De momento las voy a poner en cuarentena con STOPs.
En el apartado de correcciones, una veo necesaria en la parte que atañe el salvar una partida y luego continuar en otro momento el juego desde el punto en el que la última vez lo guardamos. Es original, lo de salvar todo el programa con sus variables y luego volverlo a cargar con otra línea de arranque. Singular. Pero si cargamos la "partida", nos encontramos con una reentrada un poco chusca, sin haber puesto el BORDER, PAPER, etc. bien ni nada, sin mostrar tampoco el gráfico. Si examinamos el código, vemos que el arranque standar en la línea 1000 salta a 8000 (INIT_VARS), donde salta a 6000 (SET_UDG), pone los atributos, hace un CLS, salta a 150 (ACTUALIZA_MAPA) y retorna a 1010, donde de nuevo salta a 6000 (SET_UDG). Es obvio que esto es redundante e innecesario, dado que en la versión distribuída en cinta, hay un cargador previo (un pequeño programa en BASIC) que establece los atributos, carga una pantalla SCREEN$ de presentación y carga el programa principal. Podemos a eliminar las llamadas a SET_UDG y ACTUALIZA_MAPA desde INIT_VARS y a añadirlas a la línea 1010. La declaración de atributos se puede borrar y añadir una opción al programa inicial cargador para arrancar el programa como nueva partida o cargar la última partida guardada, de manera que ambas versiones arranquen desde aqllí con los atributos ya establecidos. De hecho se podrían también mover las instrucciones (línea 8100) y la subrutina SET_UDG al programa cargador.
Los bucles FOR/NEXT marcados en naranja son simples pausas que podemos sacar a un GOSUB y ahorrar algunos pocos bytes sin afectar de manera perjudicial al programa.
La subrutina en la línea 100 (LIMPIA_WIN1) sólo es llamada una vez (en la línea 177), es innecesaria como SUB, podemos ponerla directamente en la línea 177.
De momento voy a trabajar con esta versión modificada para comprobar que no hay ningún fallo extraño a partir de los cambios introducidos.