C64 BASIC ダンジョンクローラー:階段、レベル、そしてレベルアップ(パート11)
C64 Basic Dungeon Crawler: Stairs, Levels and Levelling Up (Part 11) (retrogamecoders.com)
要約
この記事は、C64 BASICで開発中のダンジョンクローラーゲームに、レベルアップ、キャラクターの成長、複数レベルの導入について解説しています。プレイヤーは複数のダンジョンレベルを探索し、各レベルで特定の数の「聖杯」を集めることで次のレベルに進むことができます。また、キャラクターはヒットポイントやステータスが上昇し、魔法の収集も可能になります。
全文翻訳
C64 BASIC ダンジョンクローラー:階段、レベル、そしてレベルアップ(パート11)
進歩しているという感覚は、ゲームの楽しさの大きな部分を占めます。それが単語として正しいかは100%確信がありませんが、意味は分かっていただけるでしょう!
これは、「手に取ってすぐに遊べるミニゲーム」と「うわー、もうこんな時間、一日中これに費やしてしまった!」というゲームの違いです。あくまで仮の話ですが。
現時点では、私たちのC64 BASICダンジョンにはレベルアップ機能も、キャラクターの成長要素もなく、マップは1つだけです。誤解しないでください、多くの楽しいゲームは1画面でキャラクターの成長要素がなくても成り立っていますが、それらのゲームは通常、セッションが進むにつれて難易度を上げていきます。
そこで次に、進歩、難易度の上昇、そしてキャラクターのステータス強化を追加する必要があります。
ここまでの進捗
マップは1つだけですが、今はプレイ可能なものになっています。聖杯を見つけると、「YOU WIN」というメッセージとプレイ続行のプロンプトでゲームは終了します。
プレイ続行を選択すると、新しいキャラクターが生成され、新しいマップが生成されます。あなたの進捗はすべてリセットされ、実質的に「N」キーを押して新しいゲームを開始するのと同じです。
[画像:オンラインレトロIDEでC64 BASICコードを表示]
チュートリアルに従って、オンラインレトロIDEで直接コードを編集できるようになりました。
– ダウンロードや設定は不要で、無料です!
現在の「レベル」の定義
このバージョンでは、5つのレベルに進みます。各レベルは、パート10と同じジェネレーターを使用して新しいマップを生成しますが、オブジェクトの配置と作成に関するルールが追加されています。
1つの聖杯ではなく、レベルをクリアするには、ダンジョン内のすべての聖杯を掴む必要があります。そうして初めて階段を降りることができます。聖杯の数はレベルが上がるにつれて増加しますが、興味深いことに、単純な+1ではありません。
| レベル | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| 聖杯の数 | 1 | 1 | 2 | 2 | 3 |
LVはレベル番号、CLは残りの聖杯数です。INTは小数点以下を切り捨てるため、レベル1と2では1個、レベル3と4では2個、レベル5では3個の聖杯が配置されます。
CL=INT((LV+1)/2)
あなたのキャラクターは、まだ生きている間はヒットポイント、ステータス、ゴールド、鍵、魔法を引き継ぎます。
今のところ、レベル5の階段はダンジョンから脱出し、ゲームをクリアします。
勝っても負けても、到達したレベルと獲得したゴールドが表示されるようになりました。
[画像:レベル5をクリアした後の終了画面:YOU WIN、ゴールド合計、LEVEL: 5]
レベル5をクリアした後の終了画面:YOU WIN、ゴールド合計、LEVEL: 5
1つのルーチンがレベルを構築する
パート10では、プレイヤーを設定し、ゲーム開始時と「N」キーでの新しいゲーム開始時の2箇所でマップを描画しました。
そのコードは現在2つに分割されています。INITPLAYERはキャラクターに関するすべての処理を担当し、ゲームごとに1回だけ実行されます。BUILDLEVELは、各レベルに関するすべての処理を担当し、レベルごとに1回実行されます。
BUILDLEVEL:
PX=10 : PY=11 : OX=PX : OY=PY
WN=0 : LA=0
CL=INT((LV+1)/2)
POKE 53280,0 : POKE 53281,0
GOSUB MAPBLANK
GOSUB MAPROLL
GOSUB DISPLAY
GOSUB POPULATE
GOSUB DRAWPLAYER
RETURN
PX、PYはプレイヤーをスタート地点に戻します。WNは「このレベルを離れる」フラグです。LAはメッセージログの行数で、画面がクリアされたばかりなのでゼロです。
新しいゲームは GOSUB INITPLAYER の後に GOSUB BUILDLEVEL を実行します。階段を降りる場合は、GOSUB BUILDLEVEL のみを単独で実行します。
これがゲームのリセットとレベルのリセットの違いであり、キャラクターがマップ生成を無事に乗り越えられる理由です。
階段の使用
階段は、4つの角部屋のうちの1つにランダムに配置されます。プレイヤーは中央の部屋から開始するため、階段が開始地点と同じ部屋になることはありません。
EX=4*INT(RND(1)*2) : EY=4*INT(RND(1)*2)
INT(RND(1)*2)は0または1です。それに4を掛けると0または4になり、横方向の最初または最後の部屋、縦方向も同様です。
パート10のマップルールにより、すべての部屋が他のすべての部屋から到達可能になっているため、どの部屋が選択されても安全なはずです。階段が到達可能かどうかはチェックしませんが、その論理によれば常に到達可能です。
階段のある部屋はオープンな部屋タイプに強制し、階段はその中央セルに配置されます。
IF RX=EX AND RY=EY THEN MT=1
理由は、階段は聖杯が集められるまで移動をブロックするためです。階段を悪い場所に配置して移動をブロックしたくはありません。
その中央セルの位置を取得するのは、部屋番号から行います。部屋は壁を含めて幅4セルで、マップは画面行2から始まります。
ROW=EY*4+4 : COL=EX*4+2
聖杯の収集と階段のアクティブ化
各聖杯は引き続き10ゴールドの価値があり、CLをカウントダウンします。ゼロになると、ログに「FIND THE STAIRS」と表示されます。
POPULATEはレベルに必要な数の聖杯を配置し、配置された数をCLに設定します。PLACEONEは、空き床を見つけるのに200回失敗すると諦めるため、混雑したマップでは聖杯が出現しない可能性があります。追加されたものだけをカウントすることで、レベルは引き続きクリア可能です。
Q=CL : CL=0
IT$="{PURPLE}(" : FOR N=1 TO Q : GOSUB PLACEONE : CL=CL+PF : NEXT N
PFはPLACEONEの「成功した」フラグ(1または0)なので、これを合計することで成功した数をカウントします。
まだ拾われていない聖杯がある状態で階段に入ると、プレイヤーは「CHALICES LEFT」というメッセージと残りの数とともに跳ね返されます。
何も残っていない場合、階段はWN=1を設定して戻ります。WNはパート10で「勝った」という意味で始まりましたが、今ではゲーム全体ではなく、レベルがクリアされたことを意味します。
メインループはフラグを見て、NEXTLEVELにジャンプします。これはパート10で勝ったときと同じ、フラグを立ててからのGOTOアプローチです。階段はGOSUB内で見つかり、そこから新しいレベルを構築すると、BASICのスタック上でそのGOSUBが毎回未完了のまま残ってしまいます。
レベルアップ
今のところ、新しいレベルごとにキャラクターのヒットポイントが、constitution(体力)の半分(切り捨て)だけ増加します。また、偶数レベルではstrength(筋力)に+1、奇数レベルではdexterity(器用さ)に+1が追加されます。
これは主に、現時点でどのように実装できるかを示すためのもので、後で磨き上げる段階で何が実際に有益かをさらに検討できます。
HL=INT(STATS(2)/2) : HP=HP+HL
S=LV AND 1 : STATS(S)=STATS(S)+1
AC=10+INT((STATS(1)-10)/2)
STATS(0)は筋力、STATS(1)は器用さ、STATS(2)は体力です。
LV AND 1は、奇数の場合は1、偶数の場合は0になります。ANDは2つの数値をビットごとに比較し、任意の奇数の最下位ビットは1です。したがって、結果は上昇させるステータスの配列インデックスと同じになります。
アーマークラスは、dexterity(器用さ)から派生するため、再度計算されます。
Strength(筋力)は、to-hitロール(命中判定)と、そのmodifier(修正値)によるダメージに役立ちます。Modifierは2ポイントごとにしか変化しないため、1ポイントのstrength(筋力)がすぐに大きな違いを生むとは限りません。ここでも、キャラクターの能力と幸運のバランスを取ることは、コードが機能してから考えるべきことです。
ログには、新しいレベル、上昇したステータス、獲得したヒットポイントが表示されます。
ポーションがついに魔法に
*のポーションを収集すると、最大100まで、50マジックが追加されます。
IF CH=42 THEN MG=MG+50:MSG$="MAGIC UP 50":GOSUB TAKEITEM
IF MG>100 THEN MG=100
まだマジックを「消費」するものはありませんが、カウントされ表示されており、パート12の遠距離攻撃の準備ができています。
この数値は、このゲームのC言語版と一致しており、同じアイテムの取得で50マジックが追加され、呪文は5マジックに移動セル数ごとの+1がコストとしてかかります。
[画像:ポーションを飲んだ後のレベル1:ステータスラインに50マジックとレベル1と表示され、階段は右下の部屋にある]
ポーションを飲んだ後のレベル1:ステータスラインに50マジックとレベル1と表示され、階段は右下の部屋にある
ステータスライン
これにより、マジックと現在のレベルの2つのカウンターが必要になります。スペースを多く使うようになったため、カウンター間のスペースは2つから1つになりました。ステータスラインは、利用可能な40文字のうち31文字を占めるようになりました。
これは2つのPRINTステートメントで構築されます。最初のステートメントはセミコロンで終わるため、カーソルは2番目の部分のために同じ行に留まります。
まだToDoリストにあること
まず、進歩の要素を追加しましたが、難易度を上げる必要があります。例えば、各レベルには依然として同じ3~6体のゴブリンが登場します。
次に、マジックは収集できますが、まだ使用できません。
最後に、まだRAMに空きがあるので、より多くのアイテムやゲームプレイの多様性をメモリに収めることができるでしょうか?
皆さんへの質問:
- 階段は双方向に機能すべきでしょうか? 再訪したレベルでは敵が再出現するでしょうか?
- 収集した鍵は引き継がれますが、次のレベルのドアを開けるために、前のレベルから余分な鍵を保持することを奨励すべきでしょうか?
- キャラクターのレベルアップは自動ですが、プレイヤーにどのステータスを上げるか選択肢を与えるべきでしょうか?
- ゲームオーバーになるまでに、レベルはいくつあるべきでしょうか?