diff options
author | L0ne_W0lf <L0ne_W0lf@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2010-03-31 18:57:22 +0000 |
---|---|---|
committer | L0ne_W0lf <L0ne_W0lf@54d463be-8e91-2dee-dedb-b68131a5f0ec> | 2010-03-31 18:57:22 +0000 |
commit | 6f88f2409f1853ae205573257865462540f935fc (patch) | |
tree | 30598fa37157d159bce0f8712a8b2b38047e2eab /doc/sample | |
parent | d35717644b58c55b50098b3b0a08cf8002d39cca (diff) | |
download | hercules-6f88f2409f1853ae205573257865462540f935fc.tar.gz hercules-6f88f2409f1853ae205573257865462540f935fc.tar.bz2 hercules-6f88f2409f1853ae205573257865462540f935fc.tar.xz hercules-6f88f2409f1853ae205573257865462540f935fc.zip |
Moved /npc/sample/ to /doc/sample. These are examples, not actual npcs.
git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@14277 54d463be-8e91-2dee-dedb-b68131a5f0ec
Diffstat (limited to 'doc/sample')
30 files changed, 2108 insertions, 0 deletions
diff --git a/doc/sample/PCLoginEvent.txt b/doc/sample/PCLoginEvent.txt new file mode 100644 index 000000000..b7020b719 --- /dev/null +++ b/doc/sample/PCLoginEvent.txt @@ -0,0 +1,53 @@ +// eAthena Special NPC + +// PCLoginEvent NPC (davidsiaw) +//============================================================================== +// How it works: +// When a player logs in, the NPC will run as if he just clicked it. Which means +// if the script is like this: +// +// [code] +// prontera,0,0,0 script OnPCLoginEvent -1,{ +// mes "lmao"; +// close; +// } +// [/code] +// +// every player who logs in will receive a message 'lmao' in their face as soon +// as they can see the map. +//----------------------------------------------------------------------------- +// Note: +// 1) This NPC will only run if its name is 'PCLoginEvent' +// 2) I made it invisible because you don't need to see it. Its an abstract NPC +// 3) If you don't want it, simply delete it +// 4) If you have more than one PCLoginEvent NPC, strange things will happen. +// 5) You can put this script in ANY file. +// 6) I put an end; there because that just makes it do nothing. +// 7) Modify this script to your liking and give your players a surprise +// 8) Remember: IT RUNS LIKE A NORMAL NPC. BUT THE ONLY WAY TO 'CLICK' IT IS BY +// LOGGING ON +// 9) There are 2 ways to use this - check the examples below! + +// +// The 1st type -- with 'event_script_type' set to 0 +// +prontera,0,0,0 script OnPCLoginEvent -1,{ + end; +} + +// +// The 2nd type -- with 'event_script_type' set to 1 +// +prontera,155,175,0 script An NPC 46,{ + close; +OnPCLoginEvent: + // this part will run + close; +} + +prontera,156,176,0 script Another NPC 46,{ + close; +OnPCLoginEvent: + // this part runs AS WELL + close; +}
\ No newline at end of file diff --git a/doc/sample/bank_test.txt b/doc/sample/bank_test.txt new file mode 100644 index 000000000..4baac7b4e --- /dev/null +++ b/doc/sample/bank_test.txt @@ -0,0 +1,58 @@ +// Bank Test +prontera,162,188,1 script Bank Test 112,{ + cutin "kafra_06",2; + + mes "[Bank Test]"; + mes "Welcome to Prontera's Bank Test."; + mes "You can only deposit a minimal of"; + mes "1000z. What do you want to do?"; + next; + menu "Deposit",BANK_IN,"Withdraw",BANK_OUT,"Exit",B_EXIT2; +BANK_IN: + mes "[Bank Test]"; + mes "You must deposit the same of less"; + mes "amount of zeny that you carry."; + mes "How much do you want to deposit?"; + next; + input @kafrabank; + + if(@kafrabank<1000) goto B_EXIT2; + set @kafrabank2,@kafrabank*1/100; + if(@kafrabank+@kafrabank2>Zeny) goto BANK_F; + set Zeny,Zeny-@kafrabank-@kafrabank2; + set #kafrabank,#kafrabank+@kafrabank; + mes "You now have: ^135445" + @kafrabank2 + "z^000000"; + + goto B_EXIT; +BANK_OUT: + if(#kafrabank==0) goto BANK_F2; + mes "[Bank Test]"; + mes "You can only withdraw equally or below this quantity:"; + mes "^135445" + #kafrabank + "^000000z"; + mes "How much do you want to withdraw?"; + next; + input @kafrabank; + + if(@kafrabank<1) goto B_EXIT2; + if(@kafrabank>#kafrabank) goto BANK_F; + set #kafrabank,#kafrabank-@kafrabank; + set Zeny,Zeny+@kafrabank; + + goto B_EXIT; + +BANK_F: + mes "[Bank Test]"; + mes "You can't withdraw more than ^135445"+ #kafrabank + "^000000z."; + goto B_EXIT2; +BANK_F2: + mes "[Bank Test]"; + mes "Your account is empty, you may not withdraw at this time."; + goto B_EXIT2; + +B_EXIT: + mes "Thanks for using depositing"; +B_EXIT2: + mes "Good bye!"; + cutin "kafra_06",255; + close; +}
\ No newline at end of file diff --git a/doc/sample/basejob_baseclass_upper.txt b/doc/sample/basejob_baseclass_upper.txt new file mode 100644 index 000000000..913707404 --- /dev/null +++ b/doc/sample/basejob_baseclass_upper.txt @@ -0,0 +1,7 @@ +prontera,155,177,1 script Tell Me 725,{ + mes "[Tell Me]"; + mes "Class: " + Class; + mes "BaseClass: " + BaseClass; + mes "BaseJob: " + BaseJob; + mes "Upper: " + Uppser; +}
\ No newline at end of file diff --git a/doc/sample/delitem2.txt b/doc/sample/delitem2.txt new file mode 100644 index 000000000..ef781e81f --- /dev/null +++ b/doc/sample/delitem2.txt @@ -0,0 +1,29 @@ +prontera,160,182,5 script Deleter2 51,{ + mes "Input item ID"; + next; + input @nameid; + mes "Amount?"; + next; + input @amount; + mes "Identified?"; + next; + input @iden; + mes "How many times refined?"; + next; + input @ref; + mes "Attribute?"; + next; + input @attr; + mes "4 cards (one after another):"; + next; + input @c1; + input @c2; + input @c3; + input @c4; + mes "Your command is:"; + mes "delitem2 "+@nameid+","+@amount+","+@iden+","+@ref+","+@attr+","+@c1+","+@c2+","+@c3+","+@c4; + next; + delitem2 @nameid,@amount,@iden,@ref,@attr,@c1,@c2,@c3,@c4; + mes "And here is the moment when Your item should disappear :P"; + close; +}
\ No newline at end of file diff --git a/doc/sample/getequipcardid.txt b/doc/sample/getequipcardid.txt new file mode 100644 index 000000000..b1fe55505 --- /dev/null +++ b/doc/sample/getequipcardid.txt @@ -0,0 +1,34 @@ +//===== eAthena Script ======================================= +//===== By: ================================================== +//= Lupus +//= Shows your HAT's slots IDs +//= Use it for some checks... e.g. +//= is your EQUPPED weapon has FIRE property? +//= is your EQUPPED item produced? +//============================================================ + +prontera,155,177,4 script Check My Hat 810,{ + mes "Checking your head..."; + set @ref,0; + + if (getequipisequiped(1)) goto L_CHECK1; + mes "Nothing?"; + emotion e_hmm; + close; + +L_CHECK1: + set @id,getequipid(1); + if(getequipisidentify(1)) goto L_CHECK2; + mes "How can you wear not identified hats?"; + npctalk "You're a cheater!"; + emotion e_wah; + close; + +L_CHECK2: + set @ref,getequiprefinerycnt(1); + mes "Your hat is... "+getitemname(@id)+"..."; + if(@ref)mes "It has been refined "+@ref+" times."; + mes "Card Slot 0:"+getequipcardid(1,0)+" 1:"+getequipcardid(1,1); + mes "Card Slot 2:"+getequipcardid(1,2)+" 3:"+getequipcardid(1,3); + close; +}
\ No newline at end of file diff --git a/doc/sample/getiteminfo.txt b/doc/sample/getiteminfo.txt new file mode 100644 index 000000000..e98212739 --- /dev/null +++ b/doc/sample/getiteminfo.txt @@ -0,0 +1,16 @@ +//by Lupus + +prontera,156,179,6 script test_getiteminfo 117,{ + mes "Please enter an item ID (501 ... 14000)"; + input @value; +//WOW! this line uses INTERNAL function of your client to show item name by its ID! +// ^nItemID^XXXX -> Item Name + mes "Item ID: "+@value+" ^nItemID^"+@value; + mes "Current Item info:"; + set @id,0; +L_LOOP: + mes " getiteminfo("+@value+","+@id+") = "+getiteminfo(@value,@id); + set @id,@id+1; + if(@id<14) goto L_LOOP; + close; +}
\ No newline at end of file diff --git a/doc/sample/getmonsterinfo.txt b/doc/sample/getmonsterinfo.txt new file mode 100644 index 000000000..fd30c66df --- /dev/null +++ b/doc/sample/getmonsterinfo.txt @@ -0,0 +1,18 @@ +//by Lupus + +prontera,156,179,6 script test_getmonsterinfo 117,{ + mes "Please enter a monster ID (1001 ... 2000)"; + input @value; + if(getmonsterinfo(@value,MOB_LV)<0 || getmonsterinfo(@value,MOB_NAME)=="Dummy") { + mes "Wrong MOB ID."; + close; + } + mes "Monster ID: "+@value+" '"+getmonsterinfo(@value,MOB_NAME)+"'"; + mes "Current Monster info:"; + set @id,0; +L_LOOP: + mes " getmonsterinfo("+@value+","+@id+") = "+getmonsterinfo(@value,@id); + set @id,@id+1; + if(@id<22) goto L_LOOP; + close; +}
\ No newline at end of file diff --git a/doc/sample/gstorage_test.txt b/doc/sample/gstorage_test.txt new file mode 100644 index 000000000..6c97fa2bc --- /dev/null +++ b/doc/sample/gstorage_test.txt @@ -0,0 +1,70 @@ +/* Guild Warehouse Service Test-Script +prontera,165,188,4 script Guild Warehouse 112,{ + cutin "kafra_06",2; + + mes "[Guild Warehouse Coupler]"; + mes "This is the guild warehouse coupler service."; + mes "You will not receive zeny for this is a test."; + next; + menu "Access Guild Warehouse", GS_OPEN, "Exit", GS_EXIT3; + +GS_OPEN: + set @flag,guildopenstorage(0); + if(@flag == 1) goto GS_EXIT1; + if(@flag == 2) goto GS_EXIT2; + goto GS_EXIT4; + +GS_EXIT1: + mes "[Guild Warehouse]"; + mes "The guild warehouse is being used right now."; + mes "Please wait a while, then come back."; + goto GS_EXIT4; + +GS_EXIT2: + mes "[Guild Warehouse]"; + mes "You can't use this service if you're not in a guild!"; + goto GS_EXIT4; + +GS_EXIT3: + mes "[Guild Warehouser]"; + mes "Come back whenever you want."; + +GS_EXIT4: + cutin "kafra_06",255; + close; +} +*/ + +// カプラギルド倉庫サービス テストスクリプト +prontera,165,188,4 script ギルド倉庫カプラ 112,{ + cutin "kafra_06",2; + + mes"[ギルド倉庫カプラ]"; + mes "カプラギルド倉庫サービスです。"; + mes "毎度ご利用ありがとうございます♪"; + mes "テスト用なので金は貰いません。"; + next; + menu "ギルド倉庫を利用する",GS_OPEN,"やっぱやめる",GS_EXIT3; + +GS_OPEN: + set @flag,guildopenstorage(0); + if(@flag == 1) goto GS_EXIT1; + if(@flag == 2) goto GS_EXIT2; + goto GS_EXIT4; + +GS_EXIT1: + mes "ギルドメンバーが倉庫を使用中です。"; + mes "しばらく待ってから利用してください。"; + goto GS_EXIT4; + +GS_EXIT2: + mes "ギルドに所属してない方は利用することができません。"; + goto GS_EXIT4; + +GS_EXIT3: + mes "またのご利用をお待ちしています♪"; + +GS_EXIT4: + cutin "kafra_06",255; + close; +}
\ No newline at end of file diff --git a/doc/sample/localized_npc.txt b/doc/sample/localized_npc.txt new file mode 100644 index 000000000..3a721d108 --- /dev/null +++ b/doc/sample/localized_npc.txt @@ -0,0 +1,151 @@ +//===== eAthena Script ======================================= +//= Sample localized NPC +//===== By: ================================================== +//= eAthena Dev Team +//===== Current Version: ===================================== +//= v1.0 +//===== Compatible With: ===================================== +//= eAthena with setd, getd +//===== Description: ========================================= +//= Example of a localized NPC. +//= +//= There are many ways to do it, this is just one option. +//= The player has a global account variable ##_langid_ that +//= identifies the it's language. +//= +//= The default language should always have langid 0. +//= When a message isn't found for the player's langid +//= (strlen = 0), the message from langid 0 is used instead. +//= +//= Each message is identified by a string that must only +//= contain valid variable name characters. +//= +//= void setlang(int langid) +//= - sets the player's language +//= int getlang(void) +//= - returns the player's language +//= void setmes2(string name,int langid,string text) +//= - sets the localized text for name +//= string getmes2(string name,int langid) +//= - returns the localized text of name +//= void mes2(string name) +//= - displays the localized text of name +//= +//===== Additional Comments: ================================= +//= To use this globally, just put the functions in Global_Functions.txt +//============================================================ + +////////////////////////////////////////////////////////////// +/// Sets the language of the player account. +/// @param langid Languange identifier (0 for default) +function script setlang { + set ##_langid_, getarg(0); + return; +} + +////////////////////////////////////////////////////////////// +/// Returns the language identifier of the player +function script getlang { + return ##_langid_; +} + +////////////////////////////////////////////////////////////// +/// Sets a localized text entry. +/// Does not need a RID attached. +/// @param name Message identifier +/// @param langid Language identifier (0 for default) +/// @param text Text message +function script setmes2 { + set $@mes2_name$, getarg(0); + set $@mes2_langid, getarg(1); + set $@mes2_text$, getarg(2); + set $@mes2_var$, "$@__"+ $@mes2_name$ +"_"+ $@mes2_langid +"$"; + + //debugmes "setmes2 \""+ $@mes2_var$ +"\", \""+ $@mes2_text$ +"\";"; + + // set the localized text + setd $@mes2_var$, $@mes2_text$; + return; +} + +////////////////////////////////////////////////////////////// +/// Sets a localized text entry. +/// Does not need a RID attached. +/// @param name Message identifier +/// @param langid Language identifier (0 for default) +/// @return Text message +function script getmes2 { + set $@mes2_name$, getarg(0); + set $@mes2_langid, getarg(1); + set $@mes2_var$, "$@__"+ $@mes2_name$ +"_"+ $@mes2_langid +"$"; + set $@mes2_text$, getd($@mes2_var$); + + //debugmes "getmes2(\""+ $@mes2_var$ +"\")=\""+ $@mes2_text$ +"\""; + + return $@mes2_text$; +} + +////////////////////////////////////////////////////////////// +/// mes for localized text. +/// index should be a unique string, made up only of characters +/// that are valis as a variable name +/// @param index Message identifier +function script mes2 { + set @mes2_index$, getarg(0); + + if( getstrlen(@mes2_index$) == 0 ) + return; // invalid index + + // print localized text + set @mes2_text$, callfunc("getmes2",@mes2_index$,##_langid_); + if( getstrlen(@mes2_text$) == 0 ) + { + if( ##_langid_ != 0 ) + {// revert to default language + set @mes2_text$, callfunc("getmes2",@mes2_index$,0); + if( getstrlen(@mes2_text$) != 0 ) + mes @mes2_text$; // default text + } + } else + mes @mes2_text$; // localized text + return; +} + +////////////////////////////////////////////////////////////// +/// Sample localized NPC +prontera,155,183,4 script LocalizedNPC 705,{ + // Get text for specific languages + set @menu1$, callfunc("getmes2","LNPC_lang",0); + set @menu2$, callfunc("getmes2","LNPC_lang",1); + do { + // get text that fallbacks to language 0 + callfunc "mes2", "LNPC_name"; + // localized mes + callfunc "mes2", "LNPC_lang"; + callfunc "mes2", "LNPC_text"; + next; + + switch(select(@menu1$,@menu2$,"Cancel")) + { + case 1: + case 2: + // Set player language + callfunc "setlang",@menu-1; + break; + } + } while( @menu != 3 ); + close; + end; + +OnInterIfInitOnce: + // Load the localized text. + // This can be anywhere, as long as it's executed before the coresponding getmes2/mes2 calls + // 0 - English (default) + // 1 - Portuguese + callfunc "setmes2", "LNPC_name", 0, "[LocalizedNPC]"; + callfunc "setmes2", "LNPC_lang", 0, "EN"; + callfunc "setmes2", "LNPC_lang", 1, "PT"; + callfunc "setmes2", "LNPC_text", 0, "Something in english"; + callfunc "setmes2", "LNPC_text", 1, "Algo em portugu黌"; + end; +}
\ No newline at end of file diff --git a/doc/sample/npc_dynamic_shop.txt b/doc/sample/npc_dynamic_shop.txt new file mode 100644 index 000000000..1a1f174c9 --- /dev/null +++ b/doc/sample/npc_dynamic_shop.txt @@ -0,0 +1,85 @@ +- shop dyn_shop1 -1,501:50 + +prontera,181,200,4 script Dynamic Shop 123,{ +callshop "dyn_shop1",0; +npcshopattach "dyn_shop1"; +end; + +OnSellItem: +for(set @i, 0; @i < getarraysize(@sold_nameid); set @i, @i + 1){ + if(countitem(@sold_nameid[@i]) < @sold_quantity[@i] && @sold_quantity[@i] <= 0){ + mes "omgh4x!"; + close; + } + if(@sold_nameid[@i] == 501){ + set $@rpotsleft, $@rpotsleft + @sold_quantity[@i]; + set Zeny, Zeny + @sold_quantity[@i]*20; + delitem 501, @sold_quantity[@i]; + } else { + if(@sold_nameid[@i] == 502){ + set $@opotsleft, $@opotsleft + @sold_quantity[@i]; + set Zeny, Zeny + @sold_quantity[@i]*100; + delitem 502, @sold_quantity[@i]; + } else { + mes "Sorry, I don't need your items."; + } + } +} +deletearray @sold_quantity, getarraysize(@sold_quantity); +deletearray @sold_nameid, getarraysize(@sold_nameid); +mes "Deal completed."; +close; + +OnBuyItem: +for(set @i, 0; @i < getarraysize(@bought_nameid); set @i, @i + 1){ + if(@bought_quantity[@i] <= 0){ + mes "omgh4x!"; + end; + } + if(@bought_nameid[@i] == 501){ + if(@bought_quantity[@i] > $@rpotsleft){ + if($@rpotsleft > 0){ + set @bought_quantity[@i], $@rpotsleft; + } else { + mes "We are out of red potions!"; + close; + } + } + if(Zeny >= 40*@bought_quantity[@i]){ + set Zeny, Zeny - 40*@bought_quantity[@i]; + getitem 501, @bought_quantity[@i]; + set $@rpotsleft, $@rpotsleft - @bought_quantity[@i]; + } else { + mes "You have insufficient cash."; + close; + } + } else { + if(@bought_quantity[@i] > $@opotsleft){ + if($@opotsleft > 0){ + set @bought_quantity[@i], $@opotsleft; + } else { + mes "We are out of orange potions!"; + close; + } + } + if(Zeny >= 200*@bought_quantity[@i]){ + set Zeny, Zeny - 200*@bought_quantity[@i]; + getitem 502, @bought_quantity[@i]; + set $@opotsleft, $@opotsleft - @bought_quantity[@i]; + } else { + mes "You have insufficient cash."; + close; + } + } +} +deletearray @bought_quantity, getarraysize(@bought_quantity); +deletearray @bought_nameid, getarraysize(@bought_nameid); +mes "Trade done."; +close; + +OnInit: +npcshopitem "dyn_shop1", 501,40,502,200; +set $@rpotsleft, 10; +set $@opotsleft, 10; +end; +}
\ No newline at end of file diff --git a/doc/sample/npc_equip_sample.txt b/doc/sample/npc_equip_sample.txt new file mode 100644 index 000000000..6cd6f5e69 --- /dev/null +++ b/doc/sample/npc_equip_sample.txt @@ -0,0 +1,16 @@ + +prontera,161,181,6 script GetEquipID Sample 105,{ + mes "[GetEquipID Sample]"; + mes " GetEquipID(01) : " + getequipid(1); + mes " GetEquipID(02) : " + getequipid(2); + mes " GetEquipID(03) : " + getequipid(3); + mes " GetEquipID(04) : " + getequipid(4); + mes " GetEquipID(05) : " + getequipid(5); + mes " GetEquipID(06) : " + getequipid(6); + mes " GetEquipID(07) : " + getequipid(7); + mes " GetEquipID(08) : " + getequipid(8); + mes " GetEquipID(09) : " + getequipid(9); + mes " GetEquipID(10) : " + getequipid(10); + close; + end; +} diff --git a/doc/sample/npc_extend_shop.txt b/doc/sample/npc_extend_shop.txt new file mode 100644 index 000000000..833db80dc --- /dev/null +++ b/doc/sample/npc_extend_shop.txt @@ -0,0 +1,60 @@ +//SuperNovice +prontera,182,213,3 shop Super Novice Shop 716,1243:-1,2112:-1,2340:-1,2352:-1,2414:-1,2510:-1,2628:-1,5055:-1 + +//Whips +prontera,149,139,5 shop Whips Merchant 58,1951:-1,1953:-1,1955:-1,1957:-1,1959:-1,1961:-1,1962:-1,1963:-1,1964:-1 + +//Headgears +prontera,162,175,3 shop Headgears Merchant 1 73,2209:-1,2210:-1,2211:-1,2221:-1,2223:-1,2217:-1,2227:-1,2231:-1,2225:-1,2229:-1 + +//Headgears +prontera,162,172,3 shop Headgears Merchant 2 73,2203:-1,2212:-1,2218:-1,2239:-1,2241:-1,2242:-1,2243:-1,2263:-1,2265:-1,2276:-1,2288:-1,2291:-1,2297:-1 + +//Armor +prontera,162,169,3 shop Armours Merchant 73,2311:-1,2313:-1,2315:-1,2317:-1,2318:-1,2320:-1,2322:-1,2324:-1,2326:-1,2327:-1,2329:-1,2331:-1,2334:-1,2336:-1,2337:-1,2342:-1 + +//Shields +prontera,162,166,3 shop Shields Merchant 73,2102:-1,2104:-1,2106:-1,2108:-1,2109:-1,2110:-1,2111:-1 + +//Boots +prontera,162,163,3 shop Boots Merchant 73,2402:-1,2404:-1,2406:-1,2407:-1,2412:-1,2413:-1 + +//Robes +prontera,162,160,3 shop Robes Merchant 73,2502:-1,2504:-1,2506:-1,2507:-1,2508:-1,2509:-1 + +//Accessory +prontera,162,157,3 shop Accessory Merchant 73,2601:-1,2602:-1,2603:-1,2604:-1,2605:-1,2607:-1,2608:-1,2615:-1,2616:-1,2618:-1,2619:-1 + +//Arrows +prontera,162,154,3 shop Arrows Merchant 73,1750:-1,1751:-1,1752:-1,1753:-1,1754:-1,1755:-1,1756:-1,1757:-1,1758:-1,1759:-1,1760:-1,1761:-1,1762:-1,1763:-1,1764:-1,1765:-1,1766:-1,1767:-1,1768:-1,1769:-1 + +//Alchemist +prontera,162,151,3 shop Alchemist Shop 73.7127:-1,7128:-1,7129:-1,7130:-1,7131:-1,7132:-1,7133:-1,7144:-1,7134:-1,1093:-1 + +//Taming Merchant +prontera,162,148,3 shop Taming Merchant 73,619:-1,620:-1,621:-1,623:-1,624:-1,625:-1,626:-1,627:-1,628:-1,629:-1,630:-1,631:-1,632:-1,633:-1,634:-1,635:-1,636:-1,637:-1,638:-1,639:-1,640:-1,641:-1,642:-1,659:-1 + +//Pet Equipment +prontera,162,145,3 shop Pet Equipment 73,10001:-1,10002:-1,10003:-1,10004:-1,10005:-1,10006:-1,10007:-1,10008:-1,10009:-1,10010:-1,10011:-1,10012:-1,10013:-1,10014:-1,10015:-1,10016:-1,10017:-1,10018:-1,10019:-1,10020:-1 + + +//Weapon Cards +prontera,148,234,5 shop Weapon Card's Merchant 80,4004:100000,4018:100000,4025:100000,4026:100000,4019:100000,4029:100000,4043:100000,4017:100000,4020:100000,4024:100000,4037:100000,4055:100000,4057:100000,4076:100000,4096:100000,4104:100000,4030:100000,4049:100000,4062:100000,4069:100000,4085:100000,4007:100000,4060:100000,4063:100000,4068:100000,4080:100000,4094:100000,4111:100000,4118:100000,4082:20700,4092:100000,4126:100000,4072:100000,4115:100000,4035:100000,4086:100000,4106:100000,4117:100000,4125:100000 + +//Headgear Cards +prontera,148,231,5 shop Headgear Card's Merchant 80,4010:100000,4039:100000,4046:100000,4052:100000,4087:100000,4110:100000,4112:100000,4122:100000,4127:100000 + +//Armor Cards +prontera,146,229,5 shop Armor Card's Merchant 80,4003:100000,4008:100000,4011:100000,4014:100000,4016:100000,4021:100000,4023:100000,4031:100000,4078:100000,4089:100000,4098:100000,4099:100000,4101:100000,4114:100000,4119:100000,4141:100000,4061:100000,4105:100000 + +//Shield Cards +prontera,144,227,5 shop Shield Card's Merchant 80,4013:100000,4032:100000,4058:100000,4059:100000,4066:100000,4074:100000,4083:100000,4120:100000,4124:100000,4136:100000,4138:100000,4045:100000,4067:100000,4075:100000,4090:100000 + +//Robe Cards +prontera,142,225,5 shop Robe Card's Merchant 80,4056:100000,4071:100000,4081:100000,4095:100000,4108:100000,4109:100000,4113:100000,4116:100000,4133:100000,4015:100000,4088:100000,4102:100000,4129:100000 + +//Shoe Cards +prontera,140,223,5 shop Shoes Card's Merchant 80,4009:100000,4038:100000,4050:100000,4070:100000,4097:100000,4100:100000,4107:100000 + +//Accessory Cards +prontera,138,221,5 shop Accessory Card's Merchant 80,4022:100500,4027:100500,4028:100500,4034:100500,4051:100500,4064:100500,4091:100500,4079:100500,4033:100500,4040:100500,4044:100500,4048:100500,4053:100500,4073:100500,4077:100500,4084:100500,4093:100500,4103:100500,4139:100500
\ No newline at end of file diff --git a/doc/sample/npc_live_dialogues.txt b/doc/sample/npc_live_dialogues.txt new file mode 100644 index 000000000..a82c14e89 --- /dev/null +++ b/doc/sample/npc_live_dialogues.txt @@ -0,0 +1,51 @@ +//by Lupus. +// *** Usage of Global_Functions.txt (you can translate Global_Functions.txt function messages) +// Here's a polite wolf NPC ^_- Luppy +// learn how to make your NPC more alive. +// PS don't use it as a normal NPC in your server. It's exploitable 8) + +prontera,167,177,5 script Luppy 1107,{ + mes "[Luppy]"; + + //say random greeting from Global_Functions.txt + mes callfunc("F_Hi"); + + //say a compliment according to player's gender + //1st string is for FEMALE, 2nd for MALE + mes callfunc("F_Sex","What a beautiful lady!","What a handsome man!"); + + //add some random greeting and goodbye into the menu + menu callfunc("F_Hi"),-, callfunc("F_Bye"),M_BYE; + + mes "[Luppy]"; + //give a random prize from set list of items + if(@gotstuff){ + //again, say stuff according to player's gender + mes "I like "+callfunc("F_Sex","smiling ladies!","bloody pirates!"); + + //show one of 3 emotion from the list (we added ,1 to show emotion over PLAYER's head) + emotion callfunc("F_RandMes",3,e_scissors,e_kis,e_pat),1; + close; + } + + //we set a temp var to give present just once. Player can get more by RE-entering the server + set @gotstuff,1; + + //get item Id from the list of presents: Apple, Mastela Fruit, Yggdrasil Seed or Orange Juice + set @itemIDfromList, callfunc("F_RandMes",4,512,522,608,620); + + //again, say stuff according to player's gender + mes "Hey, "+callfunc("F_Sex","sister!","brother!")+" I have "+getitemname(@itemIDfromList)+" for you!"; + + //get the item from the list + getitem @itemIDfromList,1; + close; + +M_BYE: + mes "[Luppy]"; + //add some random goodbye from Global_Functions.txt + mes callfunc("F_Bye"); + close; +} + +//Please, be more creative. Or else this li'l wolfy would eat you up!
\ No newline at end of file diff --git a/doc/sample/npc_pcre.txt b/doc/sample/npc_pcre.txt new file mode 100644 index 000000000..906e076e3 --- /dev/null +++ b/doc/sample/npc_pcre.txt @@ -0,0 +1,392 @@ +prontera,152,181,5 script MouseJstr 763,{ + +// hello +Lquote0: + npctalk "How do you do. Please state your problem."; + end; + +// computer +Lquote1: + switch(rand(4)) { + case 0: npctalk "Do computers worry you?"; break; + case 1: npctalk "What do you think about machines?"; break; + case 2: npctalk "Why do you mention computers?"; break; + case 3: npctalk "What do you think machines have to do with your problem?"; break; + } + end; + +// name +Lquote2: + npctalk "I am not interested in names"; + end; + +// sorry +Lquote3: + switch(rand(3)) { + case 0: npctalk "Please don't apologize"; break; + case 1: npctalk "Apologies are not necessary"; break; + case 2: npctalk "What feelings do you have when you apologize"; break; + } + end; + +// I remember $@p2$ +Lquote4: + switch(rand(6)) { + case 0: npctalk "Do you often think of "+$@p2$+"?"; break; + case 1: npctalk "Does thinking of "+$@p2$+" bring anything else to mind?"; break; + case 2: npctalk "What else do you remember?"; break; + case 3: npctalk "Why do you recall "+$@p2$+" right now?"; break; + case 4: npctalk "What in the present situation reminds you of "+$@p2$+"?"; break; + case 5: npctalk "What is the connection between me and "+$@p2$+"?"; break; + } + end; + +// do you remember +Lquote5: + switch (rand(4)) { + case 0: npctalk "Did you think I would forget "+$@p2$+" ?"; break; + case 1: npctalk "Why do you think I should recall "+$@p2$+" now"; break; + case 2: npctalk "What about "+$@p2$+""; break; + case 3: npctalk "You mentioned "+$@p2$+""; break; + } + end; + +// if +Lquote6: + switch(rand(4)) { + case 0: npctalk "Do you really think its likely that "+$@p2$+""; break; + case 1: npctalk "Do you wish that "+$@p2$+"?"; break; + case 2: npctalk "What do you think about "+$@p2$+"?"; break; + case 3: npctalk "Really-- if "+$@p2$+"?"; break; + } + end; + +// i dreamt +Lquote7: + switch(rand(3)) { + case 0: npctalk "Really-- "+$@p2$+""; break; + case 1: npctalk "Have you ever fantasized "+$@p2$+" while you were awake?"; break; + case 2: npctalk "Have you dreamt "+$@p2$+" before?"; break; + } + end; + +// dream about +Lquote8: + npctalk "How do you feel about "+$@p2$+" in reality?"; + end; + +// dream +Lquote9: + switch(rand(4)) { + case 0: npctalk "What does this dream suggest to you?"; break; + case 1: npctalk "Do you dream often?"; break; + case 2: npctalk "What persons appear in your dreams?"; break; + case 3: npctalk "Don't you believe that dream has to do with your problem?"; break; + } + end; + +// my mother +Lquote10: + switch(rand(2)) { + case 0: npctalk "Who else in your family "+$@p2$+""; break; + case 1: npctalk "Tell me more about your family"; break; + } + end; + +// my father +Lquote11: + switch(rand(3)) { + case 0: npctalk "Your father"; break; + case 1: npctalk "Does he influence you strongly?"; break; + case 2: npctalk "What else comes to mind when you think of your father?"; break; + } + end; + +// I want +Lquote12: + switch(rand(3)) { + case 0: npctalk "What would it mean if you got "+$@p2$+""; break; + case 1: npctalk "Why do you want "+$@p2$+""; break; + case 2: npctalk "Suppose you got "+$@p2$+" soon"; break; + } + end; + +// I am glad +Lquote13: + switch(rand(3)) { + case 0: npctalk "How have I helped you to be "+$@p2$+""; break; + case 1: npctalk "What makes you happy just now"; break; + case 2: npctalk "Can you explain why you are suddenly "+$@p2$+""; break; + } + end; + +// I am sad +Lquote14: + switch(rand(2)) { + case 0: npctalk "I am sorry to hear you are depressed"; break; + case 1: npctalk "I'm sure its not pleasant to be sad"; break; + } + end; + +// $@p2 are like "+$@p3$+" +Lquote15: + npctalk "What resemblance do you see between "+$@p2$+" and "+$@p3$+""; + end; + +// "+$@p2$+" is like "+$@p3$+" +Lquote16: + switch(rand(4)) { + case 0: npctalk "In what way is it that "+$@p2$+" is like "+$@p3$+""; break; + case 1: npctalk "What resemblance do you see?"; break; + case 2: npctalk "Could there really be some connection?"; break; + case 3: npctalk "How?"; break; + } + end; + +// alike +Lquote17: + switch(rand(2)) { + case 0: npctalk "In what way?"; break; + case 1: npctalk "What similarities are there?"; break; + } + end; + +// same +Lquote18: + npctalk "What other connections do you see?"; + end; + +// I was "+$@p2$+" +Lquote19: + switch(rand(3)) { + case 0: npctalk "Were you really?"; break; + case 1: npctalk "Perhaps I already knew you were "+$@p2$+""; break; + case 2: npctalk "Why do you tell me you were "+$@p2$+" now?"; break; + } + end; + +// was I +Lquote20: + switch(rand(3)) { + case 0: npctalk "What if you were "+$@p2$+" ?"; break; + case 1: npctalk "Do you thin you were "+$@p2$+""; break; + case 2: npctalk "What would it mean if you were "+$@p2$+""; break; + } + end; + +// I am +Lquote21: + switch(rand(2)) { + case 0: npctalk "In what way are you "+$@p2$+""; break; + case 1: npctalk "Do you want to be "+$@p2$+" ?"; break; + } + end; + +// am I +Lquote22: + switch(rand(4)) { + case 0: npctalk "Do you believe you are "+$@p2$+""; break; + case 1: npctalk "Would you want to be "+$@p2$+""; break; + case 2: npctalk "You wish I would tell you you are "+$@p2$+""; break; + case 3: npctalk "What would it mean if you were "+$@p2$+""; break; + } + end; + +// am +Lquote23: + switch(rand(2)) { + case 0: npctalk "Why do you say AM?"; break; + case 1: npctalk "I don't understand that"; break; + } + end; + +// are you +Lquote24: + switch(rand(3)) { + case 0: npctalk "Why are you interested in whether I am "+$@p2$+" or not?"; break; + case 1: npctalk "Would you prefer if I weren't "+$@p2$+""; break; + case 2: npctalk "Perhaps I am "+$@p2$+" in your fantasies"; break; + } + end; + +// you are +Lquote25: + npctalk "What makes you think I am "+$@p2$+" ?"; + end; + +// because +Lquote26: + switch(rand(3)) { + case 0: npctalk "Is that the real reason?"; break; + case 1: npctalk "What other reasons might there be?"; break; + case 2: npctalk "Does that reason seem to explain anything else?"; break; + } + end; + +// were you +Lquote27: + switch(rand(3)) { + case 0: npctalk "Perhaps I was "+$@p2$+""; break; + case 1: npctalk "What do you think?"; break; + case 2: npctalk "What if I had been "+$@p2$+""; break; + } + end; + +// I can't +Lquote28: + switch(rand(2)) { + case 0: npctalk "Maybe you could "+$@p3$+" now"; break; + case 1: npctalk "What if you could "+$@p3$+" ?"; break; + } + end; + +// I feel +Lquote29: + npctalk "Do you often feel "+$@p2$+" ?"; + end; + +// I felt +Lquote30: + npctalk "What other feelings do you have?"; + end; + +// $@p1$ I $@p2$ you $@p3$ +Lquote31: + npctalk "Perhaps in your fantasy we "+$@p3$+" each other?"; + end; + +// why don't you +Lquote32: + switch(rand(3)) { + case 0: npctalk "Should you "+$@p3$+" yourself?"; break; + case 1: npctalk "Do you believe I don't "+$@p3$+""; break; + case 2: npctalk "Perhaps I will "+$@p3$+" in good time"; break; + } + end; + +// yes +Lquote33: + switch(rand(3)) { + case 0: npctalk "You seem quite positive"; break; + case 1: npctalk "You are sure?"; break; + case 2: npctalk "I understand"; break; + } + end; + +// no +Lquote34: + switch(rand(3)) { + case 0: npctalk "Why not?"; break; + case 1: npctalk "You are being a bit negative"; break; + case 2: npctalk "Are you saying NO just to be negative?"; break; + } + end; + +// someone +Lquote35: + npctalk "Can you be more specific?"; + end; + +// everyone +Lquote36: + switch(rand(4)) { + case 0: npctalk "surely not everyone"; break; + case 1: npctalk "Can you think of anyone in particular?"; break; + case 2: npctalk "Who for example?"; break; + case 3: npctalk "You are thinking of a special person?"; break; + } + end; + +// always +Lquote37: + switch(rand(4)) { + case 0: npctalk "Can you think of a specific example?"; break; + case 1: npctalk "When?"; break; + case 2: npctalk "What incident are you thinking of?"; break; + case 3: npctalk "Really-- always?"; break; + } + end; + +// what +Lquote38: + switch(rand(5)) { + case 0: npctalk "Why do you ask?"; break; + case 1: npctalk "Does that question interest you?"; break; + case 2: npctalk "What is it you really want to know?"; break; + case 3: npctalk "What do you think?"; break; + case 4: npctalk "What comes to your mind when you ask that?"; break; + } + end; + +// perhaps +Lquote39: + npctalk "You do not seem quite certain"; + end; + +// are +Lquote40: + switch(rand(2)) { + case 0: npctalk "Did you think they might not be "+$@p2$+""; break; + case 1: npctalk "Possibly they are "+$@p2$; break; + } + end; + +// default +Lquote41: + switch(rand(6)) { + case 0: npctalk "Very interesting"; break; + case 1: npctalk "I am not sure I understand you fully"; break; + case 2: npctalk "What does that suggest to you?"; break; + case 3: npctalk "Please continue"; break; + case 4: npctalk "Go on"; break; + case 5: npctalk "Do you feel strongly about discussing such things?"; break; + } + end; + +OnInit: + defpattern 1, "([^:]+):.*\\shello.*", "Lquote0"; + defpattern 1, "([^:]+):.*\\scomputer.*", "Lquote1"; + defpattern 1, "([^:]+):.*\\sname.*", "Lquote2"; + defpattern 1, "([^:]+):.*\\ssorry.*", "Lquote3"; + defpattern 1, "([^:]+):.*\\si\\s+remember\\s+(.*)", "Lquote4"; + defpattern 1, "([^:]+):.*\\sdo\\s+you\\s+remember\\s+(.*)", "Lquote5"; + defpattern 1, "([^:]+):.*\\sif\\s+(.*)", "Lquote6"; + defpattern 1, "([^:]+):.*\\si\\s+dreamt\\s+(.*)", "Lquote7"; + defpattern 1, "([^:]+):.*\\sdream\\s+about\\s+(.*)", "Lquote8"; + defpattern 1, "([^:]+):.*\\sdream\\s+(.*)", "Lquote9"; + defpattern 1, "([^:]+):.*\\smy\\s+mother\\s+(.*)", "Lquote10"; + defpattern 1, "([^:]+):.*\\smy\\s+father\\s+(.*)", "Lquote11"; + defpattern 1, "([^:]+):.*\\si\\s+want\\s+(.*)", "Lquote12"; + defpattern 1, "([^:]+):.*\\si\\s+am\\s+glad\\s+(.*)", "Lquote13"; + defpattern 1, "([^:]+):\\s+(.*)\\s+i\\s+am\\s+sad\\s+(.*)", "Lquote14"; + defpattern 1, "([^:]+):\\s+(.*)\\s+are\\s+like\\s+(.*)", "Lquote15"; + defpattern 1, "([^:]+):\\s+(.*)\\s+is\\s+like\\s+(.*)", "Lquote16"; + defpattern 1, "([^:]+):.*\\salike\\s+(.*)", "Lquote17"; + defpattern 1, "([^:]+):.*\\ssame\\s+(.*)", "Lquote18"; + defpattern 1, "([^:]+):.*\\si\\s+was\\s+(.*)", "Lquote19"; + defpattern 1, "([^:]+):.*\\swas\\s+i\\s+(.*)", "Lquote20"; + defpattern 1, "([^:]+):.*\\si\\s+am\\s+(.*)", "Lquote21"; + defpattern 1, "([^:]+):.*\\sam\\s+i\\s+(.*)", "Lquote22"; + defpattern 1, "([^:]+):.*\\sam\\s+(.*)", "Lquote23"; + defpattern 1, "([^:]+):.*\\sare\\s+you\\s+(.*)", "Lquote24"; + defpattern 1, "([^:]+):.*\\syou\\s+are\\s+(.*)", "Lquote25"; + defpattern 1, "([^:]+):.*\\sbecause\\s+(.*)", "Lquote26"; + defpattern 1, "([^:]+):.*\\swere\\s+you\\s+(.*)", "Lquote27"; + defpattern 1, "([^:]+):.*\\si\\s+(cant|can't|cannot)\\s+(.*)", "Lquote28"; + defpattern 1, "([^:]+):.*\\si\\s+feel\\s+(.*)", "Lquote29"; + defpattern 1, "([^:]+):.*\\si\\s+felt\\s+(.*)", "Lquote30"; + defpattern 1, "([^:]+):.*\\si\\s+(.*)\\s+you\\s+(.*)", "Lquote31"; + defpattern 1, "([^:]+):.*\\swhy\\s+(don't|dont)\\s+you\\s+(.*)", "Lquote32"; + defpattern 1, "([^:]+):.*\\syes\\s+(.*)", "Lquote33"; + defpattern 1, "([^:]+):.*\\sno\\s+(.*)", "Lquote34"; + defpattern 1, "([^:]+):.*\\ssomeone\\s+(.*)", "Lquote35"; + defpattern 1, "([^:]+):.*\\severyone\\s+(.*)", "Lquote36"; + defpattern 1, "([^:]+):.*\\salways\\s+(.*)", "Lquote37"; + defpattern 1, "([^:]+):.*\\swhat\\s+(.*)", "Lquote38"; + defpattern 1, "([^:]+):.*\\sperhaps\\s+(.*)", "Lquote39"; + defpattern 1, "([^:]+):.*\\sare\\s+(.*)", "Lquote40"; + defpattern 1, "([^:]+):(.*)", "Lquote41"; + + activatepset 1; + end; +} diff --git a/doc/sample/npc_sample.txt b/doc/sample/npc_sample.txt new file mode 100644 index 000000000..9dce66094 --- /dev/null +++ b/doc/sample/npc_sample.txt @@ -0,0 +1,456 @@ +// +// 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のみで他の埋め込み変数は変更しても意味を持ちません。 +// また、この3つの埋め込み変数を変更した場合、変更はクライアントに即座に反映されます。 +// +// ------- +// *ラベル +// ------- +// ラベルは、ラベル名の後に:を付け +// 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; } diff --git a/doc/sample/npc_shop_test.txt b/doc/sample/npc_shop_test.txt new file mode 100644 index 000000000..865bd0c13 --- /dev/null +++ b/doc/sample/npc_shop_test.txt @@ -0,0 +1,32 @@ +// Near fountain in Prontera +prontera,156,192,3 shop Card Shop1 95,4001:100,4002:100,4003:100,4004:100,4005:100,4006:100,4007:100,4008:100,4009:100,4010:100,4011:100,4012:100,4013:100,4014:100,4015:100,4016:100,4017:100,4018:100,4019:100,4020:100,4021:100,4022:100,4023:100,4024:100,4025:100,4026:100,4027:100,4028:100,4029:100,4030:100,4031:100,4032:100,4033:100,4034:100,4035:100,4036:100,4037:100,4038:100,4039:100,4040:100,4041:100,4042:100,4043:100,4044:100,4045:100,4046:100,4047:100,4048:100,4049:100,4050:100 +prontera,154,192,1 shop Card Shop2 123,4051:100,4052:100,4053:100,4054:100,4055:100,4056:100,4057:100,4058:100,4059:100,4060:100,4061:100,4062:100,4063:100,4064:100,4065:100,4066:100,4067:100,4068:100,4069:100,4070:100,4071:100,4072:100,4073:100,4074:100,4075:100,4076:100,4077:100,4078:100,4079:100,4080:100,4081:100,4082:100,4083:100,4084:100,4085:100,4086:100,4087:100,4088:100,4089:100,4090:100,4091:100,4092:100,4093:100,4094:100,4095:100,4096:100,4097:100,4098:100,4099:100,4100:100 +prontera,158,192,1 shop Card Shop3 67,4101:100,4102:100,4103:100,4104:100,4105:100,4106:100,4107:100,4108:100,4109:100,4110:100,4111:100,4112:100,4113:100,4114:100,4115:100,4116:100,4117:100,4118:100,4119:100,4120:100,4121:100,4122:100,4123:100,4124:100,4125:100,4126:100,4127:100,4128:100,4129:100,4130:100,4131:100,4132:100,4133:100,4134:100,4135:100,4136:100,4137:100,4138:100,4139:100,4140:100,4141:100,4142:100,4143:100,4144:100,4145:100,4146:100,4147:100,4148:100 +prontera,144,205,1 shop Headgear Shop1 71,2201:100,2202:100,2203:100,2204:100,2205:100,2206:100,2207:100,2208:100,2209:100,2210:100,2211:100,2212:100,2213:100,2214:100,2215:100,2216:100,2217:100,2218:100,2219:100,2220:100,2221:100,2222:100,2223:100,2224:100,2225:100,2226:100,2227:100,2228:100,2229:100,2230:100,2231:100,2232:100,2233:100,2234:100,2235:100,2236:100,2237:100,2239:100,2240:100,2241:100,2242:100,2243:100,2244:100,2245:100,2246:100,2247:100,2248:100,2249:100,2250:100 +prontera,144,203,3 shop Headgear Shop2 101,2251:100,2252:100,2253:100,2254:100,2255:100,2256:100,2257:100,2258:100,2259:100,2260:100,2261:100,2262:100,2263:100,2264:100,2265:100,2266:100,2267:100,2268:100,2269:100,2270:100,2271:100,2272:100,2273:100,2274:100,2275:100,2276:100,2277:100,2278:100,2279:100,2280:100,2281:100,2282:100,2283:100,2284:100,2285:100,2286:100,2287:100,2288:100,2289:100,2290:100,2291:100,2292:100,2293:100,2294:100,2295:100,2296:100,2297:100,2298:100,2299:100 +prontera,144,201,3 shop Headgear Shop3 69,5001:100,5002:100,5003:100,5004:100,5005:100,5006:100,5007:100,5008:100,5009:100,5010:100,5011:100,5012:100,5013:100,5014:100,5015:100,5016:100,5017:100,5018:100,5019:100 +prontera,167,202,5 shop Accessories Shop 102,2601:100,2602:100,2603:100,2604:100,2605:100,2607:100,2608:100,2609:100,2610:100,2611:100,2612:100,2613:100,2614:100,2615:100,2616:100,2617:100,2618:100,2619:100,2620:100,2621:100,2622:100,2623:100,2624:100,2625:100,2626:100,2627:100,2628:100 +prontera,167,204,6 shop General Store 96,501:100,502:100,503:100,504:100,505:100,506:100,507:100,508:100,509:100,510:100,511:100,512:100,513:100,514:100,515:100,516:100,517:100,518:100,519:100,520:100,521:100,522:100,523:100,525:100,526:100,528:100,529:100,530:100,531:100,532:100,533:100,534:100,535:100,536:100,537:100,538:100,539:100,601:100,602:100,603:100,604:100,605:100,606:100,607:100,608:100,609:100,610:100 +prontera,167,206,6 shop Blacksmith Shop 90,714:100,715:100,716:100,717:100,718:100,719:100,720:100,721:100,722:100,723:100,724:100,725:100,726:100,727:100,728:100,729:100,730:100,731:100,732:100,733:100,756:100,757:100,984:100,985:100,990:100,991:100,992:100,993:100,994:100,995:100,996:100,997:100,1010:100,1011:100,998:100,999:100,1000:100,1001:100,1002:100,1003:100,913:100,920:100,718:100,958:100,957:100,922:100,963:100,923:100,968:100,1005:100,612:100,615:100,989:100 +prontera,164,204,5 shop Japan Store Limited 81,542:100,543:100,1766:100 + +// South-central Prontera +prontera,141,175,5 shop Bow man 102,1705:100,1711:100,1716:100,1719:100,1720:100,1750:1,1751:1,1752:1,1753:1,1754:1,1755:1,1756:1,1766:1,1065:1 +prontera,141,173,5 shop Sword shop 102,1117:100,1125:100,1155:100,1162:100,1130:100,1131:100,1132:100,1133:100,1134:100,1135:100,1136:100,1137:100,1138:100,1139:100,1140:100,1141:100,1161:100,1162:100,1163:100,1164:100,1165:100,1166:100,1167:100,1168:100,1169:100,1170:100 +prontera,141,171,5 shop Spear man 102,1408:100,1461:100,1464:100,1413:100,1414:100,1415:100,1416:100,1466:100,1467:100,1468:100,1469:100,1470:100,1471:100 +prontera,141,169,5 shop Axe man 102,1352:100,1355:100,1361:100,1363:100,1364:100,1365:100,1366:100,1367:100,1368:100,1369:100 +prontera,141,167,5 shop Dagger man 102,1208:100,1220:100,1223:100,1224:100,1225:100,1226:100,1227:100,1228:100,1229:100,1230:100,1231:100,1232:100,1233:100,1234:100,1235:100,1236:100,1237:100 +prontera,141,165,5 shop Mace shop 102,1505:100,1520:100,1514:100,1517:100,1522:100,1523:100,1524:100,1525:100,1526:100,1527:100,1528:100 +prontera,141,163,5 shop Katar shop 102,1251:100,1253:100,1255:100,1256:100,1257:100,1258:100,1259:100,1260:100,1261:100 +prontera,141,161,5 shop Rod man 102,1602:100,1608:100,1611:100,1613:100,1614:100,1615:100 +prontera,141,159,5 shop Bookstore 102,1550:100,1551:100,1552:100,1553:100,1554:100,1555:100,1556:100,1557:100,1558:100 +prontera,141,177,5 shop Armor shop 102,2306:100,2339:100,2311:100,2331:100,2336:100,2337:100,2326:100,2327:100,2315:100,2317:100,2102:100,2104:100,2106:100,2108:100,2402:100,2404:100,2406:100,2407:100,2408:100,2409:100,2502:100,2504:100,2506:100,2507:100,2508:100 + +// Pet Groomer Merchant +prontera,218,211,4 shop Pet Groomer 125,537:2500,643:3000,10013:1500,10014:2000 +izlude,164,138,4 shop Pet Groomer 124,537:2500,643:3000,10013:1500,10014:2000 +morocc,269,167,4 shop Pet Groomer 125,537:2500,643:3000,10013:1500,10014:2000 +geffen,193,152,4 shop Pet Groomer 124,537:2500,643:3000,10013:1500,10014:2000 +payon,142,104,4 shop Pet Groomer 124,537:2500,643:3000,10013:1500,10014:2000 + +// EOF //
\ No newline at end of file diff --git a/doc/sample/npc_test_arena.txt b/doc/sample/npc_test_arena.txt new file mode 100644 index 000000000..2ba093d03 --- /dev/null +++ b/doc/sample/npc_test_arena.txt @@ -0,0 +1,104 @@ +// ------------------------------------------------------------------ +// アリ−ナの設定 +// ------------------------------------------------------------------ + +// 次のマップを使います +//map: prontera +//map: prt_are_in +//map: force_1-1 + +// テレポなどの禁止処理 +prt_are_in mapflag nomemo dummy +prt_are_in mapflag noteleport dummy +prt_are_in mapflag nosave prontera,156,191 +force_1-1 mapflag nomemo dummy +force_1-1 mapflag noteleport dummy +force_1-1 mapflag nosave prontera,156,191 + +// プロンテラに入り口を置く +prontera,160,185,0 script アリーナ入り口 116,{ + mes "アリーナ入り口に飛びますか?"; + next; + menu "飛ぶ",L_GOARENA,"やめる",L_YAME; +L_GOARENA: + warp "prt_are_in",31,82; + close; +L_YAME: + close; +} + +// 待機室から準備室への転送 +prt_are_in,29,79,0 script タイムアタック1 116,{ + if( getmapusers("force_1-1")>0 ) goto L_WAIT; + mes "ここはタイムアタックLv1です"; + mes "挑戦しますか?"; + menu "はい",L_GOLV1,"やめる",L_YAME; +L_GOLV1: + if( getmapusers("force_1-1")>0 ) goto L_WAIT; + disablenpc "fc103-1"; + disablenpc "fc105"; + disablenpc "fc107"; + addtimer 5000,"arenatestev0000"; + warp "force_1-1",99,12; + end; +L_WAIT: + mes "現在挑戦中の方がいますので、"; + mes "しばらくお待ちください。"; +L_YAME: + close; +} + +// 準備室(10秒準備期間) +force_1-1,99,12,0 script arenatestev0000 -1,{ + announce "10秒後に開始します",3; + addtimer 10000,"arenatestev0001"; +} + +// 実際の部屋への転送とMOBの設定 +force_1-1,99,12,0 script arenatestev0001 -1,{ + killmonster "force_1-1","arenatestev1000"; + monster "force_1-1",25,25,"--ja--",1002,1,"arenatestev1000"; + monster "force_1-1",20,25,"--ja--",1002,1,"arenatestev1000"; + monster "force_1-1",25,20,"--ja--",1002,1,"arenatestev1000"; + monster "force_1-1",30,25,"--ja--",1002,1,"arenatestev1000"; + monster "force_1-1",25,30,"--ja--",1002,1,"arenatestev1000"; + set $arenatest00,5; + disablenpc "fc101"; + disablenpc "fc103"; + warp "force_1-1",25,26; + enablenpc "fc103-1"; + enablenpc "fc105"; + enablenpc "fc107"; + announce "30秒以内に殲滅せよ",19; + addtimer 30000,"arenatestev8000"; +} + +// 倒した処理 +force_1-1,25,26,0 script arenatestev1000 -1,{ + set $arenatest00, $arenatest00 - 1; + if( $arenatest00 > 0 ) goto L_CONT; + deltimer "arenatestev8000"; + announce "クラッシュ!!",3; + enablenpc "fc101"; + enablenpc "fc103"; + areaannounce "prt_are_in",25,75,40,90, + strcharinfo(0) + " がタイムアタックLv1をクリアしました",0; + addtimer 5000,"arenatestev9000"; +L_CONT: + end; +} + +// タイムアウト +force_1-1,25,26,0 script arenatestev8000 -1,{ + set $arenatest00,99; + killmonster "force_1-1","arenatestev1000"; + announce "タイムオーバー!!",3; + areaannounce "prt_are_in",25,75,40,90, + strcharinfo(0) + " がタイムアタックLv1に失敗しました",0; + addtimer 5000,"arenatestev9000"; +} + +// プロンテラに帰る +force_1-1,25,26,0 script arenatestev9000 -1,{ + warp "prontera",156,191; +}
\ No newline at end of file diff --git a/doc/sample/npc_test_array.txt b/doc/sample/npc_test_array.txt new file mode 100644 index 000000000..de0a80ef2 --- /dev/null +++ b/doc/sample/npc_test_array.txt @@ -0,0 +1,35 @@ +// Array Test +prontera,164,190,1 script Array Test 112,{ + set @hoge[0],1; + set @hoge[1],5; + mes "Please enter a value for hoge[2]."; + next; + input @hoge[2]; + mes "hoge => " + @hoge; + mes "hoge[0]=> " + @hoge[0]; + mes "hoge[1]=> " + @hoge[1]; + mes "hoge[2]=> " + @hoge[2]; + next; + setarray @hoge[1],2,3,4,5; + mes "true: 5,1,2,3,4"; + mes "hoge size = "+ getarraysize(@hoge); + mes "hoge[0]=> " + @hoge[0]; + mes "hoge[1]=> " + @hoge[1]; + mes "hoge[2]=> " + @hoge[2]; + mes "hoge[3]=> " + @hoge[3]; + next; + copyarray @fuga[0],@hoge[2],2; + mes "true: 3,4,0"; + mes "fuga[0]=> " + @fuga[0]; + mes "fuga[1]=> " + @fuga[1]; + mes "fuga[2]=> " + @fuga[2]; + next; + deletearray @hoge[1],2; + mes "true: 1,4,5,0"; + mes "hoge[0]=> " + @hoge[0]; + mes "hoge[1]=> " + @hoge[1]; + mes "hoge[2]=> " + @hoge[2]; + mes "hoge[3]=> " + @hoge[3]; + + close; +}
\ No newline at end of file diff --git a/doc/sample/npc_test_chat.txt b/doc/sample/npc_test_chat.txt new file mode 100644 index 000000000..f593490cb --- /dev/null +++ b/doc/sample/npc_test_chat.txt @@ -0,0 +1,28 @@ + + +prontera,158,182,0 script Chat Test::test0001 116,{ + mes "Trigger Number" + getwaitingroomstate(2); + mes "Trigger State" + getwaitingroomstate(3); + menu "Enable",L_ENA,"Disable",L_DISA,"Delete",L_DEL,"Create",L_MAKE; + close; +L_ENA: + enablewaitingroomevent; + close; +L_DISA: + disablewaitingroomevent; + close; +L_DEL: + delwaitingroom; + close; +L_MAKE: + waitingroom "Test",15,"test0001::OnChatEvent",1; + close; +OnInit: + waitingroom "Test",15,"test0001::OnChatEvent",1; + end; +OnChatEvent: + disablewaitingroomevent; + warpwaitingpc "prontera",160,180; + end; + +}
\ No newline at end of file diff --git a/doc/sample/npc_test_duplicate.txt b/doc/sample/npc_test_duplicate.txt new file mode 100644 index 000000000..5c61c4fcd --- /dev/null +++ b/doc/sample/npc_test_duplicate.txt @@ -0,0 +1,30 @@ +// +// This sample script tests: +// * how npc-variables work with duplicated npcs +// * how the trigger area is applied to duplicates +// +// Outcome (r11216 trunk): +// * the variables are _shared_ between all duplicates +// * each duplicate knows its own map coordinates +// * 'OnInit' loads the middle poring last, for some reason +// * duplicates always override the source npc's trigger area (even 0x0) +// + +- script Test Script -1,1,1,{ + mes "Hi."; + mes "My coords are "+ .map$ +", "+ .x +"/" +.y ; + close; + +OnInit: + getmapxy(.map$, .x, .y, 1); + end; + +OnTouch: + getmapxy(.map$, .x, .y, 1); + emotion e_scissors; + end; +} + +prontera,150,175,4 duplicate(Test Script) Test1 909 +prontera,155,175,4 duplicate(Test Script) Test2 909,2,2 +prontera,160,175,4 duplicate(Test Script) Test3 909,3,3 diff --git a/doc/sample/npc_test_ev.txt b/doc/sample/npc_test_ev.txt new file mode 100644 index 000000000..cc170373e --- /dev/null +++ b/doc/sample/npc_test_ev.txt @@ -0,0 +1,146 @@ +// イベントのテストと解説 +// + + +// * NPCの表示クラスを-1にするとイベントになり、実行可能になります。 +// * 通常のNPCでも以下のラベル付きイベントを使うことでイベントになれます。 +// * NPCスクリプトでOn〜で始まるラベルを定義すると、 +// ラベル付きのイベントとしてエクスポートし、実行可能になります。 +// * NPCイベントで"NPC名(orイベント名)::ラベル名"とすると、 +// 指定したラベルから実行できます。 +// * ラベル名は24バイト以内にして下さい。 + + +// ------------------------------------------------------------------ +// イベントの起こし方/起こり方 +// ------------------------------------------------------------------ + +// 1.doeventコマンドで起こす +// 2.MOBを倒したときに起こす +// a. スクリプトmonsterコマンドの第7引数でイベント名を設定 +// b. monsterの配置の最後の引数でイベント名を設定 +// 3.マップ初期化時に起こる(OnInit) +// 4.NPCチャットルームが満員になったときに起こる +// 5.時計によって起こる +// (OnMinute??,OnHour??,OnClock????,OnDate????) : ?は数字 + +// 3,5の初期化イベント、時計イベントは、対象のPCを持たないイベントになります +// よってPCを対象とするスクリプトを使うことは出来ません。 +// また、announceコマンドなどは0x08フラグを指定してNPC主体にする必要があります + +// ----------イベント駆動のサンプル ------------- +// クリックするとイベント「event_test2」を起こすNPC +prontera,155,180,0 script ev_doテスト 116,{ + doevent "event_test2"; +} + +// ----------MOBによるイベント駆動のサンプル ------------- +// 倒すとイベント「event_test」を起こすモンスターの[召喚] +prontera,150,185,0 script ev_mobテスト 116,{ + monster "this",0,0,"Event_Mob2",1002,1,"event_test"; +} + +// ----------MOBによるイベント駆動のサンプル2------------- +// 倒すとイベント「event_test3」を起こすモンスターの[配置] +prontera,150,180,0 monster Event_Mob 1008,1,0,0,event_test3 + +// ----------タイマによるイベント駆動のサンプル ------------- +// クリックすると5秒後にラベル「OnTimer」を実行するNPC +// (イベント名に「NPC名::On〜で始まるラベル」を指定するとラベルを実行できる) +prontera,155,185,0 script ev_timerテスト 116,{ + addtimer 5000,"ev_timerテスト::OnTimer"; + end; +OnTimer: + mes "5秒経ちました"; + close; +} + +// ----------OnInit/チャットルームによるイベント駆動のサンプル ------------- +// マップサーバー起動時にラベル「OnInit」が実行され、チャットを作る +// また、waitingroomの第3引数にイベントを設定する +prontera,145,180,0 script ev_initテスト 116,{ + end; +OnInit: + waitingroom "OnInitテスト",1,"ev_initテスト::OnMax"; + end; +OnMax: + warpwaitingpc "prontera",155,190; + end; + +} + +// ----------時計によるイベント駆動のサンプル ------------- +// 指定の時刻や日付でイベントを実行する +// announceに0x08フラグを指定しているところに注意してください。 +prontera,145,185,0 script ev_clockテスト 116,{ + end; +// 毎時5分 +OnMinute05: + announce "毎時5分をお知らせします",8; + end; +// 毎日12時(24H) +OnHour12: + announce "正午のニュースです",8; + end; +// 23時59分 +OnClock2359: + announce "あと1分で明日です",8; + end; +// 1月1日 +OnDate0101: + announce "あけましておめでとうございます",8; + end; +} + + +// ------------------------------------------------------------------ +// イベントスクリプトの作り方 +// ------------------------------------------------------------------ +// 表示クラスを-1にするとイベント扱いになり、名前がイベント名になる。 +// エリアを指定しない場合、同じマップ内がイベントを起こす範囲になる。 +// エリアを指定する場合、共に-1にすると同じマップ鯖ならマップが違っても +// 駆動する。エリアは半径である。なお、イベントの起こる位置というのは、 +// 対象となるPCの座標である。たとえば、遠距離攻撃でMOBを倒したときに +// 起こるイベントはMOBの座標ではなく、PCの座標なので注意。 + +// ----------イベントで、エリアは指定していないサンプル------------ +// 同じマップ内でイベント「event_test」が起こると実行される +prontera,150,185,0 script event_test -1,{ + announce strcharinfo(0) + " が召喚MOBを倒しました",2; + close; +} + +// ----------イベントで、エリアを指定したサンプル------------ +// (155,185)から半径5セル以内でイベント「event_test2」が起こると実行される +prontera,155,180,0 script event_test2 -1,5,5 { + announce "5セル以内でクリックしましたね",19; + close; +} + +// ----------イベントで、エリアを-1にしたサンプル------------ +// 同じマップ鯖でイベント「event_test3」が起こると実行される +prontera,150,180,0 script event_test3 -1,-1,-1 { + mes "配置MOB倒しましたね"; + close; +} + + + +// ------------------------------------------------------------------ +// イベントマップ用の設定 +// ------------------------------------------------------------------ +// (全てコメントアウトしてます) + +// ----------セーブ禁止のサンプル--------- +// このマップでログアウトすると、必ず プロンテラ の座標(156,190)に +// セーブされる +//prontera mapflag nosave prontera,156,190 + +// ----------メモ禁止のサンプル--------- +// このマップではメモがとれない +//prontera mapflag nomemo dummy + +// ----------テレポ禁止のサンプル--------- +// このマップでは蝿、蝶、テレポ、ポタが使えない +// 注意:スクリプトのwarpの"Random","SavePoint"が無効になります +//prontera mapflag noteleport dummy
\ No newline at end of file diff --git a/doc/sample/npc_test_func.txt b/doc/sample/npc_test_func.txt new file mode 100644 index 000000000..2e613404f --- /dev/null +++ b/doc/sample/npc_test_func.txt @@ -0,0 +1,26 @@ + +// 値を返さない関数 +function script func001 { + mes "ユーザー定義関数"; + next; + return; // 省略できない +} + +// 値を返す関数 +function script func002 { + return "ユーザー定義関数2"; +} + +// 関数の呼び出しとサブルーティンのテスト +prontera,168,189,1 script 関数テスト 112,{ + callfunc "func001"; // ユーザー定義関数は文字列で指定 + mes callfunc("func002"); + next; + callsub L_SUB001; // サブルーティンはラベルを直接指定 + close; + end; + +L_SUB001: + mes "サブルーティン"; + return; // 省略できない +} diff --git a/doc/sample/npc_test_npctimer.txt b/doc/sample/npc_test_npctimer.txt new file mode 100644 index 000000000..1787202e0 --- /dev/null +++ b/doc/sample/npc_test_npctimer.txt @@ -0,0 +1,33 @@ + +prontera,156,183,0 script NPCtimerTest::npctimerX0000 116,{ + mes "Timer value" + getnpctimer(0); + mes "State timer" + getnpctimer(1,"npctimerX0000"); + mes "Number of events" + getnpctimer(2); + menu "Initialization",L_INIT,"Stop",L_STOP,"Start",L_START,"Settings",L_SET; + close; +L_INIT: + initnpctimer; + close; +L_STOP: + stopnpctimer; + close; +L_START: + startnpctimer; + close; +L_SET: + input @temp; + setnpctimer @temp; + close; + +OnTimer1000: + announce "After a second",0; + end; + +OnTimer5000: + announce "After 5 seconds",0; + end; + +OnTimer10000: + announce "After 10 seconds",0; + end; +}
\ No newline at end of file diff --git a/doc/sample/npc_test_npctimer2.txt b/doc/sample/npc_test_npctimer2.txt new file mode 100644 index 000000000..8ff8be575 --- /dev/null +++ b/doc/sample/npc_test_npctimer2.txt @@ -0,0 +1,16 @@ +prontera,156,183,0 script NPCtimerTest::npctimerX0000 116,{ +L_INIT: + mes "What would you like to know?"; + menu "Tell me my level",L_WAIT; + +L_WAIT: + mes "I need time to think..."; + initnpctimer; + attachnpctimer; + close; + +OnTimer5000: + mes "Ah, your level is " + readparam(11); + detachnpctimer; + close; +}
\ No newline at end of file diff --git a/doc/sample/npc_test_setitemx.txt b/doc/sample/npc_test_setitemx.txt new file mode 100644 index 000000000..dbefd5cc2 --- /dev/null +++ b/doc/sample/npc_test_setitemx.txt @@ -0,0 +1,69 @@ +//by Lupus. +// SVN TRUNK 9940+ only + +//setiteminfo(itemID,n,Value), where n +// 0 value_buy; +// 1 value_sell; +// 2 type; +// 3 maxchance = Max drop chance of this item e.g. 1 = 0.01% , etc.. +// if = 0, then monsters don't drop it at all (rare or a quest item) +// if = 10000, then this item is sold in NPC shops only +// 4 sex; +// 5 equip; +// 6 weight; +// 7 atk; +// 8 def; +// 9 range; +// 10 slot; +// 11 look; +// 12 elv; +// 13 wlv; + +prontera,164,161,5 script Lupus 1013,{ + menu "Make Knife[3] Edible",M_1, + "Make Apple Equippable",M_2, + "Edible Knife = Full SP",M_3, + "Knife = Weapon + 3 Notes",M_4; + close; + +M_1: + //WORKS! + mes "Ok. We Made Knife[3] Edible"; + setiteminfo(1201,2,0); //type = 0 : potion + setitemscript(1201,"{dispbottom \"* You used Knife[3]\";}"); + close; + +M_2: + //WORKS! + mes "Ok. We Made Apple Equippable"; + //item type -> headgear + setiteminfo(512,2,5); //type = 5 + //where to equip to + setiteminfo(512,5,512); //equip = 512 + //set as headgear location + setiteminfo(512,11,256); //loc = 256 + //set Headgear Sprite ID + setiteminfo(512,14,85); //view id = 85 + + setitemscript(512,"{dispbottom \"* Other item's changed\";}",0); + setitemscript(512,"{dispbottom \"* Equipped\";}",1); + setitemscript(512,"{dispbottom \"* Unequipped\";}",2); + close; + +M_3: + //WORKS! + mes "Ok. Now Edible Knife[3] restores your SP"; + setitemscript(1201,2,0); + setitemscript(1201,"{dispbottom \"* You ate Knife[3] + Full SP\"; percentheal 0,100;}"); + close; + +M_4: + //WORKS! + mes "Ok. We Made Knife... a weapon. But added 3 notes."; + setiteminfo(1201,2,4); //type = 4 : weapon again + setitemscript(1201,"{dispbottom \"* 1 Used\";}",0); + setitemscript(1201,"{dispbottom \"* 2 Equipped\";}",1); + setitemscript(1201,"{dispbottom \"* 3 Unequipped\";}",2); + close; + +} diff --git a/doc/sample/npc_test_setmapflag.txt b/doc/sample/npc_test_setmapflag.txt new file mode 100644 index 000000000..e68375b58 --- /dev/null +++ b/doc/sample/npc_test_setmapflag.txt @@ -0,0 +1,24 @@ +//by Jbain + +prontera,165,145,0 script EXPflagtest 123,{ + mes "[Yo man]"; + mes "Setup the map rates"; + menu "Job EXP",L_job,"Base EXP",L_base,"PVP ON",L_pvp,"Reset all flags",-; + + removemapflag "prontera",MF_BEXP; + removemapflag "prontera",MF_JEXP; + removemapflag "prontera",MF_PVP; + close; + +L_job: + input @rate; + setmapflag "prontera",MF_JEXP,@rate; + close; +L_base: + input @rate; + setmapflag "prontera",MF_BEXP,@rate; + close; +L_pvp: + setmapflag "prontera",MF_PVP; + close; +}
\ No newline at end of file diff --git a/doc/sample/npc_test_skill.txt b/doc/sample/npc_test_skill.txt new file mode 100644 index 000000000..55864a117 --- /dev/null +++ b/doc/sample/npc_test_skill.txt @@ -0,0 +1,19 @@ +// スキル所得テスト + +// skill スキルID ,スキルLV [,フラグ]; +// フラグは省略可能、省略時は1。 +// フラグ=1でカードなどの一時的な所得、 +// フラグ=2でクエストなどによる恒久的な所得(skill_tree.txtに依存) + +prontera,157,182,0 script スキル所得テスト 116,{ + mes "スキル所得テスト"; + menu "応急処置所得",L_GETSKILL142,"死んだ振り所得",L_GETSKILL143,"やめる",L_YAME; +L_GETSKILL142: + skill 142,1,0; + close; +L_GETSKILL143: + skill 143,1,0; + close; +L_YAME: + close; +}
\ No newline at end of file diff --git a/doc/sample/npc_test_str.txt b/doc/sample/npc_test_str.txt new file mode 100644 index 000000000..78f3cfdf3 --- /dev/null +++ b/doc/sample/npc_test_str.txt @@ -0,0 +1,17 @@ +// Some Test Example +prontera,164,188,1 script sTrInG2compare 112,{ + set @str$, "StRiNg1"; + mes "sTrInG2 isn't equal to " + @str$ ; + mes "Our Var is equal to " + @str$ + " ...OK?"; + next; + mes "Comparision eqOK:" + (@str$=="StRiNg1"); + mes "Comparision eqNG:" + (@str$=="sTrInG2"); + mes "Comparision neOK:" + (@str$!="00000"); + mes "Comparision neNG:" + (@str$!="StRiNg1"); + mes "Comparision gtOK:" + ("aab">"aaa"); + mes "Comparision ltNG:" + ("aab"<"aaa"); + next; + input @str2$; + mes "You've entered '" + @str2$ + "' string."; + close; +}
\ No newline at end of file diff --git a/doc/sample/npc_testchkoption.txt b/doc/sample/npc_testchkoption.txt new file mode 100644 index 000000000..87c100ae7 --- /dev/null +++ b/doc/sample/npc_testchkoption.txt @@ -0,0 +1,15 @@ +prontera,156,89,6 script test_chkoption 117,{ + mes "Please enter a value of type!"; + input @value; + if(checkoption(@value) == 1) goto L1; + if(checkoption(@value) == 0) goto L0; + end; + L1: + mes "True!"; + close; + end; + L0: + mes "False!"; + close; + end; +}
\ No newline at end of file diff --git a/doc/sample/npc_time_sample.txt b/doc/sample/npc_time_sample.txt new file mode 100644 index 000000000..219e94e48 --- /dev/null +++ b/doc/sample/npc_time_sample.txt @@ -0,0 +1,18 @@ + +prontera,157,181,6 script Time Sample 105,{ + mes "[Time Sample]"; + mes "System Tick : " + gettimetick(0); + mes " Time Tick : " + gettimetick(1); + mes " GetTime(0) : " + gettime(0); + mes " GetTime(1) : " + gettime(1) + " (Sec)"; + mes " GetTime(2) : " + gettime(2) + " (Min)"; + mes " GetTime(3) : " + gettime(3) + " (Hour)"; + mes " GetTime(4) : " + gettime(4) + " (WeekDay)"; + mes " GetTime(5) : " + gettime(5) + " (MonthDay)"; + mes " GetTime(6) : " + gettime(6) + " (Month)"; + mes " GetTime(7) : " + gettime(7) + " (Year)"; + mes " GetTimeStr : " + gettimestr("%Y-%m/%d %H:%M:%S",19); + close; + end; +} + |