ターミナルタイピングRPG「クムドールの試練」 v0.5.0|C言語製ターミナルタイピングRPGの更新 | UNIX Cafe

* 当サイトでは、コンテンツの一部に広告を掲載しています。

System Note $ cat /proc/ai-disclosure

本記事の構成および論理分析にはAI(人工知能)を使用しています。情報の正確性は、システム管理者(UNIXユーザー)による手動検証済みです。

ターミナルタイピングRPG「クムドールの試練」 v0.5.0|C言語製ターミナルタイピングRPGの更新 | UNIX Cafe

C言語で作っているターミナルタイピングRPG「クムドールの試練」を、v0.5.0 に更新しました。

GitHubでは kumdor-trial という名前で公開しています。

前回の v0.4.0 では、敵の本気状態、反撃特性、3連続正解ボーナスなどを追加して、戦闘シーンでの楽しさを見直しました。

今回は、その戦闘シーンをもう少し遊びやすくするために、休憩イベント、ステージ突破評価、ミス時の短いフィードバック、セーブデータ互換チェックを追加しました。

一言でいうと、v0.5.0 は「遊んだ結果が少し見えるようになり、途中の区切りもできた」状態です。

目次

3ステージごとに休憩イベントを入れました

これまでは、ステージを突破すると報酬と物語文が出て、そのまま次のステージへ進む形でした。

ただ、10ステージを続けて遊ぶと、ログの流れが少し単調になりすぎたので、第3ステージ、第6ステージ、第9ステージの突破後に、休憩イベントを入れることにしました。

【休息】
鐘楼の下で村人が温かい布を差し出した。短い休息のあいだ、左右のホーム段の感覚が指に沈み直していく。

