ユーザ用ツール

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

次のリビジョン
前のリビジョン
ハイハイスクールアドベンチャー_sdl版 [2025/09/11 21:33] – 作成 arakiハイハイスクールアドベンチャー_sdl版 [2025/09/18 01:22] (現在) – [ビルドと実行] araki
行 1: 行 1:
 ====== ハイハイスクールアドベンチャー SDL版 ====== ====== ハイハイスクールアドベンチャー SDL版 ======
 +===== あらすじ =====
 +2019年神奈山県立ハイ高等学校は 地盤が弱く校舎の老朽化も進んだため、 とうとう廃校にする以外方法がなく なってしまった。
 +
 +ところで大変な情報を手に入れた。 それは、
 +
 +「ハイ高校にATOMIC BOMBが仕掛けられている。」
 +
 +と、いうものだ。 どうやらハイ高が廃校になった時、 気が狂った理科の先生がATOMIC BOMBを 学校のどこかに仕掛けてしまったらしい。
 +
 +お願いだ。我が母校のコナゴナになった 姿を見たくはない。 早くATOMIC BOMBを取り除いてくれ……!!
 +
 +行動は英語で、“<動詞>” 或いは、“<動詞>”+“<目的語>“のように入れていただきたい。 例えば、”look room”と入れれば部屋の様子を見ることが出来るという訳だ。
 +
 +それでは Good Luck!!!…………
  
 ===== 概要 ===== ===== 概要 =====
行 24: 行 38:
 Net 8.0をターゲットにしていますので、Net 8.0 SDKがインストール済みであることを前提としています。 Net 8.0をターゲットにしていますので、Net 8.0 SDKがインストール済みであることを前提としています。
  
-Net 8.0なので Windows版といいながら、実は Ubuntuや Debianでも動きます、Net 8.0が入っていれば。+Net 8.0なので Windows版といいながら、実は Ubuntuや Debianでも動きます((Windows11, Ubuntu24.04(x64), Ubuntu25.04(x64), Debian 12(ARM64)での動作は確認しました))、Net 8.0が入っていれば。
  
 ビルドは、Visual Studio や Visual Studio Codeを使ってもできますが、コマンドラインからもできます。 ビルドは、Visual Studio や Visual Studio Codeを使ってもできますが、コマンドラインからもできます。
 <code pwsh> <code pwsh>
-C:\Users\foo\source\HHSAdvSDL> dutnet build+C:\Users\foo\source\HHSAdvSDL> dotnet build
 </code> </code>
  
行 49: 行 63:
 AppData というフォルダ名で同梱してありますので、これを配置してください。 AppData というフォルダ名で同梱してありますので、これを配置してください。
  
-Windowsでザ名が foo としたら、 +Powershell をお使いなら、$env:LOCALAPPDIR\HHSAdvSDLにcmd.exeなら %LOCALAPPDATA%\HHSAdvSDL にデータをコピしてくさい。 
-<code command+<code ps1
-C:\Users\foo\source\HHSAdvSDL> mkdir C:\Users\foo\AppData\Local\HHSAdvSDL +C:\temp\HHSAdvSDL> mkdir $env:LOCALAPPDIR\HHSAdvSDL 
-C:\Users\foo\source\HHSAdvSDL> copy AppData\Local\HHSAdvSDL\*.* C:\Users\foo\AppData\Local\HHSAdvSDL+C:\temp\HHSAdvSDL> copy AppData\Local\HHSAdvSDL\*.* $env:LOCALAPPDIR\HHSAdvSDL
 </code> </code>
 のようにやってください。 のようにやってください。
  
-Linuxの場合は、.local/share/AppData においてください。+Linuxの場合は、~/.local/share/AppData においてください。
  
 <code bash> <code bash>
行 66: 行 80:
  
 <code command> <code command>
-C:\Usrs\foo\source\HHSAdvSDL> dotnet run+C:\temp\HHSAdvSDL> dotnet run
 </code> </code>
 <code bash> <code bash>
