ぼんさいゲーム

RPGツクールMVでゲームを作ったりするブログ

RPGツクールのコンテスト情報2017

気づいたら書いていきます。
私は最近ちょっと目をやられてしまって参加できるか分かりませんが…。

物語×放置ゲームコレクション

応募締め切り:2017年7月9日
ch.nicovideo.jp

第2回電ファミニコゲームマガジン新人賞

応募締め切り:2017年9月7日
gamemaga.denfaminicogamer.jp

RPGのバランス調整とか、各種数値の設定ってどうやるの?

私はRPGツクールRPGを作ったことがありません。笑
なぜかというと、バランス調整ができる気がしないから。

ツクールシリーズだと最初から敵のデータも用意されているので、カタチだけは作ることもできるでしょうけど。
なんというか「勘所」みたいなのがサッパリ掴めないんですね。

どうのつるぎの価格、スライムのHP、次のレベルに必要な経験値は、何を基準にどうやって算出すればいいのか?
そもそものゲーム設定の仕方が皆目見当もつかんのです。

イオンの駐車料金

ところで先日、イオンでこんな張り紙を見ました。
「平日は1000円、休日は2000円で駐車料金が2時間無料」
あたりまえですがこれも、イオンの中の人がいろいろ試算して出した数値なんでしょう。

ショッピングモールを作るのに10億円かかるとして。
年利1%で10年で返済する計画だったら、実質11億円くらい?
月に1000万円くらいの利益を出すためには、売上はいくら必要?
こう考えると駐車場にかかる費用や、どのくらいの駐車料金をとるかが見えてきそう。
あと、テナント料の設定なんかも。

さらにお店単位で、テナント料や人件費など他コストを考えると売上がどのくらい必要?
飲食店なら回転率と席数で割れば、ほしい客単価が見えてきそうです。

RPGで考える

これと同じような計算が、RPGを作るときも必要なのかなと思います。
ただ「ゲーム内」の設定の場合、基準となる数字(建築費とか金利とか)がとくにないので、とっかかりがありません。
(開発スケジュールなら出しやすいんですけどね)
最初の基準も、ある程度自分で決めなければなりません。

なんとなく「エンディングまで普通にプレイして、何時間くらいでクリアさせたいか?」が基準になりそうな気がしました。
あと「ラスボスはだいたい何レベルくらいで倒せるような強さにしたいか?」とか。

毎日2時間プレイで30日遊ばせたい場合は、クリア時間の目標は60時間。
ラスボスをレベル70くらいで倒したいとして。
「最初の2時間のうちに5レベルくらいにならないと飽きそう」
「最後のほうは2時間で1レベル上がるか上がらないかくらい」
とか考えていけば、なんとなく見えてきそうです。

で、その2時間のうちに何戦闘くらいさせたいかで敵のEXPが出せそう。
何戦闘くらいで武器を買わせたいかによって、武器の値段も決められそうです。


計算が苦手なので、まだフワフワしたイメージしか掴めていませんけど。
そのうちRPGを作るなら過程もアップしていきたいです。

自分にとって「面白い」とは?

「面白い」と一口にいっても人の好みは十人十色。
ウケるものを作ることも大切ですが、まず自分が何を面白いと思うのか?をしっかり持っていないとブレがちですよね。
というわけで「私にとって面白い」ゲームってどんなものかを考えてみました。

自由度高すぎるとムリ

最新版のゼルダとか画面みてると、こわい!と思います。
そもそも「やることを自分で設定する」のが苦手なんですね、決めてほしい。
意思決定が苦手で現実でも苦労してるので、ゲームくらいは適度に指示が欲しいです。

広いマップがムリ

現実でも縦軸移動が苦手なので、広くて行き先がわからないマップとか恐怖です。
(マンションの管理センターに行けない…。)

神の視点で世界のすべてが見渡せると安心します。
「箱庭系」とか、せいぜい2~3画面分くらのマップで構成されたSRPGとかが好きですね。
あとパズルゲームもマスが決まり切ってるので好きです。

簡素なグラフィック

いまだに2Dゲームが好きなんですけど、たぶん情報が多すぎるとダメだということに最近気づきました。
リアルなグラフィックの3Dとか、もう現実でいいじゃんと思います。

アニメも実写に比べて、画面の情報が少ないのがいいんですよね。
情報が多いと脳が処理できない。笑

