「ランダム名付け機能」「NPCと主人公の名前被り判定機能」を配列で解決!(追記あり)
セルフメモです。
①「ランダム名付け機能」
キャラメイク時に名付けに迷った時、適当な候補の中から名前をつけてくれる機能(確かジルオールにあったやつ)。
これは割と簡単にできました。
const array = ["フィーロ", "フィル", "フィロウ", "フィリエル"];
let r = array[Math.floor(Math.random() * array.length)]; $gameVariables.setValue(1,r);
配列に適当な名前のリストを入れる→ランダムで抽出→変数1に抽出したデータを格納、という処理を行ってます。
②主人公とNPCの名前かぶり問題について。
前々から主人公にNPCと同じ名前をつけてしまった場合には警告文を出したい、と思ってまして、その解決方法を考えました。
ひとまず、const array = ['ナリッシュ', 'ディアンヌ', 'サイラス']; みたいに既存NPCの名前を羅列した配列を作る→ あとは名前を付ける際にこの配列を参照して、その中に名前被りがあったら「※NPCに同名キャラがいます」という警告文を出す、という構造にしたいと考えたのですが……。
何故かはわからないんですが、「配列から要素を抽出する」関数がうまく動かせませんでした。どっかで構文を間違えてるのかな?とも思ったんですが、エラーは出ないのですよね……ただ、どういうわけか「主人公名と同じ名前が配列内にないか参照する」という処理がスルーされてしまってるような感じで……仕方ないので別の方法でアプローチすることに。
フォロワーさんからいただいた案を参考に、名前被りの有無を判定する方法を考えました。
まずは.lengthで配列の要素数を覚えておく→オリジナルの配列をコピーした別の配列を作り、そちらに.push()で主人公名を追加→配列の中に重複してる名前があればそれを削除→もう一度.lengthで配列の要素数を出す→オリジナルの配列より要素数が増えてれば「名前被りなし」、オリジナルの要素数と同数なら「名前被り有り」と判定できる、という考え方に基づいています。
配列の重複を削除する方法は色々調べた上でsetという関数を使ってみました。
これで望む処理が実装できました!
プログラムはもともと苦手意識があったのですが(だからこそのツクールユーザー)、比較的簡単なスクリプトでも、思った通りの挙動を実現できるとなんだか嬉しくなりますね……。
(以下追記)
後日、他の方から
const array = ['ナリッシュ', 'ディアンヌ', 'サイラス']; const name = $gameVariables.value(1); とするなら、名前が被ったかどうかは array.includes(name) で判定可能
というアドバイスをいただきましたので、そちらの方法でも判定してみました。