
「ねえ勇者。いくの?」
「ああ。悪い」
「子供、できたみたいなんだ」
「お、おお、おれは魔王討伐に行かなきゃならないんだ……」
「んだとこらぁ!」(記事本編は↓の続きを読むよりお願いします)
[0回]
凪「1週間ぶりですが、チョコの準備は進んでますか? 凪司工房です」
「という訳でブログ企画
『Ren'Pyはじめます。』の第3回です」
前回のあらすじ:
「ばーぶー」
「クポー」
「くぴぴ、くぽ」
「僕と契約して魔法少女になってよ!」「何言ってるか分かんねえから、おめえ……という前回でしたね」
「でも魔法少女になって見事問題解決をし、漸く今回から作品っぽく製作していきますよ!」
「という訳で、前回は日本語を使えるようにしました、一応 (でもまだメニューとか英語のままですけどね)」
「今日はRen'Pyでのゲーム製作の基本を学んでいきましょう」
「今までは、基本じゃ無いのか? と?」
「前置きです。前提です。前座で、朝飯前です!」
「物事を始める前にはその下準備が何より大事なのです」
「大根を桂剥きしますか? トマトを湯剥きしますか? ゴボウを亀の子たわしで洗いますか!」
「下準備をしっかりしておくことが料理の基本なんです」
「さて、一応この講座での最終的な目標は
それなりにまとまったRen'Pyの機能をいろいろと活かしたビジュアル・ノベルを製作することなのですが」
(え? 初耳? そう思うならざっと第0回から読み返してみてくださいよ)
(……どこにも書いてませんから)
「今回はビジュルアル面
以外の基本的な機能を押さえた短い作品を製作してみようと思います」
STEP1:シナリオを書こう! ・まずどんな作品のストーリィにしたいのか、その台本を書きます
・今回はRPGやファンタジィの王道である「魔王を倒して世界を救う」をその作品のテーマとしてやってみます
・台本はメモ帳などの自分が普段使っているテキストエディタ等に書いて下さい
・書き慣れていない人は、箇条書きに自分が作りたい物語の場面や設定等を書き出してみて下さい
・その際にゴールを設定しておくと多少脇道に外れてもそれなりのものが出来ます
・今回は短い物語にするので、以下のように単純ですが、起承転結っぽいものがある構成にしてみました
<※以下、今回のシナリオっぽいもの>
タイトル: Ren'Py物語 『魔王さま倦怠期です(仮)』
始まり:第156代目勇者に選出される
分岐A:仲間選び。一人は現在の彼女で金髪の魔法使い、もう一人は元彼女で紫髪の僧侶
分岐B:(強制)仲間選びでどちらを選んだかで展開が変わる
現彼女 → プロポーズのイベント → 受ける/受けない
元彼女 → 昔話 → 元彼女の彼氏が出現して争う
終わり:魔王は待ちぼうけしている
「別に書き方なんてメモ程度でいいんです。しっかりしたものを最初から用意する必要はありません」
「特に最初は色々な仕様に慣れることの方が先なので、プログラム以外の部分はなるべくさくっとやってしまいましょう」
「今回はノベル・ゲームで最低限度、備えていそうな
分岐と
強制分岐をシナリオに入れ込んでみました」
「分岐というのは簡単なものだと質問に対するYes/Noであったり、行き先の選択であったり、デートの相手を選ぶことであったりしますが、基本は選択肢があり、そのどれかを選ぶことにより内部的な変化や、ストーリィの変化を引き起こすものですね」
「それから強制分岐ですが、これは恋愛ゲームなんかで言えば好感度のようなものによってストーリィの流れが変わっていったり、誰かと付き合うルートになったり、推理ものなら何かの重要アイテムやヒントを得ているかどうかで事件解決の方へと向かったりするという、」
「プレイヤーの選択では無く、条件により分岐するというものですね。条件分岐とも言われます」
「物語の流れの操作はこの二つがあれば大抵間に合います。つまり、普通のノベル・ゲームの基本的機能という訳ですね」
「それを踏まえた上で、実際のRen'Pyスクリプトに移っていきましょう」
STEP2:台詞等を書き込む ・台本(というかメモ)を元にして、実際に「script.rpy」のファイルにコードを書き込んでいきます
・まずランチャーから(でなくてもいいですが)エディタで「script.rpy」を開いて下さい
・それに以下のように書き込みましょう
# The game starts here.
label start:
"この物語は一人の魔王と、一人の勇者の、汗と涙と血と骨と肉の物語である。"
"この国では国民から魔王と戦う勇者を選出し、永きに渡り魔王と戦ってきた。"
"王" "次の勇者はこの者だ。探し出してここに連れてこい!"
"兵士" "承知しました!"
"こうして第156代目の勇者にあなたは選出されたのである。"
"勇者" "えっと、何すか?"
"王" "お前は第156代目の勇者に選ばれたのだ。さっさと魔王と戦って世界平和を取り戻せ!"
"勇者" "えー、そんな面倒な。"
"王" "もし魔王を倒したらその暁には何なりと望みを叶えよう。"
"勇者" "よしわかった。商談成立だな。"
"王" "では手続きを済ませて、さっさと魔王討伐の旅へ出ろ。"
"勇者" "もし俺が魔王を倒して帰ってきたら、まずお前のその命令口調なおしてやっからな。"
"こうして勇者は旅の準備をしに酒場へ向かった。"
jump sakaba
label sakaba:
"酒場にやってきた勇者だったが、そこで勇者は二人のよく知る女性を見かける。"
"一人は今付き合っている彼女の金髪の魔法使いだ。"
"もう一人は寂しそうにバーカウンターに座っている元彼女の紫髪の僧侶。"
"あなたはどちらに話しかける?"
menu:
"今の彼女の金髪の魔法使い":
$ girl_friend = 1
jump ima_kano
"昔の彼女の紫髪の僧侶":
$ girl_friend = 2
jump moto_kano
label ima_kano:
"勇者" "飲みにくるなんて珍しいな。"
"魔法使い" "あんた、私を置いて旅に出るつもりだったんでしょ?"
"勇者" "危険な旅に連れてけないよ。"
"魔法使い" "この前ずっと一緒にいようって言ってたじゃない!"
"勇者" "酔ってたんだよ。"
"魔法使い" "死ぬ時は一緒だから。"
"勇者" "何言うんだよ、縁起悪いな。"
"魔法使い" "私、一緒に行くから。"
"魔法使いが仲間になった!"
jump trip1
label moto_kano:
"勇者" "久しぶり、だな。"
"僧侶" "あ……。勇者に選ばれたんだよね?"
"勇者" "ああ。世界を救うことになっちまった。"
"僧侶" "あの頃言ってたホラが、叶っちゃったね。"
"勇者" "最近はどうなんだよ?"
"僧侶" "どうって……別に。"
"勇者" "また悪い男につかまってんじゃないのかよ。"
"僧侶" "だったら何?"
"勇者" "もうやめろよ、そういうの。"
"僧侶" "じゃあ、勇者と一緒に冒険の旅に出ちゃおうかな。"
"勇者" "……いいぜ。"
"僧侶" "ほんとに? ほんとのほんと?"
"勇者" "ああ。"
"僧侶が仲間になった!"
jump trip1
label trip1:
"勇者は仲間と共に魔王討伐の旅に出かけた。"
"行く先々で魔王の配下に苦しめられている町や村を救いながら、進んだ。"
"とある村に泊まった夜のことだった。"
jump shuraba
label shuraba:
if girl_friend == 1:
jump shuraba_imakano
if girl_friend == 2:
jump shuraba_motokano
label shuraba_imakano:
"勇者" "何だよ、話って?"
"魔法使い" "あのね……アレが、ないの。"
"勇者" "何か前の村に忘れ物か?"
"魔法使い" "ソレがさ、きちゃったみたいなの。"
"勇者" "忘れ物が? 歩いてきたのか?"
"魔法使い" "お前の赤ん坊が出来たって言ってんだよ!"
"勇者" "えっと……マジか?"
"魔法使い" "結婚する? ねえ結婚しちゃう?"
menu:
"はい":
"翌日、勇者と魔法使いは村で小さな式を挙げた。"
"こうして二人は冒険の旅から新婚旅行へとその目的を切り替えた。"
jump ending
"いいえ":
"翌日、勇者の撲殺死体が発見された。"
"犯人は見つかっていないが、王国では既に次の勇者選考が行われているそうだ。"
jump ending
label shuraba_motokano:
"勇者" "あれ? 僧侶どこ行ったんだ?"
"勇者が宿の外に出てみると、そこでは僧侶と宿屋の息子が抱き合っていた。"
"勇者" "おい! 何してんだ!"
"僧侶" "あ、勇者。ごめん……。"
"勇者" "ごめんじゃなくて何か言えよ。"
"宿夫" "彼女は悪くない。オレが、宿屋を継がずにいれば……。"
"僧侶" "彼と、付き合ってたの……。"
"勇者" "ごめんじゃなくて何か言えよ。"
"宿夫" "……。"
"僧侶" "……。"
"勇者" "何なんだよ! これじゃ俺が悪者じゃないか!"
"宿屋の息子をぶち殺しますか?"
menu:
"はい":
"宿屋の息子は意外と強かった。"
"敗れた勇者は一人寂しく、傷心の旅へと出かけたが、"
"勇者のその後を知る者は誰もいない。"
jump ending
"いいえ":
"翌朝、勇者はひっそりと村を出て行った。"
"僧侶と宿屋の息子の毒殺死体が見つかったが、その犯人はまだ見つかっていない。"
jump ending
label ending:
"一方その頃、魔王の城では……"
"魔王" "勇者君まだ来ないの? もう待ちくたびれちゃったよお。"
"魔王はそのあまりの退屈さに一億と三千二百六十四回目の欠伸をかみ殺した。"
"END"
return
「コピペでばーっと
script.rpy の
label start: の上から貼り付けちゃって下さればいいです、はい」
「細部の説明は補講に任せますが、ざっくりと何をやってるのかを説明してみましょう」
STEP3:コードを追っていく ・という訳でざっくりとコードの説明です
「
label から始まるのが一つのまとまりです。その終わりは return か次のlabelまでという感じで判定しているようです」
「で、今回は以下の9つのまとまりで成り立っています (ラベル名を並べてます)」
(1) start ……冒頭の場面
(2) sakaba ……酒場。仲間選択がある
(3) ima_kano ……今の彼女(魔法使い)
(4) moto_kano ……元彼女(僧侶)
(5) trip1 ……旅の話
(6) shuraba ……修羅場の強制分岐
(7) shuraba_imakano ……今彼女との修羅場
(8) shuraba_motokano ……元彼女との修羅場
(9) ending ……エンディング
「基本的には話のひとまとまりを一つのラベルにしています」
「ラベルの中で何度か
menu というワードが出てきますが、それが選択肢の部分のコードになっています」
「menu の基本的な書き方は以下」
menu:
"選択肢1":
jump 別のラベル
"選択肢2":
jump 別のラベル
「label のところでもそうなんですが、セミコロン
: を忘れないようにして下さい」
「セミコロンの後は一つのブロックとなるのが基本で、次の行でインデント(字下げ)を行います」
「これにより Ren'Py のゲームエンジンがそれを解析してゲームの動作に反映してくれます」
「まあセミコロンが抜けていたり、余計に付いていたりすると、ゲームを動かす前にエラーが出て教えてくれるので、この程度の書き込みミスであれば心配ありません」
「と言うか、意外とよくあります」
「で、menuのところで
jump ラベル というのが出てきますが、」
「これが分岐の基本的な形です」
「どの選択肢かを選んでもらって、その選択肢に応じたストーリーに進む」
「直感的に分かり易いと思います」
「ただ、今回のコードの中ではmenu後に jump ラベル 以外にも妙なものが書き込まれている箇所があります」
「
$ girl_friend = 1 とかってのです」
「これは何をやっているかというと、どっちの彼女を選んだのかというフラグを立てているんですね」
「RPGツクールなんかで言えばスウィッチでしょうか」
「プログラムをやる人には変数なんだと分かるでしょうが、」
「この girl_friend に何か数値や文字を入れて、それを後で読み取ったりして使う為のものです」
「ここでのフラグは、後の shuraba ラベルにて使われています」
「ではそこだけ抜き出して見てみましょう」
label shuraba:
if girl_friend == 1:
jump shuraba_imakano
if girl_friend == 2:
jump shuraba_motokano
「ラベルの次の行に見慣れないものがある……」
「
if ←こいつ」
「これは if =もしも〜ならば、って英語です」
「プログラムではよく使われますが、条件分岐の際にこのワードが使われますね」
「if 以降に
girl_friend == 1 等と書かれておりますが、この意味は girl_friend の中身が 1 だったら、ということです」
「書かれた条件が○ (真) の時はその次の行が実行され、× (偽) の時はそのブロックは飛ばして次のブロックに処理が移る訳です」
「ここでは if が2つ続けて書いてありますから、最初の if で条件分岐 の判断がなされて、その後に 次の if でまた条件分岐の判断がなされています」
(本来なら値が二種類しか使っていない時は if の次に else として続ければいいのですが、今回は分かり易さの為にこうしてます)
「今回プログラムらしいことをやっているのは、以上です」
「え? それだけ?」
「すみません。台詞の部分ばっか多くて……」
(一応超短編のゲームっぽいものになるように努力したので……)
「あと、もう一つ付け加えて説明しておくなら」
「台詞の部分の書き方でしょうか」
(補講に詳しいのは回しておきますが)
「名前の部分を""でくくり、その後に半角スペイスを1つ空けてから、台詞を""でくくっています」
「いちいち名前を書かなくても済む方法があるのですが、今回は使ってません」
「また後日説明予定です」
「ふぅ……長かったですか? まだまだ序の口ですよ。じょ・の・く・ち」
「という訳で、いつもの如く、遊んで……もとい、試してみましょう」
STEP4:ちゃんと動くか試す ・上記のコードを書き込んだら(コピペしたら)
・ランチャーからプロジェクトを起動してみましょう
・Start から遊んでみて下さい
・選択肢は出ましたか?
・そこでちゃんと台本通りにことが進みましたか?
「さあさあさあ!」
「やってみて楽しくなってきたでしょう?」
「え? 楽しくない?」
「そもそも絵が無い?」
「声も無い?」
「音楽は?」
「てか文章はえーよ」
「等々……クレームの嵐ですね」
「まあ、それらの不満点をおいおい解消していきましょう」
「色々とご不満はありましょうが……それでも、これであなたは基本的なノベル・ゲームを作る力を手に入れたのです!」
「言い換えれば、画像と音のないかまいたちの夜を作ることが出来るかも知れないのです!」
(それはかまいたちの夜と呼ばない?)
「……ともかく、文章と、条件分岐が基本なのです。これをないがしろにしては、ゲームの道はローマまで遠いですよ!」
「という訳で、第3回はこれにて終了です」
「次回予告!」
『第4回 -魔女の誘惑-』「いつだって気の油断が落とし穴なのよ」

「の補講 第6.5回」「第6回 -俺の鼓動が聴こえるか?-」「の補講 第5.5回」「第5回 -君に会いに行く-」「第4回 -魔女の誘惑-」「の補講 第3.5回」「第3回 -出会いと別れ-」
「の補講 第2.5回」「第2回 -そんな話は聞いてない-」「の補講 第1.5回」「第1回 -魔王現る-」「第0回 -1人の敗者-」PR