抽象度が高い

最近、自分は抽象度が高いものが好きなのかもしれないなーと思いました。
美麗なグラフィックより「動きそうもない絵が動く」「現実では物理的にありえない」感じを、二次元には求めています。

「抽象画の中に入る」みたいな感じが欲しいかなぁ?

雑感

囲碁も将棋もやらないですけど、私にとってゲームはそれらに近いモノを求めているのではないかと思いました。
あるいはインタラクティブ性のある漫画。

好みと得意ってわりと近いところにある場合も多いので、自分の好みを把握しておくのって大事ですね。

「物語×放置ゲーム」コンテスト。

「物語×放置ゲーム」コンテストが開催されるそうなので、間に合うかわかりませんが参加してみようかな。
ch.nicovideo.jp

公式?プラグイン

公式ツイートで配布されているプラグインでは、以下のことができるそうです。
(「プラグインコマンド」で下記の説明のように記述します)

* ■on 時間(分)が経ったら確率でスイッチをオンする
* TimeEvent on 時間(分) 確率(%) ONにするスイッチ番号 ifスイッチ番号(省略可) if変数条件(省略可)
* 例)TimeEvent on 5 60 3 \S[7] \V[2]>60
* 5分経ったら60%の確率で「S[0003]:三毛ネコ」スイッチをONする
* (ただし、S[0007]:赤いボールがONでV[0002]:餌が60より上のとき)
*
* ■off 経過時間がきたら確率でスイッチをオフする
* TimeEvent off 時間(分) 確率(%) OFFにするスイッチ番号 ifスイッチ番号(省略可) if変数条件(省略可)
*
* ■get 経過時間がきたら確率でアイテムを1つ得る
* TimeEvent getch.nicovideo.jp
時間(分) 確率(%) 手に入れるアイテム番号 ifスイッチ番号(省略可) if変数条件(省略可)
*
* ■join 経過時間がきたら確率でキャラがパーティに加わる
* TimeEvent join 時間(分) 確率(%) 加わるアクター番号 ifスイッチ番号(省略可) if変数条件(省略可)
*
* ■byebye 経過時間がきたら確率でキャラがパーティが別れる
* TimeEvent byebye 時間(分) 確率(%) 別れるアクター番号 ifスイッチ番号(省略可) if変数条件(省略可)
*
* ■common 経過時間がきたら確率でコモンイベントを実行する
* TimeEvent common 時間(分) 確率(%) 実行するコモンイベント番号 ifスイッチ番号(省略可) if変数条件(省略可)
*
* ■add 経過時間がきたら確率で変数を足す
* TimeEvent add 時間(分) 確率(%) 変数番号 加算値or加算変数番号 ifスイッチ番号(省略可) if変数条件(省略可)
* 変数番号に加算値または加算変数番号を足す(マイナスの場合は引く)
*
* ■addevery 経過時間ごとに確率で変数を足す
* TimeEvent addevery 時間(分) 確率(%) 変数番号 加算値or加算変数番号 ifスイッチ番号(省略可) if変数条件(省略可)
* 変数番号に加算値または加算変数番号を足す(マイナスの場合は引く)
*
* ■reset ゲームを開始したときに全ての変数をゼロにする
* TimeEvent reset 変数番号 変数番号 変数番号
*
* ■alloff ゲームを開始したときに全てのスイッチをOFFにする

制作過程

さっそくちまちまとツクりはじめてみました。

5/1進捗

・画面サイズをスマホでも見やすいよう480*336に。
(マップは10×7マス)
・プレイヤーキャラはカーソルに。
・イベントをタップしたとき、「キョウコ」が追尾する。

5/2進捗

主人公がヒロインの謎を探るストーリーを予定していたけど、どうしても物語の導入が長くなる。
このてのゲームでは致命的なので、主人公=ヒロインにすることに。

・カーソル(プレイヤーキャラ)を、常時歩行アニメさせる。
・セーブできないようにする(開発中のみ)。
→ある程度できてきたら、下記のオートセーブプラグインを入れたい。
【オートセーブ】セーブコマンドプラグイン for MV - 鳥小屋.txt

5/3進捗

タイトル画面をとりあえず文字画像にしてみる。
オリジナル画像だと拡大されるみたいなので、画面と同じ480*336に。

タイトルメニューの位置調整は、最初から入ってるプラグインでできた。
公式プラグイン:TitleCommandPosition - RPGツクールMV Wiki

