トップ «前の日記(02/14) 最新 次の日記(02/17)» 編集

hossy online - といぼっくす

ゲームの感想日記、たまにIT・プログラミングの話


02/16

_ [同人ゲーム] ヒトガタハッパ 1.11人柱版

1.00より残機が残り気味で易しめな調整だと思ったら、意図したものではなかったようで、[PlatineDispositif] で即日修正版が公開されました。

昨日から今日での 1.11 クリア実績。

  • Solo N / FOOL クリア。ROOTY 真2-9。FOURTUNER 真1
  • Solo A / FOOL 真2-1
  • Solo D / 2面
  • D13 E / クリア

最初はルーティ優遇パッチだと思っていました。けれど、エリスも全体的に火力がアップして使えるようになっていたり、今まであまり触っていなかった色々なキャラを動かすのが楽しいです。

しかし、元 D13 5面の救世主に対して、LEAFPOST で「火力高すぎ!修正してやる!」と言われてしまっているのは...

_ [商用ゲーム] 君が呼ぶ、メギドの丘で セーブデータのフラグをテキストに

去年末に発売された、[Leaf] の [君が呼ぶ、メギドの丘で] (年齢制限あり) を進めていました。 ...これのためにかなり日記がほったらかしになっていたというのも。40時間以上かかるとは、と。一月半、長かった(汗)。

RPGとしてはけっこう戦闘の歯ごたえがあって面白かったです。技が1キャラ6個ずつで足りないかと思っていたら、そんな事はなく。装備変更や武器強化で、下手すると0ターンキルされるボスにもなんとかなる、という。ラスボスも、それより強いエクストラボスも。

けれど、一体(?)だけ、2周目以降で解禁の強い隠しボスが居るとの事。そのためにもう一度40時間も進めたくないと思って... ごにょごにょと(汗)。

そのついでとして、セーブデータのフラグ情報をテキスト出力するスクリプトができてしまいました。セーブデータが100個埋まってどれがどれか混乱する人以外にはきっと関係ありません。一応ここに貼り付けてみたり。

スクリプト

  • セーブデータの置かれているフォルダに以下のスクリプトを置いて、実行
  • Ruby 1.8.6 で動作確認。文字列の使い方が怪しく、1.9.1 で動くかどうかは分かりません
  • 手元の100個のセーブデータは抽出できました。他のデータでも成功するかどうかは分かりません
  • レベルや所持金などのフラグ以外全般には対応していません。当初の目的が難易度を変更したいという一点だけだったわけでして
FLAG_START = "1.05"
Dir["*.sav"].each do |filename|
  puts filename
  str = File.open(filename, "rb").read
  pos = (str =~ Regexp.new(Regexp.escape(FLAG_START)))
  if !pos.nil?
    pos += FLAG_START.size
    flag_size = str[pos, 4].unpack("i").first
    pos += 4
    flag_size.times do |t|
      # flag name
      if (str[pos].zero?)
        puts "nop"
        pos += 1  # nop
        next
      elsif (str[pos] == 1)
        break
      end
      len = str[pos, 4].unpack("i").first
      pos += 4
      name = str[pos, len]
      pos += len
      
      # flag data
      type = str[pos]
      pos += 1
      case type
      when 1
        data = str[pos, 1].unpack("c").first
        pos += 1
        pos += (-pos % 4)
      when 3
        pos += (-pos % 4)
        data = str[pos, 4].unpack("i").first
        pos += 4
      when 4
        pos += (-pos % 4)
        data = str[pos, 4].unpack("f").first
        pos += 4
      when 5
        pos += (-pos % 4)
        len = str[pos, 4].unpack("i").first
        pos += 4
        data = str[pos, len]
        pos += len
        pos += (-pos % 4)
      else
        puts "error: #{len}, #{name}, #{type}"
        exit
      end
      
      puts [name, data].join("\t")
    end
  end
  puts
end

出力

Megiddo01.sav
...
_章	1
_シーン	1
_ゲームモード	1
_プレイヤー固定	-1
_経験値_ゼロ	0
_イベント中セーブ?	1
_ワープエリア	0
_ワープポイント	-1
_ワープポイントが使えなくなった	0
_ワープポイントセーブ名	果てから来た少女
_Warpソルトベルの街	1
...

スクリプトの感想

暗号化やチェックサムがないどころでなく、ご丁寧にフラグの名前まで埋め込まれて、というのにびっくりしました...

アライメント回避方法がかなりやっつけです。

これが、例大祭までの小ネタ更新のリハビリになればいいかなぁと... 間に合うかどうか(汗)。

最後にゲームの感想

シナリオ展開について、ADVの方法論をRPGに持ってくるのはいろいろ無理があったんじゃないかな、と思いました(汗)。