好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

「続・ゲームにおけるスクリプト言語の現状」行ってきた

前回は予定があっていけなかったけど*1、今回は行ってきた。

あー、懇親会も行けばよかったかなぁ。結構、聞いてみたい事いっぱいあった。が、顔見知りとかまったくいないし、弱小プログラマであることを自覚しているので自重してしまいました。Give は欲しいけど、Take できることが何も無い! 明日、朝から出かけないといけないから、早く帰りたいというのもあった。

質問をそれなりにしたけど、質問力の低い質問ばっかりでスマンかった。もっと一発で良い答えを引き出せるような聞き方をしないとダメだよなぁ。


以下、自分用メモ。内容とかが気になる人は、きっと他の人が詳しくレポを書いてたりするだろうから、そっちを見ればいいと思うよ!

オープニング

進行の人が LL Future の Tシャツだった。

ごく簡単な並列処理スクリプトシステムの設計と実装

一発目ということで、タイトルどおり『ごく簡単な』。よくあるオレオレスクリプトだなーという感じ。

  • 日本語が書ける。が、全角半角切り替えがめんどくさくて廃れた
  • エラーメッセージはていねいに。さらになるべく対処法も出す
  • 並列処理である以上、絶対デッドロックは起こる
  • ユーザーの操作時間を奪う時間が長くなり過ぎないように気をつけていた

サクラ大戦 V でのスクリプト運用事例

発表の場での、宣伝効果が無いことを確認しててワロタ

ブレイザードライブ

ブレイザードライブ

シナリオ屋さん用のスクリプト、実際にゲームで動かす C言語ライクなスクリプト、移動マップ管理用の EXCEL ファイルの三段構え。

オンラインゲーでもないのに、チート対策とかしてるんだなー。フラグの配置アドレスを起動時にランダムで変更、変数暗号化、チェックサム

フラグ操作に制限をつける -> ロジックエラー抑制

略字対応はともかく、多少の誤字許容ワロタ。誤字はダメだろwww

スクリプト先読み。キューとかに入れずに、画面や音に変化が無いものはどんどん実行 -> セーブが力技になる。そりゃそうだ。なんで、キューに入れとくとかしなかったんだろうとか思ったけど、まぁ一長一短か。

次の BG をセットする命令と、切り替え(Fade)で分けてるのは、策士だなーとは思った。先読みを意識させずにスクリプタに書かせてる的な意味で。

海外版作業。やったこと無いからいろいろ新鮮だった。何度も出てくる重複している文はは、翻訳リストで重複しないようにしてワード数減らした方が安いとかw

質疑応答
  • シナリオ屋さん用のファイルから、スクリプトファイルへの変換作業を行った後に、シナリオファイルに変更が加わったらどうするか
    • (痛いところをついてくるなー。)手作業です。

この質問オレオレ。答えの予想はついてたんだけど、一応確認してしまいました。ゴメンナサイ。

あとの方で、この辺の手作業を今解決するならどうするかとか、翻訳用のメッセージの ID 振り分けが使いまわせるんじゃないかとか聞いてた方がいた。んー、個人的にはメッセージにまで ID を振って、シナリオ屋さん用とスクリプタ用のファイルの整合性を保てるようにするというのは、あんまり現実的じゃないと思ってるんだよなー。

Don't repeat yourself の精神としては正しいんだけど、スクリプト的にメッセージの間に wait コマンドを入れたかったり、画面ゆれとか演出を入れたいときとかどうすんだよ、と。それで、シナリオ屋さん用のファイルを変更しないといけなくなったりしたら本末転倒だし。なにより、ID ばかりのスクリプトと格闘する人の心が折れそうだとか思ってしまったw 日本語のメッセージが読めたほうが楽しいよw

  • EXCELでの移動マップ管理。何ファイルぐらいに分かれてて、何人ぐらいでいじってたか

オレオレ。EXCELでやってると、マージ作業が発生しないようにしたりしないと問題起こるだろうなーと思って聞いたけど、1人か2人で作業してしたらしく、特に問題が無かった模様。無意味な質問をしてしまった‥‥。


汎用スクリプト言語 Xtal 設計と実装

個人的には今日のメイン。Xtal の人が頻繁に繰り出す不思議な日本語チョイスの面白さは異常。笑いを取りすぎです。「よし!」で有名になった(?)LL Spirit では前準備無しで挑んで大変だったので、今回は練習してきたとのこと。

  • 読み方は「クリスタル」。よく「エックスタル」と呼ばれるので僕も「エックスタル」と呼ぶようにしたいと思います(会場笑い)
  • MIT ライセンス
    • Google Code での選べるライセンスの中で良さそうなものを選んだ(?)
    • 将来的に、もっとゆるいライセンスにして組み込みやすくするかも
  • Lua を使ってみたら不満点が多かったので作った
    • 不満点を列挙してみたらそんなにはなかった(ぇ)
    • 一番大きな理由は「ただ言語を作りたかったから」
    • 「よし!次!」
  • 動的な型
    • optional で静的型もやりたいが難航中
  • foe は定義されていません。'foo' と間違えている可能性があります
    • まさかのもしかして機能
    • Ruby(の嘘発表から?)パクった
  • 制御構文
    • 個人的には、for や while の first_step とか else は非常に面白い部分なので、高等だけじゃなくて、プレゼン資料に入ってたら割とインパクトあったんじゃないかなーと思うた。
  • 字句解析
    • 完全に手書き
    • 拡張しやすいかもと思い構文解析と分離
      • また統合するかも
  • 構文解析
    • こちらも手書き
      • yacc などは使っていない
      • boost::spirit を試みたこともあったがコンパイル時間長すぎて中止
    • 将来的にPEG(解析表現文法)ライブラリで置き換えたい
      • 文法拡張を容易にしたい(DSLなど)
  • GC。参照カウンタ+Mark & Sweep
    • 参照カウントが 0 になっても解放していない
      • VM が参照している
      • デストラクタでのスタック枯渇防止
  • Xtalの欠点
    • デバッカ未整備
      • APIは作ったので、誰かやってください
  • 開発を振り返って
    • 言語の理想は体調で変わる
      • 会場大爆笑
    • XtalLisp になりかけたことがある
