//
// Athena Sample Script
//  (c) 2003 Athena Project.
//
// $Id: npc_sample.txt,v 1.1.1.1 2004/09/10 17:26:47 MagicalTux Exp $

// このファイルは、Athenaで使用されるスクリプトの解説と使用例のサンプルと
// なっています。

// =============
// *基本的な書式
// =============
// <parameters_1>\t<command>\t<displayname>\t<parameters_2>
// \tはTABをあらわします。
// command は "warp" / "monster" / "shop" / "script" のいずれかになります。
// 各行において"//"以降はコメントとして無視されます。
// 以下、個々について解説をしていきます。
//
// 書式中<n>とかかれている部分はnという文字ではなく、任意の文字列/値を示します。
// また、[n]は必要に応じて指定する任意の文字列/値となっています。

// ========
// *command
// ========
//
// ---------------
// *通常warp(warp)
// ---------------
// 書式 : <gatname>,<x>,<y>	warp	<displayname(hidden)>	<dx>,<dy>,<destination_gatname>[],<destination_x>,<destination_y>
//
// <gatname>	- マップデータファイル名。拡張子は必須です。
// <x>,<y>		- ワープポイントの中心座標(x,y)
// <displayname(hidden)>	- npc名。一文字以上の任意の文字で指定します。ユニークな名前である必要はありません。
// 				  実際には表示されません。
// <dx>,<dy>	- 動作範囲(x,y) <x,y>を中心に(dx+1,dy+1)の範囲にPCが来ると発動します
// <destination_gatname>,<destination_x>,<destination_y> -
// 移動先のマップデータファイル名,座標(x,y)
// destination_gatnameについては拡張子""はあっても無くても構いません。
// 移動先のmapデータファイルが存在しない(あるいはmap_configで指定されていない)場合は発動しません。
// 移動先の座標が進入禁止区域であった場合は、ランダムな座標にワープします。
// また、同一座標に複数のwarpが置かれていた場合、先に記述されているものが有効になります
// これは、confファイル内で指定される、npc*.txtファイルをまたいでwarpを記述するときも同じことがいえます。
// 例:
prontera,156,185,4	warp	sample1	0,0,prontera,156,225
prontera,156,185,4	warp	sample1a	0,0,prontera,156,230
// sample1の方が先に記述されているので、156,225に移動します
prontera,156,220,4	warp	sample1-1	0,0,prontera,156,180

// --------------------
// *モンスター(monster)
// --------------------
// 書式:<gatname>,<x>,<y>[,<xs>,<ys>]	monster	<displayname>	<npcid>,<number>[,<spawn_delay1>,<spawn_delay2>]
// <gatname>	- マップデータファイル名。拡張子は必須です。
// <x>,<y>		- 初期配置座標(x,y) 0,0であればランダムな位置に配置されます。
// [,<xs>,<ys>]	- 特定範囲内に配置する時に指定します。
// <displayname> - マウスカーソルを合わせたときに表示される名前。名前は一文字以上指定してください
// <npcid>		- キャラクター種。詳細についてはお察しください(db/mob_db.txtが参考になると思いますが...)
// <number>		- 配置数
// [,<spawn_delay1>,<spawn_delay2>] - 同一pc_idをもつモンスターの生成時間についての定義
// 前回出現時間+出現遅延1,倒された時間+出現遅延2,倒された時間+5秒 で算出される値のうち、最も大きい物を
// 出現時間とします
// 例:
prontera,0,0	monster	ポリン	1002,5

// ---------
// *店(shop)
// ---------
// 書式:<gatname>,<x>,<y>,<direction>	shop	<displayname>	<npcid>,<item_id1>:<price1>[,<item_id2>:<price2>[,.....<item_id_N>:<priceN>]]
// <gatname>	- マップデータファイル名。拡張子は必須です。
// <x>,<y>		- NPCの配置座標(x,y)
// <direction>	- npcの向いている方向。0を北(y座標方向+)として、反時計回り45度きざみになっています
// <displayname> - マウスカーソルを合わせたときに表示される名前。名前は一文字以上指定してください
// <npcid>		- キャラクター種。詳細についてはお察しください
// <item_id_N>:<price_N>	- item_id_Nの商品を価格price_Nとして販売物ウインドウに表示します。
// 						  item_idについてはdb/item_db.txtを参照してください。
// 例:
prontera,136,203,6	shop	道具商人	73,501:5,502:20,503:55,504:120,506:20,645:80,656:150,601:30,602:30,611:20,610:400

