「ランダム名付け機能」「NPCと主人公の名前被り判定機能」を配列で解決!(追記あり)

セルフメモです。

①「ランダム名付け機能」
キャラメイク時に名付けに迷った時、適当な候補の中から名前をつけてくれる機能(確かジルオールにあったやつ)。
これは割と簡単にできました。
const array = ["フィーロ", "フィル", "フィロウ", "フィリエル"];
let r = array[Math.floor(Math.random() * array.length)]; $gameVariables.setValue(1,r);
配列に適当な名前のリストを入れる→ランダムで抽出→変数1に抽出したデータを格納、という処理を行ってます。

変数1に代入した「名前候補」を表示してます。これでOKとなったら、後はスクリプトを使って「アクター1の名前」に変数1の文字列を代入します。


「名前候補」の配列からランダムに抜き出された名前が表示されてます。いろいろ試していく中で「やっぱ主人公の名前は自分で考えたい」となった時用に「自分で命名する」選択肢も選べるようにしています。

②主人公とNPCの名前かぶり問題について。
前々から主人公にNPCと同じ名前をつけてしまった場合には警告文を出したい、と思ってまして、その解決方法を考えました。
ひとまず、const array = ['ナリッシュ', 'ディアンヌ', 'サイラス']; みたいに既存NPCの名前を羅列した配列を作る→ あとは名前を付ける際にこの配列を参照して、その中に名前被りがあったら「※NPCに同名キャラがいます」という警告文を出す、という構造にしたいと考えたのですが……。

何故かはわからないんですが、「配列から要素を抽出する」関数がうまく動かせませんでした。どっかで構文を間違えてるのかな?とも思ったんですが、エラーは出ないのですよね……ただ、どういうわけか「主人公名と同じ名前が配列内にないか参照する」という処理がスルーされてしまってるような感じで……仕方ないので別の方法でアプローチすることに。

フォロワーさんからいただいた案を参考に、名前被りの有無を判定する方法を考えました。
まずは.lengthで配列の要素数を覚えておく→オリジナルの配列をコピーした別の配列を作り、そちらに.push()で主人公名を追加→配列の中に重複してる名前があればそれを削除→もう一度.lengthで配列の要素数を出す→オリジナルの配列より要素数が増えてれば「名前被りなし」、オリジナルの要素数と同数なら「名前被り有り」と判定できる、という考え方に基づいています。

配列の重複を削除する方法は色々調べた上でsetという関数を使ってみました。

ツクールMVのスクリプトには行数制限があるので、2つの配列の要素数を変数に代入するところまでスクリプトで処理してます。要素数の比較はイベントコマンドの条件分岐で判定しました。
名前に被りがない場合は何も言われませんが……。
NPCと同じ名前を入れると2行目に警告文が出てきます。

これで望む処理が実装できました!
プログラムはもともと苦手意識があったのですが(だからこそのツクールユーザー)、比較的簡単なスクリプトでも、思った通りの挙動を実現できるとなんだか嬉しくなりますね……。

(以下追記)
後日、他の方から
const array = ['ナリッシュ', 'ディアンヌ', 'サイラス']; const name = $gameVariables.value(1); とするなら、名前が被ったかどうかは array.includes(name) で判定可能

というアドバイスをいただきましたので、そちらの方法でも判定してみました。

これによりイベントやスクリプトの行数を減らすことができ、また使う変数も1つになりました。
出力される内容は元のやり方と同じです。

この記事が気に入ったらサポートをしてみませんか?