オススメ機能
Twitter
お気に入り
記事履歴
ランキング
パッケージ
The Tower of AION公式サイトへ
読者の評価
69
投稿数:398
レビューを投稿する
海外での評価
81
Powered by metacritic
お気に入りタイトル/ワード

タイトル/ワード名(記事数)

最近記事を読んだタイトル/ワード

タイトル/ワード名(記事数)

LINEで4Gamerアカウントを登録
「The Tower of AION」今日から始めるハウススクリプト入門。公式サイト内“知識エンチャント”にスクリプトを投稿すればプレゼントのチャンスも!
特集記事一覧
注目のレビュー
注目のムービー

メディアパートナー

印刷2012/05/02 11:21

プレイレポート

「The Tower of AION」今日から始めるハウススクリプト入門。公式サイト内“知識エンチャント”にスクリプトを投稿すればプレゼントのチャンスも!

「この画面を見てもいまいちピンとこない」というAIONプレイヤーでも,本稿を参考にすればハウジング用スクリプトが組めるようになる……かも
画像集#001のサムネイル/「The Tower of AION」今日から始めるハウススクリプト入門。公式サイト内“知識エンチャント”にスクリプトを投稿すればプレゼントのチャンスも!
 エヌ・シー・ジャパンのMMORPG「The Tower of AION」で4月10日に実施された大型アップデート「Episode3.0 キミのドラマ」で,多くのプレイヤーが待ち望んでいた「ハウジング」が実装された(関連記事)。もうキミはマイホームを手に入れただろうか。
 AIONのハウジングでは,室内に自由に家具を配置したり,アイテムが収穫できる植物を育てたりと,さまざまな楽しみ方ができるのだが,その中でも興味深いのが,簡単なプログラム言語のようなものを組み,NPCやオブジェクトをコントロールできる「スクリプト機能」だ。
 しかしこのスクリプト機能,ゲーム内にはマニュアルのようなものが用意されておらず,簡単なサンプルが用意されているのみ。そういったことから,スクリプト機能のポテンシャルについては,エヌ・シー・ジャパン社内でも把握しきれていない状況だそうで,公式サイト内知識エンチャントでは,FSドガノフによってこのようなスレッドも立てられている。
 本稿では,そんなスクリプト機能とはどんなものなのかを,サンプルスクリプトと合わせて解説していこう。

画像集#007のサムネイル/「The Tower of AION」今日から始めるハウススクリプト入門。公式サイト内“知識エンチャント”にスクリプトを投稿すればプレゼントのチャンスも!
画像集#008のサムネイル/「The Tower of AION」今日から始めるハウススクリプト入門。公式サイト内“知識エンチャント”にスクリプトを投稿すればプレゼントのチャンスも! 画像集#009のサムネイル/「The Tower of AION」今日から始めるハウススクリプト入門。公式サイト内“知識エンチャント”にスクリプトを投稿すればプレゼントのチャンスも!

「The Tower of AION」公式サイト

「知識エンチャント」内FSドガノフからの依頼



まずは執事との挨拶を自分流にカスタマイズしてみよう


まずはサンプルをいじりつつ,スクリプトの意味を覚えていくのがいいだろう
画像集#002のサムネイル/「The Tower of AION」今日から始めるハウススクリプト入門。公式サイト内“知識エンチャント”にスクリプトを投稿すればプレゼントのチャンスも!
 マイホームには一家に1人ずつ,住宅への入場設定などを管理する執事が用意されている。この執事,家に入ると挨拶をしてくれるなど,ぼっちなプレイヤーにはありがたい同居人なのだが,実はスクリプトを編集することで,その挙動を自由に設定することができるのだ。ほかにも,家の中にある家具を光らせたり動かしたり,音楽を演奏したり,ミニゲームで遊んだりと,スクリプトを駆使すればかなり自由度の高い遊び方ができる。

 スクリプトとはコンピュータ言語の一種で,「The Tower of AION」のハウジングスクリプトはLuaというスクリプト言語がベースになっている。ゲーム内にはいくつかのサンプルスクリプトが用意されているので,まずはそれをカスタマイズしながら,基本的な構造を紹介していこう。