// -====================-
// *NPCスクリプト(script)
// -====================-
// 書式:
// <gatname>,<x>,<y>,<direction>	script	<displayname>	<npcid>[,<xs>,<ys>],{ <script> ... }
// <gatname>	- マップデータファイル名。拡張子は必須です。
// <x>,<y>		- NPCの配置座標(x,y)
// <direction>	- npcの向いている方向。0を北(y座標方向+)として、反時計回り45度きざみになっています
// <displayname> - マウスカーソルを合わせたときに表示される名前。名前は一文字以上指定してください
// <npcid>		- キャラクター種。詳細についてはお察しください
// [,<xs>,<ys>]	- (x,y)を中心として(xs,ys)以内にPCが近寄るとスクリプトが発動します
// 				  (warpと同じような発動のしかたになります)
//
// この後に続く{}内がスクリプトとして認識されますが
// }(行末) でスクリプトの終了と判断しています。
// そのため、}の後にはコメント(//〜)は付けないでください。
// (後日この仕様は変更予定です)
//
// ------------------------
// *{}内のスクリプトについて
// ------------------------
// 個々の命令語や数字,文字列,ラベル,演算子等の間は
// スペースやタブ、改行、/* */により囲まれたコメント、//から改行までのコメントを
// 自由に入れる事が出来ます (C風味)
// 各命令は最後に";"をつけます (C風味)
//
// ---
// *値
// ---
// script内で使用される値は 数字 / 文字列 / 変数名 / ラベル の4種類に分かれます。
// 
// *数字 [0-9]の列で表わされる10進数か、0xで始まる16進数
//      数値として扱えるのは符号付32bit整数のみで、小数は扱えません
// *文字列 ""で囲まれた一通りの文字列が使えます。
//      文字列中に"を入れたい場合は\"、\を入れたい場合は\\とします
// *変数名/ラベル名 [A-Za-z0-9_]と@(一文字目のみ)が使えます。
//      特殊なラベルとして-が存在します。これは次の命令を意味します
//      以下で説明する定数や埋め込み変数もこれにあたります
// 
// -----------------------
// *定数または埋め込み変数
// -----------------------
// db/const.txtに<定数名> <数値>と記述する事で
// スクリプト内で利用可能な定数を宣言出来ます。
// (NPC店の商品リスト,見た目の設定部分等には利用出来ません)
//
// また、この中でキャラクターのステータスを参照する
// 埋め込み変数の定義もしています。現在有効な物は以下の7つです
//
//  BaseLevel : ベースレベル
//  JobLevel  : ジョブレベル
//  StatusPoint : 振り分け可能なステータスポイント数
//  SkillPoint  : 振り分け可能なスキルポイント数
//  Class : キャラクターの職業の種類
//     Class値についてはJob_Novice等db/const.txtで定数定義されてますのでこちらを使うと良いでしょう
//  Zeny  : お金
//  Sex   : 性別[0=♂, 1=♀]
//
// これらの変数は、if命令やset命令で自由に参照が出来ますが、
// 変更はStatusPointとSkillPointとZenyのみで他の埋め込み変数は変更しても意味を持ちません。
// また、この３つの埋め込み変数を変更した場合、変更はクライアントに即座に反映されます。
//
// -------
// *ラベル
// -------
// ラベルは、ラベル名の後に:を付け
// label:
// のように記述します。
// goto文やmenu文、if文等の飛び先として使われます。
//
// ---
// *式
// ---
// 命令の引数として数値が要求されている所は、全ての所で式が利用可能です。
// 整数演算のみですが、Cの式のサブセットになっています
// 利用可能な演算子は()、単項演算子 - ! ~、2項演算子 + - * / % & | ^ && || == != > >= < <= です
//
// 文字列の場合は + で連結が可能です。
// 文字列 + 数値 や 数値 + 文字列 とした場合は数値を文字列へと変換し連結します。
//
// -----------------
// *{}内で使える命令
// -----------------
//
//  mes "<message>";
// メッセージウインドウにmessageを表示します
// 文字の色は^000000等^に続けて16進数6桁で指定します(初期色は黒(^000000)です)
//
//  next;
// メッセージウインドウに"next"のボタンを表示します
//
//  close;
// メッセージウインドウに"close"のボタンを表示し、スクリプトの実行を終了します
//
//  menu "<choice1>",<Label1>[,"<choice2>",<Label2>....];
// 選択肢ウインドウを表示します。"choice1","choice2"等か選択肢に表示され
// メニューで選んだ場合は、その後に記述されるラベルにジャンプします。
// また、選択した項目はローカル変数l15にて参照できます。
// 上の例ですと選択肢に"choice1"が現れ、これを選ぶとLabel1:で始まる行にジャンプします。
// そして、変数l15には1という値がセットされます
// cancelを選んだ場合、スクリプトの実行を終了します
//
//  goto <Label>;
// Label:で始まる行から続きを実行します
//
//  cutin "<filename>[.bmp]",<pos>;
// 画面上にfilenameで指定する画像を表示します
// filename	- 表示するbmpファイル名。拡張子は無くても構いません
// pos		- 表示位置 0-左下 1-中央下 2-右下 3-? 4-? 255-非表示
// 現在のクライアントでは、cutinを実行するときに以前cutinが実行されており画像が表示されている場合は、
// 先に表示してある画像を消去してから後で指定される画像を表示します
// 
//  jobchange <Jobid>;
// PCの職をJobnameで指定した職に変更します。指定できるJobidについてはdb/const.txtのJob_ではじまる行を
// 参照してください。constで指定している埋めこみ変数名も使用できます。
// jobchangeを行うと、JobLvは1に、ステータスボーナスはその職に
// 合わせた物に変化します。Athena-d2.1ではスキルは使えないので、見た目変更だけと思ってください。
// [注意]
// 1.追加2次職(クルセイダー等)にjobchangeをする場合、服色パレットを変更している場合はリソースエラーが
// 起きますので、実行しないようにしてください。
// 2.バードとダンサーのJobnameは別になっています。
// このため、男性PCに対してJob_Dancerを実行したり、女性PCに対してjob_Birdを実行しないようにしてください。
// クライアントによってはリソースエラーで落ちます。
// map側では整合チェックを行っていないため、スクリプト側でチェックする必要があります。
// npc_testJ.txtの例を参照してください。
// 3.db/const.txtにはknight2/crusader2の記述がありますが、このjobへのjobchangeは行わないほうが無難です。
// 実際のゲームでもこのjobは使用されていないようです。
//
//  input [<variable>];
// 数字入力ウインドウを開きます。
// 入力された数字はvariableがあった場合その変数に、
// 無かった場合はローカル変数l14にセットされます。
//
//  warp "<destination_gatname>",<destination_x>,<destination_y>;
// 指定したマップのx,y座標にワープします。詳細は上記warp(NPC)の項を参照してください。
//
//  setlook <n1>,<n2>;
// PCの外見を設定します。
// <n1>	- (1 .. 8)
// 		1-髪型
// 		2-武器
// 		3-頭下
// 		4-頭上
// 		5-頭中
// 		6-髪色
// 		7-服色
// 		8-盾
// <n2> - 任意
// 		外見設定は該当アイテムを装備していなくても付加されます。
// 		想定外の番号を設定すると、クライアントがリソースエラーで落ちます。
// 		アサシン男,追加2次職に関しては服色の変更は行わないでください(やはりリソースエラー落ちします)
// 武器や頭装備,盾の設定はステータス再計算時に上書きされてしまうため、
// 実験的な用途にのみ利用可能です。
//
//  set <variable>,<n>;
// 変数<variable>の値を<n>にセットします。
// 現在<n>は数値のみで文字列が扱えませんが、後日対応予定です。
//
//  if (<cond>) goto <Label>;
// 条件分岐です。<cond>の計算結果が0以外の場合、Labelにジャンプします。
//
//  getitem <item_id>,<num>;
// PCの所持品リストにitem_idで指定されるアイテムをnumだけ追加します。
//
//  delitem <item_id>,<num>;
// PCの所持品リストからitem_idで指定されるアイテムをnumだけ削除します。
//
//  viewpoint <type>,<x>,<y>,<id>,<color>;
// ミニマップのx,yの座標にマーク(color色を指定)を付けます。
// <type> 1-表示
//        2-削除
//
//  heal <hp>,<sp>;
// PCのHP/SPをhp,spで指定した値だけ回復させます。
//
//  end;
// ここでスクリプトの実行を終了します。
//
//  setoption <str>;
// PCに以下で示す付属品(?)を付けます。
// 0x0000	- 付属品削除
// 0x0001	- ?
// 0x0002	- ハイド(影付き)
// 0x0004	- ??
// 0x0008	- カート
// 0x0010	- 鷹
// 0x0020	- ペコペコ(ナイト,クルセイダーの時のみ有効)
// 0x0040	- ハイド(影無し)
// 0x0080	- カート2
// 0x0100	- カート3
// 0x0200	- カート4
// 0x0400	- カート5
// 0x0800	- 頭がオーク(Sageのスキル、リバースオーキッシュがかかった状態になる)
// setoptionを実行するとき、元々セットされていた値はクリアされます。
// それぞれの値は加算した値を設定することにより、同時に付属品が付けられます。
// 例えば、0x38でカートを引いて、鷹を連れたペコ乗りナイトといったものもできます。
// setoptionでセットされた値はクライアント終了後も記憶されます。
// [memo]暫定的なので仕様変更の可能性があります。
//
//  savepoint "<gatname>",<x>,<y>;
// セーブポイントをgatname,x,yに設定します
//
// -----
// *関数
// -----
// 条件命令などで以下の関数が使用できます。
//
//  rand(<n>[,n2])
// nのみの場合、0から(n-1)までの数をランダムに返します。
// n2が与えられていた場合は n から n2 までの数をランダムに返します
//
//  countitem(<item_id>)
// プレイヤーの所持する、item_idで指定するアイテムの数を返します
//
// [memo]
// ランダムワープを実装したい場合、範囲実行なscriptを利用します(npc_warp.txtを参照)
//

