プレイレポート
「The Tower of AION」ユーザー投稿ハウススクリプトを大紹介! お役立ちTipsからミニストーリーまで力作が集結
4Gamerでは「こちら」のレポートで,ハウススクリプトの基本的な使い方を紹介するとともに,公式サイト内の知識エンチャントでFSドガノフが行なっていた,スクリプト募集も紹介した。
知識エンチャントの該当スレッドでは,FSドガノフの切実なお願いに応えたプレイヤーが,さまざまなスクリプトを投稿してくれている。今回のレポートでは,その中から4Gmaer編集部が独断で選んだ優秀作を紹介していきたい。
なお,今回紹介させてもらったスクリプトに関わったプレイヤーには,エヌ・シー・ジャパンから4Gamer賞として,素敵なプレゼント(レアな家具アイテム3点セット)が送られている。また,該当スレッドに投稿してくれた参加者全員に,参加賞として「百年物の黄金ニンジンの模型」をプレゼントしている。
4Gamer賞「タハバタの壁飾り」 |
4Gamer賞「ラクシャの壁飾り」 |
4Gamer賞「ルドラの壁飾り」 |
参加賞「百年物の黄金ニンジンの模型」 |
「Episode 3.0」の実装から数か月が過ぎ,狩りや観光も一通り落ち着いてきていると思うが,「今日は狩りって気分じゃないな〜」という日には,ぜひハウススクリプトをいじってみてはどうだろうか。
「The Tower of AION」公式サイト
「知識エンチャント」内FSドガノフからの依頼
音楽部門はマニュアルが豊富
あのMCタナベの「SEPIA」もスクリプト化!
最初に紹介するのは,ハウススクリプトを使った音楽の作り方を詳しく解説してくれたレイリーンさん。
ハウススクリプトに使われているのは「Lua言語」というスクリプト言語。既存のプログラムに組み込んで,機能を拡張することに特化した言語だ。
音楽は「MML」と略されることの多い「Music Macro Language(ミュージック・マクロ・ランゲージ)」という文法を使って記述されている。いくつもの楽器を組み合わせたり,打楽器でテンポをとったり,SEを鳴らしたりと,工夫と熱意次第でかなり凝った曲を作ることができる。
レイリーンさんのブログ(レイリーンさんの投稿内にリンクあり)には,xRayさんのスクリプを改良した,ジャンプをすると某ゲーム風のレベルアップファンファーレが流れるスクリプトも掲載されているので紹介したい。
function OnInit()
H.SetSensor(3, 10);
end
function OnPlayerJumpEnd(outletIndex)
H.SetInstrument(0, H.Instrument.piano);
H.SetInstrument(1, H.Instrument.piano);
H.SetInstrument(2, H.Instrument.piano);
H.SetInstrument(3, H.Instrument.piano);
H.PlaySound(0,"v8 l16 o7ccccro6b-ro7dro6c1&c1");
H.PlaySound(1,"v5 l16 o6gf#f#-erdrf#re1&e1");
H.PlaySound(2,"v5 l16 o5gf#ferdrf#re1&e1");
H.PlaySound(3,"v3 l16 ccccro3b-ro4drc1&c1");
end
なお,音楽の記述方法については,該当スレッドでAusleseさんも詳しく補足してくれているので,そちらもぜひ参考にしてほしい。MCタナベ氏の突発ユニット「108(ヒャッハー)」によるイメージソング「SEPIA (セピア)」を収録したムービーも公開されている。
セレブな高級住宅にぴったりの優雅なクラシックBGM!
音楽を使ったスクリプトをもう1つ。憂ぷもさんが投稿したスクリプトは,部屋に入ると執事が挨拶をして優雅なBGMが流れるという,“高級住宅”あたりに欲しいセレブな内容。憂ぷもさんのブログ(憂ぷもさんの投稿内にリンクあり)には,BGMを止める方法なども掲載されているので,そちらも参考にしてみてほしい。
--キャラごとの挨拶の指定
helloTable = {
["キャラA"] = {"おかえりなさいませ,A様"},
["キャラB"] = {"いらっしゃいませ"},
["キャラC"] = {"おつかれさまです"},
["キャラD"] = {"不法侵入アルネ!"},
["キャラE"] = {"E様,どうぞごゆっくりなさってくださいね"},
};
--指定されていない人が来た場合の挨拶
function GetHelloString(desc)
if (helloTable[desc] == nil) then
return desc.."様 いらっしゃいませ";
end
return helloTable[desc][1];
end
function OnInit()
--執事の7M〜30Mに入った場合実行されます
H.SetSensor(7, 30);
end
function OnUserEntered(desc)
H.PlaySound(0, "r[1]r[2]");
--執事のエモーションの指定
H.StartAnimation(0, 1, H.Emotion.kneel);
--執事が挨拶をする
H.Say(2, GetHelloString(desc));
--ココに楽譜
H.PlaySound(1,"t120 o5 g r r r r r r r r a8 f8 d8 c8 o4 b8 o5 c8 o4 b r a g o5 g r r r e8 c#8 o4 a8 o5 d8 c#8 g8 f8 f r r r d8 o4 a8 g8 o5 c8 o4 b8 o5 f8 e8");
end
レアキャラのポップ時間をチェックできる
便利スクリプト「Spawn Checker」
「The Tower of AION」には,ポップする時間や日付が決まっているNPCがいる。インスタンスダンジョンのように時間をチェックするシステムはなく,実際に確認しに行って「いた?」「いなかった」というやりとりを交わしたことがあるプレイヤーも多いのではないだろうか。
そんなときに役に立つのが,ヴァティストゥータさんが紹介してくれた,ゲーム内の時間を取得するスクリプトだ。ブログには「季節のアグリント」と「シューゴ流浪団」のポップ時間を教えてくれる「Spawn Checker」というスクリプトが掲載されている。
「季節のアグリント」は,「高速バイクロン」製作のための材料をドロップするネームドモンスター。「シューゴ流浪団」は,育てるとアイテムを収穫できる家具を販売するNPCだ。
このスクリプトを組んでおけば,こまめに時計をチェックする必要がないのでとても便利。ブログにはスクリプトの解説や,時間によって執事の挨拶が変化するスクリプトも紹介されている。
ここでは,知識エンチャントで紹介された,ゲーム時間の日付を取得するための関数を紹介しよう。「The Tower of AION」では,現実の2時間がゲーム内の1日に相当する。このスクリプトは「os.time()」で取得した現在時刻を,ゲーム内の月と日に変換するものだ。
function get_game_time_m(now)
time_difference = now - 1323788460;
gtm = math.floor(time_difference / game_time_m);
gtm = math.floor(gtm % 12);
gtm = gtm + 1;
return gtm;
end
function get_game_time_d(now)
time_difference = now - 1323788460;
gtd = math.floor(time_difference / game_time_m);
gtd = math.floor(gtd % 31);
gtd = gtd + 1;
return gtd;
end
乱数を使って今日の運勢とラッキープレイスを
表示する占いスクリプト
次は乱数を使ったスクリプトを紹介しよう。ツァイさんの占いスクリプトは,3つの変数を組み合わせてその日の運勢をランダムに表示してくれるというもの。メッセージの中身を見ると,どうやら魔族用のようだ。言葉は荒っぽいが,スクリプトには職人気質の愛情が満ち溢れている。
ここに載せたものは,投稿されたオリジナルバージョンを少しだけ改良し,セリフを順番に表示させるためにH.PlaySoundのコマンドを追加したもの。魔族はこのまま,天族はセリフを天族バージョンに変えて使ってみてほしい。
-- 運勢の数
maxLuck = 5;
-- ラッキープレースの数
maxPlace = 12;
-- 運勢と音
luckTable = {
[1] = {"最高", H.Percussion.fx10 },
[2] = {"いい感じ", H.Percussion.fx2 },
[3] = {"ふつう", H.Percussion.fx9 },
[4] = {"ちょい悪い", H.Percussion.fx1 },
[5] = {"どん底", H.Percussion.fx11 }
};
-- 運勢のコメント一覧
descTable = {
[1] = "何をやってもツいてるよ!仲間を誘ってIDに繰り出そう!",
[2] = "いつもより運気がきてるよ!制作もシャイニングかも?",
[3] = "可もなく不可もなく。のんびり採集でもいかが?",
[4] = "ちょっと運気が落ちてるかも。天には気を付けて!",
[5] = "何をやってもダメよダメダメダメウィング。"
};
-- ラッキープレイスの一覧
placeTable = {
[1] = "パンデモニウム", [2] = "アルトガルド",
[3] = "モルヘイム", [4] = "ブルストホーニン",
[5] = "ベルスラン", [6] = "イスハルゲン",
[7] = "ペルノン", [8] = "エレシュランタ",
[9] = "ゲルクマルス", [10] = "サルファン",
[11] = "インギスオン", [12] = "ティアマランタ"
};
function OnInit()
H.SetSensor(3, 30);
end
function OnUserEntered(desc)
-- ひとまずおじぎと挨拶
H.Say(-1, "いらっしゃい" .. desc .."さん");
H.StartAnimation(0, 1, H.Emotion.thanks);
-- 乱数決める
gameTime = H.GetGameTime();
seedOption = string.len(desc);
seed = gameTime + seedOption;
math.randomseed(seed);
-- どんだけSeed変えても1回目は同じの出しやがるので1回破棄
rand1 = math.random(maxLuck);
H.PlaySound(0, "r[1]r[2]");
-- 乱数とってメッセージ表示
rand1 = math.random(maxLuck);
rand2 = math.random(maxPlace);
H.SetPercussion(1, luckTable[rand1][2]);
H.PlaySound(1, "x");
H.Say(1, "★★★ 今日の占い ★★★");
H.Say(2, "今日の運勢は " .. luckTable[rand1][1] .. " です。");
H.Say(3, descTable[rand1]);
H.Say(4, "ラッキープレイスは" .. placeTable[rand2] .. "です");
H.PlaySound(0, "r[-1]rrrrr[1]rrrrr[2]rrrrr[3]rrrrr[4]");
end
脱力サボリ執事がかわいくて……そんなミニストーリーをスクリプトで!
ストーリーは2つのスクリプトで構成されている。1つめの音楽用スクリプトは,プレイヤーキャラクターが執事に近づくと,執事が横になってだらけながら「ご主人様は魔族の手に・・ 落ちました。香典は頭の上の宝箱にどうぞ・・・」と投げやりに答える。BGMは空白になっているので,このまま動かすと無音。自分でH.PlaySoundの部分に音楽を入力してもOKだ。
爆弾用スクリプトは,サボっている執事の横で時限爆弾が爆発して周囲のものを吹っ飛ばし,執事が驚いて謝るというもの。アウトレットの1に爆弾を,2〜4に吹っ飛ばすオブジェクトを指定する。執事の動きやオブジェクトの吹っ飛び方など,なかなかいい感じに調整されている。
【音楽用スクリプト】
function OnInit()
H.RegisterMenu("曲名", 1);
H.SetSensor(3, 30);
H.SetOutletCount(7);
H.EnableSoundCallback(1)
end
function OnMenu(menuNum)
if (menuNum == 1) then
H.PlaySound(0, "r[1]");
H.Say(1,"ご主人様は魔族の手に・・ 落ちました。香典は頭の上の宝箱にどうぞ・・・");
H.StartAnimation(0, 1, H.Emotion.sleep);
sound()
end
end
function OnUserEntered(desc)
H.PlaySound(0, "r[1]");
H.Say(1,desc.."さん・・・ ご主人様は魔族の手に・・ 落ちました。香典は頭の上の宝箱にどうぞ・・・");
H.StartAnimation(0, 1, H.Emotion.sleep);
sound()
end
function sound()
--メインパート上段1
H.SetInstrument(1, H.Instrument.piano);
H.PlaySound(1, "");
--メインパート上段2
H.SetInstrument(2, H.Instrument.piano);
H.PlaySound(2, "");
--メインパート下段1
H.SetInstrument(3, H.Instrument.piano);
H.PlaySound(3, "");
--メインパート下段2
H.SetInstrument(4, H.Instrument.piano);
H.PlaySound(4, "");
--宝箱点滅(光らせたいオブジェクトを5のアウトレットで指定)
H.SetPercussion(5, H.Percussion.fx18);
H.PlaySound(5, "(v1 t75 x2x4x8x8 x4.x8x4x4 x4.x8x4x4 x2.x8x2 r4x8x8x8 x2x8x8x8x4 x4x8x2 x8x8x8x8x8x8x8x8 x2.r4 x8x8x4 x8x8x8x4 x8x8x8x2 x16x8x16x8x4x8x8x8 x2r8x8x8x8 x2x2 x2r8x8x8x8x4. x8x8x8x8x8 x2 r4r8x8 x2x8x8x8x4 x4x8x2 x8x8x8x8x8x4x16x16 x2.r8 )");
end
function OnSoundPlay(channel, note, len, label)
if (note == 'x') then
H.GlowNow( H.Outlet.outlet0+channel, 0.1, 0, 0, 255);
end
end
【爆弾用スクリプト】
function OnInit()
H.RegisterMenu("爆弾どっかん", 1);
H.SetSensor(3, 30);
H.SetOutletCount(7);
H.EnableSoundCallback(1)
end
function OnMenu(menuNum)
if (menuNum == 1) then
sound2()
end
end
function OnUserEntered(desc)
sound()
end
function sound()
H.SetPercussion(1, H.Percussion.fx12 );
H.PlaySound(1, "(v7 t75 r4x4r4x4r4x4r4x4r4x4r4x4r8x8r16x8r16x8r16x8r16)");
H.SetPercussion(2, H.Percussion.fx1 );
H.PlaySound(2, "v10 t75 r4r4r4r4r4r4r4r4r4r4r4r4r8r8r16r8r16r8r16r8r16x8[1]r2");
H.StartAnimation(1, 1, H.Emotion.surprise);
H.Say(1, "ひゃああ さぼっててゴメンナサイ");
H.SetPos(H.Outlet.outlet2, 1, -2, 1, 0, 1);
H.SetPos(H.Outlet.outlet3, 1, -2, 2, 0, 1);
H.SetPos(H.Outlet.outlet4, 1, -3, 1, 1, 1);
H.SetPos(H.Outlet.outlet5, 1, 0, -0.5, 0, 1);
end
function sound2()
H.SetPercussion(1, H.Percussion.fx12 );
H.PlaySound(1, "(v7 t75 r4x4r4x4r4x4r8x8r16x8r16x8r16x8r16)");
H.SetPercussion(2, H.Percussion.fx1 );
H.PlaySound(2, "v10 t75 r4r4r4r4r4r4r8r8r16r8r16r8r16r8r16x8[1]r2");
H.StartAnimation(1, 1, H.Emotion.surprise);
H.Say(1, "ひゃああ びっくりしたな もう");
H.SetPos(H.Outlet.outlet2, 1, -2, 1, 0, 1);
H.SetPos(H.Outlet.outlet3, 1, -2, 2, 0, 1);
H.SetPos(H.Outlet.outlet4, 1, -3, 1, 1, 1);
H.SetPos(H.Outlet.outlet5, 1, 0, -0.5, 0, 1);
end
function OnSoundPlay(channel, note, len, label)
if (note == 'x') then
H.GlowNow( H.Outlet.outlet1, 0.1, 0, 0, 255);
end
end
なお,AIONでは7月3日から7月17日までの期間,イベント「新誕!ハウジング ウイング」が実施されている(関連記事)。これは,AIONに関するイラストや動画,スクリーンショットを投稿するコンテスト形式のイベントとなっているので,これまで紹介してきたハウジングスクリプトを参考に,オリジナルアクション満載の動画制作にチャレンジしてみるのも面白いかもしれない。
「The Tower of AION」公式サイト
「知識エンチャント」内FSドガノフからの依頼
- 関連タイトル:
The Tower of AION
- この記事のURL:
The Tower of AION(TM) is a trademark of NCSOFT Corporation.
Copyright (C) 2009 NCSOFT Corporation.
NC Japan K.K. was granted by NCSOFT Corporation the right to publish, distribute and transmit The Tower of AION(TM) in Japan. All rights reserved.