・メイン画面の部屋作成、マップチップ調整

5/4進捗

・リージョンで通行設定
下記を参考に、リージョンで通行設定ができるプラグインを導入。
「プレイヤーは通れるけどイベントは通れない」マスを作る。
リージョンでマップ移動制限が出来るプラグイン!!YEP_RegionRestrictions | プログラミング素人がゲームを作る
面倒な通行設定をすべてこれでやろうとしたら思ったように動かなかったので、基本ちゃんと通行設定はしつつ「例外のみ」をこのプラグインで設定するといいようです。
(たった横10マスしかないマップなんだから、横着せずにやれって話^^;)

5/5進捗

・基本3アイテムのドット絵調整

5/6進捗

・TimeEventプラグイン導入。「0.1分」「0.05分」という指定もできた。
・アイテムが数秒間隔でランダム出現するようにした。

5/7進捗

・オープニングの画面挙動だけツクった。
→プレイヤーを「透明状態で開始」にしたあと透明を解除するには、移動ルートの設定「透明化OFF」でした。


(やること)
・額縁アイテム7個作る。遠景を縮小して使う。
・UI作る(右上から縦ならび?)
☆オートセーブにする?

「プレイヤーは通れるけどイベントは通れない」マスを作る

YEP_RegionRestrictions

「プレイヤーは通れるけどイベントは通れない」マスを作るのに、ちょっとドハマリしたのでメモ。
「YEP_RegionRestrictions」というプラグインを使い、リージョンで通行設定をすることにしたんですけどね。
こちらのサイト様を参考にしました。
ossangame.com

リージョン設定とは本来、敵の出現エリア分けを設定するのに使うものだそうです。
(よく分からないのでいまままでノータッチだった)
プラグインを入れると、リージョン設定に通行設定をつけられます。

通行設定を「追加」する

このプラグインでは「通行設定をする」というより、「通行設定を付け足す」イメージ。
「本来通れないところをムリヤリ通れるようにする」「本来通れるところをムリヤリ通れないようにする」という感じです。

なので、そもそものマップチップの通行設定はちゃんとした上で使いましょう。
先にマップの通行設定をしてからでないと、ツクってて混乱します。

壁から床に戻れない

私は「壁に入ったプレイヤーが戻ってこれない」という状態に悩みました。

どうやらもともとMVのマップ移動は、壁の判定が「今いる地形と同じか否か?」で判定されているようです。
なので本来入れないはずの壁に入ってから床に戻ろうとすると、「今いる地形と異なるから壁!」と判定されて床に戻れなくなるみたい。

このような状態になったら、「壁にも床にも通行可能設定のリージョンを敷く」という方法で解決できました。
いや~ほんと色々ありますね!

マップ上でアクターが移動しないときも歩行アニメ(足踏み)させる。

仲間キャラクターが足踏みするプラグイン

下記ページの「Actor Stepping Animation」というプラグインを使用します。
forums.rpgmakerweb.com
商用利用もできるみたいですね。

使い方

①ダウンロードしたjsのファイル名を「ActorStepAnim.js」に変更します。
(js.jsにならないよう注意!)

プラグインフォルダにつっこみ、ツクールMVのブラグイン管理で適用します。

③足踏みさせたいアクターのメモ欄に「<stepanim>」と記入
(※<>は半角にしてね!)

これでアクターが移動していないときも、足踏みしてくれました。

(変数)番のピクチャを色調変更・移動する

会話中に立ち絵をシェイクさせたいと思って。
「ピクチャの移動」とかでやってみたけど、ウエイト入れるとセリフが止まるし、ウエイト入れないと上手く動かない。

セリフのキー待ちとは関係なしに、ピクチャをフラッシュさせたい!
と、いろいろ試したら「並列処理」で実装できた。

「マップ上のイベントページで、変数にピクチャ番号を入れる⇒コモンイベントでフラッシュさせる」という形になりました。

マップイベント側

◆ピクチャの表示=#1
◆変数の操作:変数1 動かすピクチャ番号=1
◆スイッチの操作:スイッチ1

コモンイベント側

トリガー:並列処理
スイッチ:スイッチ1
スクリプト:
$gameScreen.tintPicture($gameVariables.value(1),[50,50,50,0],3)
※[赤,緑,青,グレー],フレーム数
スクリプト:
$gameScreen.movePicture($gameVariables.value(1),0,-5,-5,100,100,255,0,3)
※原点,x座標,y座標,x拡大率,y拡大率,不透明度,合成方法,フレーム数

