2022年12月

Steam 版ラングリッサーⅠ E ルート攻略完了

D ルートに引き続き E ルートもクリア。

バルディア滅ぼしE ルートでは、ランス殺しにバルディア領主も関わっていたと知ったレディンが、外からバルディアに攻め込んで全滅させるという、わりと頭おかしい行動を取る。いや、王子なんだから普通に当該領主を処罰すればいいでしょうに。

闇堕ちかつての味方も構わず切り刻むレディンは、ラングリッサーと共に闇に堕ちる。

お供それを支えるというか煽っているのが、ランスの妹ベティ。

レディンとベティ仲間からも見放されたレディンに寄り添うベティ。

ベティしかし、人を滅ぼす寸前にベティも死亡。

誰も幸せにならないルートであった……。

ステータスステータス的には、レディンはレベル 37 に到達。

ゲーム的には、後半がレディンとベティの 2 人のみになってしまうので、一点集中突破でいかないと厳しい。

攻略メモは以下に整理。

2022 年の振り返り

年の瀬も迫ってきたので、今年 1 年の活動を振り返ってみたいと思います。

ニコカラメーカー 2

カラオケ字幕焼き付けソフト「ニコカラメーカー 2」は今年 6 回リリースを行い、最新版は Ver 12.53 になりました。

Microsoft Store での配布となってインストールが簡単になったほか、一括コピー機能の実装や字幕エンジンの改善など、より便利に、より簡単に使えるようになりました。

ニコカラメーカー 2 お問い合わせチャット

いつでも気軽にニコカラメーカー 2 のことを聞ける AI お問い合わせチャットを開設しました。

質問を入力したり、あるいは選択肢から選んで聞くこともできます。

ゆかりすたー 4 NEBULA

カラオケ字幕動画ファイル検索アシスト&一覧作成ツール「ゆかりすたー 4 NEBULA」は今年 5 回リリースを行い、最新版は Ver 7.22 になりました。

検索のしやすさを一層向上させ、また、使い方に迷わないようヘルプ機能を充実させました。

ゆっこビュー 2

ゆかりコメントを流す「ゆっこビュー 2」を新たに開発しました。3 回のリリースを経て、最新版は Ver 2.10 になりました。

簡易キーチェンジャー

MPC-BE などでキーチェンジを行えるようになる「簡易キーチェンジャー」は、最新の状況に合わせてヘルプを更新しました。

ちょちょいとファイル合併 2

HTML ヘルプの作成を手助けする開発者向けツール「ちょちょいとファイル合併 2」を新たに開発しました。3 回のリリースを経て、最新版は Ver 2.70 になりました。

GitHub

GitHub現時点で 1,116 個のコントリビュートができました。まだ同期していない分もあるので、最終的にはもう少し増えると思います。

講習会

ニコカラの作り方講座で講師を務めたり、ささやかなプログラミング講習会をしたりしました。

まとめ記事(ユーザー的整理)

ボーカル抽出ソフト Demucs の使い方を整理したり、画質が安定する CRF エンコードについてまとめたりしました。

まとめ記事(技術的整理)

WPF でコンテキストメニューを制御する様々な方法を整理したり、C# で効率的に SQLite を使う LINQ to SQLite のやりかたを整理したりしました。

はじまる A 列車

自作シナリオ作成方法をまとめたり、地域の伝承を楽しめる自作シナリオ「渓谷の琵城」を公開したりしました。

ラングリッサー

Steam 版ラングリッサーⅠの攻略メモをまとめています。



今年も色々な活動をすることができて楽しく過ごせました。

遊んでくれた皆様、ありがとうございました。

来年もどうぞよろしくお願いします。

Steam 版ラングリッサーⅠ D ルート攻略完了

C ルートに引き続き D ルートもクリア。

ランスC ルートではレディンと完全に手を組んでいたディゴスだが、D ルートでは闇の軍勢を倒した後は距離を置く。

その様子に不満げだったランスは、皇帝ディゴスを討ち、自らが皇帝となる。

闇の軍勢の残党や盗賊などとも手を結んでレディンに戦いを挑んでくる。

ランス2実はそれは、自らと一緒に敵対勢力をまとめてレディンに討たせるための計画だったという。

確かに有効な一手ではあるものの、なんかモヤるのはなぜだろう。日頃の身勝手なランスの言動故か、あるいは、皇帝を討ってしまったからか……。

レディンステータス的には、レディンはレベル 35 に到達。

D ルートは 19 章までランス隊(最大 4 人)が強制出撃で、20 章でいきなりその 4 人がいなくなり、あまり出撃できていない(育てられていない)残りの指揮官が出張ることになる。

