ランダムRPG ニルナ・ノーグ

ベーマガの投稿作品は「作者本人であること」「非営利であること」「転載元を明記すること」という条件をクリアすればwebで公開することができます。なので、公開してみました。

「ニルナ・ノーグ」は、マップや名前、敵の形状、攻撃パターンまですべて乱数で展開するという変わったRPGです。
乱数なので何度でも遊べます。
対応機種はシャープのX1です(turboではない)。

誤植のせいで誌面どおりに打ち込んでも動かないという悲劇の作品でしたが、17年ぶりにリベンジできて良かったです。

転載元:電波新聞社マイコンBASICマガジン」 1991年5月号
題名:X1用「ランダムRPG ニルナ・ノーグ」


▲画面構成です。
左がマップです。右上の三角形が主人公です。
テンキーで移動(8で前進、4or6で方向転換)/選択。
スペースキーでキャンプ/決定です。

▲キャンプ中の画面。食事することができます。
集めるべき「7つの秘宝」が表示されています。
たとえば、「SHOES」があるとマップを長距離に移動できるようになります。
「BANGLE」があると壁を押して動かすことができるようになります。
「ARMOR」があると攻撃をはね返すことができるようになります。
残りは実際にやってみてください。

▲「引き算の館」。計算問題の早押しに正解すると賞金がもらえます。

▲武器屋です。

▲食料を買うお店です。
店によって価格の差がありますので、別の店で売れば差額で儲けることもできます。

▲「7つの秘宝」のうちの一つ「MIRROR」を入手したときの様子。
マップのマスクが外れました。

▲ラスボスです。
秘宝の「JEWEL」がないと攻撃が当たりません。
一見弱そうですが、簡単などんでんがえしがあります。


▼プログラムリスト
(コードをすべてASCIIに書き直しました。メッセージを英語表示に書換えました)