数値を保持して移動だけする

ピクチャの拡大率や不透明度を変えずに、移動だけさせたい場合は下記の方法でできました。(変えたいところだけ数値入れる)

スクリプト:
pic = $gameScreen._pictures[$gameVariables.value(1)];
if(pic){
pic.move(pic._origin, pic._targetX, pic._targetY, pic._targetScaleX,
pic._targetScaleY, pic._targetOpacity, pic._blendMode, 3);
}
※原点,x座標,y座標,x拡大率,y拡大率,不透明度,合成方法,フレーム数

こちらのサイト様を参照させていただきました。
likilia.blog57.fc2.com

ピクチャを全て消去

表示中のピクチャを一度に全て消すときは、スクリプトで以下の一行を書けばOKです。
(100番までのピクチャを消す)

スクリプト:
for(var i = 0; i <= 100; i++){$gameScreen.erasePicture(i)}


ループとかfor文とかホントわからんね・・・!

サイドビュー戦闘中のメッセージ(バトルログ)を消す

「SimpleMsgSideView」

サイドビュー戦闘で、画面上部に「〇〇の攻撃!」とかごちゃごちゃメッセージが出るのを非表示にできます。
「SimpleMsgSideView」というプラグインが、最初からツクールMV本体に入っています。

プラグイン管理から、「SimpleMsgSideView」を追加してON状態にしましょう。
これだけで、バトルログが非表示になります。

f:id:ao385:20170416035318p:plain
こんな感じで使いました。

戦闘中の名前表示を二つ名にする

プラグインを作ってもらいました。

BattleManager._phase という値で戦闘の進行を管理しているそうなのですが、「nullじゃなければ(戦闘中であれば)二つ名を表示」みたいな処理をしているそうです。

こちらに詳しく説明がありますね。まったく分かりませんけど。
qiita.com

最低限リリースを目指す

ちょっとイメージが膨大になってきたので。
現状では実装がむずかしい機能や演出を削った、仮バージョンのリリースに進路変更。

まず最低限の機能でバランスをみてから、少しずつ機能を足していくイメージ。
絵のクオリティなども、いったん考えるのやめる。

トーリーはいま考えている本編の「前日譚」。
主人公と親友が、ヒロインと出会う前の話にする。
二人がこれまでどんな日常を過ごしていたかを描けば、キャラに愛着もわくかも?

主人公イメージ

イメージは菅田将暉さん。
独特の主人公感ありますよね。

あの2.7枚目くらいの雰囲気を絵にするの難しい。
誰か絵描いてくれないかな。

ジェネレーターで軽くイメージをツクってみたら、コレジャナイ感がすごい。
熱血だけど育ちが良さそうな感じを出したい。

親友のイメージ

f:id:ao385:20170423221916j:plain
栗原類さんとピース又吉さんを足した感じ。
こいつはかなりイメージ固まってる。

基本的に覇気がなく、ゆっくり喋る。
でも主人公より色々考えてはいる。

天才肌だけど、主人公としかまともにコミュニケーション取れないからツルんでる感じ。

ヒロインのイメージ

前日譚には出てこないヒロイン。
トリンドルさんのイメージ。

エルフみたいな美少女だけど、人間ぽい性格と表情がある子にしたい。
ハーフエルフ感が出せるといいな。

戦闘おわりに戦績を表示する

戦闘おわりに、その戦闘での戦績を表示させたいと思いまして。

戦闘画面が切り替わってからイベントを呼ぶプラグインはあったけど、戦闘画面のままイベントを呼べるものがなかったのでアレクさんに作ってもらいました。
(戦闘おわりのタイミングは色んな処理があって、思ったより大変だったそう。感謝)

メッセージを4行以上にするプラグインも作って(改変)もらいました。
f:id:ao385:20170412221611p:plain
(メモ)敵HP超える与ダメージは、与ダメージの値がそのまま取得される。

スクリプトでウィンドウ変更・メッセージ位置変更・メッセージ表示をしています。
こちらのサイト様を参考にさせていただきました。

・メッセージウィンドウ変更(1=透過黒)
$gameMessage.setBackground(1);

・メッセージ位置変更(1=中)
$gameMessage.setPositionType(1);

