見出し画像

RPGツクールMZの名前入力でNGワード処理するスクリプト

タイトルの通りです!笑
どんな動作をするかは下の動画を参考にしてください。
なお、下の動画ではキーボード入力してますが、通常の名前入力の処理でもスクリプトは動作しています。


概要

スクリプトは4部構成
・処理その1で、全アクターと名前が被っていないかをチェック。
・処理その2で、NGの名前かどうかをチェック(全一致)。
・処理その3で、NGワードが含まれていないかチェック(部分一致)。
・処理その4で、NGがなかった場合の名前書き込み処理を行います。
上記すべての処理において、ひらがなでもカタカナでも(半角カタカナでも)NGにします。
例えば、処理1においてアクター名「まおうさま」のアクターが他に存在していた場合、「まおうさま」も「マオウサマ」もNGとなります。

下記スクリプトの場合、
調査対象のアクターIDを事前に変数24に入れておきます。
その後、スクリプトの処理において変数27に対象アクターの名前が入ります。
処理の結果、重複があった場合はNGとなり、スイッチ16をONにします。
その後、条件分岐でスイッチ16がONだった場合で「その名前はNG」と表示させています。

※下記スクリプト内では今まで述べてきたようにスイッチと変数といくつか使用していますので、必要に応じて変更してください!


処理1.全アクターの名前と被ってないかチェック

//処理その1  全アクターの名前と被ってないかチェック

// チェック対象者のアクターIDが 変数[24]
// 入力された名前が 変数[27]
// 重複があったらスイッチ[16]をONにする。


// 半角カタカナを全角カタカナに変換する関数
function convertToFullWidthKatakana(str) {
    return str.replace(/[\uFF61-\uFF9F]/g, function (match) {
        return String.fromCharCode(match.charCodeAt(0) - 0xFEC0);
    });
}

// 全角カタカナをひらがなに変換する関数
function katakanaToHiragana(str) {
    return str.replace(/[\u30a1-\u30f6]/g, function (match) {
        return String.fromCharCode(match.charCodeAt(0) - 0x60);
    });
}

// 名前の標準化関数
function standardizeName(name) {
    // Unicode正規化
    let normalized = name.normalize("NFKC");
    // 全角カタカナをひらがなに変換
    normalized = katakanaToHiragana(convertToFullWidthKatakana(normalized));
    return normalized.toLowerCase(); // 小文字に変換
}

// 変数からアクターIDと新しい名前を取得
var aid = $gameVariables.value(24);  // アクターID
var newName = $gameVariables.value(27);  // 新しい名前

// デバッグ用に新しい名前と自分のアクターIDをログに出力
console.log("New Name: " + newName);
console.log("Actor ID to Exclude: " + aid);

// 自分のアクターIDを除外して他のアクターをチェック
var isDuplicate = $gameActors._data.some(actor => {
    if (actor && actor.actorId() !== aid) {  // 自分自身のアクターIDを除外
        console.log("Checking Actor: " + actor.name());  // デバッグ用に各アクターの名前をログに出力
        return standardizeName(actor.name()) === standardizeName(newName);
    }
    return false;
});

if (isDuplicate) {
    console.log("Duplicate Found: " + newName);  // 重複が見つかった場合のログ
    $gameSwitches.setValue(16, true);
} else {
    console.log("No Duplicates: " + newName);  // 重複が見つからなかった場合のログ
    $gameSwitches.setValue(16, false);
}

処理2.NG名前チェック

処理2ではアクター以外の名前をチェックします。
(例えば、重要な登場人物だけどアクターとしては登場しないなど)

//処理その2 NG名前チェック

// NG氏名のリストを定義(全体一致;カタカナ使用不可)
const ngNames = [
 "○○", "●●", "□□"
];

// 半角カタカナを全角カタカナに変換する関数
function convertToFullWidthKatakana(str) {
    return str.replace(/[\uFF61-\uFF9F]/g, function (match) {
        return String.fromCharCode(match.charCodeAt(0) - 0xFEC0);
    });
}

