・2021/04/03
BASICプログラム 10行で作られた MSX 用RPG 10 Lines Hero を解析する!【閲覧注意】 (たったの 10行で「遊べる」 RPGゲームができるとは!!凄い!!凄すぎる!!)
Tags: [Windows開発 ]
●解析記事なのでネタバレを含む可能性があるので【閲覧注意】
解析記事なのでネタバレを含む可能性があるので【閲覧注意】
解析記事なのでネタバレを含む可能性があるので【閲覧注意】
解析記事なのでネタバレを含む可能性があるので【閲覧注意】
解析記事なのでネタバレを含む可能性があるので【閲覧注意】
● BASICプログラム 10行で作られた MSX 用RPG『10 Lines Hero』を解析する!
たったの 10行で「遊べる」 RPGゲームができるとは!!
凄い!!凄すぎる!!(BASICコードが語りかけます)
しかし、ホント、この 10行(プログラム的には 9行)でどうやって自分が移動して、マップ切り替えをして、敵が動き回って、敵毎に判定処理が有って、経験値を得てレベルアップして、鍵の扉やワープトンネルが有って、エンディングまで有るんだろう?
WebMSXで Webブラウザで MSXエミュレータで動きます。
MSX 用RPG『10 Lines Hero』
・MSX 用RPG『10 Lines Hero』
・MSX 用RPG『10 Lines Hero』
・MSX 用RPG『10 Lines Hero』
・MSX 用RPG『10 Lines Hero』
● BASIC 10Liner Contest 2021
#basic10liner
HOMEPUTERIUM - Das Homecomputer-Laboratorium an der Eider-Treene-Schule
BASIC10Liners GAME LIST 2021
BASIC10Liners GAME LIST 2019
・Mooyan by Giuseppe Stassi
何でこれが 10行でできるんだよ???!!!
これも凄い!
・Mini Bros by Vitoco
Mini Bros by Vitoco
全部 BASIC 10行!!
Mini Bros - Atari game for NOMAM BASIC 10Liners Contest 2019
VIDEO
Defensor - Atari game for NOMAM BASIC 10Liners Contest 2018
VIDEO
Patrol - Atari game for NOMAM BASIC 10Liners Contest 2021
VIDEO
●私の場合は同じく BASIC言語で 5行で CAR GAMEでした
・マイコン雑誌 Pioの表紙
当時は「パソコン」と言うよりも「マイコン」「マイクロ コンピュータ」「マイ(My 自分専用の) コンピュータ」と言う言葉が主でした。
ちなみに、同じく当時はマイコンは高価だったので、マイコンが欲しいけれどマイコンを持っていない人の事を「ナイコン」(無い)と呼んでいました。
・私の投稿作品
・私の投稿作品 プログラム部分
5行で CAR GAME
ちなみに SHARP MZ-2000の S-BASIC(SHARP製 BASIC)は MSXの BASIC程の「自由度」が有りません。
(ELSE文も無ければ、キャラジェネ機能も無い)
なお、これの前の号に MicroManとかのペンネーム(うろ覚え)で 4行プログラムのゲームがシリーズで掲載されていました。(マシン語を使わずに「横スクロール」もしていました!!)
本作はそれに影響を受けて私も真似して作成して投稿して掲載になりました。
●ネットで見つけた MSXのテクニック記事、参考文献
MSX-BASIC の1画面プログラミング技術
MSX-BASICの容量節約術
MSX-BASICのVPOKE命令で遊ぼう
MSX Floppy Disk Manager v0.9.9.1
Disk-Manager V0.17
スパゲティプログラムの奨励事例
● BASICプログラム10行で作られた MSX 用RPG『10 Lines Hero』を解析する!
MSXは今回が初めてですが、上記の参考記事を基にして『10 Lines Hero』を解析します。
なお、原作者の穂乃井 a.k.a ほのっぺさんには無許可で行なっています。
まずはプログラムリストを入手します。
ツイッター上に画像でプログラムが貼り付けてありますが、面倒なので DISKイメージからプログラム リストをゲットします。
MSXエミュレータの「Save Disk Image」で DSKファイルを保存して、MSX Disk Managerを使って DSKイメージから BASICファイルをゲットします。
はい(笑)、BASICの中間言語形式で保存されているので読めません!!(笑)
・中間言語形式
と言う訳で ASCII形式で保存しなおします。
SAVE "10LINESHERO.TXT",A
※ SAVE命令の後に ,Aを付けると ASCII形式(単なるテキスト)で保存されます
これで無事に Windowsのテキストエディタで読める様になりました!!
・ASCII形式で保存で単なるテキスト形式になる
次に、REM文(コメント部分)に埋め込まれたバイナリ値を取得します。
コメントの文字と MSXの文字コード表とをニラメッコしても良いのですが、面倒なので技術のチカラに頼る事にします。
MSXの BASICプログラムは メモリエリア &H8000から始まるので、そこを PEEK文で読み出します。
なお、プログラム中では &H8000 = 32768の記述を 8^5(8の 5乗)で実装しています(2文字少なくできる)。
とりあえず、MSXの BASICプログラムのメモリエリアの理解を得る為にミニプログラムを作って確認しました。
1 'ABCDEFG
2 '01234556789
10 FOR I=0 TO 4
11 FOR J=0 TO 15:PRINT HEX$(PEEK(&H8000 + I*16 + J));",";:NEXT
12 PRINT:NEXT
※ BASIC言語の場合 PRINT文の最後を;(セミコロン)にすると改行しません
・MSXの BASICプログラムのメモリエリアの理解を得る為にミニプログラムを作って確認しました
コメントの ABCDEFの文字列とメモリ &H8008~が対応
コメントの 0123456789の文字列とメモリ &H8017~が対応している事が解ります。
※ 3A,8F,E6が REM文の中間コードっぽい
これで、BASICのプログラムとメモリ番地との対応が掴めました!
10 Lines Heroのプログラムを読み込んだ状態で、下記のPEEKダンププログラムを動かします。
判り易い様に 256バイト 100H単位で表示します。(次の 256バイトをダンプする時は手で &H8000を &H8100に書き換える)
10 FOR I=0 TO 15
20 FOR J=0 TO 15:PRINT HEX$(PEEK(&H8000 + I*16 + J));",";:NEXT
30 PRINT:NEXT:END
・MSX 用RPG『10 Lines Hero』のコメント部分
なお、画面表示が 40行モードだと厳しいので 80行モードに変更します。
SCREEN0:WIDTH80
で 80行モードに変更できます。
・MSXの画面モードを 80行モードにする方法
・MSXの画面モードを 80行モードにする方法
・MSX 用RPG『10 Lines Hero』のコメント部分のバイナリをゲットする方法
・MSX 用RPG『10 Lines Hero』のコメント部分のバイナリをゲットする方法
ゲットしたバイナリ ダンプ。(2桁整形済み)
&H8000-
00,05,81,00,00,3A,8F,E6,48,68,F0,4D,4B,63,6B,F3,
4A,4A,4A,4A,82,82,9A,9A,ED,FD,3D,FA,FA,6E,AE,F6,
57,87,9F,B0,30,30,E4,34,F4,20,A6,80,44,C0,F4,20,
70,80,44,20,B0,90,20,80,44,50,90,71,7B,68,72,9E,
9F,44,45,CE,F8,FD,F5,4B,7A,B8,BD,B5,6A,BA,B9,BC,
B5,AB,BA,B9,BB,B4,8B,9B,9D,9B,94,6C,7C,7C,7C,54,
8C,9C,9C,94,40,C0,50,41,40,84,40,60,FB,40,2E,40,
FB,40,2E,40,FB,40,2E,40,FB,40,2E,40,40,91,EA,91,
40,55,EA,55,7C,82,D9,E5,E5,E5,E5,27,3F,EA,EA,3F,
3F,EA,EA,3F,40,40,40,86,68,94,50,48,5C,7C,68,8D,
DE,7E,B4,D4,44,46,48,4C,50,B0,88,78,7C,9A,D9,D9,
D5,D9,D9,3F,7C,82,C1,C1,C1,C1,C1,C1,40,BF,81,81,
81,81,81,BF,40,BF,BF,BF,BF,BF,BF,BF,9C,9C,8B,9F,
2B,88,54,62,40,60,B8,3E,EF,3F,3F,BE,7E,BD,A7,B0,
7E,C7,BF,7E,81,B7,9D,7E,48,5C,6A,AB,40,6F,BC,70,
A8,A4,82,81,78,92,39,5D,8F,BF,AE,9B,FA,97,BD,71,
&H8100-
3A,E7,B2,C8,00,CB,81,01,00,92,3A,AC,41,F2,5A,3A,
C5,12,2C,11,2C,11,3A,A0,0F,1C,3A,BD,2C,12,2C,12,
3A,CC,EB,3A,5A,EF,1C,CE,02,3A,86,4D,28,5A,29,2C,
5A,28,5A,29,3A,82,49,EF,16,D9,5A,3A,4B,EF,FF,98,
28,49,29,3A,C6,49,2C,4B,F7,4B,FC,13,3A,91,22,90,
90,22,3B,3A,5A,28,49,29,EF,FF,97,28,49,F2,19,F5,
16,29,F2,0F,40,F6,0F,FF,3A,83,3A,82,49,EF,0F,11,
D9,0F,24,3A,82,4A,EF,4A,D9,4A,F1,18,3A,C6,1C,48,
07,F1,4A,2C,51,3A,8F,E6,6C,6B,5B,6A,6B,64,6A,5C,
5B,63,82,8A,5C,88,5B,88,95,95,95,60,97,69,83,66,
6C,89,65,5A,D5,EF,DE,31,94,C8,C4,73,C8,DD,C8,92,
88,C8,8F,47,8E,D8,C8,97,AB,92,F0,7D,DA,79,71,CF,
9D,81,DB,33,8F,77,AA,26,B9,D4,00,AA,82,02,00,C6,
49,F3,0F,38,F1,4A,F1,19,F2,28,49,EE,0F,1D,29,F3,
1C,00,31,2C,5A,28,4A,F1,0F,64,29,3A,83,3A,51,EF,
51,F1,13,F5,28,0F,18,F2,49,29,3A,83,3A,4F,EF,18,
&H8200-
3A,54,24,EF,22,4C,4F,56,45,59,4F,55,21,22,3A,82,
4D,EF,11,D9,5A,3A,4D,EF,18,3A,58,28,12,29,EF,1A,
3A,59,28,12,29,EF,1A,3A,48,28,12,29,EF,51,3A,50,
EF,50,FC,13,3A,82,47,EF,11,D9,12,3A,4B,EF,5A,28,
4D,F1,1C,A2,01,29,3A,4E,EF,FF,88,28,F2,0F,9E,F3,
4B,29,F3,15,F5,16,3A,4B,EF,4B,FB,18,F0,14,3A,4E,
EF,4E,F7,4E,FC,13,3A,44,EF,5A,28,4D,F1,0F,42,29,
3A,42,EF,11,3A,4B,54,EF,11,3A,82,49,EF,12,D9,19,
3A,4E,EF,4E,F3,13,F5,28,28,FF,88,28,12,29,F3,14,
F1,13,29,FB,14,F2,12,29,3A,82,4A,EF,12,D9,19,3A,
51,EF,4E,FC,13,F5,4A,F6,12,00,87,83,03,00,4D,28,
49,F3,0F,0A,F5,28,12,F1,4B,29,F1,4A,F3,0F,0A,F5,
F2,4B,29,EF,51,3A,83,4A,2C,49,3A,82,49,EF,17,D9,
0F,11,3A,C6,1C,11,1B,F2,49,2C,11,3A,D8,13,2C,49,
F2,12,3A,91,2C,3A,C6,1C,20,20,F2,49,2C,5A,28,0F,
1D,F1,49,F2,28,49,EE,0F,0A,29,F3,28,28,4D,F1,0F,
0行のコメント部分の中身は &H8008から(48,68,F0,,,) &H8103まで(,,,E7,B2,C8)
1行のコメント部分の中身は &H8188から(6C,6B,5B,,,) &H81C9まで(,,,26,B9,D4)
&H8008 32768 + 8 8^5 + 8 0
&H8103 32768 + 256 + 3 32768 + 8 + 251 252バイト
&H8188 32768 + 256 + 136 32768 + 8 + 256 + 128 0
&H81C9 32768 + 256 + 201 32768 + 8 + 256 + 194 67バイト
10 Lines Heroの PEEKを使っている場所!
Z=718
DIM M(Z),Z(Z)
FOR I=5 TO Z:
K = VPEEK(I): VPOKE I,K OR K \ 2
PRINT"・・";
Z(I) = PEEK(I-8^5)-64 AND 255
NEXT
Z = 718 = 0x2CE
&H8005~&h82CE
ん?! 0x2CEってコメントエリアを越えているんだけど??
プログラムコード部分も「データ」として扱っている?
それとも VPOKE処理用?
単に処理の都合上か?
FOR I=17 TO 36
FOR J=J TO J+7
VPOKE 1864+J, Q
VPOKE I*56 + J+8 -(I>29)*12544, Z(J+100)
NEXT
Q = Q + 2^(24-I)
NEXT
● VPOKE I*56 + J+8 -(I>29)*12544, Z(J+100)
Z(J+100)で J=0~159が VPOKE(キャラグラ用)みたいだ!
・実際にプログラムを動かして計算値を確認しながら解析していく!
・実際にプログラムを動かして計算値を確認しながら解析していく!
&H78~ 8文字毎に背景のキャラグラを定義している。(I*56なので 7文字毎と思えるが、変数 Jが 8増えるので 8文字毎になる。最初気が付かなくて悩んだ!)
0x20~0xFFまでの文字を表示してキャラグラの定義を確認する。
FOR I=32 TO 255:? CHR$(I);:NEXT
・0x20~0xFFまでの文字を表示してキャラグラの定義を確認する
&H78~ 8文字毎に背景のキャラグラを定義している。(I*56なので 7文字毎と思えるが、変数 Jが 8増えるので 8文字毎になる。最初気が付かなくて悩んだ!)
MSXのグラフィックキャラクタ(拡張文字)は変更無し!(CHR$(1)+CHR$(n)、n=0x40~0x5Fでグラフィックキャラクタを表示する)
・MSXのグラフィックキャラクタ(拡張文字)は変更無し
グラフィックキャラクタの文字領域としてはコントロールコードの 0x00~0x1Fに割り当てられている。
●キャラグラ領域(+前後1文字)だけを表示して確認する
FOR I=112 TO 228 STEP 8:? CHR$(I);:NEXT
・キャラグラ領域(+前後1文字)だけを表示して確認する
● -(I>29)*12544はスプライト用のグラフィック定義
PUT SPRITE n,(X,Y),COLOR,m
n = SPRITE No.
m = SPRITE DEFINE No.
(I>29)の時の 12544 = 0x3100(計算値 0x3800、0x3840、0x3880、、、)はスプライト用のグラフィック定義か!(スプライト用のグラフィック定義アドレスは 0x3800~)
スプライト定義番号 0、8、16の様に 8単位で全部で 7種類のスプライトを定義している。
・-(I>29)*12544はスプライト用のグラフィック定義
● VPOKE 1864+J, Q
1864 = 0x748、0x748 / 8 = 0xE9
&HE9~の文字は体力ゲージ用の文字定義か。
・&HE9~の文字は体力ゲージ用の文字定義
・&HE9~の文字は体力ゲージ用の文字定義
● MSXは VPOKEで文字フォントを書き換えられます。うーん凄い!
VPOKE &H100,&H55
VPOKE &H101,&HAA
VPOKE &H102,&H55
VPOKE &H103,&HAA
で &H20の空白文字のフォントの上部が市松模様に書き換わります。
0x20 * 8 = 0x100
・MSXは VPOKEで文字フォントを書き換えられます。うーん凄い!
&H55,01010101,・■・■・■・■
&HAA,10101010,■・■・■・■・
&H55,01010101,・■・■・■・■
&HAA,10101010,■・■・■・■・
0x11、0x22、0x44、0x88で斜め線
・MSXは VPOKEで文字フォントを書き換えられます。うーん凄い!
&H11,00010001,・・・■・・・■
&H22,00100010,・・■・・・■・
&H44,01000100,・■・・・■・・
&H88,10001000,■・・・■・・・
● MSXの BASIC言語の 論理値 TRUE/ FALSEの値
TRUE = -1
? (1=1)
-1
FALSE = 0
? (1=0)
0
※ ?は PRINT命令と同じです
・MSXの BASIC言語の 論理値 TRUE/ FALSEの値
● VPOKE &H1800~で画面の表示内容(VRAM)を直接書き換え。
・VPOKE &H1800~で画面の表示内容(VRAM)を直接書き換え
● VPOKE &H1B00~でスプライトの座標を直接書き換え。
● STICK命令でカーソルキーやジョイスティックの入力状態を取得できる
STICK(0) カーソルキー
STICK(1) ジョイスティック 1
STICK(2) ジョイスティック 2
値
0 未入力
1 UP
3 RIGHT
5 DOWN
7 LEFT
斜めは
2 UP + RIGHT
4 DOWN + RIGHT
6 DOWN + LEFT
8 UP + LEFT
●マップの描画
FOR I=0 TO 99:
J=M(I):
VPOKE 6341+(I\10)*22+I,8*(16+J+(M>24*J)*J*2-(J=6 AND M>1)*3): 0x18C5
NEXT:
さっぱりわからん。
とりあえず、2行の後半の T$="L***Y**!"からがメインループっぽい。
とりあえず、5行に END(プログラム終了)を仕込んでみる。
・とりあえず、5行に END(プログラム終了)を仕込んでみる
この状態でマップが表示される。
とりあえず、6行に END(プログラム終了)を仕込んでみる。
・とりあえず、6行に END(プログラム終了)を仕込んでみる
この状態でレベル等が表示される。
とりあえず、7行に END(プログラム終了)を仕込んでみる。
・とりあえず、7行に END(プログラム終了)を仕込んでみる
この状態で体力ゲージ HP部分が表示される。
FOR I=0 TO 718:? HEX$(Z(I));",";:NEXT
0x0 - 0x2CE
Z(718) =
0000 00,00,00,00,00,
[FA,4F,A6],08,28,B0,0D,0B,23,2B,B3
0010 0A,0A,0A,0A,42,42,5A,5A,AD,BD,FD,BA,BA,2E,6E,B6
0020 17,47,5F,70,F0,F0,A4,F4,B4,E0,66,40,04,80,B4,E0
0030 30,40,04,E0,70,50,E0,40,04,10,50,31,3B,28,32,5E
0040 5F,04,05,8E,B8,BD,B5,0B,3A,78,7D,75,2A,7A,79,7C
0050 75,6B,7A,79,7B,74,4B,5B,5D,5B,54,2C,3C,3C,3C,14
0060 4C,5C,5C,54,{00,80,10,01,00,44,00,20} ,{BB,00,EE,00
0070 BB,00,EE,00},{BB,00,EE,00,BB,00,EE,00} ,{00,51,AA,51
0080 00,15,AA,15},{3C,42,99,A5,A5,A5,A5,E7} ,{FF,AA,AA,FF
0090 FF,AA,AA,FF},{00,00,00,46,28,54,10,08} ,{1C,3C,28,4D
00A0 9E,3E,74,94},{04,06,08,0C,10,70,48,38} ,{3C,5A,99,99
00B0 95,99,99,FF},{3C,42,81,81,81,81,81,81} ,{00,7F,41,41
00C0 41,41,41,7F},{00,7F,7F,7F,7F,7F,7F,7F} ,
00CC {5C,5C,4B,5F
00D0 EB,48,14,22},{00,20,78,FE,AF,FF,FF,7E} ,{3E,7D,67,70
00E0 3E,87,7F,3E},{41,77,5D,3E,08,1C,2A,6B} ,{00,2F,7C,30
00F0 68,64,42,41},{38,52,F9,1D,4F,7F,6E,5B} ,{BA,57,7D,31
0100 FA,A7,72,88},
0104 C0,8B,41,C1,C0,52,FA,6C,01,B2,1A,FA
0110 85,D2,EC,D1,EC,D1,FA,60,CF,DC,FA,7D,EC,D2,EC,D2
0120 FA,8C,AB,FA,1A,AF,DC,8E,C2,FA,46,0D,E8,1A,E9,EC
0130 1A,E8,1A,E9,FA,42,09,AF,D6,99,1A,FA,0B,AF,BF,58
0140 E8,09,E9,FA,86,09,EC,0B,B7,0B,BC,D3,FA,51,E2,50
0150 50,E2,FB,FA,1A,E8,09,E9,AF,BF,57,E8,09,B2,D9,B5
0160 D6,E9,B2,CF,00,B6,CF,BF,FA,43,FA,42,09,AF,CF,D1
0170 99,CF,E4,FA,42,0A,AF,0A,99,0A,B1,D8,FA,86,DC,08
0180 C7,B1,0A,EC,11,[FA,4F,A6],2C,2B,1B,2A,2B,24,2A,1C
1B,23,42,4A,1C,48,1B,48,55,55,55,20,57,29,43,26
2C,49,25,1A,95,AF,9E,F1,54,88,84,33,88,9D,88,52
48,88,4F,07,4E,98,88,57,6B,52,B0,3D,9A,39,31,8F
5D,41,9B,F3,4F,37,6A,E6,79,94,C0,6A,42,C2,C0,86
09,B3,CF,F8,B1,0A,B1,D9,B2,E8,09,AE,CF,DD,E9,B3
DC,C0,F1,EC,1A,E8,0A,B1,CF,24,E9,FA,43,FA,11,AF
11,B1,D3,B5,E8,CF,D8,B2,09,E9,FA,43,FA,0F,AF,D8
0200 FA,14,E4,AF,E2,0C,0F,16,05,19,0F,15,E1,E2,FA,42
0D,AF,D1,99,1A,FA,0D,AF,D8,FA,18,E8,D2,E9,AF,DA
FA,19,E8,D2,E9,AF,DA,FA,08,E8,D2,E9,AF,11,FA,10
AF,10,BC,D3,FA,42,07,AF,D1,99,D2,FA,0B,AF,1A,E8
0D,B1,DC,62,C1,E9,FA,0E,AF,BF,48,E8,B2,CF,5E,B3
0B,E9,B3,D5,B5,D6,FA,0B,AF,0B,BB,D8,B0,D4,FA,0E
AF,0E,B7,0E,BC,D3,FA,04,AF,1A,E8,0D,B1,CF,02,E9
FA,02,AF,D1,FA,0B,14,AF,D1,FA,42,09,AF,D2,99,D9
0280 FA,0E,AF,0E,B3,D3,B5,E8,E8,BF,48,E8,D2,E9,B3,D4
B1,D3,E9,BB,D4,B2,D2,E9,FA,42,0A,AF,D2,99,D9,FA
11,AF,0E,BC,D3,B5,0A,B6,D2,C0,7C,42,C3,C0,85,E0
D1,FA,60,CF,10,FA,49,E0,CE,2E,C0,C0,63,43,C4,C0
02C0 0B,AF,0A,AE,D1,FA,0D,E8,0A,E9,AF,B2,0B,B3,1A
CHR$(120)
0064 00,80,10,01,00,44,00,20
00 ・・・・・・・・
80 ■・・・・・・・
10 ・・・■・・・・
01 ・・・・・・・■
00 ・・・・・・・・
44 ・■・・・■・・
00 ・・・・・・・・
20 ・・■・・・・・
略
CHR$(152)
0084 3C,42,99,A5,A5,A5,A5,E7
3C ・・■■■■・・
42 ・■・・・・■・
99 ■・・■■・・■
A5 ■・■・・■・■
A5 ■・■・・■・■
A5 ■・■・・■・■
A5 ■・■・・■・■
E7 ■■■・・■■■
CHR$(160)
008C FF,AA,AA,FF,FF,AA,AA,FF
FF ■■■■■■■■
AA ■・■・■・■・
AA ■・■・■・■・
FF ■■■■■■■■
FF ■■■■■■■■
AA ■・■・■・■・
AA ■・■・■・■・
FF ■■■■■■■■
CHR$(220)
00C4 00,7F,7F,7F,7F,7F,7F,7F
00 ・・・・・・・・
7F ・■■■■■■■
7F ・■■■■■■■
7F ・■■■■■■■
7F ・■■■■■■■
7F ・■■■■■■■
7F ・■■■■■■■
7F ・■■■■■■■
Z(718)配列 CHR$(xx) HEX キャラ名称
Z(0x0064) CHR$(120) 0x78 洞窟の地面
Z(0x006C) CHR$(128) 0x80 壁
Z(0x0074) CHR$(136) 0x88 地面
Z(0x007C) CHR$(144) 0x90 背景
Z(0x0084) CHR$(152) 0x98 ワープ
Z(0x008C) CHR$(160) 0xA0 檻(鉄格子)
Z(0x0094) CHR$(168) 0xA8 草
Z(0x009C) CHR$(176) 0xB0 ??(秘密)
Z(0x00A4) CHR$(184) 0xB8 鍵
Z(0x00AC) CHR$(192) 0xC0 扉(鍵必要)
Z(0x00B4) CHR$(200) 0xC8 門
Z(0x00BC) CHR$(208) 0xD0 マップ
Z(0x00C4) CHR$(216) 0xD8 マップ(現在地)
スプライト定義 0
00CC 5C,5C,4B,5F,EB,48,14,22
5C ・■・■■■・・
5C ・■・■■■・・
4B ・■・・■・■■
5F ・■・■■■■■
EB ■■■・■・■■
48 ・■・・■・・・
14 ・・・■・■・・
22 ・・■・・・■・
スプライト定義 1
00D4 00,20,78,FE,AF,FF,FF,7E
00 ・・・・・・・・
20 ・・■・・・・・
78 ・■■■■・・・
FE ■■■■■■■・
AF ■・■・■■■■
FF ■■■■■■■■
FF ■■■■■■■■
7E ・■■■■■■・
...
スプライト定義 6
00FC BA,57,7D,31,FA,A7,72,88
●変数表
変数名 初期値 内容
O 7
T$ "L***Y**!" エンディング メッセージ
M 7 マップ番号 FOR
X(1) 9 自分の X座標
Y(1) 9 自分の Y座標
H(1) 自分の HP
P 0 EXP 経験値
M(99) マップ情報ワーク
G FOR
K Z(M+418)
N
D Z(M+66) AND 7 敵番号(0=敵1、5=敵6)
B 0
KT 0
L
G 0
L0 -3*(RND(1)*(D>0)*(B=0)+D)*(L+B>0) 敵のレベル
X(0) 敵の X座標
Y(0) 敵の Y座標
H(0) 敵の HP
R FOR
LS 自分のレベル(L0減算済み)
L1 0 自分のレベル
Z L1*4+4 次回レベルアップ経験値
H 0 TO 2 FOR
F 10-D
N HP表示用 FOR
H 0
U 0
KK Z(451+D)
SC 敵スプライト描画色
T F TO 99 FOR
E 1-J TO 1 FOR
C 0
K RND(J)*5 敵移動方向
K VPEEK 地面情報
V xx X座標ワーク
W xx Y座標ワーク
VP 6917 0x1B05
Z(117-136) 2行目 0x0075-0x0088
Z(M+418) 2行目 0x01A2
Z(M+66) 2行目 0x0042
Z(59-70) 3行目 0x003B-0x0046
Z(392-419) 3行目 0x0188
Z(8-35) 4行目 0x0008-0x0023
Z(451+D) 6行目 0x01C3
Z(KT) 8行目
●プログラム
0 データ定義
1 画面初期化、キャラクタ定義、データ定義
2 キャラクタ定義、初期化、メイン開始、草配置
3 マップ定義変数、マップ情報ワーク生成
4 マップ描画、
5 EXP 経験値、レベル描画
6 HP表示、自分死亡判定(IF J<1 THEN)
7 キー入力(自分移動)、敵移動、スプライト キャラ描画
8 マップ移動判定(IF C<0 OR I+J THEN)、エンディング判定(IF C=8 THEN)
9 自分と敵との重なり判定(IF N<(VDP(8) AND 32)\16 THEN)、敵死亡判定(IF H(0)<1 THEN)、
●自分と敵との重なりを判定
VDP(8) 割り込み情報
C is the collision flag. It is set when two sprites have collided. This bit is reseted after the register is read or when the VDP is externally initialized .
(VDP(8) AND 32)
スプライトの衝突(自分と敵との重なりを判定)
MSX VDP Status Registers
●マップ生成の実装方法がヤバイ件!やばたにえん!
超ヤバイ実装でマップを生成していた!!
マップ番号毎に乱数のシードの初期値を設定して、マップを生成していた!!
ドウヤッテ乱数ノしーど値ヲ求メタノ???只管ぶん回したの?
乱数までをも掌握してしまうなんて!!
●マップ基本値(壁パターン)の生成
K=Z(M+418):
N=RND(-158*K)*4^5:
●壁の揺らぎ(ズレ)の生成
FOR I=1 TO 8:
N=N*2^((RND(1)*3+2) MOD 3-1):
●壁の方向性(縦方向、横方向)
K=K MOD 7<3:
●壁情報の代入
M(I* 10^(1+K) + J*10^-K) = Q:
マップ情報ワーク M(0)~M(99)
●乱数はどう頑張っても再現できないので「答え」を取得します
FOR M=0 TO 39:K=Z(M+418):N=RND(-158*K)*4^5:PRINT M;",";K;",";N;:FOR I=1 TO 8:R=RND(1)*3:PRINT ",";R;:NEXT:PRINT:NEXT
0 , 37 , 564 , 1 , 2 , 2 , 1 , 1 , 2 , 1 , 2
1 , 26 , 357 , 1 , 0 , 1 , 0 , 2 , 1 , 0 , 1
2 , 149 , 129 , 1 , 1 , 2 , 1 , 1 , 0 , 0 , 2
3 , 175 , 662 , 0 , 1 , 2 , 0 , 2 , 2 , 2 , 1
4 , 158 , 314 , 0 , 1 , 2 , 0 , 1 , 0 , 1 , 2
5 , 241 , 991 , 2 , 0 , 0 , 1 , 0 , 1 , 2 , 1
6 , 84 , 845 , 2 , 2 , 0 , 0 , 1 , 0 , 2 , 2
7 , 136 , 887 , 2 , 0 , 1 , 2 , 0 , 1 , 2 , 1
8 , 132 , 805 , 0 , 0 , 1 , 0 , 0 , 2 , 2 , 0
9 , 51 , 362 , 0 , 2 , 0 , 1 , 2 , 2 , 0 , 2
10 , 136 , 887 , 2 , 0 , 1 , 2 , 0 , 1 , 2 , 1
11 , 157 , 293 , 2 , 1 , 0 , 2 , 2 , 1 , 0 , 0
12 , 136 , 887 , 2 , 0 , 1 , 2 , 0 , 1 , 2 , 1
13 , 82 , 804 , 1 , 2 , 0 , 2 , 1 , 2 , 2 , 0
14 , 72 , 599 , 2 , 2 , 1 , 2 , 2 , 0 , 2 , 0
15 , 136 , 887 , 2 , 0 , 1 , 2 , 0 , 1 , 2 , 1
16 , 79 , 742 , 0 , 2 , 1 , 0 , 2 , 2 , 0 , 2
17 , 7 , 558 , 0 , 2 , 1 , 1 , 2 , 1 , 2 , 1
18 , 78 , 722 , 2 , 2 , 2 , 0 , 0 , 0 , 2 , 2
19 , 152 , 191 , 2 , 1 , 1 , 2 , 0 , 0 , 2 , 0
20 , 136 , 887 , 2 , 0 , 1 , 2 , 0 , 1 , 2 , 1
21 , 87 , 906 , 1 , 2 , 2 , 2 , 0 , 0 , 0 , 0
22 , 107 , 292 , 1 , 0 , 2 , 1 , 0 , 2 , 2 , 0
23 , 82 , 804 , 1 , 2 , 0 , 2 , 1 , 2 , 2 , 0
24 , 176 , 683 , 1 , 1 , 1 , 1 , 1 , 1 , 0 , 1
25 , 61 , 364 , 0 , 2 , 0 , 0 , 2 , 1 , 2 , 2
26 , 154 , 232 , 0 , 1 , 1 , 0 , 0 , 1 , 1 , 2
27 , 57 , 568 , 1 , 1 , 0 , 2 , 2 , 1 , 0 , 2
28 , 49 , 976 , 0 , 2 , 1 , 2 , 2 , 0 , 1 , 2
29 , 143 , 6 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 2
30 , 93 , 5 , 2 , 2 , 0 , 2 , 1 , 0 , 0 , 2
31 , 65 , 455 , 1 , 2 , 2 , 2 , 0 , 0 , 1 , 1
32 , 155 , 252 , 1 , 1 , 0 , 1 , 2 , 0 , 0 , 1
33 , 243 , 8 , 0 , 0 , 0 , 2 , 1 , 2 , 2 , 0
34 , 79 , 742 , 0 , 2 , 1 , 0 , 2 , 2 , 0 , 2
35 , 55 , 158 , 2 , 0 , 0 , 0 , 2 , 2 , 1 , 2
36 , 106 , 272 , 0 , 0 , 0 , 1 , 2 , 0 , 1 , 1
37 , 230 , 766 , 2 , 2 , 0 , 1 , 0 , 0 , 1 , 1
38 , 121 , 579 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 1
39 , 148 , 109 , 0 , 1 , 0 , 0 , 2 , 1 , 2 , 2
・10 Lines Heroのマップ生成の実装方法がヤバイ件!やばたにえん!
・10 Lines Heroのマップ生成の実装方法がヤバイ件!やばたにえん!
●マップの草
マップ中央の 6*6の中に乱数で配置します。
(壁に接する外周部には草は生えない)
● MSXの乱数 RND命令はマイナスのシード値で生成値が初期化されます
MSXの乱数 RND命令はマイナスのシード値で生成値が初期化されます。
RND(負の整数)でシード値とした乱数生成の初期化
RND(0)で前回と同じ値
RND(正の整数)で 0以上~1未満の乱数
・MSXの乱数 RND命令
・MSXの乱数 RND命令
● C#言語に勝手移植中
・MSX 10 Lines Heroを C#言語に勝手移植中
Tags: [Windows開発 ]
●関連するコンテンツ (この記事を読んだ人は、次の記事も読んでいます)
PC-9801で MZ-80Kのシューティングゲーム ZEPLISを動かしたい。旧題:PC98でMZ80K(謎) PC-98x1にMZ-80Kの名作ゲーム ZEPLISシリーズを移植!
私の手掛けたシューティングゲーム NEC-PC98/EPSON互換機用 同人ソフト MELT DOWN、ReFIGHT、HARD RANK、同人サークル Group R204、NOP Software
ソフトウェア実験場 実験ソフト
[HOME]
|
[BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c)
2021 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator
http://www.neko.ne.jp/~freewing/software/msx_10_lines_hero_hack/