GREE Engineering

脚本をjsonにパースしてみる

脚本をjsonにパースしてみる

ごぶさたしております。ちょびえです。
今日は脚本テキストをパースしてjsonの構文データを作ってみようかと思います。

背景

物語を進めるタイプのゲームを作る上で、なんかしらの脚本テキストからゲーム向けの演出設定ファイルなどに変換するタスクというのが大抵の場合あったりします。

小さめのゲームであれば何でも好きやればよいのですが、ある程度の規模があるゲームの場合、脚本テキストデータだけでも全部読むだけで数日かかってしまう分量が最終的に出来上がるので何かしらの前処理系統とメンテ更新しやすいデータというものが必要になってきます。

後処理の変換の準備をやるにはどうアプローチすればいいか、というところで今回は問題をシンプルにしてプレーンな脚本テキストから構文木を作ってexcelファイルへの書き出しまでやってみます。

脚本テキストのデータはどれくらいになるのか

全部読むだけで数日って具体的にどんだけの分量よ、という感じなので具体的な数字を出してみると、例えば1章8話あるとして、10章ある場合。

10章 * 8話 * 体感的な係数(盛り上がりで増えたりするので)で1.5かけて約100ファイル。

これに加え、サブシナリオや細かいショットのお話などを含めるとだいたい3~500ファイル程度に増えます。

スマートフォン向けゲームの場合、文字数はおおよそ1ファイルあたり1000~2000文字ぐらいが多いかと思います。

感覚的な平均で1ファイル2000文字とした場合、300ファイルあると60万文字になります。

60万という数字は文庫本に概算すると約4~5冊分の情報量があります。ゲーム内容によって多少の幅はありますが、概ね文庫本数冊分くらいの情報量を扱うと思っておくと大きなズレはないと思います。

その大量の文章からゲームに組み込む最終フォーマットに変えていく後工程が必要となるのですが、これを手作業でやるとなるとコピペの往復でだいぶたるいです。

勿論、演出実装はその性質上手作業なんですが、その下準備くらいは自動化したいもんです。

脚本~組み込みまでのワークフロー

プログラムに入る前に、ゲームを作る上での脚本から組み込みまでのワークフローをざっと書き下してみます。
物語、世界観、キャラクター設定などは済んでいるという状況では概ねこんな感じです。

・プランナー/脚本家: プロット
・脚本家: 初稿
・プランナー/脚本家: 調整、表現チェック、演打ち
・脚本家: 修正稿
・プランナー/脚本家: 調整、表現チェック、演打ち
・脚本家: 改訂稿
・プランナー: 演出仮組み
・プログラマー: (演出に足りない機能づくり)
(↓からは修正するとやり直しが多くなります)
・脚本家: 最終稿
・プランナー: 演出本組
・脚本家/プランナー: 調整
・QA: フィードバック
・脚本家/プランナー: 最終調整

だいぶ端折ったり、タイムライン的には多少ずれがありますが1話つくるにもそれなりの工程があります。

脚本の構文

今回の記事では脚本データをプログラムからパースしよう、ということなのですが脚本テキストはどういった規則なのでしょうか。

調べた所、ローカルルール等はありますが、日本の場合大まかに下記のような形式のテキストなようです。

内容的には状況説明や、誰が何を喋っているのかというのが分かる(ほぼ)定形のフォーマットになっています。

形式もわかりましたし、脚本テキストをプログラムからパースしてみます。

コードを書いてみる

ざっくりと書いていきます、動けばOKの精神でlexer側にある程度情報埋め込みつつ、parser側は楽をするという感じで作っていきます。
実行がしやすいようにJavaScriptで書いていますのでお手元のnode.js等で試してみてください。
尚、文字コードはUTF8固定と仮定します。

と、こんな所でしょうか。あくまで前処理系のプログラムで実際にゲームに組み込まれるわけではないので動けばOKという方針で書いて大丈夫かと。

今回の記事では脚本フォーマットの柱の一部記号は特殊として扱うことにしました
・★はファイル分割用の目印とします
・△は終了の目印とします

実行

それでは実行してみます。普段私はnodeのv12使っているのでもしかしたらお手持ちの環境で動かないかもしれませんが・・・

と、こんな感じでパースしつつ簡単な統計情報がだせました。統計情報を出すと些細なミス等把握しやすいのでついでに作っとくと良い感じです。

Excelファイルへの展開

parseついでに適当にExcelファイルへ展開してみます。

依存ライブラリのxlsxをインストールしつつ下記スクリプトを実行します。

実行して出来上がったsample.xlsxを開いてみるとこんな感じに仕上がりました。

構文情報がjsonになっていれば後工程は楽に処理できますね。今回はJavaScriptで書きましたがお好きな言語を使うで良いと思います。

若干今回のコードのはやっつけ感が漂いますが、実際ゲーム作って運用したりしていると、サブのツール的なものはできるだけ平易な設計で、そんなメンテしなくてもある程度動いてくれて、かつゲームの表現に合わせてビルドなしで手早くpatch当てられる方が日々の運用楽だな、と思います。

脚本の運用を見据えて

現場で脚本テキスト素のまま、というのは少ないのでテキストに特殊タグ埋め込み型だったり、スプレッドシート直だったりするんですが基本の脚本テキストを自力でパースできるだけのコード力があればあとはどうにでも料理できますね。
実際とあるゲームでも書式は違いますがテキストから演出テンプレデータへの展開などをプログラム経由でやっています。

開発が進んでいくと、脚本データ関連だけでもアレコレやりたいことが出てきます。
例えば

・ゲーム用の演出設定ファイルに出したい(今回のケース)
・脚本の段階で誤字脱字チェックを始めとした表現チェックをしたい/しなければならない
・統計データを出したい
・校正用の印刷したい
・ボイス収録用の台本作りたい
・diffとりたい

構文木データを作るプログラム単品ではあまり意味のないものですが、準備をしていくとこういった要望への応用は楽にできるかと思います。

あとがき(と免責)

・呼称やワークフローについてはチームや組織によって違うので平易な表現に落としてあります
・(好みの範囲だと思うので)テキストデータ/スプレッドシートなどはチームにあったものを使うのが良いと思います
・サンプルプログラムは説明用に書いたものなのでケース処理が甘かったりします。あくまでご自身の責任の範囲内でご利用ください。

それでは~

リファレンス

脚本の書き方: 脚本のルール

課題になりそうなのがあったら広く浅くジャンル問わず解決していくスタイル。最近もっぱらUnity使うので言語はC#メインですが以前はPHP, Go, Cをよく書いていたなんでもやさん。 利用ツール: Unity, Photoshop, ClipStudio, Blender, ZBrush, houdini, AfterEffects, FilterForge, SubstanceDesigner, Illustrator, Maya, Cubaseなどなど