【クムムースの助言】
  < スペースも剣筋の一部、モォォ…… >
    o   \_\_    _/_/
     o      \__/
            (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

HPが3回復した。 (あなたのHP: 9/10)

次の助言: 次は人差し指を上段へ伸ばす。打ったあと、必ずfとjへ戻ることを意識しろ。

休憩では、HPが少し回復し、毒や暗闇などの状態異常も解除されます。

また、次のステージに向けた短い助言も表示します。

単に「回復しました」と出すだけでなく、物語の区切りとして読めるようにしたかったので、休息の場所や状況も短く書いています。

小さな内蔵イベントを入れた

休憩中には、小さなイベントも表示されます。

外部コマンドの cowsayfortune を呼び出すのではなく、ゲーム内に組み込んだ表示です。

現在は次の順番で出ます。

  • 第3ステージ後: クムムースの助言
  • 第6ステージ後: 補給車クム3号
  • 第9ステージ後: 旅の札

最初はランダム表示にしていましたが、遊んでみると「見たいイベントが出ない」ことがありましたので、休憩ポイントごとに固定しました。

ゲームの本筋を邪魔しない程度の短い小ネタですが、ターミナルゲームらしい息抜きになったと思います。

ステージ突破時に評価を出す

ステージ突破時には、ステージごとの成績を表示するようにしました。

ステージ成績: 正解 10 / ミス 1 / 入力失敗 0 / 命中率 90.9% / 最大連続正解 6
突破評価    : 剣筋は安定

評価は、命中率、ミス数、入力失敗数、最大連続正解数を見て決めています。

大げさなスコアランキングではありませんが、ステージを抜けた直後に「今のステージはどれくらい安定していたか」が軽く分かるようにしました。

タイピング練習としては、クリアできたかどうかだけでなく、どこで崩れたかを簡単に振り返れることが大事だと思ったからです。

最大連続正解数を保存する

ステージ別成績には、これまで正解数、ミス数、入力失敗数を保存していました。

v0.5.0 では、これに加えて最大連続正解数も保存するようにしました。

そのため、セーブ形式は KUMDOR_SAVE_V3 になっていますが、古いセーブデータを捨てる形にはしていませんので、V1V2 のセーブデータも読み込むことができます。

セーブデータに不正な値がある場合や、すでにクリア済みの記録だった場合は、新しい試練として始めるようにしています。

セーブデータに KUMDOR_SAVE_V1 / V2 / V3 を入れている理由

C言語で作っているターミナルタイピングRPG「クムドールの試練」では、セーブデータの先頭に次のような文字列を入れています。

#define SAVE_FORMAT_HEADER_V1 "KUMDOR_SAVE_V1"
#define SAVE_FORMAT_HEADER_V2 "KUMDOR_SAVE_V2"
#define SAVE_FORMAT_HEADER_V3 "KUMDOR_SAVE_V3"

これは、セーブファイルの形式を見分けるためのラベルです。

ゲーム中に実際に作られるセーブファイルは kumdor_save.txt ですが、その先頭に KUMDOR_SAVE_V3 のような形式識別子を書いておくことで、読み込み時に「このセーブデータはどのルールで書かれたものか」を判断できます。

形式を分ける理由

V1,V2,V3と形式を分ける理由は、セーブデータの中身がバージョンごとに変わるからです。

たとえば「クムドールの試練」では、保存する内容が段階的に増えています。

V1: プレイヤーの基本データだけ
V2: ステージ別の正解数、ミス数、入力失敗数を追加
V3: ステージ別の最大連続正解数を追加

V2では、各ステージごとに3つの数値を保存します。

正解数 ミス数 入力失敗数

V3では、そこに最大連続正解数が増えるので、各ステージごとに4つの数値を保存します。

正解数 ミス数 入力失敗数 最大連続正解数

もし形式識別子がなければ、読み込み側は「このファイルには3つずつ数値が並んでいるのか、4つずつ並んでいるのか」を判断できません。

そのため、V2のセーブファイルをV3として読もうとすると、読み取り位置がずれて、後続のデータまで壊れたように見えてしまいます。

形式識別子があると何ができるのか

先頭に KUMDOR_SAVE_V1 / KUMDOR_SAVE_V2 / KUMDOR_SAVE_V3 を入れておけば、読み込み時に分岐することができます。

KUMDOR_SAVE_V1 なら、基本データだけ読む
KUMDOR_SAVE_V2 なら、ステージ別成績を3項目ずつ読む
KUMDOR_SAVE_V3 なら、ステージ別成績を4項目ずつ読む

こうしておくと、新しいバージョンのゲームでも、古いセーブデータをある程度読み込むことができます。

v0.5.0 の現在は KUMDOR_SAVE_V3 で保存しますが、古い KUMDOR_SAVE_V1KUMDOR_SAVE_V2 の読み込み処理も残しています。

実ファイルが同梱されているわけではない

KUMDOR_SAVE_V1KUMDOR_SAVE_V2 という名前のファイルが、リポジトリに入っているわけではありません。これらはあくまで、セーブファイルの中に書かれる文字列です。

実際のセーブファイルは、ゲームを実行して保存したときに kumdor_save.txt として作られます。

kumdor_save.txt

このファイルはプレイヤーごとの進行状況なので、Git管理には含めていません。

今後の拡張にも使える

将来、さらに保存項目を増やす場合は、同じ考え方で KUMDOR_SAVE_V4 を追加できます。たとえば、装備所持品難易度設定複数スロットなどを保存したくなった場合です。

そのときも、古い V1 / V2 / V3 の読み込み処理を残しておけば、過去のセーブデータを壊さずにゲームを拡張できます。

セーブ形式識別子は地味な仕組みですが、小さなゲームでも後から仕様を変えやすくするための保険になります。

セーブ確認の言葉を変えた

起動時のセーブ確認も、少し分かりやすくしました。

以前は次のような表示でした。

セーブデータが見つかりました。ロードしますか? (y/n):

クムドールの試練の開始前に見るコメントとしては、少し事務的な感じがします。

ちょと気になったので、現在はこうしています。

記録の石板が見つかりました。
前回の続きから始めますか? (y/n):

保存や再開の文言も、「セーブしました」ではなく「記録を刻んだ」という語り口に変更しました。

たとえばステージ突破後に中断する場合は、次のように表示します。

次は第2ステージの入口に刻まれた記録から再開する。

機能としてはただのセーブですが、ゲームの世界観を壊したくなかったので、揃えています。画面全体の雰囲気はかなり変わったと思います。

ミス時の短いフィードバック

タイプミスしたときに、入力のずれを見て短いヒントを出すようにしました。

たとえば、入力が短い場合、余計な文字が入った場合、最初の文字が違う場合、途中の文字が違う場合で、表示を分けています。

➔ ミス! 手元が狂った!(反撃を受ける!)
(剣筋が届いていない。最後の一文字まで振り抜け!)

詳しい解説ではありませんが、それでも、ただ「ミスをした」と出るよりは、次の入力でどこを意識すれば良いかのヒントになります。

タイピング練習としては、こういう短いフィードバックの積み重ねが効果的です。

ログを整理しました

BGMやセーブの補助ログも整理しました。

たとえば、BGM関連は [音]、セーブ関連は [記録] として表示します。

[音] 第4ステージのBGMを鳴らします。音量: 0.45
[記録] 第5ステージの入口に記録を刻みました。

BGMファイルがないステージでは、余計なログを出さずに無音で進みます。

ログが増えすぎると、肝心の課題や進行状態が見つけにくくなるからです。

そのため、補助情報は短いラベルに寄せて、通常のゲームログと見分けやすくしました。

セーブ互換チェックを追加しました

今回から make check-save を追加しました。

make check-save

このチェックでは、一時ディレクトリで次の内容を確認します。

  • KUMDOR_SAVE_V1 のロード
  • KUMDOR_SAVE_V2 のロード
  • KUMDOR_SAVE_V3 のロード
  • 不明な形式の扱い
  • クリア済みセーブの扱い
  • 新規保存時に KUMDOR_SAVE_V3 で保存されること

小さなシェルスクリプトですが、セーブ形式を変えるときの安心材料になります。

v0.5.0にした理由

今回の変更は、画面文言の修正だけではなくて、ステージ間の流れ、成績の見え方、セーブ形式、検証方法まで変更しています。

主な変更点は次の通りです。

  • バージョンを v0.5.0 に更新
  • 第3、第6、第9ステージ後に休憩イベントを追加
  • 休憩時にHP回復、状態異常解除、次ステージ助言を表示
  • クムムース、補給車クム3号、旅の札の内蔵小イベントを追加
  • ステージ突破時に敵の撃破セリフを表示
  • ステージ突破時に突破評価を表示
  • 最大連続正解数を記録、表示、保存
  • セーブ形式を KUMDOR_SAVE_V3 に更新
  • KUMDOR_SAVE_V1 / KUMDOR_SAVE_V2 の互換ロードを維持
  • make check-save を追加
  • セーブ、ロード、BGMログの文言を整理
  • READMEと作業計画を v0.5.0 の内容に更新

そのため、v0.4.1 ではなく v0.5.0 としました。

小さなゲームとして固まってきた

v0.5.0 で、クムドールの試練はかなり「通して遊ぶ」形に近づきました。

敵を倒すだけでなく、ステージを抜けたあとに成績を見て、休憩して、次の練習に向かう。

その流れが入ったことで、タイピング練習としても、ターミナルRPGとしても、一区切りごとの手触りが出てきた気がします。

まだ後半ステージの難易度や突破評価の条件は、実プレイで調整する余地があります。

次は、数ステージずつ遊びながら、課題の長さ、敵の反撃ダメージ、評価の出方を細かく見ていく予定です。

次の更新では敵の反応と状態異常を強化しまし

v0.6.0では、敵のセリフや毒・暗闇・修正不可の扱いを見直し、タイピングRPGとしての緊張感を少し強めています

GitHub Repository

GitHub
kumdor-trial
C言語製ターミナルタイピングRPG「クムドールの試練」
github.com/k1117n-cmyk/kumdor-trial

C言語の次にUnityやUnreal Engineを学ぶ選択肢

用途ごとに選ぶ C言語のおすすめ本

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe マスター

Macintosh Color Classicから始まった旅は、長いWindows時代を経て、Windows10のサポート終了をきっかけにUNIXの世界へ戻ってきました。UNIX Cafeでは、UNIX・Linux・そしてMacな世界を、むずかしい言葉を使わず、物語のように書いています。プログラミングは、アイデアをコンピューターに伝えるための言葉です。簡単な単語と文法を覚えれば、誰でもコマンドを使えます。ぜひ一度、やさしいプログラミングの世界をのぞいてみてください。

目次