1 周目で D ルートに進もうと思うと結構つらいかもしれない。

攻略メモは以下に整理。

ニコカラメーカー 2 Ver 12.53 公開

設定ニコカラメーカー 2 Ver 12.53 を公開しました。

ニコカラメーカー 2 は、カラオケ字幕動画ファイル(ニコカラ)を手軽に作ることができる字幕焼き付けツールです。画面の案内に従って操作を進めていくことで、ニコカラができあがる流れになっています。

Steam 版ラングリッサーⅠ C ルート攻略完了

B ルートに引き続き C ルートもクリア。

C ルートでは、ボーゼルによる操りの描写が丁寧。A ルート初見だとその辺りの様子が分からないが、C ルートを見ると、あぁこういう裏側なのか、というのが分かる。

Endとはいえストーリー展開は A ルートとは異なり、操りに気付いた帝国のディゴスはレディンと和解、連合を組んで闇の軍勢に対抗する。帝国のランス、ライアス、レティシア、ディゴスが仲間になる(ランスは最後は敵対するが)。エンディング画像もディゴスと手を組んだものになっている。

また、A ルートでは渾沌の神カオスを呼びだすボーゼルだが、C ルートでは自らが神を名乗っている。

クリスエピローグでは、A ルートではレディンと結ばれていたクリスは、C ルートでは孤児院を開いている。

ナームレディンと結ばれるのはナーム。

ライアスランスはお亡くなりになったのだ……。

撃破数が 100 越えかどうかで少しエピローグが変化するようだが……。

A ルート → 周回で B ルート → 20 章のデータから 11 章まで戻って C ルート

レディンレベルと進んでいるので、レディンのレベルは 33 まで上昇。

とはいえこのゲーム、指揮官のレベルが上がっても傭兵のレベルは上がらないので、無双というほどにはならない。それでも、初回で C ルートは結構厳しいのではとも思う。

攻略メモは以下に整理。

Steam 版ラングリッサーⅠ B ルート攻略完了

A ルートに引き続き B ルートもクリア。

NarmA ルートではランス単独で敵を足止めして結局戻って来られなかったが、B ルートではランスと共にナームが足止め役と務め、ラスダンで一緒に戻ってくる。A ルートよりもハッピーエンド。

ストーリー的には A ルートよりもシンプル。

ラスボスのカオスは闇を司る神だが、A ルートでは闇は光と表裏一体で、渾沌であると共に発展でもあるとしていた。一方の光は安定と共に停滞。どちらかに偏りすぎず、バランスが大事であると。

LucilisB ルートでは光の神ルシリスに手助けをしてもらい、ラングリッサーを強化してもらう。そのためか、光が善、闇が悪というシンプルな考え方になっている。

ゲームの進め方的には、クリアデータを使ってみたかったというのがあって、A ルートクリア後のセーブデータで、1 章から再度進めていった。

Ledin周回プレイ開始時のレディンのレベルは 28 だったが、B ルートクリア味には 31 まで上がった。

攻略メモは以下に整理。

Steam 版ラングリッサーⅠ A ルート攻略完了

Steam 版のラングリッサーⅠリメイク、楽しかった。
傭兵を雇って戦う SRPG が初めてだったので、新鮮な気持ちでプレイできた。

レディンA ルートクリア直後(周回開始時)の主人公レディン。

スキルは突撃勲章と散兵戦の心得で、指揮範囲を 5 に。

ナームドラゴンロードのナームは飛兵なのでもちろん大活躍なんだけれど、最後 2 章(地下神殿、闇の封印)は魔法地獄なので出番がなくて残念。

一方、最後にサーペンロードになったテイラーは意外にもずっと活躍した。水兵なので水が無いとダメかと思っていたけど、陸でも十分強い。配下も含めて。

