HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2021/04/03

BASICプログラム 10行で作られた MSX 用RPG 10 Lines Hero を解析する!【閲覧注意】 BASICプログラム 10行で作られた MSX 用RPG 10 Lines Hero を解析する!【閲覧注意】

(たったの 10行で「遊べる」 RPGゲームができるとは!!凄い!!凄すぎる!!)

Tags: [Windows開発]




●解析記事なのでネタバレを含む可能性があるので【閲覧注意】

 解析記事なのでネタバレを含む可能性があるので【閲覧注意】

 解析記事なのでネタバレを含む可能性があるので【閲覧注意】

 解析記事なのでネタバレを含む可能性があるので【閲覧注意】

 解析記事なのでネタバレを含む可能性があるので【閲覧注意】


● BASICプログラム 10行で作られた MSX 用RPG『10 Lines Hero』を解析する!

 たったの 10行で「遊べる」 RPGゲームができるとは!!

 凄い!!凄すぎる!!(BASICコードが語りかけます)

 しかし、ホント、この 10行(プログラム的には 9行)でどうやって自分が移動して、マップ切り替えをして、敵が動き回って、敵毎に判定処理が有って、経験値を得てレベルアップして、鍵の扉やワープトンネルが有って、エンディングまで有るんだろう?

BASICプログラム10行で作られた #MSX 用RPG『10 Lines Hero』、完成しました!!
よければリンクから飛んで遊んでみてください!(起動まで約30秒ほどかかります)
説明書とプログラムのスクショをこのツイートにぶらさげます。 #MSXBASIC #BASIC #10liner #MSX10行RPG https://t.co/bUMbrNw4mi pic.twitter.com/UJiwpaN0PO

— 穂乃井 a.k.a ほのっぺ (@honowi) March 27, 2021

 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』


・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
Mooyan by Giuseppe Stassi
 何でこれが 10行でできるんだよ???!!!

 これも凄い!
・Mini Bros by Vitoco
Mini Bros by Vitoco
Mini Bros by Vitoco

 全部 BASIC 10行!!

Mini Bros - Atari game for NOMAM BASIC 10Liners Contest 2019


Defensor - Atari game for NOMAM BASIC 10Liners Contest 2018


Patrol - Atari game for NOMAM BASIC 10Liners Contest 2021



●私の場合は同じく BASIC言語で 5行で CAR GAMEでした

・マイコン雑誌 Pioの表紙
マイコン雑誌 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形式で保存で単なるテキスト形式になる
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プログラムのメモリエリアの理解を得る為にミニプログラムを作って確認しました
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』のコメント部分
MSX 用RPG『10 Lines Hero』のコメント部分



 なお、画面表示が 40行モードだと厳しいので 80行モードに変更します。
SCREEN0:WIDTH80
 で 80行モードに変更できます。

・MSXの画面モードを 80行モードにする方法
MSXの画面モードを 80行モードにする方法


・MSXの画面モードを 80行モードにする方法
MSXの画面モードを 80行モードにする方法



・MSX 用RPG『10 Lines Hero』のコメント部分のバイナリをゲットする方法
MSX 用RPG『10 Lines Hero』のコメント部分のバイナリをゲットする方法


・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)

&H800832768 + 88^5 + 80
&H810332768 + 256 + 332768 + 8 + 251252バイト
&H818832768 + 256 + 13632768 + 8 + 256 + 1280
&H81C932768 + 256 + 20132768 + 8 + 256 + 19467バイト

 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までの文字を表示してキャラグラの定義を確認する
0x20~0xFFまでの文字を表示してキャラグラの定義を確認する


 &H78~ 8文字毎に背景のキャラグラを定義している。(I*56なので 7文字毎と思えるが、変数 Jが 8増えるので 8文字毎になる。最初気が付かなくて悩んだ!)

 MSXのグラフィックキャラクタ(拡張文字)は変更無し!(CHR$(1)+CHR$(n)、n=0x40~0x5Fでグラフィックキャラクタを表示する)
・MSXのグラフィックキャラクタ(拡張文字)は変更無し
MSXのグラフィックキャラクタ(拡張文字)は変更無し


 グラフィックキャラクタの文字領域としてはコントロールコードの 0x00~0x1Fに割り当てられている。

