初のAI生成RPG「エターナルクエスト」ができるまで

解説

こちらは本サイトで初めてAIのみで生成したRPG「エターナルクエスト」ができるまでを解説します。まだ遊んだことがない方はぜひプレイしてみてから、このページを読んでいただけるとより理解が深まると思います。

生成AIで作ったもの

前の投稿のおさらいになりますが、「エターナルクエスト」を作成するにあたり生成AIに制作を任せたものは以下になります。それぞれどうやって作成したかを説明していきます。

  • タイトル・ストーリー
    • タイトル(タイトル画像も)
    • ストーリー(背景画像も)
  • 登場人物
    • 味方キャラクターのステータス・スキル・見た目
    • 敵キャラクターのステータス・スキル・見た目
  • アイテム
    • 装備アイテム
    • 消費アイテム

タイトル・ストーリー

タイトル

1作品目ということで王道RPGをテーマにタイトル候補をChatGPTに挙げてもらいました。何も考えずに1番目の「エターナルクエスト:伝説の起源」を選択します(かっこいい…!✨)。

王道RPGをテーマにしたタイトルは、古典的な冒険、壮大な物語、伝説的な英雄たちを想起させるものが望ましいです。以下にいくつかのタイトル候補を挙げます:

  1. 「エターナルクエスト: 伝説の起源」
    • 永遠(エターナル)という言葉は、王道RPGの時代を超えた冒険を暗示しています。
  2. 「クリスタルの守護者」
    • クリスタルは、多くのファンタジーRPGで重要な役割を果たすアイテムです。
  3. 「フォーガットンキングダムズ: 運命の剣」
    • 忘れ去られた王国と運命の剣は、王道RPGの要素を強調しています。
  4. 「ドラゴンズヘリテージ」
    • ドラゴンは、ファンタジーRPGの中心的な存在です。
  5. 「シャドウズオブデスティニー」
    • 運命の影というテーマは、王道RPGにおいて不可欠な要素です。
  6. 「レジェンドオブアストラル」
    • 星々(アストラル)に関連した伝説は、幻想的な冒険を予感させます。
  7. 「ガイアの選ばれし者たち」
    • 大地(ガイア)と選ばれし者の概念は、英雄的な旅を暗示しています。
  8. 「フォーリン・エンパイアズ: 砕かれた玉座」
    • 落ちた帝国と砕かれた玉座は、壮大なストーリーを期待させます。

これらのタイトルは、古典的なファンタジー要素と、壮大な冒険のイメージを組み合わせたものです。王道RPGの魅力を表現するのに適しています。

合わせてタイトル画像も一発で作成してもらったものを使っています(こちらもかっこいい…!✨)

ストーリー

エターナルクエストのプロローグや中間シーンの作成をChatGPTにお願いしました。今後はイベント作成も自動でやりたいのでJSONで作成してもらいましたが、実際はRPGツクールMZのエディタを使って手作業で文章入力を行いました。文章自体はそのまま使っています。

了解しました。以下に「エターナルクエスト: 伝説の起源」のプロローグをJSON形式で、キーを “prologue” として表現します。

{
    "prologue": [
        "レオンハルトは古代遺跡で謎のアーティファクトを発見し、未知の力に目覚める。",
        "村を襲った闇の勢力に立ち向かい、村人たちを救い出す。",
        "旅の途中で、魔法使いサラと獣人ガルに出会い、共に旅をすることになる。",
        "彼らは古代の文明と失われた力に関する手がかりを求め、様々な地を巡る。",
        "途中、敵対する勢力や謎の人物たちとの戦いが繰り広げられる。",
        "レオンハルトたちは、伝説の力が封じられた最終ダンジョンの存在を知り、その場所を目指す。",
        "ついに、最終ダンジョンの入り口に到着し、究極の戦いに備える。"
    ]
}

このJSON形式は、ゲームのプロローグのテキストを構造化し、プログラミングやデータ管理のために利用する際に適しています。各文は、物語の背景と主人公の冒険の始まりを説明しています。