質疑応答

質問を考えてたら、他の人の質問内容のメモとってなかった&記憶からも飛んでるorz

自分でも何を質問したか忘れてしまった(ぇ)。全てがオブジェクトです、というのを聞いて、if 文とかもオブジェクトなんですか? ってのと何を聞いたんだっけ‥‥

つか、冷静になってから思ったけど、本当に聞きたかったのは「if 文とかもオブジェクトなのか」じゃなくて、「if 文とかがオブジェクトを返すのか」だよorz なんとなく意味は通じていたような気もしないではない。だって、私達みんな、Rubyistだもんね!

先週末にちょっと予習してからいったんだけど、組み込みまでは辿り着かずにいってしまったから、込み入った質問はできなかった。無念。とりあえず、現時点までで読んだドキュメントの誤字とか疑問点を報告してこよう。あとで。

Xtal が思っていた以上に良さそうなので、Squirrel から乗り換えようかなーと思い始めている。地雷踏むぜー、超踏むぜー。ライセンスさえ変えてくれればなー(苦笑)。

そのうち、日記で Xtal 触ってみたメモとか書きます。

Squirrelスクリプトを使った実装と活用

個人的な今日のメインその2。

前半は Squirrel の文法紹介。

中盤から実際に組み込んだ話。

  • メインループを Squirrel の方に書いてた
  • バインドは SqPlus で
  • GC は画面切り替えや、フェードのタイミングで
    • デバック機能にも、GC を呼ぶ機能をつけといた(作業用)

良さそうな実装例がいろいろと、ファイル周りとか、エラー復帰とか、バインドコードを自動で吐くようにしたりとか、エラー対策とか、リロードとか。逆に言うと、この辺に気を使う必要が多分にあるってことなんだよなー。これはどの言語を使ってても同じだとは思うんだけども、もうちょっとなんとかなると楽なのになーとは思ってた。

C++ からの Squirrel の呼び出しは、そんなにスタック操作を書かなくても、SqPlus 使ってるならもっと簡単にかけるよ! と思ったけど、揚げ足取りは不要ですよね。

質疑応答

質問考えてたら他の人の質問をメモってなかった(またか!)。記憶にあるものだけ。

  • DSやPSPなどのWiiより性能の低いハード、360やPS3などの性能の高いハードで組み込もうとしたらどうなるか
    • DS
      • メインループをSquirrelに書くようなことはキビシイと思う。
      • イベント部分だけなど、用途を限定すればなんとか
    • PS3,360
      • 速度やメモリはほとんど心配いらない
      • ただし、大規模開発に使う場合は、ルールを作らないと収拾がつかなくなるだろう
  • ライセンスが Squirrel を使う決め手になったか
    • たしかに、説明書への表記などのことを考えずにすむので楽ではある。
    • が、本質ではない
  • 全部 C++ で書くことに比べて、効率よく作れる勝算が最初からあったのか
    • ゲーム性のトライ&エラーを繰り返しながら作っていったゲームだった
    • C++ でやっていたらトライ&エラーの繰り返しが少なくなっていたと思う
  • 文法の紹介で thread や generator がでてこなかったが使わなかったのか(←オレオレ)
    • 時間が無かったので省略した。
    • threadを使った。特に問題なく使えていた(generator は使っていなかった?)
  • Squirrel の地雷を踏んだか(←オレオレ)
    • 踏みました
    • だが、ソースコードが6000行しかないので、直せばいいと思っていた。
      • 最初から見積もりに入れていた
  • (関連で)ちなみに、Squirrel と SqPlus のどっちの地雷を踏みましたか?(オレオレ)
    • 両方です(笑)
      • ですよねー(具体的に何を踏んだか聞こうと思ったけど自重してしまいました)


Squirrelで気になってたことがだいぶ解消できて非常に為になりました。無難に Squirrel を使うか、思い切って Xtal を使うか。それが問題だ。

結構、Lua を使ってる人、多いんだなーという印象は受けた。Lua との違いが気になる人が質問していたせいでそう感じただけかも。Lua 使ってる人って、int と float の区別が無いのが論外だったんだけど、大した問題にはならんのかな‥‥。前回のに行けてれば Lua の本を書いた人に質問できたのになー。

私の今後の課題

  • 質問力アップ
  • Xtal の組み込みを試す / バグ報告 / ドキュメント誤字報告
  • そろそろ製品に言語組み込みしたい(なんだかんだで調査しかしてない)