--.--.-- *--*
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

はじめてのAurigaスクリプト 応用編(3)

2010.12.17 *Fri*

//=====================================
//簡単な討伐クエスト
//----------------------------------

//----------------------------------
//討伐数カウント用NPC
//----------------------------------
map.gat,0,0,0 script test_killed -1,{

OnStart:
//値を初期化
set 'mob_count,0;
end;

OnKilled: //モンスターが倒されたら処理がここに飛んできます

//討伐数カウント

//※注目すべきなのは変数の種類です。
// これはNPC変数。鯖再起動まで消えない性質の変数です。
set 'mob_count, 'mob_count + 1;

if('mob_count < 30) end; // カウントが30未満ならば処理終了

announce "おめでとー!",8; //クリア時アナウンス

set $test_quest_flag,2; //クリアフラグを立てる

end;

}

//----------------------------
// クエスト開始用NPC
//----------------------------
map.gat,100,100,4 script テスト討伐クエスト 888,{


// フラグ 0:クエスト開始前 1:クエスト開始中 2:クリア
// この変数の種類はサーバー永続変数。鯖再起動でも消えません。
switch ($test_quest_flag) {

case 1: // 開始中
mes "まだ敵が全部倒されていません!";
close; //何もしないで終了!

case 2: //クリア時
goto L_CLEAR; //クリア処理へGO!
}

//開始前
mes "討伐クエストを開始しますか?";

menu "開始する", L_START, "なにもしない", -;

mes "-なにもしなかった-";
close;

L_START: //開始処理

mes "開始します!";

close2;

//討伐数カウントNPCを初期化させる。
donpcevent "test_killed::OnStart";

//モンスターを発生させる
monster "map.gat",0,0,"ポリン", 1002, 30, "test_killed::OnKilled";

set $test_quest_flag, 1; //フラグは「開始中」に。

end;

L_CLEAR: //クリア処理

mes "お!クリアしましたか!";
mes "ではこれをどうぞ。";
next;

getitem 512,100; //リンゴ100個を渡す

mes "おめでとうございます。";
mes "おつかれさま!";
close2;

set $test_quest_flag, 0; //フラグを元に戻す

}

/*-------------------------------------------

解説:

まず、NPCを二つに分けた理由の説明から。

NPCは非イベント型、イベント型と2種類に分けられます。

非イベント型というのは
通常の会話型NPCなどがそれです。

イベント型NPCは
OnTouch: OnTimerXXXX: など特殊なラベルを持ったNPCです。
そのようなNPCの場合、NPC名が長すぎたり、同じ名前のNPCがあってはダメで
ユニークな名前を付けないといけません。



今回は、モンスターが倒された時に実行されるイベント型NPCなので
test_killedという名前でイベント型NPCを設置しています。
このイベント型NPCは非表示NPCにしていますので、NPC番号は -1 としています。



そしてもうひとつ重要なのは ラベルの書き方です。
通常のラベルは L~~~: と書かないといけませんと説明しましたが
イベント専用のラベルは

On~~~:

と書かないと動作しません。
(理由はよくわかりませんが、そういう決まりです。eAthenaも共通。)


討伐された時のラベルは別に決まっていませんが、OnKilled: とするのが通例です。

donpcevent <イベント名>

イベント型ラベルの処理を実行します。
OnInit、OnTouch、OnTimer、OnClock などの
定義済みのラベルも実行することができます。

donpcevent "test_killed::OnStart";

書き方は、 "NPC名::ラベル" となります。

別のNPCの処理を実行させたい場合などに非常に便利です。

ちなみに、次のようにNPC名を省略するとどうなるでしょうか。

donpcevent "::OnStart";

なんと、このラベルを持つ全てのNPCのOnStartラベルが実行されます!
使い方を間違えれば、バグの原因となりそうですが
これは仕様となっており、上手に使えば有効な手段となるかもしれません。


次にモンスターの召喚です。

monster "map.gat", 0,0, "ポリン", 1002, 30, "test_killed::OnKilled";
// ↑ ↑座標 ↑ ↑ ↑
// マップ名 0,0とするとランダム mob_ID 数 討伐数をカウントさせる為のNPC名とラベルを指定。

こうすると、このモンスターが倒されるた時に、
指定されたイベント型ラベルの処理が実行されます。




追記となりますが、このスクリプトでは $test_quest_flag という
サーバー永続変数を使用して、NPC同士の値のやり取りを行っていますが、
サーバの再起動で消えることが無い為、再起動後に初期化を行わないと
バグの原因となってしまいますので、実は賢い方法とは言えません。

多少ソースの可読性が落ちるのを厭わないのであれば、
getvariableofnpc 関数を使い、NPC変数の参照・書換えを行うほうが
スマートかもしれません。

getvariableofnpc(<変数名>, "<ユニークなNPC名>")

これは、'ABC 'xyz$ というような、
NPC依存型の(再起動まで消えない)変数にのみ有効な関数で
特定のNPC内の変数を参照できる便利な関数です。

C#やJavaなどで言えば、 original_npc.FLAG 、original_npc->FLAG というような
classや構造体内のメンバ変数を参照するイメージです。

使用例:

if( getvariableofnpc( 'FLAG, "original_npc" ) == 1) { ~~ 略 ~~ }

 original_npcというNPCの 'FLAG という変数が 1 だったら・・・・

 C#/Java風 if(original_npc.FLAG == 1){ ~~~ }

set getvariableofnpc( 'FLAG, "original_npc" ), 2;

 original_npcというNPCの 'FLAG という変数に 2 をセット

 C#/Java風 original_npc.FLAG = 2;

*/
関連記事

COMMENT

DDの討伐した際のカウント
これを使えばいいんですね!

DDのポリンマップだけでもある程度再現しようと
敵を設定し、スクリプト講座を順番にみてきて、
少しづつステップアップしてるような気になってみる!

復習しながらやらないと忘れちゃうw
2012/07/19(木) 01:15:31 | URL | とある自鯖設定のT #- [Edit
Re: タイトルなし
うーん、
今のAurigaのシステムだと個人別に討伐カウントが持てますが、
この方法は転職試験などに使われている古い方式です。
昔の蜃気楼の塔などもこの方式が採用されていました。

言われて気づきましたが、
現在の個別の討伐システムの作り方もテキスト作らないとだめでした。
今度書いておきます!
2012/07/19(木) 09:52:46 | URL | みのり #- [Edit

Comment Form


秘密にする
 


TRACKBACK

TrackBack List



プロフィール

Author:みのり

すごく面倒臭がりで大雑把です。
なので、すぐ楽をしようとして
ツールを作り始めます。
ツールを作る時間と手作業で費やす時間
はたしてどちらが短いのか……


-構築環境-

Auriga0945 MySQL 5.5
with 2011-12-20bRagexeRE

3CeAM rev525
with 2010-07-30aRagexeRE



カテゴリ

未分類 (9)
RagexeRE (9)
eAthena (1)
Auriga (5)
ツール:eAthena用 (4)
ツール:Auriga用 (6)
ツール:その他 (14)
はじめてのAurigaスクリプト (8)
はじめてのAurigaスクリプト基本編 (21)
はじめてのAurigaスクリプト応用編 (7)
Aurigaスクリプト (3)
本鯖 (7)
Aurigaスクリプト:冒険者アカデミー (6)
ドラクエ10 (2)
新生FF14 (3)
EVE Online (2)



最新記事



最新コメント



月別アーカイブ



検索フォーム



リンク

このブログをリンクに追加する



ブロとも申請フォーム

この人とブロともになる



QRコード

QR



12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Copyright © Rocco di Forte All Rights Reserved.
テンプレート配布者: サリイ  ・・・  素材: HELIUM  ・・・ 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。