SetWindowSubclass によるウィンドウプロシージャーのカスタム(C# / WinUI 3)


はじめに

GitHub標準のイベント等では処理できないウィンドウメッセージ(WM_*)を処理したい場合、自前のウィンドウプロシージャー(WndProc)を作る必要があります。

C# では、WinForms(フォーム)や WPF なら、ウィンドウプロシージャーをカスタムする仕組みが用意されている(HwndSource)ので簡単なのですが、WinUI 3(Windows App SDK)には残念ながら今のところそのような仕組みはないようです。

結局ネイティブ Windows API を使うしかないようですので、その方法をまとめました。Windows API なので WinUI 3 専用ではありませんが、出番としては WinUI 3 で開発するときくらいかと思います。

はやいとこ WinUI 3 にも簡単な仕組みが用意されることを祈っています……。

サンプルプログラムのソースコードは GitHub に上げてあります。

使用する API

ウィンドウプロシージャーをカスタムするのを「サブクラス化」と呼んでいるようです(C# でいう派生クラスではありません)が、マイクロソフトのドキュメントによれば、サブクラス化は新旧 2 種類あります。

旧バージョンでは SetWindowLong() or SetWindowLongPtr() と CallWindowProc() を使います。欠点は先のドキュメントにいろいろ書いてありますが、個人的にはそれよりも、元のウィンドウプロシージャーを自前で管理する分、手間が増えるのかなと思います。

新バージョンでは SetWindowSubclass() と DefSubclassProc() を使用します。元のウィンドウプロシージャーは気にしなくて済みます。

ここでは新バージョンを使います。

というか、新バージョンの情報が少なくて苦労したというのもあってここにまとめたというのもあります。

やりかた

ウィンドウメッセージを扱うので、NuGet で PInvoke.User32 を入れておきます。

カスタムウィンドウプロシージャーの型(SUBCLASSPROC コールバック関数)をデリゲートとして宣言しておきます。型の詳細はこちらに書いてあります。

internal delegate IntPtr SubclassProc(IntPtr hWnd, User32.WindowMessage msg, IntPtr wPalam, IntPtr lParam, IntPtr idSubclass, IntPtr refData);

カスタムウィンドウプロシージャーを作成します。

自分が処理したいメッセージの部分だけ書いて、あとは元のウィンドウプロシージャーに丸投げします。

private IntPtr CustomSubclassProc(IntPtr hWnd, User32.WindowMessage msg, IntPtr wPalam, IntPtr lParam, IntPtr idSubclass, IntPtr refData)
{
    switch (msg)
    {
        case User32.WindowMessage.WM_HogeHoge:
            (処理)
            return IntPtr.Zero;
        default:
            // 関心のあるメッセージ以外は次のウィンドウプロシージャーにお任せ
            return DefSubclassProc(hWnd, msg, wPalam, lParam);
    }
}

カスタムウィンドウプロシージャーを登録します。

_subclassProc = new SubclassProc(CustomSubclassProc);
SetWindowSubclass(hWnd, _subclassProc, IntPtr.Zero, IntPtr.Zero);

注意点の 1 つめは、SetWindowSubclass() に渡すのはカスタムウィンドウプロシージャー本体を「インスタンス化」したもの、ということです。インスタンス化していない CustomSubclassProc も SetWindowSubclass() に渡せてしまいますが罠です。

注意点の 2 つめは、そのインスタンスをずっと(カスタムウィンドウプロシージャーが不要となるまで)持ち続ける、ということです。

Crashこれらを守らないと、特に 64 ビットバイナリ(x64)において、一見うまく動くようですが、メッセージ処理をこなしているうちにアプリが強制終了します。私はこれでハマりました。

強制終了時は集約エラーハンドラーにすら引っかかりませんでした。デバッガーでは以下の箇所で落ちていました。

global::Microsoft.UI.Xaml.Application.Start((p) => {
    var context = new global::Microsoft.UI.Dispatching.DispatcherQueueSynchronizationContext(global::Microsoft.UI.Dispatching.DispatcherQueue.GetForCurrentThread());
    global::System.Threading.SynchronizationContext.SetSynchronizationContext(context);
    new App();
});

サンプルプログラム

Sampleサンプルプログラム(GitHub に上げてあります)では、ウィンドウのタイトルバーにヘルプボタンを表示しています。

このコンテキストヘルプは WinUI 3 標準ではハンドルできないため、カスタムウィンドウプロシージャーで処理しています。

ヘルプボタンをクリックする度に、ウィンドウのサイズが変化します(アプリとしてはありえない動きですが……)。

ちなみに、SetWindowSubclass() にインスタンス化していない CustomSubclassProc を直接渡すようにコードを変更すると、うちの環境で x64 バイナリを実行すると、チェックボックス連打で 1 分もしないうちにアプリが落ちました。

【追記】
Zenn をはじめてみました。試しにこの記事を Zenn に再掲してみました。

ちょちょいとファイル合併 2 Ver 2.70 公開

270「ちょちょいとファイル合併 2」Ver 2.70 を公開しました。

ちょちょいとファイル合併 2 は、静的 HTML によるヘルプの作成をアシストする、開発者向けのツールです。

Steam 版 ラングリッサー 攻略

MapラングリッサーⅠ&Ⅱ(LANGRISSER 1&2)リメイクのラングリッサーⅠを Steam 版(PC 版)でプレイしていますが、Steam 版の情報がほとんど見当たらないので、攻略メモを残しておきます。
現在、13 章までメモしていて、随時増やしていく予定です。

月別アーカイブ
記事検索
最新コメント
  • ライブドアブログ