効果音などは,こういったメニューから設定することもできる
画像集#003のサムネイル/「The Tower of AION」今日から始めるハウススクリプト入門。公式サイト内“知識エンチャント”にスクリプトを投稿すればプレゼントのチャンスも!
 スクリプトの編集は,執事をクリックして「スクリプトの編集」を選び,その後表示されるウィンドウ内から行える。ウィンドウ内には最初,スクリプトが表示されていないので,左側にある下向きの矢印をクリックして表示させよう。まずは「挨拶」という基本のスクリプトからいじってみるのがオススメだ。

 プリセットのスクリプトでは,青文字をクリックすると入力用のウインドウが出てくる。セリフや効果音の内容だけなら,ここをいじるだけでも変更できるのだが,今回はもう少し踏み込んでスクリプト自体をいじってみたい。

 まずは,セリフを変えてみる。「挨拶」のセリフに使われているスクリプトは以下のようなものだ。「function」「end」で囲まれた範囲内が1つの命令を表す。「desc」という文字は,ユーザー名を表す変数。こういった()の中で使われる文字を引数と呼ぶ。これは「GetHelloString」という関数を「desc」という引数を使って利用しろという命令文だ。

function GetHelloString(desc)

if (helloTable[desc] == nil) then
return desc.." さん,こんにちは。";
end
return helloTable[desc][1];
end

 このスクリプトは複数のキャラクターに対して返事を使い分けられるようになっているため,返事をする相手を判別するための「if〜then」式になっている。「nil」は「〜ではない」といった意味合い。つまりこのスクリプトは「もし関数に代入したキャラクター名(つまり部屋に入ってきたキャラクター名)が「helloTable」にあるキャラクター名と一致しない場合,「desc.." さん,こんにちは。"」という文字列を返せ,そうでない場合は「helloTable」の該当するキャラクター名のlabel[1]にある挨拶を返せ,という命令になっている。

 「GetHelloString」のように大文字と小文字を組み合わせているのは,そのほうが読みやすいので習慣上そうなっているらしい。ただし,スクリプトでは大文字と小文字は違う文字として判別されるので,その点はご注意を。文末の「;」は命令文の区切りに使う記号だが,このスクリプトではなくても動くようだ。

 ここでは文字列を「お帰りなさいませ。(ユーザー名)様。」に直してみよう。「return desc.." さん,こんにちは。";」の行を,「return "お帰りなさいませ。"..desc.." 様。"」に変えるだけだ。「..」は接続詞。「""」で囲まれた中はどんな文字でも使えるので,例えば「return "(・ω・)<"..desc.."か……"」のようにアスキーアートをしゃべらせることもできる。

 次の章では,一からスクリプトを組む方法を説明しよう。


近づくと執事が話しかけてくるスクリプトで寸劇を楽しもう


 新しいスクリプトを組むときには,アイコンの横にある「+」マークをクリックして,「新スクリプト」を設置する。最初の状態では,画面には以下の文字が表示されている。

function OnInit()
-- 初期化スクリプトを入力してください。
end

 「OnInit」はプログラムの作動条件を決める関数だ。例えばユーザーがチャットを打ち込んだとき,特定のモーションをしたときなど色々な条件が設定できる。今回はキャラクターが執事に近づいたらスタートという条件にする。スクリプトは以下のようになる。

function OnInit()
H.SetSensor(3, 10); -- 執事の認識範囲
end

 これで,キャラクターが執事から3m以内に入るとスクリプトが起動し,10m以上離れると認識しなくなる。「--」マークより後ろに書く文字はプログラムには反映されないので,スクリプトの説明を書いておく。こうすれば後々公開したプログラムを他人が使うときにも便利だ。

 スクリプトを書き込んだとき,「出力」という窓に何か表示が出る場合,その部分にミスがある。ライン番号でどこが悪いのかを探すことができるが,ウィンドウには番号がないので,テキストエディタのようなものを使ってコピー&ペーストするほうが作りやすいかもしれない。

 さて,次は5m以内に近づいたときに何をするかを書いていく。ユーザーが範囲内に入ったときの反応には「OnUserEntered」を使用する。

-- 執事がユーザーを認識した時の行動
function OnUserEntered(desc)

-- 行動順の指示
H.PlaySound(0, "r[1]r[2]");

-- エモーションの設定,lableは1
H.StartAnimation(0, 1, H.Emotion.blush);