上記ストーリーラインを作ってもらったうえで、その場面にふさわしい背景画像をChatGPTの中で作成してもらいました(ChatGPTとDALL-E3の連携素晴らしい…!)。

登場人物

味方

ステータス

ラスボスと戦う直前という前提でステータス値やスキルを決めてもらいました。

ChatGPTへの入力

ラスボスと戦う直前の主人公パーティーメンバー全員の能力を1人1人の決めます。
以下のJSONスキーマで作成してください。
・level:レベル(50前後)
・class:職業(ひらがな・カタカナ・漢字のみ)
・hp:体力
・mp:魔法力
・atk:攻撃力
・def:防御力
・mat:魔法攻撃力
・mdf:の魔法防御力
・agi:素早さ
・luk:運
・element:属性(なし、炎、氷、雷、水、土、風、闇、光のどれか)
・skills:持っているスキル名の配列(5つ程度で、RPGのテーマに即したひらがな・カタカナ・漢字のみの名前)
・weapon:装備可能武器の種類配列(配列の要素は必ず、剣、槍、杖、弓、ナイフ)
・armor:装備可能防具の種類配列(配列の要素は必ず、軽量防具、重量防具)

ChatGPTからの出力

{
    "レオンハルト": {
        "level": 50,
        "class": "剣士",
        "hp": 4500,
        "mp": 200,
        "atk": 700,
        "def": 600,
        "mat": 300,
        "mdf": 500,
        "agi": 550,
        "luk": 400,
        "element": "光",
        "skills": ["光の剣", "疾風突き", "鋼の意志", "獅子奮迅", "万全の防御"],
        "weapon": ["剣", "槍"],
        "armor": ["軽量防具", "重量防具"]
    },...

}

できたJSONをスクリプトを使ってRPGツクールMZのActors.jsonやClasses.jsonに落とし込みます。ここまで開設すると膨大な量になってしまうので、これは後日別記事にまとめます。

スキル

さらに、上では「光の剣」や「疾風突き」などスキル名しか定義していないので、さらにこれらのスキルの効果量や対象・追加効果などを定義していきます。

ChatGPTへの入力

主人公パーティーメンバーが持っているすべてのスキルの詳細を決めます。
以下のスキーマでJSONを作成してください。
・name:スキル名(ひらがな・カタカナ・漢字のみ)
・description:説明文(日本語)
・mp:消費MP
・type:物理、魔法のどれか
・scope:自分、敵単体、敵全体、味方単体、味方全体のどれか
・effect_type:なし、HPダメージ、HP回復のどれか
・effect_size:ダメージ量または回復量の数字
・repeats:効果を発動する回数
・element:物理、炎、氷、雷、水、土、風、闇、光のどれか
・add_bad_state:付与する状態異常名の配列(配列の要素は、毒、暗闇、混乱、炎上、凍結、睡眠、麻痺、スタン)
・add_good_state:付与する良い状態の配列(配列の要素は、物理バリア、魔法バリア、状態異常回復)
・up:5ターンの間、アップする能力名の配列(配列の要素は、攻撃力、防御力、魔法攻撃力、魔法防御力、素早さ、運)
・down:5ターンの間、ダウンする能力名の配列(配列の要素は、攻撃力、防御力、魔法攻撃力、魔法防御力、素早さ、運)
・animation:スキルのアニメーション(Absorb、ArrowSpecial、以降RPGツクールMZのデフォルトアニメーション名が並ぶ...)

ChatGPTからの出力