・メッセージテキスト表示
$gameMessage.add("戦闘に勝利!")
$gameMessage.add("合計"+$gameVariables.value(変数)+"のダメージを与えた!")

エフェクトはみんなでツクるプラグインコマンド集の、「指定位置にアニメーション表示」を使っています。
通常バトルエフェクトは敵IDで位置指定するので、敵がいないと表示できないんですね。
このプラグインを使うと、座標指定でエフェクトを表示できます。

戦績プラグイン

数値はトリアコンタンさんの「戦績プラグイン」で取得しています。
これは累計の数値をとるものなので、戦闘ごとの数値をとるためには毎回べつの変数に格納してリセット(0代入)する処理が必要ですね。
アクターごとの与えたダメージを変数に代入 - ツクマテ

このプラグインプラグインコマンドはありません。
イベントコマンド(変数の操作)で、値をとり出して使います。

・使い方
戦闘中の様々な情報を記録していつでも取得可能にします。
戦績として記録に残せるほか、特殊なスキルのダメージ計算式に
組み込んだりすることもできます。

アクターごとに以下の要素を記録できます。

・スキルごとの使用回数(戦闘中のみカウント。他項目も同様)
・全スキルの使用回数合計
・アイテムごとの使用回数
・全アイテムの使用回数合計
・敵キャラごとの撃破回数
・全敵キャラの撃破回数合計
・与えたダメージの合計
・与えたダメージの最大
・受けたダメージの合計
・受けたダメージの最大
・回復したダメージの合計
・消費したMP合計
・消費したTP合計
・戦闘不能回数

値はイベントコマンド「変数の操作」から「スクリプト」で
対応するスクリプトを呼び出して取得してください。

・データベースのアクターIDから取得する場合
$gameActors.actor(1).getSkillUseCounter(2); # アクター[1]のスキル[2]使用回数
$gameActors.actor(1).getAllSkillUseCounter(); # アクター[1]の全スキル使用回数
$gameActors.actor(1).getItemUseCounter(3); # アクター[1]のアイテム[3]使用回数
$gameActors.actor(1).getAllItemUseCounter(); # アクター[1]の全アイテム使用回数
$gameActors.actor(1).getKillEnemyCounter(4); # アクター[1]の敵キャラ[4]撃破数
$gameActors.actor(1).getAllKillEnemyCounter();# アクター[1]の全敵キャラ撃破数
$gameActors.actor(1).attackDamageMax; # アクター[1]の最大与ダメージ
$gameActors.actor(1).attackDamageSum; # アクター[1]の合計与ダメージ
$gameActors.actor(1).acceptDamageMax; # アクター[1]の最大被ダメージ
$gameActors.actor(1).acceptDamageSum; # アクター[1]の合計被ダメージ
$gameActors.actor(1).recoverDamageSum; # アクター[1]の合計回復ダメージ
$gameActors.actor(1).payCostMpSum; # アクター[1]の消費MP合計
$gameActors.actor(1).payCostTpSum; # アクター[1]の消費TP合計
$gameActors.actor(1).deadCounter; # アクター[1]の戦闘不能回数

・パーティの並び順(先頭は0)から取得する場合
$gameActors.actor(n)を$gameParty.members()[n]に置き換えて実行する。
(例)
$gameParty.members()[0].attackDamageMax # 先頭メンバーの最大与ダメージ

・計算式で使用する場合
$gameActors.actor(n)をa(実行者)もしくはb(対象者)に置き換えて実行する。
(例)
a.getSkillUseCounter(5) # 実行者のスキル[5]使用回数
b.getKillEnemyCounter(6) # 対象者の敵キャラ[6]撃破数

・すべてのアクターの合計値を取得する場合
$gameActors.actor(n)を$gameActorsに置き換えて実行する。
(例)
$gameActors.getKillEnemyCounter(4); # 全アクターの敵キャラ[4]撃破数合計

・パーティごとに管理される戦績を取得する場合
$gameParty.gainGoldSum; # 入手ゴールド合計
$gameParty.loseGoldSum; # 消費ゴールド合計
$gameParty.getGainItemSum(1); # アイテム[1]の入手合計
$gameParty.getGainWeaponSum(1); # 武器[1]の入手合計(初期装備以外)
$gameParty.getGainArmorSum(1); # 防具[1]の入手合計(初期装備以外)