-- セリフの設定,labelは2
H.Say(2, "あの……");
end

 「H.PlaySound」は,音楽を演奏するために使用する命令文だが,今回のようにセリフやエモーションを出す順番を指定するのにも利用できる。「r」は音符の休止符で,[1]と[2]というlabelはそれぞれエモーションとセリフのカッコ内にある数値に対応している。H.PlaySound(0, "r[1]r[2]")は0番の楽譜に休止符を2つ書いて,その休止符を演奏するタイミングで音楽の代わりに[1]と[2]の行動を起こすといった意味合いだ。

 何かの行動を起こすときには常に,「H.PlaySound」と行動を指示する命令文がセットになる。記述する順番はあまり関係がないようで,先に行動内容を書いてから最後に「H.PlaySound」を置いても同じように動作した。

 次は,ユーザーのチャットに反応して執事が返事をするというスクリプト。今度は「OnUserSay」という関数を使用する。()に入る引数はセリフを表す「str」と,ユーザー名を取得するための「desc」を使っている。

-- ユーザーのチャットで起動
function OnUserSay(str, username)

-- 「どうしたの?」と打つ
if (string.find(str, "どうしたの?")) then

-- 執事の反応1つめ[1]に入る内容
H.StartAnimation(0, 1, H.Emotion.blush);
H.Say(1, username.."様っていつも素敵で…");

-- 執事の反応2つめ[2]に入る内容
H.StartAnimation(0, 2, H.Emotion.thanks);
H.Say(2, "憧れるぎゃるん!");

-- 行動順の指示
H.PlaySound(0, "rr[1]rrrrrrrrr[2]");

end
end

 チャットに「どうしたの?」という文字列を見つけると,執事はその下の反応を返す。今回は執事の反応を2つのセリフに分けて,間に休符「r」をたくさん挟み,時間をおいてセリフが表示されるようにしている。

 さて,褒められたユーザーが喜んで笑ったとき,そのモーションに対して執事が返す反応を指示することもできる。そのための関数は「OnUserEmotion」だ。

-- ユーザーがモーションを入力
function OnUserEmotion(motion)

-- 「笑う」モーションを入力した場合下の反応を返す
if (motion == H.Emotion.laugh) then

-- 執事の反応
H.PlaySound(0, "rrrrrrrrr[3]");
H.Say(3, "おだてるとすぐ調子にのるぎゃるん");
H.StartAnimation(0, 3, H.Emotion.yes);

end
end

 というわけで,完成したものをムービーに撮影したので見てほしい。スクリプトが無事動いた後は,テストプレイをしながら微調整を繰り返すといいだろう。なお,スクリプトで使えるモーションと効果音は以下の通りだ。



■使えるモーション
point(指さし), sleep(睡眠), angry(怒り), blush(照れる)
dance(ダンス), clap(拍手), comfort(応援), drink(飲む), eat(食事)
laugh(笑い), kneel(ひざまずく), no(否定),otl(挫折), pat(励まし)
plead(お願い), ready(ウォーミングアップ), sad(悲しみ), slap(平手打ち)
surprise(驚く), taunt(挑発), thanks(感謝), thunder(雷に当たった際のモーション)
useup(アイテム使用時のモーション), victory(勝利), yes(同意)
wave(手を振る), boo(ヤジ), charge(突撃), dislike(拒絶)
panic(恐怖), salute(敬礼), smile(微笑み),sorry(ごめん)
think(考える), blueflag(青旗あげて), twoflag(両方あげて)
whiteflag(白旗あげて), sing(歌), jump(ジャンプ)

■使える効果音
fx1 ダメージ音1
fx2 クエスト音1
fx3 召喚解除音
fx4 モーション音
fx5 マップウインドウを開く音
fx6 アーティファクト音
fx7 アイテム使用音
fx8 ダメージ音2
fx9 ID入場お知らせ音
fx10 クエスト音2
fx11 モンスターアラート音
fx12 製作道具使用音
fx13 ダメージ音3
fx14 石(魔石,スティグマ)アイテム音
fx15 ギーナ移動音
fx16 紙(スクロール)アイテム音
fx17 モンスターアラート解除音
fx18 キューブを開く音
fx19 マップウインドウを閉じる音
fx20 モンスターの足音



これぞスクリプトの醍醐味! 友達によって反応を変えてみよう


 次は,執事の反応を友達によって変えるスクリプトを組んでみよう。今回は自分と友達2人分で組んでみた。ゲーム内のサンプルでは効果音を変更しているが,効果音よりも見栄えのいいエモーションとセリフをセットで切り替えることにした。

