HN 日本語サマリー

← 一覧へ戻る
プログラミング

C64 BASIC ダンジョンクローラー:階段、レベル、そしてレベルアップ(パート11)

C64 Basic Dungeon Crawler: Stairs, Levels and Levelling Up (Part 11) (retrogamecoders.com)

7 pointsby ibobev3 コメント

要約

この記事は、C64 BASICで開発中のダンジョンクローラーゲームに、レベルアップ、キャラクターの成長、複数レベルの導入について解説しています。プレイヤーは複数のダンジョンレベルを探索し、各レベルで特定の数の「聖杯」を集めることで次のレベルに進むことができます。また、キャラクターはヒットポイントやステータスが上昇し、魔法の収集も可能になります。

全文翻訳

C64 BASIC ダンジョンクローラー:階段、レベル、そしてレベルアップ(パート11)

進歩しているという感覚は、ゲームの楽しさの大きな部分を占めます。それが単語として正しいかは100%確信がありませんが、意味は分かっていただけるでしょう!

これは、「手に取ってすぐに遊べるミニゲーム」と「うわー、もうこんな時間、一日中これに費やしてしまった!」というゲームの違いです。あくまで仮の話ですが。

現時点では、私たちのC64 BASICダンジョンにはレベルアップ機能も、キャラクターの成長要素もなく、マップは1つだけです。誤解しないでください、多くの楽しいゲームは1画面でキャラクターの成長要素がなくても成り立っていますが、それらのゲームは通常、セッションが進むにつれて難易度を上げていきます。

そこで次に、進歩、難易度の上昇、そしてキャラクターのステータス強化を追加する必要があります。

ここまでの進捗

マップは1つだけですが、今はプレイ可能なものになっています。聖杯を見つけると、「YOU WIN」というメッセージとプレイ続行のプロンプトでゲームは終了します。

プレイ続行を選択すると、新しいキャラクターが生成され、新しいマップが生成されます。あなたの進捗はすべてリセットされ、実質的に「N」キーを押して新しいゲームを開始するのと同じです。

[画像:オンラインレトロIDEでC64 BASICコードを表示]

チュートリアルに従って、オンラインレトロIDEで直接コードを編集できるようになりました。

– ダウンロードや設定は不要で、無料です!

現在の「レベル」の定義

このバージョンでは、5つのレベルに進みます。各レベルは、パート10と同じジェネレーターを使用して新しいマップを生成しますが、オブジェクトの配置と作成に関するルールが追加されています。

1つの聖杯ではなく、レベルをクリアするには、ダンジョン内のすべての聖杯を掴む必要があります。そうして初めて階段を降りることができます。聖杯の数はレベルが上がるにつれて増加しますが、興味深いことに、単純な+1ではありません。

レベル12345
聖杯の数11223

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に空きがあるので、より多くのアイテムやゲームプレイの多様性をメモリに収めることができるでしょうか?

皆さんへの質問:

  • 階段は双方向に機能すべきでしょうか? 再訪したレベルでは敵が再出現するでしょうか?
  • 収集した鍵は引き継がれますが、次のレベルのドアを開けるために、前のレベルから余分な鍵を保持することを奨励すべきでしょうか?
  • キャラクターのレベルアップは自動ですが、プレイヤーにどのステータスを上げるか選択肢を与えるべきでしょうか?
  • ゲームオーバーになるまでに、レベルはいくつあるべきでしょうか?