●キャラグラ領域(+前後1文字)だけを表示して確認する
FOR I=112 TO 228 STEP 8:? CHR$(I);:NEXT
・キャラグラ領域(+前後1文字)だけを表示して確認する
キャラグラ領域(+前後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はスプライト用のグラフィック定義
-(I>29)*12544はスプライト用のグラフィック定義



● VPOKE 1864+J, Q
 1864 = 0x748、0x748 / 8 = 0xE9
 &HE9~の文字は体力ゲージ用の文字定義か。
・&HE9~の文字は体力ゲージ用の文字定義
&HE9~の文字は体力ゲージ用の文字定義


・&HE9~の文字は体力ゲージ用の文字定義
&HE9~の文字は体力ゲージ用の文字定義




● MSXは VPOKEで文字フォントを書き換えられます。うーん凄い!
VPOKE &H100,&H55
VPOKE &H101,&HAA
VPOKE &H102,&H55
VPOKE &H103,&HAA
 で &H20の空白文字のフォントの上部が市松模様に書き換わります。
 0x20 * 8 = 0x100
・MSXは VPOKEで文字フォントを書き換えられます。うーん凄い!
MSXは VPOKEで文字フォントを書き換えられます。うーん凄い!
&H55,01010101,・■・■・■・■
&HAA,10101010,■・■・■・■・
&H55,01010101,・■・■・■・■
&HAA,10101010,■・■・■・■・

 0x11、0x22、0x44、0x88で斜め線
・MSXは VPOKEで文字フォントを書き換えられます。うーん凄い!
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の値
MSXの BASIC言語の 論理値 TRUE/ FALSEの値



● VPOKE &H1800~で画面の表示内容(VRAM)を直接書き換え。

・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(プログラム終了)を仕込んでみる
とりあえず、5行に END(プログラム終了)を仕込んでみる
 この状態でマップが表示される。

 とりあえず、6行に END(プログラム終了)を仕込んでみる。
・とりあえず、6行に END(プログラム終了)を仕込んでみる
とりあえず、6行に END(プログラム終了)を仕込んでみる
 この状態でレベル等が表示される。

 とりあえず、7行に 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


●変数表

変数名初期値内容
O7
T$"L***Y**!"エンディング メッセージ
M7マップ番号FOR
X(1)9自分の X座標
Y(1)9自分の Y座標
H(1)自分の HP
P0EXP 経験値
M(99)マップ情報ワーク
GFOR
KZ(M+418)
N
DZ(M+66) AND 7敵番号(0=敵1、5=敵6)
B0
KT0
L
G0
L0-3*(RND(1)*(D>0)*(B=0)+D)*(L+B>0)敵のレベル
X(0)敵の X座標
Y(0)敵の Y座標
H(0)敵の HP
RFOR
LS自分のレベル(L0減算済み)
L10自分のレベル
ZL1*4+4次回レベルアップ経験値
H0 TO 2FOR
F10-D
NHP表示用FOR
H0
U0
KKZ(451+D)
SC敵スプライト描画色
TF TO 99FOR
E1-J TO 1FOR
C0
KRND(J)*5敵移動方向
KVPEEK地面情報
VxxX座標ワーク
WxxY座標ワーク
VP6917 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マップ描画、
5EXP 経験値、レベル描画
6HP表示、自分死亡判定(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のマップ生成の実装方法がヤバイ件!やばたにえん!


・10 Lines Heroのマップ生成の実装方法がヤバイ件!やばたにえん!
10 Lines Heroのマップ生成の実装方法がヤバイ件!やばたにえん!




●マップの草

 マップ中央の 6*6の中に乱数で配置します。
 (壁に接する外周部には草は生えない)


● MSXの乱数 RND命令はマイナスのシード値で生成値が初期化されます

 MSXの乱数 RND命令はマイナスのシード値で生成値が初期化されます。

 RND(負の整数)でシード値とした乱数生成の初期化
 RND(0)で前回と同じ値
 RND(正の整数)で 0以上~1未満の乱数

・MSXの乱数 RND命令
MSXの乱数 RND命令


・MSXの乱数 RND命令
MSXの乱数 RND命令




● C#言語に勝手移植中

・MSX 10 Lines Heroを C#言語に勝手移植中
MSX 10 Lines Heroを C#言語に勝手移植中





Tags: [Windows開発]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

PC-9801で MZ-80Kのシューティングゲーム ZEPLISを動かしたい。旧題:PC98でMZ80K(謎)
PC-9801で MZ-80Kのシューティングゲーム ZEPLISを動かしたい。旧題:PC98でMZ80K(謎)

  PC-98x1にMZ-80Kの名作ゲーム ZEPLISシリーズを移植!

私の手掛けたシューティングゲーム NEC-PC98/EPSON互換機用 同人ソフト
私の手掛けたシューティングゲーム 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/