現在公開している「初代「夢幻の心臓」の紹介」の文章では、敵から受けるダメージの計算方法について紹介しています。
強さに大きな差がない相手から受けるダメージの量として、PCマガジンに掲載されていたプログラムリストにもとづいて「敵の耐久力の20%」という値が使われているという説明をしました。
そして最後に補足として「別バージョンの可能性について」というタイトルで、この20%という値が、初期に発売されていたPC88版では「 10% にしようとした形跡はあるけれどもプログラム上のミスで実際には 30% になっていた」可能性があると書きました。Project EGG のPC88版「夢幻の心臓」も「敵の耐久力の30%」という値が使われています。 ここでは、その根拠とその確認をする方法を解説します。
※注:以前記述していたものに間違いがあったため、 2023/6/29 に全体を書き直しました。
今回、特殊なツールなどは使わずに、一般的な操作をするだけで、Project EGG のPC88版「夢幻の心臓」のプログラムのソースコードを閲覧する方法をみつけました。ダメージ計算の仕組みを簡単に確認できることがわかったので、この文章を書くことにしました。
ただし、雑誌などには掲載されていない「ゲーム中に組み込まれたプログラムのソースコード」を使って確認をすることになります。
一方、正規の引用とみとめられるためには対象となる情報が公開されていることが必要です。今回の方法は、標準的なキー操作だけを使っているものの、ソースコードが公開されていると判断して良いかどうかは微妙なところです。
そこで、ここでは、まず、PCマガジンに掲載されているプログラムを引用して内容を解説したいと思います。 そして、その後で、かなりわかりにくいとは思いますが、Project EGGのPC88版については具体的なソースコードを直接的に引用することはせずに、PCマガジン版との違いを記述することで、解説をしたいと思います。事実関係を検証したい方は、実際にProjectEGGのPC88版「夢幻の心臓」で作業をしてソースコードを確かめていただければと思います。
ここでは、キーボードを使った一般的な操作だけで、Project EGGが提供しているPC88版夢幻の心臓のソースコードの「ダメージ計算の処理の部分」を確認する方法を説明します。
夢幻の心臓を起動してゲームウインドウをクリックし、BASICの表示が出た直後に、 Ctrlキー を押しながら C のキーを何度か押して、プログラムのロードを中断してください(この操作で、一般的なBASICでのロード中にSTOPキーを押して中断するのと同じことができます)
タイトル画面が表示される前にブレイクをしてください。この作業をすると、キーボードでBASICのコマンドを入力できるようになります。
下記のコマンドを入力して、エンターキーを押すことで、メインプログラムをロードしてください(ただし、 シンゾウ の部分は濁点を1文字として半角5文字で入力、英字入力とカナ入力の切り替えは「F12」のキーでおこないます)
load "シンゾウ.mai"
下記のコマンドを入力して、エンターキーを押すことで、対象となるソースコードを表示してください。
list 4750-4780
上記の命令で表示される4行が命中率とダメージを処理している部分になります。
この方法で、クラックソフトなどは使わずに標準的なキーボード操作だけでソースコードを確認できます。また、アップデートなどで変更される可能性のない「ザ・トリロジーズ」に含まれる「夢幻の心臓」でもこの方法が可能なことを確認しています。
これ以降、PCマガジンに掲載されたものを「PCマガジン版」、上記の方法で表示させたものを「初期88版」と表記します。
この2つの違いを簡単に説明すると、「PCマガジン版」が「まず補正前の基準値を算出し、その複製を作成し、一方が30以下なら30に補正し、もう一方が20以下なら20に補正する」のに対し、「初期88版」は「まず補正前の基準値を算出し、それが30以下なら30に補正し、その複製を作成し、その複製が10以下なら10に補正する」というものになっています。
補正前の基準値が30以下のとき、「初期88版」のほうは複製を作成する前に基準値が30に補正されてしまうため、その複製が30以下になることはありません。そのため、後半の「10以下なら10に補正する」という処理が機能しなくなっているのです。
以下ではプログラムを示しながら、その詳細を説明したいと思います。
PCマガジンでは、1988年8月号p132左段の行番号4720~4750が、上記の処理に該当する部分になります。 以下に、その部分を引用して示します。
この部分で使われている変数のうち、計算に関わるものの意味を下記に示します。
変数名 | プログラム上の意味(PCマガジン版) |
---|---|
AZ(4) | 敵の攻撃力 |
NZ(5) | プレイヤーの回避力(装備の補正を含む) |
MZ(5) | 回避力の魔法による影響量 |
I | ダメージの割り合いの基準値 |
J | 命中率の基準値 |
AZ(0) | 敵の耐久力の残量 |
DM | プレイヤーが受けるダメージ |
※上記の意味はプログラム全体を読んで把握したものです。なお、上記の他に MS$(表示するメッセージ)と KAI$(怪物の名前)が使われています。
このプログラムの直後(4760行目)には、変数 DM の値を使って「プレイヤーがダメージを受ける処理」を呼び出す命令が書かれています。また、if 文の行き先である 4770 行目には「敵の攻撃が失敗する処理」が書かれています。
このPCマガジン版のソースコードでは、1行目で「敵の攻撃力 ― プレイヤーの回避力 - 魔法による影響量」の引き算で計算をした基準値を、 I に代入しています。
そして、その直後に「 J = I 」という命令で J にも同じ値を割り当てています。
この代入処理の後、1行目の最後に「J が 30以下のときに J を 30 に補正する」という作業をしています。
2行目では、この J の値にもとづいて攻撃がミスするかどうかを判定しています。
そして、3行目で「 I が20 以下のときに I を 20 に補正する」という作業をしたうえで、4行目でその I を使ってダメージの量を計算するプログラムになっています。
結果として、強さに大きな差がない場合、命中率を表す J の値は30、ダメージの割り合いを表す I の値は 20 になります。
初期88版のソースコードは、PCマガジン版と比べて下記の点が異なっています。
初期88版では、2行目以降のソースコードの変数 I と J の記述がすべて入れ替わっているため、I が命中率の基準値、 J がダメージの割り合いの基準値を意味する変数になっています。
そして、1行目の最初ではPCマガジン版と同様に、「敵の攻撃力 ― プレイヤーの回避力 - 魔法による影響量」の引き算で計算をした基準値を I に割り当てています。
しかし、その直後に「 J = I 」の命令を実行せずに、「I が 30以下のときに I を 30 に補正する」という作業をしています。そして、その後で、「 J = I 」の命令を実行しています。
そのため、最初に計算した基準値が 30 以下だった場合、Iと J の両方に 30 の数値が代入されてしまいます。
3行目には、「 J が10 以下のときに J を 10 に補正する」という命令が書かれているのですが、それをを実行しても、すでに J の値は 30 (10より大きい値)になっているので、J が 10に補正されることはありません。4行目のダメージの量の計算では J に割り当てられた 30 の値が使われることになります。
結果として、初期88版では「基準値が30以下のときには、命中率とダメージの割り合いの両方で「 30% 」という値が使われる」ということになります。
以上のことから、強さに大きな差がない場合のダメージの量として、PCマガジン版では「敵の耐久力の20%」の値が使われているのに対し、初期88版では「敵の耐久力の10%にしようとした形跡はあるけれども、実際には敵の耐久力の30%」の値が使われている、と言えるわけです。
このページでは、初代「夢幻の心臓」の敵から受けるダメージの計算について、PCマガジン版と初期88版に違いがあると判断した根拠を説明しました。
初期88版のほうはソースコードを示さずに解説したので、かなりわかりにくい説明だったかと思います。以前の文章で補足として述べていた部分の証拠を確認したい方は、実際に操作をして内容をチェックしてみていただければと思います。