行に願いを
なんか怖い人が★をつけまくって去っていったのでガクブル。だがしかし恐ろしい見たさでもうちょい。
とあるソースをちらっと見た。感想は、「手を抜いて良いところと、手を入れて欲しいところ」があるです。自分で実装しても良いんだけど自分は違う言語でアタックしてみたいのでコンセプトアートで。
現在の実装
エ05「今日のお電気のお時間です。」 さ15「明け方は17V程度と冷え込みますが、日中は一部地方で42Vを越えるでしょう。」 エ08「‥‥直流なら死人でるよね。」 さ18「‥‥だよね。」
こうして欲しい案
エ5「今日のお電気のお時間です。」 さ5「明け方は17V程度と冷え込みますが、日中は一部地方で42Vを越えるでしょう。」 エ8「‥‥直流なら死人でるよね。」 さ8「‥‥だよね。」
単純で良いところ
連想配列がある実装系であることを仮定したとき、会話属性(「」の手前)へのマッチは正規表現ではなく、単純文字列マッチで良い。
slot["エ5"] ={ pos:"\0", w1:"\w9\w9\\n[1.5]", w2:"\w9\w9\n", pre: "\s[5]", suf:""} slot["エ8"] ={ pos:"\0", w1:"\w9\w9\\n[1.5]", w2:"\w9\w9\n", pre: "\s[8]", suf:""} slot["さ5"] ={ pos:"\0", w1:"\w9\w9\\n[1.5]", w2:"\w9\w9\n", pre: "\s[5]", suf:""} slot["さ8"] ={ pos:"\0", w1:"\w9\w9\\n[1.5]", w2:"\w9\w9\n", pre: "\s[8]", suf:""}
たとえばslotという連想配列を参照し、指定された会話属性文字列を単純に探して、それを適用する、という実装の方が良い。
- 通常、トークで指定する会話属性は、一つのゴーストで大爆発するほど多くはならない
- 正規表現マッチでは指定したい属性が増えたときの仕様制定と実装の手間が大変
- 連想配列を丸ごと差し替えることで、たとえば着替えが簡単に実現できる
特に、セットの差し替えが聞くことは重要。たとえば上の例だと、トークをいじらずに立ち位置を\\0から\\1に入れ替えるとか出来る。サーフェス番号と表情番号(?)の分離も重要。
凝ってみたいところ
キャラクターの1トーク(1行)において、属性を指定したい場所を列挙してみる。
- 直前に違うキャラが喋ってたときに付けたい内容(w1)。
- 直前が同じキャラが喋ってたときに付けたい内容(w2)。
- 会話の前に常に付けたい内容(pos,pre)。
- 会話の後に常に付けたい内容(suf)。
思いつきで増やしても、めどいだけなのでとりあえずこの位。posとpreを分けているのは直前のキャラを判別するための情報として。
多分こんな実装
- 何とかして会話属性部分の文字列を抜き出す(たとえば「エ5」)
- 属性名から属性セットを確定する(連想配列から探す)
- w1,w2,pos,preの適用判定
- 会話本文を何とかする
- sufの適用判定
- 直前に喋ったキャラクタ(pos)を覚えといて、次の行
あ、ちなみに、連想配列名「二人7」とかにして、二人が同時に怒る、とか表現したりデキルカモ。ちょっと特殊なことをしたいときは、専用に属性セット名を作ってそこだけスペシャルに適用するとか。
slot["エ7!"] ={ pos:"\0", w1:"\\n[1.5]", w2:"\n", pre: "\_q", suf:"\_q"} slot["さ7!"] ={ pos:"\1", w1:"\\n[1.5]", w2:"\n", pre: "\_q", suf:"\_q"} slot["シンクロ"] ={ pos:"", w1:"", w2:"", pre: \_s", suf:"\_s"}
ん、シンクロはイラネ、かもしれない。ここまで複雑な制御は直接書けばいいか。
相変わらず
妄想だ!煽ってるわけじゃないんだ!でもこの位が割とややこしくない範囲で割と良い実装だと思うんだ!正規表現が爆発するのは苦手なんだ!(ぉ)