// scriptの例:
prontera,146,203,2	script	デバッガー要員	116,{
	cutin "kafra_02",2;
	if(countitem(515)<10) goto Llesscarrot;
	mes "[デバッガー要員]";
	mes "あらあら、にんじんを沢山持ってますね。";
	mes "という事で、うさうさ好きと勝手にわたしが認定しました。";
	mes "にんじん10本と交換でうさみみヘアバンドをさしあげますね。";
	next;
	if(countitem(515)<10) goto Llesscarrot_err;
	delitem 515,10;
	getitem 2214,1;
	goto Llesscarrot;
Llesscarrot_err:
	mes "[デバッガー要員]";
	mes "あら？にんじんが足りなくなってますね。";
	mes "という事で今回の事は無かった事にします。";
	next;
// 通常はここから
Llesscarrot:
	mes "[デバッガー要員]";
	mes "いらっしゃいませ。";
	mes "何をしますか?";
	next;
	menu "ステータスポイントを200増やす",Lstp,"スキルポイントを20増やす",Lskill,
	     "お金が欲しいです",Lzeny,"案内のテスト",Lviewpoint,"転職する",Ljobchange,"カートをつける",Lcart,"やめる",Lend;
Lstp:	set StatusPoint,StatusPoint+200;
	goto Lend;
Lskill:	set SkillPoint,SkillPoint+20;
	goto Lend;
Lzeny:	set Zeny,Zeny+1000;
	goto Lend;
Lviewpoint:
	viewpoint 1,156,360,1,0x0000ff;
	mes "[デバッガー要員]";
	mes "プロンテラ城";
	next;
	viewpoint 2,156,360,1,0x0000ff;
	viewpoint 1,156,22,2,0x00ff00;
	viewpoint 1,22,203,3,0x00ff00;
	viewpoint 1,289,203,4,0x00ff00;
	mes "[デバッガー要員]";
	mes "この3箇所から外に出られます。";
	next;
	viewpoint 2,156,22,2,0x00ff00;
	viewpoint 2,22,203,3,0x00ff00;
	viewpoint 2,289,203,4,0x00ff00;
	goto Lend;
Ljobchange:
	cutin "kafra_02",255;
	mes "[デバッガー要員]";
	mes "見た目のみですが";
	mes "転職可能です。";
	mes "転職しても、スキル等は";
	mes "未実装のため使えません。";
	mes "どの職業に転職させますか?";
	next;
	menu	"初心者",Lnv,
		"剣士",Lsm,
		"マジシャン",Lmg,
		"アーチャー",Lac,
		"アコライト",Lal,
		"商人",Lmc,
		"シーフ",Ltf,
		"ナイト",Lkn,
		"プリースト",Lpr,
		"ウィザード",Lwz,
		"鍛冶屋",Lbs,
		"ハンター",Lht,
		"アサシン",Las,
		"おまかせ",Lrandom,
		"やめる",Ljchcancel;
Lnv:	jobchange Job_Novice;	goto Lend;
Lsm:	jobchange Job_Swordman;	goto Lend;
Lmg:	jobchange Job_Mage;	goto Lend;
Lac:	jobchange Job_Archer;	goto Lend;
Lal:	jobchange Job_Acolyte;	goto Lend;
Lmc:	jobchange Job_Merchant;	goto Lend;
Ltf:	jobchange Job_Thief;	goto Lend;
Lkn:	jobchange Job_Knight;	goto Lend;
Lpr:	jobchange Job_Priest;	goto Lend;
Lwz:	jobchange Job_Wizard;	goto Lend;
Lbs:	jobchange Job_Blacksmith;	goto Lend;
Lht:	jobchange Job_Hunter;	goto Lend;
Las:	jobchange Job_Assassin;	goto Lend;
Lrandom:
	mes "[デバッガー要員]";
	mes "では…";
	set l0,rand(13);
	jobchange l0;
	mes "この職業で頑張ってくださいね。";
	goto Lend;
Ljchcancel:	mes "あら、やめるのですか…";
	mes "転職されるときは";
	mes "気軽に声をかけてくださいね";	close;
	goto Lend;
Lcart:
	mes "[デバッガー要員]";
	mes "カートですね。";
	mes "付けますか？それとも外しますか？";
	menu "つける",LattachC,"外す",LremoveC;
LattachC:
	mes "はい、どうぞ。";
	setoption 0x08;
	goto Lend;
LremoveC:
	mes "では、外しますね。";
	setoption 0x00;
	goto Lend;
Lend:	cutin "kafra_02",255;
	close;
	end;	}

