ChatGPTでRPGツクールMZの味方キャラ基本データを作成する方法を解説します。基本データとは、名前、職業、ステータス値、フィールドスキル(ダンジョンRPG独自のスキル)です。
現在、生成AIを使ってダンジョンRPGを作成するのにチャレンジ中です。ダンジョンRPGは以下のようなものを想定しています。
- マップは無しで、1階層・1イベント・1バトルで深い階層を目指していく
- 現代社会に突如ダンジョンが現れた設定で、メンバーの職業はプログラマーや医師など現代風にする(併せてアイテムやスキルも現代風)
- ダンジョンの途中で多彩な冒険者に出会い、メンバーを入れ替え、うまくスキルを駆使しながらより深い層を目指す
- 冒険者は総勢100人出てくる
ランダムにパーティーを組みながらより深く潜っていくタイプのダンジョンRPGです。
パーティの組み合わせにより思わぬ相乗効果などを出せるようにしたいので、より多くのメンバー候補が必要になります。1人で作っていくには大変ですが、ここをChatGPTにアシストしてもらい100人を目標でメンバーの職業とステータスを作成してきます。
最終的に以下のようなデータが100人分作成されます。
[
{
"name": "ユウスケ",
"class": "警察官",
"hp": 123,
"atk": 92,
"def": 101,
"mat": 68,
"mdf": 56,
"agi": 77,
"luk": 63,
"field_skill": "周囲警戒"
},
{
"name": "リョウタ",
"class": "消防士",
"hp": 137,
"atk": 86,
"def": 103,
"mat": 57,
"mdf": 89,
"agi": 74,
"luk": 62,
"field_skill": "応急処置"
},
{
"name": "ユキコ",
"class": "医者",
"hp": 105,
"atk": 68,
"def": 73,
"mat": 92,
"mdf": 87,
"agi": 76,
"luk": 82,
"field_skill": "応急処置"
}, ...
]
このJSONをもとにRPGツクールMZに取り込むことで、最終的に以下のようなアクター・職業データとして使うことができます。
ダウンロードしたJSONファイル
[
{
"名前": "メンバー1",
"職業": "Journalist",
"スキル": [
"スキル1",
"スキル2",
"スキル3"
]
},
{
"名前": "メンバー2",
"職業": "Police Officer",
"スキル": [
"調査",
"逮捕",
"防御"
]
},
{
"名前": "メンバー3",
"職業": "Pilot",
"スキル": [
"スキル1",
"スキル2",
"スキル3"
]
},...
]
何度かいろいろなパターンでやってみましたが、100人同時に出力するのはさすがに無理でした。
途中からデータ出力を省略されたり、名前を「キャラクター1」「スキル1」のような適当なものに置き換えられたりするため、100人同時出力というのは無理そうです。
1回あたり5人のメンバーを作成し、それを20回繰り返して100人分のデータを作る方法に切り替えます。ChatGPTのブラウザに手動でひたすら20回繰り返す方法とWebAPIで機械的に自動で繰り返す方法を試してみます。
方針A. ChatGPTで5人作成×手動で20回繰り返し
方針B. WebAPIで5人作成×自動で20回繰り返し
方針A. ChatGPTで5人作成×手動で20回繰り返し
一度に100人は作れないので、5人ずつメンバーを作成し、これを20回繰り返します。
さらに、RPGツクールMZにインポートすることを意識して、以下のように具体的な項目を設定します。
現代社会に突如ダンジョンが現れた設定でダンジョンRPGを作りたいです。
ダンジョンの中ではランダムに仲間が加わったり、減ったりしながら進んでいきます。
このRPGの開発者に対して、ランダムメンバーを100人定義したいので先頭の5人を以下のJSONスキーマで作成してください。
必ず省略せずにすべて出力してください。
・name:名前(日本人のファーストネームで全員別、カタカナ表記)
・class:職業(現代社会の職業で全員別)
・hp:体力(レベルと職業に即した値)
・mp:魔法力(レベルと職業に即した値)
・atk:攻撃力(レベルと職業に即した値)
・def:防御力(レベルと職業に即した値)
・mat:魔法攻撃力(レベルと職業に即した値)
・mdf:魔法防御力(レベルと職業に即した値)
・agi:素早さ(レベルと職業に即した値)
・luk:運(レベルと職業に即した値)
・field_skills:ダンジョン内で使える戦闘以外のスキル名1つの文字列(職業に即したひらがな・カタカナ・漢字のみの名前)
現代社会の職業を持つランダムメンバーの詳細な属性を含むJSONファイルを作成しました。このファイルには、先頭の5人のメンバーの情報が含まれています。
ファイルは以下のリンクからダウンロードできます: ダンジョンRPG詳細メンバーリスト(バージョン2)JSONをダウンロード。
出力されたJSONファイル
[
{
"name": "ユウト",
"class": "Doctor",
"hp": 80,
"atk": 30,
"def": 50,
"mat": 40,
"mdf": 70,
"agi": 50,
"luk": 60,
"field_skill": "治療"
},
{
"name": "ソウタ",
"class": "Nurse",
"hp": 70,
"atk": 25,
"def": 45,
"mat": 35,
"mdf": 65,
"agi": 55,
"luk": 65,
"field_skill": "看護"
},
{
"name": "ハルト",
"class": "Firefighter",
"hp": 100,
"atk": 70,
"def": 90,
"mat": 30,
"mdf": 40,
"agi": 60,
"luk": 50,
"field_skill": "消火"
}, ...
]
一部職業名が英語だったりしますが、5人分のデータが正しく出力されました。これを続けます。
いいですね。次の5人を出力してください。
次の5人のメンバーの情報を含むJSONファイルを作成しました。
ファイルは以下のリンクからダウンロードできます: ダンジョンRPG詳細メンバーリスト(次の5人)JSONをダウンロード。
出力されたJSONファイル(members.jsonとして保存)
[
{
"name": "ショウタ",
"class": "Engineer",
"hp": 75,
"atk": 55,
"def": 60,
"mat": 70,
"mdf": 55,
"agi": 65,
"luk": 60,
"field_skill": "開発"
},
{
"name": "コウキ",
"class": "Chef",
"hp": 65,
"atk": 50,
"def": 45,
"mat": 60,
"mdf": 50,
"agi": 55,
"luk": 75,
"field_skill": "料理"
},
{
"name": "リク",
"class": "Journalist",
"hp": 60,
"atk": 45,
"def": 50,
"mat": 40,
"mdf": 65,
"agi": 70,
"luk": 65,
"field_skill": "取材"
}, ...
]
いい感じです。これを手動で20回繰り返し、100人分のデータが出力できました。が、時間と手間がかかります…。
これを次のステップでも使うので「members.json」として保存しておきます。
方針B. WebAPIで5人作成×自動で20回繰り返し
1回で出力できる人数は5人として、やはりこれを手動で20回繰り返すのはめんどくさいです。
なので、OpenAIのWebAPIを利用して機械的に作成することを試してみます。こちらは手作業は不要ですが、WebAPIの使用量に応じてお金がかかることに注意してください。
まずはPythonでAPIを実行するコードを書きます。(環境変数など必要な設定は事前に行ってください)
import os
from openai import OpenAI
temperature = 1
client = OpenAI()
def main():
content = """
現代社会に突如ダンジョンが現れた設定でダンジョンRPGを作りたいです。
ダンジョンの中ではランダムに仲間が加わったり、減ったりしながら進んでいきます。
このRPGの開発者に対して、ランダムメンバーを100人定義したいので先頭の5人を以下のJSONスキーマで作成してください。
良い回答には報酬があり、悪い回答にはペナルティがあります。
プレースホルダや同上は出力せずに、具体的かつ省略せずにすべて出力してください。
・name:名前(日本人のファーストネームで全員別、カタカナ表記)
・class:職業(現代社会の職業で全員別)
・hp:体力(レベルと職業に即した値)
・atk:攻撃力(レベルと職業に即した値)
・def:防御力(レベルと職業に即した値)
・mat:魔法攻撃力(レベルと職業に即した値)
・mdf:魔法防御力(レベルと職業に即した値)
・agi:素早さ(レベルと職業に即した値)
・luk:運(レベルと職業に即した値)
・field_skills:ダンジョン内で使える戦闘以外のスキル名1つの文字列(職業に即したひらがな・カタカナ・漢字のみの名前)
"""
messages = [{"role": "system", "content": "You are an excellent RPG project manager."}]
messages.append({"role": "user", "content": content})
completion = client.chat.completions.create(
model="gpt-4-1106-preview",
messages=messages,
temperature=temperature,
response_format={"type": "json_object"},
)
response = completion.choices[0].message.content
prompt_tokens = completion.usage.prompt_tokens
completion_tokens = completion.usage.completion_tokens
print(response, prompt_tokens, completion_tokens)
if __name__ == "__main__":
main()
ここではresponse_format={"type": "json_object"}
により、出力を自然言語ではなくJSONに限定しています。また、入力と出力に消費されたトークンがAPI数の課金になるので、prompt_tokens(入力トークン数)とcompletion_tokens(出力トークン)もprintしています。
まず、出力されたJSONが以下になります。
{
"members": [
{
"name": "ユウト",
"class": "救急救命士",
"hp": 180,
"atk": 60,
"def": 80,
"mat": 40,
"mdf": 70,
"agi": 60,
"luk": 50,
"field_skills": "救命の知識"
},
{
"name": "ミホ",
"class": "消防士",
"hp": 220,
"atk": 90,
"def": 100,
"mat": 30,
"mdf": 60,
"agi": 70,
"luk": 45,
"field_skills": "火災防御"
},
{
"name": "タカシ",
"class": "警察官",
"hp": 250,
"atk": 110,
"def": 120,
"mat": 50,
"mdf": 90,
"agi": 80,
"luk": 55,
"field_skills": "犯罪抑止"
},
{
"name": "サヤカ",
"class": "医者",
"hp": 200,
"atk": 70,
"def": 80,
"mat": 95,
"mdf": 100,
"agi": 60,
"luk": 65,
"field_skills": "診断"
},
{
"name": "ケンタ",
"class": "自衛官",
"hp": 300,
"atk": 150,
"def": 150,
"mat": 60,
"mdf": 110,
"agi": 90,
"luk": 75,
"field_skills": "生存訓練"
}
]
}
いい感じです。肝心のトークンは、
入力:702、出力:849
でした。
2024年1月現在gpt-4-1106-previewの使用量は、
入力:$0.01/1K tokens
出力:$0.03 /1K tokens
なので、多めに見積もって、1回のやり取りで入出力ともに1000トークン(=1K tokens)使うと仮定します。
そうすると1回あたり$0.04です。20回繰り返せば100人分のデータが作成できるので、100人作るのにかかるお金は約$0.8=約110円です。
上記料金はあくまでも1往復のやり取りで出力できた場合で、実際は何度か試行錯誤します。本サイトでは資金に余裕がないので、頑張ってブラウザ版のChatGPTで時間をかけて作成します…💰
ChatGPT方式とWebAPI方式の比較
2つの方式のメリット・デメリットをまとめると以下のようになります。
方式 | メリット | デメリット |
---|---|---|
方式A. ChatGPT | ・GPT-3.5の場合、無料 ・GPT-4の場合、月額$20以上かからない | ・手作業で何度も入力・出力確認を行わないといけない ・GPT-4の場合、回数が多くなると上限解除を待つ必要がある |
方式B. WebAPI | ・時間と手間がかからない | ・使った分だけお金がかかる |
まとめ
2つの方式で、ダンジョンRPGで使うパーティーメンバーの情報を作成してきました。
時間をかけてでもお金をかけたくない場合はブラウザ版のChatGPTを、逆にお金をかけてでも時間をかけたくない場合はOpenAIのWebAPIを使うのがベターという結論になりました。
RPGツクールMZでは今回作成したステータスやこの後作成するスキルは「クラス(職業)」に紐づいてデータ管理されます。したがって、RPGツクールMZで今回作成したアクターを使うためには、「①アクター作成⇒②スキル作成⇒③RPGツクールMZで使えるファイルに変換」という3つのプロセスを踏む必要があります。
今回はこの3つのプロセスの1つ目ということになります。次回はChatGPTを使ったスキルの作成方法について詳しく解説していきます。