(セリフのパターン)
シェルファニール 「おかえりなさいぎゃるん!」と言いながら手を振る(wave)
Bさん 「よく来てくれたぎゃるん」と言いながらひざまずく(kneel)
Cさん 「入場料をよこすぎゃるん」と言いながら手を突き出す(charge)


 まずは,必要なセリフのパターンと,使うモーションをリストにまとめる。これをスクリプトに組むと以下のようになる。

-- キャラクターごとの反応をまとめたテーブル
helloTable = {
["シェルファニール"] = {"おかえりなさいぎゃるん!", H.Emotion.wave},
["Aさん"] = {"よく来てくれたぎゃるん", H.Emotion.kneel},
["Bさん"] = {"入場料をよこすぎゃるん", H.Emotion.charge},
};

-- 入ってきたキャラクターに合わせてセリフを選ぶ
function GetHelloString(desc)

return helloTable[desc][1];

end

-- 入ってきたキャラクターに合わせてモーションを選ぶ
function GetHelloEmotion(desc)

return helloTable[desc][2];

end

-- 執事の認識距離を決める
function OnInit()

H.SetSensor(3,15);

end

-- 範囲内に入ると執事が反応を返す
function OnUserEntered(desc)

-- 行動順の指示
H.PlaySound(0, "r[1]r[2]");

-- 上で選んだ要素を,セリフとモーションの命令文に入れる
H.StartAnimation(0,1,GetHelloEmotion(desc));
H.Say(2, GetHelloString(desc));
end

 「return」という命令文は,その関数が発動したときに出てくる結果で,今回は「helloTable[desc][1]」と「[2]」という変数を返してくる。この変数は「helloTable」の中にある,「キャラクター名」の[1]番目と[2]番目の記述という意味で,それぞれ「"おかえりなさいぎゃるん!"」と「wave」に相当する。

 それを,実際に行動を指示するための命令に代入することで,執事がキャラクターによって別の行動をするというわけだ。



「PlaySound」の本領発揮! スクリプトを使って曲を演奏しよう!


 ハウススクリプトには音楽を演奏できる機能が備わっている。サンプルスクリプトはかなり凝った音楽なので,今回はもう少し簡単な曲でスクリプトの構造を紹介したい。発動条件は執事を右クリックした時に出てくるメニューに曲名を組み込む形にした。

function OnInit()

-- 執事の右クリックメニューに「タタールの歌」を追加。
H.RegisterMenu("タタールの歌", 1);

end

 このスクリプトを書いた後,執事を右クリックすると,一番下に「タタールの歌」が表示される。しかしまだ内容がないので曲は鳴らない。曲を作るには「function OnMenu(menuNum)」という関数を使う。引数の「menuNum」には,「H.RegisterMenu」で設定した曲名「タタールの歌」が入る。

 曲を鳴らすための命令は,音符を使う主旋律と打楽器の2系統に分かれている。ピアノ,ギターなどが使える主旋律は「H.SetInstrument」,打楽器と効果音は「H.SetPercussion」で指定する。スクリプトは以下の通りだ。

-- 執事を右クリックしてメニューを選択して呼び出す
function OnMenu(menuNum)

-- 曲名が正しいかどうかを判定するコマンド
if(menuNum == 1)then

-- 楽器にピアノを設定
H.SetInstrument(0, H.Instrument.piano);
-- ピアノ用の曲を入力
H.PlaySound(0, "t130 cdefedcr efgagfer crcrcrcr c8c8d8d8e8e8f8f8edc");

-- 楽器にピアノを設定
H.SetInstrument(1, H.Instrument.piano);
-- 輪唱用に「o3」でオクターブを1つ低いピアノを設定
H.PlaySound(1, "t130 o3 rrrrrrrr cdefedcr efgagfer crcrcrcr c8c8d8d8e8e8f8f8edc");

-- 打楽器にはタンバリンを設定
H.SetPercussion(2, H.Percussion.tambourine);
H.PlaySound(2, "t130 rxxrx_rxxrx_ rxxrx_rxxrx_ rx_ rx_ rx_ rx_ r8xr8xr8xr8xrxxx_");

