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

はじめてのAurigaスクリプト 基本編(18)

2011.11.23 *Wed*
ユーザー定義関数について

何度も通る処理をコピペしてベタベタと書いてしまうと
プログラムが長くなってしまい、とても見辛くなってきます。

処理が一方通行ならばgotoとラベルを使ってジャンプすればいいですよね?
でも元の処理に戻って欲しい場合には使えません。

そこで便利になるのがユーザー定義関数です。
ユーザー定義関数は、Aurigaの既存関数と同じように
呼び出すと内部で処理が実行され、処理が完了すると元の処理に戻ってきます(※)
※でもreturnを記述し忘れると戻ってきません。

長くてめんどくさい処理をあらかじめ関数として定義することで
複雑な処理も、簡単に呼び出せて見た目もシンプルに書くことが出来ます。

ちょっwwwまっwww 関数ってそもそも何なのよww?

という方はその19を参照してください。


■ユーザー定義関数の種類

 ユーザー定義関数には3種類の定義方法があります。
 
 ・サブルーチン※これは厳密に言えば関数ではないです
 ・プライベート型
 ・パブリック型

■サブルーチン
 gotoと同じ感覚で使える独立した処理です。
 関数との違いは、引数と戻り値が使用できない点です。

 BASIC言語のような古い言語の手法なので
 あまり馴染みがないかもしれません。

prontera.gat,168,189,4 script サブルーチン 112,{
mes "メインルーチンです。";
next;
callsub L_SUBROOT;
next;
mes "メインルーチンにもどりました。";
close;
L_SUBROOT:
mes "サブルーチンです。";
return;
}


■プライベート型
 ローカル宣言とも言い、宣言したscript内でのみ使用できる関数です。
 既存関数と同様の記述で使えるので便利です。
 関数なので引数を渡すことができ、戻り値も取得できます。

function <関数名> {
~~~処理~~~
}

 プライベート型関数は、使う前にあらかじめ定義されていないといけません。

 これは実行時にエラーとなります。

prontera.gat,168,189,4 script 関数テスト 112,{

mes func1(); //この段階ではまだ定義されたことにならないのでエラーになる

close;

function func1 {
return "func1()が呼ばれました。";
}
}


 これで動くようになりますが、肝心のメインルーチンがとても見辛くなります。

prontera.gat,168,189,4 script 関数テスト 112,{

function func1 {
return "func1()が呼ばれました。";
}

mes func1(); //正常に実行される

close;
}

 しかし、C言語のように「プロトタイプ宣言」という前定義ができるので
 このように書けばスマートになります。

prontera.gat,168,189,4 script 関数テスト 112,{

function func1; //関数func()のプロトタイプ宣言

mes func1(); //正常に実行される

close;

//プロトタイプ宣言すれば実際の処理はscript内のどこに書いてもOK
function func1 {
return "func1()が呼ばれました。";
}

}


 関数に渡された引数は getarg(<インデックス>) で取得できます。
  インデックス は 0から始まる引数の番号です。
  1番目の引数は 0 になります。

prontera.gat,168,189,4 script 関数テスト2 112,{

function str_zeny;

mes "あなたの所持しているZenyは";
mes str_zeny(Zeny) + "zeny";
mes "ですね。";
close;

// 数値をカンマ付の文字列に変換する
// 1234567 → "1,234,567"
function str_zeny {
set '@arg$,getarg(0);
set '@len, getstrlen('@arg$);
set '@d,0;
for(set '@i,'@len-1; '@i>=0; set '@i,'@i-1){
set '@ret$, substr('@arg$, '@i, 1) + '@ret$;
if ('@i>0 && '@d % 3 == 2) {
set '@ret$, "," + '@ret$;
}
set '@d,'@d+1;
}
return '@ret$;
}
}


■パブリック型
 どのスクリプトファイルからも使用可能な定義方法です。
 グローバル宣言とも言います。
 プライベート型と同じように引数を渡すことができ、戻り値も受け取ることが出来ます。
 
 プライベート型と違い、呼び出すときは callfunc関数を使います。

function script func2 {
mes "["+strnpcinfo(1)+"]"; //どのNPCから呼ばれても呼出したNPCの名前を表示
mes getarg(0); // 引数を表示
return;
}

// 符号を返す
function script SGN {
return (getarg(0) < 0 ? -1 : (getarg(0)!=0));
}

// 絶対値を返す
function script ABS {
return getarg(0) * callfunc("SGN", getarg(0));
}

prontera.gat,168,189,4 script 関数テスト3 112,{

callfunc "func2", "こんにちは。";

next;

callfunc "func2", "-5 の絶対値は ";
mes callfunc("ABS", -5) +" です。";

close;
}




// パーティviewpoint
// callfunc "party_viewpoint", <パーティID>, <Type>, <X>, <Y>, <ID>, <Color>;
function script party_viewpoint {
set '@ptid, getarg(0);
set '@type, getarg(1);
set '@x, getarg(2);
set '@y, getarg(3);
set '@id, getarg(4);
set '@color, getarg(5);
set '@dummy, getmapxy('@map$, '@dummy, '@dummy, 1);

getpartymember '@ptid;
for(set '@i,0; '@i<$@partymembercount; set '@i,'@i+1) {
if(getmapname($@partymembername$['@i])!='@map$) continue;
if(attachrid(getcharid(3,$@partymembername$['@i]))) {
viewpoint '@type,'@x,'@y,'@id,'@color;
detachrid;
}
}
return;
}


 サンプルとしてAurigaの既存のファイルを見てみるといいかもしれません。

  Auriga\script\function\function_itemdb.txt

 このファイルにはitem_db.txtの「巨大なハエの羽」と「キラキラスティック」
 の使用時の処理が書いてあります。

 item_db.txtのアイテムスクリプトで複雑な処理を行いたい場合に
 ここに定義しておけばシンプルな記述で実現できるというわけです。

関連記事

COMMENT

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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。