【ネタバレ】映画『グスコーブドリの伝記』に納得いかない件

絵はきれいだし、音楽も素敵。全体的な雰囲気もよく再現してると思うし、セリフ回しも良いし、それぞれに声もはまってると思う。ブドリが何かにつけて「はい」って返事するところ、原作には書かれていませんが、これなんか脚本ちょーぐっじょぶな感じ。
でも、そこを変えるのは納得いかないんだよって話です。
以下、原作と映画の両方のネタバレですよ。

続きを読む

ISO-2022-JPですか

やっぱり、正しいコードで投げないと、クライアントによっては文字化けしてました。
ということで、まじめにバイナリエディタで文字列を見てみたら、irc.trpg.netの文字はISO-2022-JPで来てました。nadokaさん、および、Brounieの内部コードは Shift-JIS(もっと言うと、Windows-31J)にして、on_privmsg と send_noticeのとこで変換するようにしたら、オールオッケーになりました。
とはいえ、これはマルチバイト対応とは言い難いのですが。でも、IRC文字コードを規定してないんだからしょーがないと思う。日本語のIRCサーバは、歴史的な経緯でほとんど ISO-2022-JPだそうなので実用上は困らないというのが言い訳なり。

Brounie 1.0を近々リリースするですよ

文字コードの扱いでひっかかってたのですが、一応の解決をみました。
どうもnadokaさんはShift-JIS決めうちらしいのですが、trpg.netのサーバから来るメッセージはShift-JISではなくて文字化けしてた模様。
on_privmsg で受け取るメッセージを、Shift-JISに変換すれば動きました。入力はこれでいいとして、出力はもともとShift-JISで投げてるんですが大丈夫みたいで。ircってこのへん、どうなってるんだろう、というのはまぁ暇ができたら調べる方向で。とりあえず動いてるからいいことにします。とりあえず動いてなかった。。。

def on_privmsg(prefix, ch, msg)
	msg= NKF::nkf('-sm0', msg).force_encoding('Windows-31J')
	return unless command= self.map_command(prefix, msg)
	message= self.do_command(command)
	message.each_line do |line|
		send_notice(ch, line.strip)
	end
end

たぶん、なんとか遊べる程度の品質になったので、一度、セッションをしようかと思ってます。オンセの日程を決めてしまって、その日をバージョン 1.0のリリースにしましょうと。やっぱ、〆切ないとずるずるするし。

残件をメモっておこう。まず、1回目のセッションに間に合わせるべきこと。

  • botに「ode オーデ」コマンドを実装するの忘れてた
  • 全体的に例外処理があまあま。特に、引数が足りない場合は中途半端に失敗してよくないことが起こる
  • ヘルプなり、ドキュメントなりを書かないと

将来的に対応したいこと。

  • テストを書きなおしたい。rspec本を読んでちょと学んだので。
  • 権限によってコマンドを制限する(GM/PLだけですが)
  • privでBrounieに話したら、privで返してくれる機能。これは、出力が長くてうるさいコマンド用

その後のBrounie

少女展爛会システム、書いてるそばから新しい思いつきをするので、一進一退なのです。バーンダウンチャートがぎざぎざしながら、下がって行かない感じ。
わりとまじめにunit testを書いてます。ちょっとitを書くのをさぼってて、意味不明な結果表示のとこもありますが。