end
end

 音符はド(c), レ(d), ミ(e), ファ(f), ソ(g), ラ(a), シ(b),シャープは(#),フラットは(-)。音符の長さは,4分音符(4), 8分音符(8), 16分音符(16)。ほかにも休止符(r), オクターブ(o), ボリューム(v), テンポ(t)などがある。音符のない打楽器の打ち込みには「x」を使う。

 楽器は以下のようなものが使用可能だ。

■「SetInstrument()」で使える楽器
H.Instrument.piano (ピアノ)
H.Instrument.abass (アコースティック ベース)
H.Instrument.ebass (エレクトリック ベース)
H.Instrument.aguitar (アコースティック ギター)
H.Instrument.accordion (アコーディオン)

■「SetPercussion()」で使える楽器
H.Percussion.tambourine (タンバリン)
H.Percussion.triangle (トライアングル)
H.Percussion.cymbal (シンバル)
H.Percussion.hihatclose (ハイハット クローズ)
H.Percussion.hihatopen (ハイハット オープン)
H.Percussion.kick (キック)
H.Percussion.snare (スネア)
H.Percussion.tomtom1 (トムトム1)
H.Percussion.tomtom2 (トムトム2)
H.Percussion.tomtom3 (トムトム3)
H.Percussion.fx1(〜fx20) (効果音 1〜20)


 筆者には音楽の才能がないので,お恥ずかしい見本しか作れなくて恐縮だが,努力と根性さえあれば長い曲を丸ごと演奏することもできる。すでに個人blogなどで力作を発表している人もいるようで,才能あふれる職人芸を披露してくれる人に期待したい。



ジャンプさせたり,動かしたり,光らせたりと自由自在な家具で遊ぼう!


画像集#004のサムネイル/「The Tower of AION」今日から始めるハウススクリプト入門。公式サイト内“知識エンチャント”にスクリプトを投稿すればプレゼントのチャンスも!
 部屋の中に置いた家具は光らせたり,動かしたり,ジャンプさせたりすることができる。どの家具を動かすのか設定するには「H.SetOutletCount()」というコマンドを使う。これを使うと,スクリプトのウィンドウにアウトレットアイコンが現われる。アイコンを右クリックしてから,登録したい家具をクリックする。アイコンに赤い○印が付けば成功だ。例えば,3個の家具を選びたい場合には,以下のようなスクリプトになる。

-- スクリプトの起動条件
function OnInit()
H.SetSensor(4,4); -- 執事の認識距離
H.SetOutletCount(3); -- 3個の家具を設定可能にする
end

 次にどんな条件で家具が動作するのかを設定する。今回は,ユーザーがジャンプすると一緒にジャンプする家具,チャットで「灯かり」というと点滅する家具,執事に掃除を頼むと勝手に動く家具という3つを作ってみた。ジャンプが可能な家具は,ボックス型,文字型,特殊装飾物と倉庫管理人などのNPCだ。

-- ジャンプすると一緒にジャンプする家具
function OnUserEmotion(motion)

-- モーションが「ジャンプ」かどうかを判別
if(motion == H.Emotion.jump) then

H.PlaySound(0, "r2[1]");

-- アウトレットアイコン1に設定した家具をジャンプ
-- 2番目の数字はlabel,末尾の数字は高さ
H.Jump(H.Outlet.outlet1,1,1);

-- アウトレットアイコン2に設定した家具をジャンプ
H.Jump(H.Outlet.outlet2,1,1);
end
end

 次は執事に命じて家具を動かしてみる。最初に執事に「掃除」というメニューを追加する。その後,移動可能な家具を動かすためのスクリプトを組む。執事にメニューを追加するには,上のOnInit()に追加する。

 家具の移動コマンドはH.SetPos(アウトレットの名前,label,前後,左右,高さ,スピード)の順に設定できるようになっている。動かすことができるのはボックス型,文字型,特殊装飾物の3種類だ。

-- スクリプトの起動条件
function OnInit()
H.SetSensor(4,4); -- 執事の認識距離
H.SetOutletCount(3); -- 3個の家具を設定可能
H.RegisterMenu("掃除", 2); -- メニューに掃除を追加。2つめの数字は固有ID
end

-- 執事を右クリックして「掃除」を選択
function OnMenu(menuNum)

-- メニューと固有IDが正しいかを照合
if(menuNum == 2) then

-- 家具が動く順番の指示
H.PlaySound(0, "r2[1] r2[2]");

-- 1つめの家具の移動
H.SetPos(H.Outlet.outlet1,1,0,0,0.5,1);
-- 2つめの家具の移動
H.SetPos(H.Outlet.outlet2,2,-2,0,0,1);
end
end

 最後に,「灯かり」とチャットすると家具が点滅するスクリプトを組んでみる。今度は「H.Glow」を使って家具を光らせる。点滅のタイミングは「H.PlaySound」で指定できる。光るタイミングに合わせて,効果音もつけてみた。なお,設置物を光らせるためにはグラフィックス設定が「高級シェーダー品質>高」に設定されている必要がある。

-- ユーザーがチャットを入力したら開始
function OnUserSay(str)

-- 「灯かり」と入力したかを確認
if(string.find(str, "灯かり")) then

-- アウトレット1を2秒間赤く光らせる
H.Glow(H.Outlet.outlet1, 1, 2, 255, 0, 0);
-- アウトレット2を2秒間緑に光らせる
H.Glow(H.Outlet.outlet2, 2, 2, 0, 255, 0);
-- アウトレット3を2秒間青く光らせる
H.Glow(H.Outlet.outlet3, 3, 2, 0, 0, 255);

H.PlaySound(0, "r[1]rrr[2]rrr[3]");

-- 効果音を設定
H.SetPercussion(1, H.Percussion.fx11);

H.PlaySound(1, "x_rrrx_rrrx_");
end
end




画像集#005のサムネイル/「The Tower of AION」今日から始めるハウススクリプト入門。公式サイト内“知識エンチャント”にスクリプトを投稿すればプレゼントのチャンスも!
 と言うわけで,駆け足ではあるが,ハウススクリプトの持つ機能の一部を紹介してきた。ゲーム内にはこのほかにも「もぐらゲーム」や「青旗白旗ゲーム」といったミニゲームが収録されている。これらのゲームを作るには,もう少し難しいプログラムの知識が必要になるため今回は紹介しないが,アイデア次第では,今回紹介したスクリプトだけでもアドベンチャーゲームや音楽ゲームなど,いろいろな遊びを作ることができる。

 今回の記事で面白そうと興味を持ってもらえたなら,今度はぜひ自分でチャレンジしてみてほしい。最初は人が作ったスクリプトをこねくりまわしているだけでも十分勉強になる。慣れてくれば,今回筆者が紹介したものよりもスタイリッシュで美しいスクリプトが作れるようになるはずだ。

 ともあれAIONプレイヤーは,面白いスクリプトが完成したら,ぜひ公式サイトの知識エンチャントで発表してみてほしい。知識エンチャントに寄せられた力作に関しては,後日あらためて4Gamerで紹介し,優秀作品には4Gamer特別賞として,何かいいもの(エヌ・シー・ジャパンと相談中)をプレゼントできるかもしれないので,そちらについてもお楽しみに。公式サイトで困っているFSドガノフを助けるためにも,今こそディーバの力を結集し,ハウジングライフを盛り上げていこう。

画像集#006のサムネイル/「The Tower of AION」今日から始めるハウススクリプト入門。公式サイト内“知識エンチャント”にスクリプトを投稿すればプレゼントのチャンスも!

「The Tower of AION」公式サイト

「知識エンチャント」内FSドガノフからの依頼


■おまけ:ごあいさつのスクリプト
function OnInit()
H.SetSensor(5, 20); -- 執事の認識範囲
H.SetOutletCount(2); -- 2個の家具を設定可能にする
end

-- ユーザーがモーションを入力
function OnUserEmotion(motion)

-- 「手を振る」モーションを入力した場合下の反応を返す
if (motion == H.Emotion.wave) then

H.PlaySound(0, "r[1]");
-- 執事のアニメーション
H.StartAnimation(0, 1, H.Emotion.wave);
-- NPC1のアニメーション
H.StartAnimation(H.Outlet.outlet1,1,H.Emotion.wave);
-- NPC2のアニメーション
H.StartAnimation(H.Outlet.outlet2,1,H.Emotion.wave);
end
end
  • 関連タイトル:

    The Tower of AION

  • この記事のURL:
AD(最終更新日:2023/12/21)

4Gamer.net最新情報
プラットフォーム別新着記事
総合新着記事
企画記事
スペシャルコンテンツ
注目記事ランキング
集計:04月17日〜04月18日