{
    "skills": [
        {
            "name": "光の剣",
            "description": "光の力を剣に宿し、敵単体に大ダメージを与える。",
            "mp": 30,
            "type": "魔法",
            "scope": "敵単体",
            "effect_type": "HPダメージ",
            "effect_size": 600,
            "repeats": 1,
            "element": "光",
            "add_bad_state": [],
            "add_good_state": [],
            "up": [],
            "down": [],
            "animation": "SlashSpecial1"
        },
        {
            "name": "疾風突き",
            "description": "敵単体に素早い突きで複数回攻撃を行う。",
            "mp": 20,
            "type": "物理",
            "scope": "敵単体",
            "effect_type": "HPダメージ",
            "effect_size": 150,
            "repeats": 3,
            "element": "物理",
            "add_bad_state": [],
            "add_good_state": [],
            "up": [],
            "down": [],
            "animation": "PiercePhysical"
        },
        {
            "name": "鋼の意志",
            "description": "一定期間、自身の物理攻撃力と物理防御力を高める。",
            "mp": 25,
            "type": "なし",
            "scope": "自分",
            "effect_type": "なし",
            "effect_size": 0,
            "repeats": 1,
            "element": "物理",
            "add_bad_state": [],
            "add_good_state": ["物理バリア"],
            "up": ["攻撃力", "防御力"],
            "down": [],
            "animation": "Powerup1"
        },// 他2つのスキルも同様に記述

    ]
}

上記のように気を抜くとChatGPTがさぼって省略してくるので、1人1人出力するなど工夫しながらすべてのスキルの詳細を決めていきます。これらのJSONもRPGツクールMZのSKills.jsonに落とし込むスクリプトを作成して、自動でスキルを定義していますが、これらの詳細はまた後日で…。

見た目

最後にそれぞれのキャラクターの見た目(正方形の顔画像)を出力してもらいます。ステータスやスキルの値が見た目に影響する可能性もあるので、一番最後の工程で画像出力を行っています。

ChatGPTへの入力

レオンハルトの顔画像を作成してください。

ChatGPTからの出力(なぜか英語)


Here is the square portrait of Leonhardt, designed to match the aesthetic of a young, courageous RPG character. This image showcases his determined expression and classic fantasy hero attire.

敵キャラのステータスやスキルも味方キャラのステータスやスキルとほぼ同様です。差分はレベル(level)、職業(class)、装備可能武器防具(weapon, armor)がないことくらいです。

ChatGPTへの入力

同様に、ラスボス軍団全員の能力を1人1人の決めます。
以下のJSONスキーマで作成してください。
・hp:体力
・mp:魔法力
・atk:攻撃力
・def:防御力
・mat:魔法攻撃力
・mdf:魔法防御力
・agi:素早さ
・luk:運
・element:属性(なし、炎、氷、雷、水、土、風、闇、光のどれか)
・skills:持っているスキル名の配列(5つ程度で、RPGのテーマに即したひらがな・カタカナ・漢字のみの名前)

ChatGPTからの出力

{
    "ザルドラク": {
        "hp": 10000,
        "mp": 1200,
        "atk": 900,
        "def": 800,
        "mat": 1000,
        "mdf": 950,
        "agi": 700,
        "luk": 600,
        "element": "闇",
        "skills": ["終焉の光", "闇の渦", "魂の吸収", "禁断の呪文", "暗黒爆発"]
    },...

}

ステータスができたらスキルや顔画像を作っていくこともほぼ同じなのでここでは割愛します。ただし、敵キャラクターなので全身画像と顔画像の両方を作るのがポイントです。

これまでと同じように、ここで作ったJSONはRPGツクールMZのEnemies.jsonに変換します。

アイテム

装備アイテム

装備アイテムはスキルを作る時と似ています。攻撃前提なので、上昇する能力から防御系のものを除いているのと良い状態異常(バリア系)などは除いて作成してもらっています。防具も基本的にはこの構造は同じなので割愛します。

ChatGPTへの入力

