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
最近のコメント