Brounie 少女展爛会システム

  • 提示部
    • セッションを新規作成した場合
      • 全てのオーデは0
      • 出来事表を持っている
      • 参加しているキャラクタは0人
    • #put_in 参加
      • キャラクタを追加できる
      • 同じ名前のキャラは追加できない
    • #exit 退出
      • キャラが参加していれば退出する
      • キャラが参加していなければ例外
    • 複数のキャラが参加している場合
      • #list キャラクタリストの表示
      • #char_idx キャラ名からidを返す
  • 展開部
    • 出来事表リストを設定できる
      • 一覧表示できる
      • 有効化/無効化できる
    • 出来事表を振れる
      • 出目を指定して出来事を表示できる
      • キャクターが出来事表を振れる
      • 出来事によってオーデが溜まる
      • テンションが危険な場合には警告が出る
  • 再現部(ショウ・アップ)
    • Phase イニチアティブの管理
      • next 次
        • should == "イニシアティブ・フェイズ"
        • should == "きゃら1のフェイズ"
        • should == "きゃら2のフェイズ"
        • should == "きゃら3のフェイズ"
        • should == "きゃら4のフェイズ"
        • should == "オーデ・フェイズ"
        • should == "イニシアティブ・フェイズ"
      • end 行動終了
        • should == "きゃら1のフェイズ"
        • should == "きゃら2のフェイズ"
        • should == "きゃら3のフェイズ"
        • should == "きゃら4のフェイズ"
        • should == "オーデ・フェイズ"
        • should == "イニシアティブ・フェイズ"
      • cut_in 割込み
        • should raise Brounie::MisplayError
        • should == "きゃら4のフェイズ"
        • should == "きゃら2のフェイズ"
    • 判定(アプローチとリプライ)
      • say 判定を宣言できること
      • roll 判定を実行できること
      • result 判定結果を表示できること
      • roll([n]) 振り直しができること
    • テンションの管理
      • impact テンションを溜められること
      • open テンションを開放できること
      • delete テンションを消去できること
      • テンションが最大値を超えたら陥落すること
    • オーデの管理
      • sway([target]) 形式のスウェイ
      • sway([target], [count]) 形式のスウェイ
      • sway([target], [count], [adverse]) 形式のスウェイ
      • リーディングの管理
      • コンクルージョンの処理ができること

BrounieBot

  • #map_command
    • 途中に%(半角)や%(全角)が入ってる発言
      • 無視すること。
    • %unknown 知らないコマンド
      • コマンドは:unknown
    • %unknown 知らないこと
      • 解釈できなかったメッセージを返すこと
    • %help
      • コマンドは:help
    • %h some_command
      • 対象のコマンドを返す
    • 引数なしのコマンド
      • %list
        • should == :list
      • %一覧
        • should == :list
      • %next 傍観するので次どうぞ
        • should == :next
      • %行動終了
        • should == :end
    • 引数がキャラ名のみのコマンド
      • %show 表示
        • %show (キャラ指定なし)
          • コマンドは:show
          • nickからキャラ名を得る
        • %きゃら.s (キャラ名前置)
          • コマンドは:show
          • キャラ名を認識する
        • %shきゃら (キャラ名後置)
          • コマンドは:show
          • キャラ名を認識する
      • %exit 退室
        • コマンドは:exit
        • キャラ名を認識する
      • %cut_in 割り込み
        • コマンドは:cut_in
        • キャラ名を認識する
  • #do_command
    • MisplayError ルール違反の例外が出た場合
      • 例外メッセージを表示すること
    • Sessionに転送されるコマンド
      • :exit
      • :list
    • Phaseに転送されるコマンド
      • :next
      • :end
      • :cut_in
    • Characterに転送されるコマンド
      • :show
  • %join 参加
    • nickに対して最初のキャラが参加した場合
      • キャラが追加されること
      • nickにキャラが紐づくこと
    • nickに対して紐づいているキャラとは別キャラが参加した場合
      • キャラが追加されること
      • nickに紐づくキャラは変わらないこと

initialize についての基本をいまさら学んだ

Somthing.new(s) で、Stringをパースしようとしてたわけです。
んで、解釈できない文字列だったら、nilを返そうとしたら嵌ったのです。
newメソッドは問答無用で、selfを返すのねん。

class Something
   def initialize
      return nil
   end
end
Something.new #=> #<Something:0x1111111>

なんですよ! 知らんかった。

というわけで、パースは、Something::parse かなんかに書くことにしました。