名前入力システムのWWA Script

提供:Aokashi Home Docs
2025年3月24日 (月) 00:38時点におけるAokashi (トーク | 投稿記録)による版 (ページの作成:「名前入力システムで使用するWWA Scriptのファイルです。 === nameinput.js === <pre> →‎* * 名前入力システムを初期化します。 * 名前入力を開始する前に必ず実行してください。: function nameInputInit() { // 名前入力をする画面の一番左上の座標 v["nameinput_map_x"] = 60; v["nameinput_map_y"] = 0; // 入力できる文字数上限 v["nameinput_max"] = 5; // おすすめ…」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)

名前入力システムで使用するWWA Scriptのファイルです。

nameinput.js

/**
 * 名前入力システムを初期化します。
 * 名前入力を開始する前に必ず実行してください。
 */
function nameInputInit() {
    // 名前入力をする画面の一番左上の座標
    v["nameinput_map_x"] = 60;
    v["nameinput_map_y"] = 0;
    // 入力できる文字数上限
    v["nameinput_max"] = 5;
    // おすすめの名前を選出する二者択一パーツの番号
    v["nameinput_show_recommend_parts"] = 12;
    // 名前入力を完了するかたずねる二者択一パーツの番号
    v["nameinput_finish_parts"] = 17;
    // キャレットのイメージ座標
    v["nameinput_caret_img_x"] = 6;
    v["nameinput_caret_img_y"] = 25;
    // キャレットを前に戻るアイテムの番号
    ITEM[7] = 9;
    // キャレットを後に進むアイテムの番号
    ITEM[8] = 10;
    // 入力文字を変更するアイテムの番号
    ITEM[9] = 11;
    // 入力操作アイテムの番号
    ITEM[10] = 6;
    // 取消操作アイテムの番号
    ITEM[11] = 7;
    // 決定操作アイテムの番号
    ITEM[12] = 8;
    // 一時変数たち
    // 0: カタカナ, 1: ひらがな, 2: アルファベット
    v["nameinput_mode"] = 0;
    v["nameinput_inputs"] = ["", "", "", "", ""];
    v["nameinput_length"] = 0;
    v["nameinput_caret"] = 0;
    v["nameinput_recommend_count"] = 0;
    v["nameinput_back_x"] = PX;
    v["nameinput_back_y"] = PY;
    // オブジェクトや配列はセーブロード時に正しく復元されない不具合が発生しているため、名前入力中はセーブ禁止にする
    SAVE(1);
    JUMPGATE(v["nameinput_map_x"] + 19, v["nameinput_map_y"] + 4);
    nameInputDrawChars();
    nameInputDrawYourName();
}

function nameInputGetCharMap() {
    if (v["nameinput_mode"] == 0) {
        return [
            ["ア", "イ", "ウ", "エ", "オ"],
            ["カ", "キ", "ク", "ケ", "コ"],
            ["サ", "シ", "ス", "セ", "ソ"],
            ["タ", "チ", "ツ", "テ", "ト"],
            ["ナ", "ニ", "ヌ", "ネ", "ノ"],
            ["ハ", "ヒ", "フ", "ヘ", "ホ"],
            ["マ", "ミ", "ム", "メ", "モ"],
            ["ヤ", "", "ユ", "", "ヨ"],
            ["ラ", "リ", "ル", "レ", "ロ"],
            ["", "", "", "", ""],
            ["ワ", "", "ヲ", "", "ン"],
            ["ガ", "ギ", "グ", "ゲ", "ゴ"],
            ["ザ", "ジ", "ズ", "ゼ", "ゾ"],
            ["ダ", "ヂ", "ヅ", "デ", "ド"],
            ["バ", "ビ", "ブ", "ベ", "ボ"],
            ["パ", "ピ", "プ", "ペ", "ポ"],
            ["ァ", "ィ", "ゥ", "ェ", "ォ"],
            ["ャ", "", "ュ", "", "ョ"],
            ["ッ", "", "ー", "", "?"],
        ];
    } else if (v["nameinput_mode"] == 1) {
        return [
            ["あ", "い", "う", "え", "お"],
            ["か", "き", "く", "け", "こ"],
            ["さ", "し", "す", "せ", "そ"],
            ["た", "ち", "つ", "て", "と"],
            ["な", "に", "ぬ", "ね", "の"],
            ["は", "ひ", "ふ", "へ", "ほ"],
            ["ま", "み", "む", "め", "も"],
            ["や", "", "ゆ", "", "よ"],
            ["ら", "り", "る", "れ", "ろ"],
            ["", "", "", "", ""],
            ["わ", "", "を", "", "ん"],
            ["が", "ぎ", "ぐ", "げ", "ご"],
            ["ざ", "じ", "ず", "ぜ", "ぞ"],
            ["だ", "ぢ", "づ", "で", "ど"],
            ["ば", "び", "ぶ", "べ", "ぼ"],
            ["ぱ", "ぴ", "ぷ", "ぺ", "ぽ"],
            ["ぁ", "ぃ", "ぅ", "ぇ", "ぉ"],
            ["ゃ", "", "ゅ", "", "ょ"],
            ["っ", "", "ー", "", "?"],
        ];
    } else {
        return [
            ["i", "r", "0", "9", ""],
            ["h", "q", "z", "8", ""],
            ["g", "p", "y", "7", ""],
            ["f", "o", "x", "6", ""],
            ["e", "n", "w", "5", ""],
            ["d", "m", "v", "4", ""],
            ["c", "l", "u", "3", ""],
            ["b", "k", "t", "2", ""],
            ["a", "j", "s", "1", ""],
            ["", "", "", "", ""],
            ["I", "R", "", "", ""],
            ["H", "Q", "Z", "", ""],
            ["G", "P", "Y", "", ""],
            ["F", "O", "X", "", ""],
            ["E", "N", "W", "", ""],
            ["D", "M", "V", "", ""],
            ["C", "L", "U", "", ""],
            ["B", "K", "T", "", ""],
            ["A", "J", "S", "", "?"],
        ];
    }
}

function nameInputDrawChars() {
    v["nameinput_charmap"] = nameInputGetCharMap();
    if (CX == v["nameinput_map_x"]) {
        // 左側
        v["nameinput_offset"] = 10;
    } else {
        v["nameinput_offset"] = 0;
    }
    for (i = 0; i < 9; i++) {
        PICTURE(100 + i, {
            pos: [(9 - i) * 40 + 10, 4 * 40 + 10],
            text:
                v["nameinput_charmap"][v["nameinput_offset"] + i][0] + "\n" +
                v["nameinput_charmap"][v["nameinput_offset"] + i][1] + "\n" +
                v["nameinput_charmap"][v["nameinput_offset"] + i][2] + "\n" +
                v["nameinput_charmap"][v["nameinput_offset"] + i][3] + "\n" +
                v["nameinput_charmap"][v["nameinput_offset"] + i][4] + "\n",
            color: [51, 51, 51],
            bold: 1,
            fontSize: 20,
            lineHeight: 40,
        });
    }
}

function nameInputDrawYourName() {
    for (i = 0; i < v["nameinput_max"]; i++) {
        PICTURE(111 + i, {
            pos: [160 + i * 40 + 10, 80 + 10],
            text: v["nameinput_inputs"][i],
            color: [51, 51, 51],
            bold: 1,
            fontSize: 20,
        });
    }
    PICTURE(110, {
        pos: [160 + (v["nameinput_caret"] * 40), 80],
        // キャレットのイメージはお好みで設定してください
        img: [v["nameinput_caret_img_x"], v["nameinput_caret_img_y"], 1, 0],
    });
}

function nameInputInsertChar() {
    if (v["nameinput_caret"] + 1 > v["nameinput_max"]) {
        MSG("これ以上入力できません!");
        EXIT(1);
    }
    v["nameinput_index_x"] = v["nameinput_map_x"] + 19 - PX;
    v["nameinput_index_y"] = PY - (v["nameinput_map_y"] + 4);
    if (v["nameinput_index_x"] < 0 || v["nameinput_index_y"] < 0) {
        MSG("入力範囲外です!");
        EXIT(1);
    }
    v["nameinput_charmap"] = nameInputGetCharMap();
    v["nameinput_char"] = v["nameinput_charmap"][v["nameinput_index_x"]][v["nameinput_index_y"]];
    if (v["nameinput_char"] == "") {
        MSG("その文字は入力できません!");
        EXIT(1);
    } else if (v["nameinput_char"] == "?") {
        o[PX][PY] = v["nameinput_show_recommend_parts"];
        EXIT(0);
    }
    v["nameinput_inputs"][v["nameinput_caret"]] = v["nameinput_char"];
    if (v["nameinput_caret"] == v["nameinput_length"]) {
        v["nameinput_length"] += 1;
    }
    if (v["nameinput_caret"] < v["nameinput_max"] - 1) {
        v["nameinput_caret"] += 1;
    }
    nameInputDrawYourName();
}

function nameInputDeleteChar() {
    if (v["nameinput_caret"] <= 0) {
        MSG("何も入力してないので消せません!");
        EXIT(1);
    }
    // 最後まで入力した状態で消去を行う場合は、一度右端を超えた状態で算出する
    if (v["nameinput_length"] == v["nameinput_max"] && v["nameinput_caret"] >= v["nameinput_max"] - 1) {
        v["nameinput_caret"] = v["nameinput_max"];
    }
    if (v["nameinput_caret"] != v["nameinput_length"]) {
        MSG("中間文字の消去はただいま実装中です。ご迷惑をおかけしますが一度消したい所まで文字を消していただくようにお願いします。");
        EXIT(1);
    }
    v["nameinput_length"] -= 1;
    v["nameinput_caret"] -= 1;
    v["nameinput_inputs"][v["nameinput_caret"]] = "";
    nameInputDrawYourName();
}

function nameInputMoveCaretBack() {
    if (v["nameinput_caret"] <= 0) {
        MSG("これ以上戻せません!");
        EXIT(1);
    }
    v["nameinput_caret"] -= 1;
    nameInputDrawYourName();
}

function nameInputMoveCaretForward() {
    if (v["nameinput_caret"] + 1 > v["nameinput_length"]) {
        MSG("何か入力してください!");
        EXIT(1);
    }
    if (v["nameinput_caret"] >= v["nameinput_max"] - 1) {
        MSG("これ以上進めません!");
        EXIT(1);
    }
    v["nameinput_caret"] += 1;
    nameInputDrawYourName();
}

function nameInputChangeMode() {
    // カタカナ → ひらがな → アルファベット
    v["nameinput_mode"] += 1;
    if (v["nameinput_mode"] > 2) {
        v["nameinput_mode"] = 0;
    }
    nameInputDrawChars();
}

function nameInputSetRecommend() {
    if (v["nameinput_recommend_count"] == 0) {
        v["nameinput_inputs"] = ["ナ", "オ", "ト", "", ""];
        v["nameinput_length"] = 3;
        v["nameinput_caret"] = 3;
    } else if (v["nameinput_recommend_count"] == 1) {
        v["nameinput_inputs"] = ["ジ", "ャ", "ッ", "ク", ""];
        v["nameinput_length"] = 4;
        v["nameinput_caret"] = 4;
    } else if (v["nameinput_recommend_count"] == 2) {
        v["nameinput_inputs"] = ["チ", "ェ", "ン", "", ""];
        v["nameinput_length"] = 3;
        v["nameinput_caret"] = 3;
    }
    v["nameinput_recommend_count"] += 1;
    if (v["nameinput_recommend_count"] >= 3) {
        v["nameinput_recommend_count"] = 0;
    }
    nameInputDrawYourName();
}

function nameInputApply() {
    if (v["nameinput_length"] <= 0) {
        MSG("あなたの名前を聞かせてって言ってるじゃないですか!");
        EXIT(0);
    }
    v["nameinput_result"] = "";
    for (i = 0; i < v["nameinput_length"]; i++) {
        v["nameinput_result"] += v["nameinput_inputs"][i];
    }
    MSG("あなたの名前は " + v["nameinput_result"] + " ですね!?");
    o[PX][PY] = v["nameinput_finish_parts"];
}

function nameInputFinish() {
    v["name"] = v["nameinput_result"];
    for (i = 0; i < 9; i++) {
        PICTURE(100 + i);
    }
    PICTURE(110);
    for (i = 0; i < v["nameinput_max"]; i++) {
        PICTURE(111 + i);
    }
    SAVE(0);
    JUMPGATE(v["nameinput_back_x"], v["nameinput_back_y"]);
}