ホーム > 日記 > DPC-100でアドベンチャーゲーム「BLACK DIAMOND」

DPC-100でアドベンチャーゲーム「BLACK DIAMOND」

を、作ってみました。苦労した……。

( DETUNE DPC-100 → http://www.detune.co.jp/dpc100.html )

とにかく今回苦労したのはメモリ不足。DPC-100にはメインメモリ4Kという制限があり、それをオーバーするとOut of Memoryが出る……のであれば良いのですが、そのへんの実装にバグがあるらしく、まあ、落ちる落ちる。有料なんですから、もうちょっとデバッグしてから出してほしいなー、とか、あたたかい目で見るのも限界があるぞ、というレベルで落ちすぎです。もう、落ちすぎて、何で落ちるのかサッパリわからないので、とにかくあちこち怪しいところをツブしていって、なんとか動くところまでこぎつけました。

怪しいところの整理の過程で、FORをツブしたりGOSUBを極力使わなくしたりしたため、猛烈にどうしょうもないソースになっていますが、まあ、修正する気力もないのでこのまま発表しちゃいます。

で、今回のウリは、いわゆるフツーのINPUTとIFの羅列の文字入力式アドベンチャーゲームの作り方ではなく、一応アドベンチャーゲームエンジンになっているところ。あと、超テキトーに暗号化もしているところ。

ソースの下の方にスクリプト(みたいなもの)があるのですが、まあ、パッと見て、正解がわからない程度になってます(コード読めばわかりますが、ロクな実装じゃないんですけど)。

ちなみにアドベンチャーゲーム自体は「なんかわからんけどBLACK DIAMONDという秘宝を手に入れろ」というだけのミニシナリオです。昔を思い出していただくために、あちこち理不尽にしてありますし、全然面白いもんではないですが、クリア目指して頑張ってください。あ、コマンドは英語です。「(動詞) (名詞)」で、間にスペース入れるパターン。お馴染ですね。

一応エンディングでは、最新バージョンで実装された音を鳴らしてみました。……が、ここも超テキトーです。MML欲しい……。

100 STRING ST
110 STRING IN
120 INT C
130 INT F(9)
1000 INPUT "コマンド?";IN
1010 GOSUB 5000
1020 SI=1
1030  GOSUB 3000
1040  L=STRLEN(ST)
1050  J=0
1060   C=GETCHAR(ST,J)
1070   IF C==36 THEN GOTO 2000
1080   J=J+1
1090   IF J>L THEN GOTO 1110
1100  GOTO 1060
1110  SI=SI+1
1120  IF SI>5 THEN GOTO 1200
1130 GOTO 1030
1200 PRINT "ナンデショウカ?"
1210 PAUSE
1220 GOTO 1000
2000 IF FINDSTR(ST,J,IN)==J+1 THEN GOTO 2100
2010 GOTO 1080
2100 J=J+STRLEN(IN)+1
2110 IF GETCHAR(ST,J)!=45 THEN GOTO 1080
2120 EX=0
2130 J=J+1
2140  IF J>L && EX==1 THEN GOTO 1000
2150  IF J>L THEN GOTO 1110
2160  C=GETCHAR(ST,J)
2170  IF C==65 THEN GOTO 2500
2180  IF C==64 THEN GOTO 2600
2190  IF C==43 THEN GOTO 2700
2200  IF C==38 THEN GOTO 2800
2210  IF C==95 THEN GOTO 2400
2220  IF C==36 && EX==0 THEN GOTO 1060
2230  IF C==36 && EX==1 THEN GOTO 1000
2240  GOTO 2900
2250  J=J+1
2260 GOTO 2140
2400 IF F(GETCHAR(ST,J+1)-49)==1 THEN GOTO 1060
2500 F(GETCHAR(ST,J+1)-49)=1
2510 J=J+3
2520 GOTO 2140
2600 IF F(GETCHAR(ST,J+1)-49)==0 THEN GOTO 1060
2610 J=J+3
2620 GOTO 2140
2700 EXIT(0)
2800 SCHSTATE(0,1)
2810 SCHNOTE(0,60)
2820 WAIT(0.5,0)
2830 SCHNOTE(0,64)
2840 WAIT(0.5,0)
2850 SCHNOTE(0,67)
2860 WAIT(0.5,0)
2870 SCHNOTE(0,72)
2880 WAIT(1,0)
2890 SCHSTATE(0,0)
2895 EXIT(0)
2900 SJ=J
2910 WHILE GETCHAR(ST,J)!=45
2920  IF J>=L THEN BREAK
2930  J=J+1
2940 WEND
2950 IN=COPYSTR(ST,SJ,J-SJ)
2960 GOSUB 5100
2970 PRINT IN
2980 PAUSE
2990 EX=1
2995 J=J+1
2997 GOTO 2140
3000 IF SI==1 THEN ST="$MPPL-ヒサ)CPY*キ゚イレ-$MPPL!CPY-TXJUDIキ゚テウトウレ-$MPPL!TXJUDI-カストムニラ-$QVTI!TXJUDI-ナ゚キア゙\"イニチヒスヌミスチ-HBNF!PWFS-+"
3010 IF SI==2 THEN ST="$PQFO!CPY-LFZキ゚ヒウートウレ-A2-$HFU!LFZ-@2-_3-キク゚ァナーチ-A3-$MPPL!LFZ-@7-キク゚ハキチツハカヤツュチ゚"
3020 IF SI==3 THEN ST="$MPPL!LFZ-@6-ラケムレナキク゚ト゚ヒニケト・-キク゚ハキチツハカヤツュチ゚-A7-$MPPL!LFZ-@3-カカクニ!キク゚!チ゚-A6-$MPPL!LFZ-@2-ヒサヌヒウートウレ"
3030 IF SI==4 THEN ST="$VTF!LFZ-@3-テキエピスッキ゚ニウ-$TIBLF!LFZ-@4-ニキヌニヌキヒウートウレ//@-A5-$TIBLF!LFZ-@3-キリキリナ!カナ!キ゚セレ-A4"
3040 IF SI==5 THEN ST="$PQFO!LFZ-@5-イー\"キク゚ハキチツハ!ヒサチ゚-ニキヌマエソクキ゚\"\"-ペリーケチ゚ウユ!チ゚\"-カモト゚ナエ\"-HBNF!DMFBS-&"
3050 RETURN
5000 LG=STRLEN(IN)
5010 FOR T=0 TO LG
5020  IN=SETCHAR(T,(GETCHAR(IN,T) & 255)+1,IN)
5030 NEXT
5040 RETURN
5100 LG=STRLEN(IN)
5110 FOR T=0 TO LG
5120  IN=SETCHAR(T,(GETCHAR(IN,T) & 255)-1,IN)
5130 NEXT
5140 RETURN
カテゴリー: 日記 タグ: