唯一の自作ソフトウルティマオンライン用ソフトMacrosの再開発

意外と使っている人がいるらしい*1を再開発しようと目論んでいたり。最初にMacrosを作成したときもVisualBasic6の勉強として作成したので、今回もVisualBasic.NETの勉強として作成しています。ASP.NETVisualBasic.NETは使ったんだけど、Windowsアプリケーションは作成したことがなかったので。
MacrosというファイルはUO上で使用するマクロファイルの編集をWindows上でできるようにしようというのが目標です。キーボードをGUIで表現しているので、どのキーにどのようなマクロが割り当てられているのかバッチリ!とかいうのがウリで、自分の使いやすいモノを作るという目的がうまく達成できたという自負はあったりします。
UOのマクロファイルというのは特殊な仕様になっています。これは、UOの歴史が関係してくるのですが、簡単に言えば「基本的にはASCIIコードのファイルなんだけど、一部がUNICODEになっている」ということなのです。全てがUNICODEになっていれば何ら問題ないのですが、一部だけがUNICODEの為にファイルを読み込むときに特殊な方法をしなければならないのです。最初にMacrosを作り始めた頃なんかは、「文字コードってなに?それってオイシイの?」とかいう状態だったので、開発が止まっていたのですがある方がマクロファイルの読み込みモジュールを提供して頂けた為に、開発を再開し公開することができました。
Macrosは最初に開発したバージョンから、バグ修正以外は殆ど修正をしていません。公開後もUOは順調にバージョンアップを続け、もうすでに使い物にならなくなってしまいました。それでも使って頂ける方がいらっしゃる現実というのは非常にうれしく思ったりもします。
というわけで、少し暇になった事もあり開発を再開しようとしているのです。まずは何よりマクロファイルが読み込めないと意味がないので、そのプログラムを作成していました。文字コードの海に囲まれながら挫折しかけたのですが、なんとかうまく読み込むことができ、第一チェックポイントはクリア!という感じです。

Private Sub readStart()

    'ASCIIモードで読み込む
    Dim fileAscii As New FileStream(Me.MyFileName, FileMode.Open, IO.FileAccess.Read)
    Dim readAscii As New StreamReader(fileAscii, System.Text.Encoding.ASCII)
    Dim macrosAscii As String = readAscii.ReadToEnd
    readAscii.Close()
    fileAscii.Close()

    'Binaryモードで読み込む
    Dim fileBinary As New FileStream(Me.MyFileName, FileMode.Open, FileAccess.Read)
    Dim readBinary As New BinaryReader(fileBinary)
    Dim macrosBinary() As Byte = readBinary.ReadBytes(fileBinary.Length)
    readBinary.Close()
    fileBinary.Close()

    'インデックスの初期値を作成
    Dim startIndex As Integer = 0
    Dim endIndex As Integer = 0

    '格納用のArrayList
    Dim macrosArray As New ArrayList

    Do
        '=======================
        'キーの情報を取得開始
        '=======================
        '改行位置を取得
        endIndex = macrosAscii.IndexOf(ControlChars.CrLf, startIndex)
        'キー情報を格納
        macrosArray.Add(macrosAscii.Substring(startIndex, endIndex - startIndex))

        '=======================
        'マクロの情報を取得開始
        '=======================
        Do
            '改行コードを取り除き、startIndexの作成とendIndexの作成
            startIndex = endIndex + 2
            endIndex = macrosAscii.IndexOf(ControlChars.CrLf, startIndex)

            '文字列の取得
            Dim aMacro As String = _
                macrosAscii.Substring(startIndex, endIndex - startIndex)

            '格納された項目が「########」だったらば、格納してからループから抜ける
            If aMacro.Equals("########") Then
                '改行コードを削除
                startIndex = endIndex + 2
                'デリミタを格納
                macrosArray.Add(aMacro)
                Exit Do
            End If

            'startIndexとendIndexを使用しmacrosBinaryからByte文字列を取得
            'その文字列をゆにこ〜どでエンコードして格納
            aMacro = System.Text.Encoding.Unicode.GetString(macrosBinary, _
                startIndex + 1, endIndex - startIndex)
            macrosArray.Add(aMacro)

        Loop

        'ファイルの終了を判断
        If startIndex >= macrosAscii.Length Then
            Exit Do
        End If

    Loop

    '変数に格納
    Me.MyMacrosArray = macrosArray

End Sub

FileStreamが2つあったりしてアレレなプログラミングですが、まぁ読み込めたのでOKとしよう…。*2次の問題点は、私自身がUOを3年近くプレイしていないことなのですが。

*1:とは言っても数人でしょうけど…

*2:しかも、マクロファイルの構造を知らない人には何がなんだか解らない