prontera,156,195,4	script	カプラ職員	112,{
	mes "[カプラ職員]";
	mes "いらっしゃいませ";
	mes "こちらでは、現在のAthenaの状況を説明いたします。";
	next;
	menu "聞く",Lcont,"聞かない",Lend;
Lcont:	mes "[カプラ職員]";
	mes "AthenaではROエミュ鯖開発スレ35さんのプログラムをベースとして開発がはじまりました"
	mes "途中、ソースの分割化が図られ、現在の状態になっています。";
	next;
	mes "現在実装されているものはつぎの通りです";
	mes "・マップ間移動ポイント";
	mes "・商人NPC";
	mes "・会話NPC　(条件分岐,ラベルジャンプ、ランダム変数、アイテム受け渡し、変数参照、cutin等";
	mes "・変数保存";
	mes "・床アイテム";
	mes "・チャット";
	mes "・戦闘(殴り)";
	mes "・Episode 4以降タイプのパケット仕様";
	mes "・経験値,lv上昇";
	mes "・アイテムの利用の一部";
	next;
	mes "[カプラ職員]";
	mes "逆に現状実装されていないものは大体以下の通りです。";
	mes "・スキル";
	mes "・装備によるパラメータ変化";
	mes "・パーティ/ギルド";
	mes "・ペット";
	mes "・精錬/武器作成";
	next;
	mes "[カプラ職員]";
	mes "それと注意点ですが、AthenaではIDの最後に_Fまたは_Mを付けると新規IDが発行される仕組になっていますが、";
Lcont2:	mes "2回目以降は_F,_Mを付けているとパスワードエラー扱いになります。";
	next;
	mes "[カプラ職員]";
	mes "例えば、初回にID:^ff0000hoge^0000ff_F^000000　pass:0123とloginした場合、hogeがIDとして登録されます。";
	mes "よって、2回目以降はID:^ff0000hoge^000000　pass:0123としてloginして下さい。";
	next;
	mes "[カプラ職員]";
	mes "keepにチェックを入れている場合、若干不便な仕様ですが、以上の点をよろしくお願いします。";
	close;
Lend:	mes "[カプラ職員]";
	mes "では注意点のみ、説明させて頂きます。";
	next;
	mes "[カプラ職員]";
	mes "AthenaではIDの最後に_Fまたは_Mを付けると新規IDが発行される仕組になっていますが、";
	goto Lcont2;	}