// 全角カタカナをひらがなに変換する関数
function katakanaToHiragana(str) {
    return str.replace(/[\u30a1-\u30f6]/g, function (match) {
        return String.fromCharCode(match.charCodeAt(0) - 0x60);
    });
}

// 名前の標準化関数
function standardizeName(name) {
    // Unicode正規化
    let normalized = name.normalize("NFKC");
    // 全角カタカナをひらがなに変換
    normalized = katakanaToHiragana(convertToFullWidthKatakana(normalized));
    return normalized.toLowerCase(); // 小文字に変換
}

// 変数27から名前を取得
let newName = $gameVariables.value(27);

// 入力された名前を標準化
newName = standardizeName(newName);

// NG氏名リストにnewNameが含まれているかどうかをチェック
const isNgName = ngNames.some(ngName => {
    return standardizeName(ngName) === newName;
});

// NG氏名が含まれている場合、スイッチ16をON
if (isNgName) {
    $gameSwitches.setValue(16, true);
} else {
    $gameSwitches.setValue(16, false); // NG氏名でない場合はスイッチ16をOFF
}


処理3.NGワードチェック(部分一致)

処理3では部分一致でNGワードを指定します(放送禁止用語的なやつ)

//処理その3 NGワードチェック(部分一致)
// NG氏名のリストを定義
const ngWords = [
 "○○", "□□", "△△"
];

// 半角カタカナを全角カタカナに変換する関数
function convertToFullWidthKatakana(str) {
    return str.replace(/[\uFF61-\uFF9F]/g, function (match) {
        return String.fromCharCode(match.charCodeAt(0) - 0xFEC0);
    });
}

// 全角カタカナをひらがなに変換する関数
function katakanaToHiragana(str) {
    return str.replace(/[\u30a1-\u30f6]/g, function (match) {
        return String.fromCharCode(match.charCodeAt(0) - 0x60);
    });
}

// 名前の標準化関数
function standardizeName(name) {
    // Unicode正規化
    let normalized = name.normalize("NFKC");
    // 全角カタカナをひらがなに変換
    normalized = katakanaToHiragana(convertToFullWidthKatakana(normalized));
    return normalized.toLowerCase(); // 小文字に変換
}

// 変数27から名前を取得
let newName = $gameVariables.value(27);

// 入力された名前を標準化
newName = standardizeName(newName);

// NGワードリストに部分一致するかどうかをチェック
const containsNgWord = ngWords.some(ngWord => 
    standardizeName(newName).includes(standardizeName(ngWord))
);

// NGワードが含まれている場合、スイッチ16をONにします
if (containsNgWord) {
    $gameSwitches.setValue(16, true);
} else {
    $gameSwitches.setValue(16, false); // NGワードでない場合はスイッチ16をOFFにする(任意)
}

処理4.名前の確定

処理4では、名前を確定します。
具体的には変数27の値を対象アクターの名前として入力しています。

id=$gameVariables.value(24)

$gameActors.actor(id).setName($gameVariables.value(27));

その他、使用している変数とかスイッチについて

・変数24:名前を調べたい対象アクターのアクターID
 ※事前に指定しておいてください。

・変数27:上記対象となるアクターの名前(文字列)

・スイッチ16:調査結果NGならONになります。
 ※OKの場合OFFになるわけではないので、事前にOFFにしておいてください。


PhantomZone-MZ-について

現代と異世界の狭間で戦うRPG。
奇妙な事件を引き金に、常人には見えない霊的存在との戦いに巻き込まれてゆく…
次々と現れる謎の霊体「ファントム」。主人公は、彼らの存在に気づいてしまったがゆえに、逃れられない運命に向き合うことになる。
現実の世界と、異世界との狭間「Phantom Zone」で人知れず戦いが始まる——。

「Phantom Zone -MZ-」をApp Storeで
Phantom Zone -MZ- - Google Play のアプリ
Phantom Zone -MZ-を遊ぶ! フリーゲームのPLiCy [プリシー]

<注>
・製作途中かつ、テストプレイの段階です。
・バグ報告や感想をTwitter等にいただけると幸いです。

作者Twitterはこちら→ evitemplezz (@evitemplezz) / X

いいなと思ったら応援しよう!