10 POKE &H01A2,&HB7
20 '+----------------------------------------------------+
30 '|  RANDOM RPG NIRUNA-NORG BY TAKUYA MATSUBARA        |
35 '|   FROM(ORIGINAL) MICOM BASIC MAGIZINE 1991/5       |
40 '+----------------------------------------------------+
50 DEFINT A-Z:WIDTH 80:PALET:TEMPO500
51 C$=CHR$(&H0D):'CR
52 R$=CHR$(&H1C):'CURSOR RIGHT
53 L$=CHR$(&H1D):'CURSOR LEFT
54 U$=CHR$(&H1E):'CURSOR UP
55 D$=CHR$(&H1F):'CURSOR DOWN
56 F$=CHR$(&H87):'FILL BOX
60 N=0:FOR I=1 TO 4:READ H$(I),X(I),Y(I):NEXT
70 DATA "NORTH",0,-1,"EAST",1,0,"SOUTH",0,1,"WEST",-1,0
80 LINE(32,32)-(231,159),PSET,1,BF
90 COLOR1:LINE(34,0)-(79,24),F$,BF:LINE(6,5)-(26,18),F$,BF
100 COLOR7:CONSOLE 0,25,0,80:LOCATE 38,7:PRINT "YOU ";SPC(35)
110 LINE(48,40)-(215,151),PSET,0,BF
120 LINE(369,31)-(376,24)-(383,31)-(369,31)
130 GOSUB"C2":PRINT C$;R$;"RANDOM RPG";D$;"'NIRUNA-NORG'";C$;R$;"FOR X1 BY T.MATSUBARA";C$
140 LINE(36,18)-(77,22),F$,B:B$="EASY,NORMAL,HARD":GOSUB "#"
150 PRINT C$;C$;"----------MISSION";C$;"SEVEN TREASURE "
160 FOR I=1 TO7:GOSUB"/":A$=MID$("BANGLESWORD MIRRORARMOR AMULETSHOES JEWEL ",I*6-5,6)+" OF "+T$:PRINT " ";A$:I$(I)=A$:NEXT
170 GOSUB"/":O$=T$:PRINT "YOUR MISSION FINDS OUT A TREASURE, AND KILL A KING ";O$;"!";C$
180 CFLASH1:PRINT"NOW MAKING MAP(PLEASE WAIT).";:CFLASH:R=900:D=1
190 '----------------------------MAP
200 D=D-1:IF D THEN220
210 D=S*3:C=RND+S:X=INT(RND*38)*4+48:Y=INT(RND*55)*2+38:IF POINT(X,Y) THEN210
220 LINE(X,Y)-(X,Y),PSET,C
230 I=INT(RND*4)+1:IF ABS(A-I)=2 THEN230 ELSE A=I
240 X=X+X(A)*4:Y=Y+Y(A)*2
250 Z=POINT(X,Y):IF Z THEN IF Z=1 THEN210 ELSE200
260 LINE-(X,Y),PSET,C:R=R-1:IF R GOTO230
270 FOR R=0 TO 1:FOR I=1 TO 7
280 X=INT(RND*60)*2+70:Y=RND*80+60:IF POINT(X,Y) THEN280
290 PSET(X,Y,R+6):PSET(X+1,Y,I):NEXT:NEXT
300 LINE(X-4,Y-2)-(X+4,Y+2),PSET,4,B:PSET(130,136,5)
310 FD=5:ST=7:S$="UNARMED":K=10:F(0)=7
320 FOR I=1 TO7:F(I)=0:NEXTI
330 FD=FD+1:X=130:Y=135:A=1:HP=30:B=1:GOSUB"@"
340 FOR I=1 TO 15:PRINT:NEXT:GOTO410
350 LABEL "$":'----------------------MAIN
360 FOR I=1 TO2:LINE(X-4,Y-2)-(X+4,Y+2),XOR,7,B:NEXT
370 IF STRIG(N) THEN620
380 S=STICK(N):ON S-3 GOTO 560,350,580,350,520
390 GOTO"$"
400 LABEL"=":PRINT H$(A);C$:PLAY"O4C:O3D"
410 GOSUB"C1":FOR J=1 TO5:FORI=1 TO5
420 ON A GOSUB 480,490,500,510
430 COLOR C:PRINT CHR$(&HF0);CHR$(&HF0);
440 NEXT:PRINT:NEXT:GOSUB"C2":COLOR7
450 GOSUB"C3":LOCATE X/8,Y/8:PRINT L$;L$;"   ";L$;L$;L$;U$;"   ":GOSUB"C2":COLOR 7
460 IF RND>SGN(K)-.05 THEN830 ELSE GOTO"$"
470 '------------------------------------SUB
480 C=POINT(X+I*2-6,Y+J-3):RETURN
490 C=POINT(X+6-J*2,Y+I-3):RETURN
500 C=POINT(X+6-I*2,Y+3-J):RETURN
510 C=POINT(X+J*2-6,Y+3-I):RETURN
520 X=X+X(A)*2:Y=Y+Y(A):C=POINT(X,Y):IF C>4 THEN1280
530 IF C=0 THEN PRINT"(FOW)";:GOTO"="
540 IF F(1) THEN710
550 X=X-X(A)*2:Y=Y-Y(A):GOTO"="
560 PRINT"(TURN L)";:A=A-1:IF A<1 THEN A=4
570 GOTO"="
580 PRINT"(TURN R)";:A=(A MOD 4)+1:GOTO"="
590 LABEL"C1":CONSOLE 1,22,42,38:RETURN
600 LABEL"C2":CONSOLE 9,15,36,42:LOCATE36,23:RETURN
610 LABEL"C3":CONSOLE 0,25,0,34:RETURN
620 '----------------------------------CAMP 
630 PRINT C$;"HP=";HP;" WEPON=";S$;" STR=";ST;" GOLD=";K
640 FOR I=1 TO7:COLOR F(I)*6+1:PRINT I$(I):NEXT:COLOR7
650 B$="EXIT,EAT FOOD"+STR$(FD)+",OTHER":IF F(6) THEN B$=B$+",JUMP TO "+H$(A)+""
660 GOSUB"#":ON S GOTO400,670,680,700
670 GOSUB"@":GOTO620
680 B$="SOUND NORMAL,SOUND FAST":GOSUB"#":TEMPO S*500
690 B$="KEYBOARD,JOYSTICK":GOSUB"#":N=S-1:GOTO620
700 PLAY"D:F":X=X+X(A)*10:Y=Y+Y(A)*5:GOTO"="
710 I=X+X(A)*2:R=Y+Y(A):IF POINT(I,R) THEN550
720 LINE(X,Y)-(X+1,Y),PSET,0:PRINT I$(1)
730 LINE(I,R)-(I+1,R),PSET,C:PLAY"D":GOTO400
740 LABEL"#":'----------------------COMMAND SELECT
750 I=0:S=1:D=0:GOTO 770
760 I=I+1:A$=MID$(B$,I,1):IF A$<>"," THEN780
770 D=D+1:A$=C$+"  "
780 PRINT A$;:IF A$="" THEN COLOR5:PRINT:GOTO820 ELSE760
790 IF STRIG(N)=-1 THEN COLOR7:LOCATE36,23:PRINT:PLAY"FE":RETURN
800 I=STICK(N):IF I=0 THEN790
810 PRINT"  ":S=S+(I=8)-(I=2)
815 IF S<1 THEN S=D ELSE IF S>D THEN S=1
820 LOCATE 36,22-D+S:PRINT "=>";L$;L$;:PLAY"D4":GOTO 790
830 '----------------------ENCOUNT 
840 C=RND*5+1:TP=RND*HP+5:TS=RND*ST+2:GOSUB"/"
850 GOSUB"C1":COLOR C:RESTORE1680
860 FOR I=1 TO5:R=INT(RND*4)
870 FOR J=0 TO3:READ A$:IF R=J THEN LOCATE59,I:PRINTA$;
880 NEXT:NEXT
890 IF B*K<0 THEN T$="KANEGO":LOCATE 61,1:PRINT"\ \\ \"
900 LINE(472,57)-(472+TP,62),PSET,2,BF
910 LOCATE 58-LEN(T$),7:PRINT T$:GOSUB"C2"
920 PLAY"E9A2D5DG:D9CFD4":IF RND THEN1100
930 COLOR7:B$="ATTACK,CHARGE,ESCAPE,EAT FOOD"+STR$(FD)
940 GOSUB"#":ON S GOTO 980,980,950,970
950 R=RND+1:B$="RIGHT,LEFT":GOSUB"#"
960 IF S=R THEN PRINT"YOU WERE ARRESTED.";C$:GOTO1100 ELSE1060
970 GOSUB"@":GOTO1100
980 PRINT"YOU";:D=0:R=ST:GOSUB"!"
990 IF S=2 THEN PLAY"DF":IF RND THEN PRINT" FAILED";C$:GOTO1100 ELSE PRINT" X3 HIT!":Z=Z*3
1000 IF B THEN 1020
1010 IF F(7)=0 OR RND THEN COLOR C:PRINT" REJECTED!":PLAY"O7BO4":GOTO1110
1020 J=TP:D=1:GOSUB"*":TP=J
1030 IF TP>0 THEN 1100
1040 R=RND*6*TS:PRINT C$;"YOU KILLED ";T$;".";C$;"YOU GOT";R;"GOLD.":K=K+R
1050 PLAY"CD3GF4:E5DA4":IF B=0 THEN1590
1060 LINE(59,1)-(68,5)," ",BF:LINE(52,7)-(58,7)," ":LINE(472,56)-(572,64),PSET,0,BF:B=1
1070 IF HP>0 THENGOTO"$"
1080 COLOR3:PRINT"GAME OVER";C$:PAUSE20:IF F(5)=0 THEN90
1090 FOR I=0 TO 7:PALET I,7:PLAY"O"+HEX$(I)+"CDO4":NEXT:PALET:GOTO330
1100 COLOR C:PRINT T$;:D=1:R=TS:GOSUB"!"
1110 IF F(4) AND RND THEN COLOR7:PRINT" REJECTED!":PLAY"O6BO4":GOTO1000
1120 D=0:J=HP:GOSUB"*":HP=J
1130 IF C=4 THEN R=RND*K/10:PRINT C$;" ";T$;" STOLE YOUR MONEY ";R;"GOLD.":K=K-R
1140 FOR I=0 TO Z:R=RND*2+87:OUT&H1800,2:PAUSE1:OUT&H1801,R:NEXT
1150 IF HP>0 THEN 930 ELSE 1060
1160 LABEL"!":PRINT "'S ATTACK " : '-------------ENCOUNT  
1170 Z=0:LINE(36,23)-(77,23)," ":LOCATE36,23
1180 PRINT F$;:Z=Z+1:IF D THEN IF RND>.99 THEN RETURN ELSE1200
1190 IF STRIG(N) THEN RETURN
1200 IF Z<R THEN 1180 ELSE 1170
1210 LABEL"*":J=J-Z:LINE(470+138*D,56)-(334+138*D+J,64),PSET,0,BF
1220 IF D THEN PRINT" ATTACK"; ELSE PRINT " DAMAGE";
1221 PRINT Z;" POINT";C$
1230 PLAY CHR$(67+D)+":E":RETURN
1240 LABEL"@":IF FD<1 THEN1260
1250 FD=FD-1:HP=HP+30:IF HP>80 THEN HP=80
1260 LINE(334,57)-(334+HP,62),PSET,4,BF:RETURN
1270 LABEL"Q":'------------------ETC
1280 D=POINT(X+1,Y):ON C-5 GOTO 1310,1360
1290 PRINT"GATE OF RESET":B$="BACK,RESET GAME":GOSUB"#"
1300 ON S GOTO550,90
1310 F(D)=1:F(0)=F(0)-1:PRINT C$;C$;R$;"YOU FIND TRESURE ";I$(D);".";C$;C$;C$;
1320 COLOR D:LINE(36,18)-(74,22),F$,B:COLOR7:PLAY"CFDEGB:CEE"
1330 IF D=3 THEN GOSUB"C3":CLS:GOSUB"C2"
1340 IF D=2 THEN S$=I$(2):ST=39
1350 LINE(X,Y)-(X+1,Y),PSET,0:GOTO400
1360 ON D-3 GOTO 1370,1420,1470,1560
1370 Z=D:R=Z*7
1380 PRINT"#####FOOD SHOP NO.";Z;"####";C$;"PRICE";R;"[GOLD/FOOD]";C$;"YOUR GOLD=";K;" FOOD=";FD
1390 B$="EXIT,BUY,SALE":GOSUB"#":ON S GOTO550
1400 FD=FD-S*2+5:IF FD<0 THEN FD=0:R=0:BEEP
1410 K=K+R*(S*2-5):GOTO 1380
1420 PRINT "*****WEPON SHOP*****";C$;"YOUR GOLD=";K
1430 B$="EXIT,CUDGEL  80,SPEAR  120,SWORD  160,SCYTHE 200,HAMMAR 240,NSWORD 280":GOSUB"#"
1440 ON S GOTO 550:R$=SCRN$(38,S+14,6)
1450 R=S*40:B$="EXIT,BUY":GOSUB"#":ON S GOTO1420
1460 K=K-R:ST=R/8:S$=R$:PRINT"THANK YOU.":GOTO550
1470 PRINT"WELCOME TO HOUSE OF SUBTRACTION.":PAUSE30:Z=100:J=5
1480 PRINT"A PRIZE=";J;"GOLD.";C$;"TIME LIMIT=";Z; "TICK";C$ :PAUSE30
1490 R=RND*8+1:I=RND*J*5+9
1500 PRINT I;"-";I-R;"=??";C$
1510 S=STICK(0):IF S THEN 1530
1520 Z=Z-1:PRINT "TICK ";:PLAY"D:A":IF Z THEN 1510
1530 PRINT:IF S=R THEN PRINT"THE RIGHT ANSWER(";R;")":K=K+J:J=J*2:PLAY"BABA":GOTO1480
1540 PRINT"MISTAKE!!!":PLAY"ACDDF":GOTO550
1550 '---------------------BOSS
1560 T$=O$:PRINT"WELCOME! MY NAME IS KING ";O$;"!";C$;
1570 PLAY"CABABEDEDF2G9F9F4":PAUSE30
1580 B=0:TP=20:TS=13:C=6:GOTO850
1590 PLAY"CGBDGC:ABFBGB":IF T$<>"CORE!" THEN TP=110:TS=20:C=2:T$="CORE!":GOTO 850
1600 GOSUB"C1":FOR I=1 TO200:LOCATE RND*9+59,RND*4+1
1610 PRINT CHR$(233+RND*5):PALET 0,RND*6:NEXT:PALET
1620 GOSUB"C2":PRINT C$;"HAPPY ENDING!"
1630 T=(ST+HP+F(0)*10+K+FD)/20:PRINT"TOTAL SCORE";T;"POINT.";C$;"HIT TRIGGER";
1640 A$=CHR$(65+RND*6):PLAY "V1504"+A$+":V13R604"+A$
1650 IF STRIG(N) THEN 90 ELSE 1640
1660 LABEL"/" :'----------------NAME
1670 T$="":FOR J=0 TORND*3+1:T$=T$+CHR$(RND*43+177):NEXT:RETURN
1680 DATA "    ()    ","   O  O   ","  /A /A   ","          "
1690 DATA " I-%%%%-I ","   @@@@   ","+O**##**O+","   <##>   "
1700 DATA "   %%%%   "," @@@@@@@@ ","  TTUUTT  ","   ####   "
1710 DATA "   I  I   ","@@@@@@@@@@","  H    H  ","   ++++   "
1720 DATA "  -+  +-  ","   @@@@   ","  #    #  ","          "

エミュレータ用のテープイメージの場合の実行方法です。
・X1用 HuBASIC(CZ-8CB01)を起動。
・テープをセットする。
・「RUN ""」を入力。