行 101: 行 115:
 ===== 実装についてのあれこれ ===== ===== 実装についてのあれこれ =====
  
 +==== きっかけ ====
 +
 +そもそも、SDL2で行こうと思ったのは、Copilot に、「320x240のビットマップの下に、一行のコマンド入力、その下にスクロール可能なログエリアがあるアプリのサンプルを作って」といったら、ほぼほぼ、完成形に近い画面レイアウトのアプリが出来上がりました。
 +
 +もちろん、レイアウトだけで、ゲームができたわけではないのですが、上にも書いたように、キモは、バッファに書いたデータが画像として表示できるか否かなので、ここまでできればほとんど勝ったも同然なのです。
 +
 +あと、めんどくさくなりそうなダイアログも「タブキーを押したら、三つボタンがあるモーダルダイアログを作って。」といってひな型を作ってもらいました。
 +
 +ここまでできれば、あとは、手を動かすだけ。
 +AIがあることで、面倒な部分をかなり軽減してくれるのはありがたいです。
 +
 +==== ビットフィールド型 ====
 +
 +シナリオデータは4バイト一組のビットフィールドでルールが記述されています。
 +なので、ビットフィールド処理は必須なのですが、C#ではビットフィールドは実装出来ないので、しょうがないからシフトと論理積を使ってマスキングすることで逃げてます。
 +
 +まあ、ビットフィールド型にしても、コンパイラが裏で同じようなことをしているだけなので、別にいいですし、クラスで隠蔽してしまえばいい話なので、一度クラスを書いてしまえばどうでもいい話ではあるのですが。
 +
 +<code c#>
 +    public class ZRuleBlock
 +    {
 +        private byte[] rules;
 +        public ZRuleBlock(byte[] r) { rules = r; }
 +        public byte Action { get { return (byte)((rules[0] >> 7) & 1); } }
 +        public byte Op { get { return (byte)((rules[0] >> 4) & 7); } }
 +        public byte Type { get { return (byte)((rules[1] >> 5) & 7); } }
 +        public byte Id { get { return (byte)(rules[1] & 0x1F); } }
 +        public byte Offset { get { return rules[2]; } }
 +        public byte BodyType { get { return (byte)((rules[2] >> 5) & 7); } }
 +        public byte BodyId { get { return (byte)(rules[2] & 0x1F); } }
 +        public byte Value { get { return rules[3]; } }
 +        ...
 +</code>
 +
 +==== 結局 unsafe ====
 +
 +==== データ欠損 ====
 +
 +デバッグプレイ中に、突然例外をはいて落ちた。
 +3階の西廊下を北に進んだら落ちた。
 +
 +なんで?
 +
 +ハイハイスクールアドベンチャーのゲームシステムは、地図情報の中に、その場所で行った動作に対するメッセージが仕込まれている。
 +まあ、多くは、その場所で何かを見たときとかに対するリアクションだ。
 +
 +メッセージは、メッセージ本体と、そのメッセージへのリンク情報からなる。
 +
 +このリンク情報がポイントしているメッセージ本体が存在していないのだ。
 +
 +このデータは、もともとShift JISで作られていたが、Android版を作るときに、扱いにくいからUTF-8に変換したのだ。
 +なので、その際に取りこぼしたのかと、オリジナルのデータファイルをがさがさあさったところ、オリジナルでもそもそも欠落していた。
 +
 +データファイルの作成時の問題か、或いは、そもそもうっかりデータを作り忘れていたのか、その辺はもはや定かではないが、とにかくないものはない。
 +
 +他にそういうところがないか、不安になって、地図データのダンプをするスクリプトを作って走らせたところ、欠落はここ1か所だけだった。
  
 +JavaやC++はこのあたりの境界越えに比較的寛容でいままでたまたま発覚しなかったが、C#は思ったより厳格だったということ。

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also, you acknowledge that you have read and understand our Privacy Policy. If you do not agree, please leave the website.

More information