ラスボスと戦う直前に主人公パーティが装備している武器を10種類程度作成します。必ず以下のスキーマでJSONを作成してください。
・name:装備アイテム名(ひらがな・カタカナ・漢字のみ)
・num:装備アイテムの所持数(平均2個程度)
・description:装備アイテムの説明文(ひらがな・カタカナ・漢字のみ)
・type:剣、槍、杖、弓、ナイフのどれか
・atk:攻撃力上昇量
・mat:魔法攻撃力上昇量
・agi:素早さ上昇量
・luk:運上昇量
・hp:最大HP上昇量
・mp:最大MP上昇量
・add_bad_state:付与する状態異常名の配列(配列の要素は、毒、暗闇、混乱、炎上、凍結、睡眠、麻痺、スタン)
・animation:アイテムのアニメーション(Absorb、ArrowSpecial、以降RPGツクールMZのデフォルトアニメーション名が続く...)

ChatGPTからの出力

{
    "equipment": [
        {
            "name": "雷光剣",
            "num": 2,
            "description": "雷の力を宿した神秘の剣。",
            "type": "剣",
            "atk": 150,
            "mat": 50,
            "agi": 20,
            "luk": 15,
            "hp": 0,
            "mp": 0,
            "add_bad_state": ["麻痺"]
        },
        {
            "name": "炎の槍",
            "num": 2,
            "description": "炎を纏う猛々しい槍。",
            "type": "槍",
            "atk": 140,
            "mat": 0,
            "agi": 10,
            "luk": 10,
            "hp": 0,
            "mp": 0,
            "add_bad_state": ["炎上"]
        },...
    ]
}

消費アイテム

消費アイテムは基本的にはスキルと同じ作り方です。消費MPがない代わりに個数のキーを用意するのがポイントです。

ChatGPTへの入力


ラスボスと戦う直前に主人公パーティが持っているアイテムを10種類程度作成します。以下のJSONスキーマでランダムに10種類程度の配列で作成して下さい。
・name:アイテム名(ひらがな・カタカナ・漢字のみ)
・description:説明文(日本語)
・num:アイテムの所持数(平均8個程度)
・scope:敵単体、敵全体、味方単体、味方全体のどれか
・effect_type:なし、HPダメージ、HP回復のどれか
・effect_size:ダメージ量または回復量の数字
・repeats:効果を発動する回数
・element:物理、炎、氷、雷、水、土、風、闇、光のどれか
・add_bad_state:付与する状態異常名の配列(配列の要素は、毒、暗闇、混乱、炎上、凍結、睡眠、麻痺、スタン)
・add_good_state:付与する良い状態の配列(配列の要素は、物理バリア、魔法バリア)
・up:アップする能力名の配列(配列の要素は、攻撃力、防御力、魔法攻撃力、魔法防御力、素早さ、運)
・down:ダウンする能力名の配列(配列の要素は、攻撃力、防御力、魔法攻撃力、魔法防御力、素早さ、運)
・animation:アイテムのアニメーション(Absorb、ArrowSpecial、以降RPGツクールMZのデフォルトアニメーション名が続く...)

ChatGPTからの出力

{
    "items": [
        {
            "name": "癒しの草",
            "description": "HPを少量回復する薬草。",
            "num": 10,
            "scope": "味方単体",
            "effect_type": "HP回復",
            "effect_size": 200,
            "repeats": 1,
            "element": "なし",
            "add_bad_state": [],
            "add_good_state": []
        },
        {
            "name": "蘇生の薬",
            "description": "倒れた仲間を復活させる。",
            "num": 5,
            "scope": "味方単体",
            "effect_type": "HP回復",
            "effect_size": 500,
            "repeats": 1,
            "element": "なし",
            "add_bad_state": [],
            "add_good_state": []
        },...
    ]
}

これまでと同じようにここで作ったJSONは、RPGツクールMZのItems.jsonに落とし込みます。

まとめ

本サイト初の生成AIで作ったRPG「エターナルクエスト」ができるまでを解説していきました。

主にChatGPTへの入出力について説明しましたが、これをどうRPGツクールMZのデータJSONに変換しているかはまた後日説明したいと思います。(基本Pythonスクリプトでのごり押しです…笑)

引き続きAI生成のRPGの研究を続けていきますのでよろしくお願いします!

タイトルとURLをコピーしました