//==================================================================== // しりとりNPC V1.0 // // 概要 :NPCとアイテム名でしりとりをする。 // しりとりで挙げるアイテムを持っている必要がある。 // しりとりのやり方について、3パターンのNPCが用意されていて、 // それぞれ次の違いがある。 // (1)しりとり少年 // 個人戦/しりとり継続数に応じて賞品の個数が増加する // (2)しりとり少女 // PT戦/しりとり継続数に応じて賞品の種類が変化する // (3)しりとりマスター // ギルド戦/勝利した場合のみ賞品が貰える // // 勝利条件:なし // 敗北条件:(1)ギブアップする // (2)前に出たアイテムを出してしまう // ※"ん"がついた場合は敗北にせずやり直しとする。 // "4"の読み方には"よん"と"し"があるように、 // 人によってアイテムの読み方が違うので思わぬところで"ん"がついて負けてしまうため。 // // 動作確認:Auriga0840 - SQLモード // // 導入方法:(1)付属のshiritori.sqlを使って専用テーブルとデータを作成する。 // (2)本スクリプトを"設定部分"で検索し、設定内容を見直す。 // (3)以降は通常のNPC設定と同様 // // 注意 :しりとりデータとして、Auriga0804のitem_dbにあるアイテムの // 先頭文字と末尾文字のデータを用意していますが、 // 先頭文字と末尾文字の間違いを潰しきれていないので // 間違いを見つけたらshiritori_dbテーブルのfirst_char/last_charを // 直接修正して下さい。 // //==================================================================== //========================================================================== //しりとり履歴検索 // 概要 履歴の中からしりとり継続回数と最後の文字を取得する // 引数 getarg(0) :NpcID // getarg(1) :AccountID / PartyID / GuildID // 戻値 getarg(2) :継続回数 // getarg(3) :前回のアイテム名 // getarg(4) :前回のアイテム名の最後の文字 //-------------------------------------------------------------------------- function script FncSearchHist { set '@npc_id,getarg(0); set '@apg_id,getarg(1); // しりとり履歴からプレイヤーに該当する履歴を全て取得する(逆順) set '@sql$,""; set '@sql$,'@sql$ + "SELECT `cnt`,`jname`,`last_char`"; set '@sql$,'@sql$ + " FROM `shiritori_db` d, `shiritori_hist` h"; set '@sql$,'@sql$ + " WHERE `npc_id` = " + '@npc_id; set '@sql$,'@sql$ + " AND `apg_id` = " + '@apg_id; set '@sql$,'@sql$ + " AND d.`nameid` = h.`nameid`"; set '@sql$,'@sql$ + " ORDER BY `cnt` DESC;"; set '@ret,sqlquery('@sql$,'@data$); // 検索結果が1以上なら1レコード目(最終履歴)を返す if ( '@ret > 0 ) { set getarg(2), '@data$[0][0]; set getarg(3), '@data$[0][1]; set getarg(4), '@data$[0][2]; } else { set getarg(2), 0; set getarg(3), ""; set getarg(4), ""; } return; } //========================================================================== //しりとりリスト作成 // 概要 手持ちアイテムの中からしりとりが出来るアイテム名を抽出する // 配列を戻すのが面倒なのでこの中でSwitchまで行ってしまう // 引数 getarg(0) :前回の末尾文字 // 戻値 getarg(1) :アイテムID配列 // getarg(2) :アイテム名配列 //-------------------------------------------------------------------------- function script FncGetItemList { set '@last_char$,getarg(0); // 所持品を@inventorylist_***にロード getinventorylist; // 手持ちアイテムのリストを作成する set '@buf1$,"-1"; for(set '@lcnt,0; '@lcnt < @inventorylist_count; set '@lcnt,'@lcnt+1) { if ( @inventorylist_equip['@lcnt] == 0 ) { set '@buf1$,'@buf1$ + "," + @inventorylist_id['@lcnt]; } } // 手持ちアイテムリストとしりとりDBから、しりとりが出来るアイテムのリストを抽出する set '@sql$,""; set '@sql$,'@sql$ + "SELECT `nameid`,`jname`"; set '@sql$,'@sql$ + " FROM `shiritori_db` d"; set '@sql$,'@sql$ + " WHERE `nameid` IN (" + '@buf1$ + ")"; set '@sql$,'@sql$ + " AND `first_char` = '" + '@last_char$ + "'"; set '@ret,sqlquery('@sql$,'@data$); // 戻り値用に2次元配列を1次元配列に変換する for(set '@lcnt,0; '@lcnt < '@ret; set '@lcnt,'@lcnt+1) { set '@nameid['@lcnt],'@data$['@lcnt][0]; set '@jname$['@lcnt],'@data$['@lcnt][1]; } // ギブアップを選択肢に含める set '@nameid['@lcnt],"-1"; set '@jname$['@lcnt],"**ギブアップ**"; // 戻り値設定 copyarray getarg(1),'@nameid,'@ret+1; copyarray getarg(2),'@jname$,'@ret+1; return; } //========================================================================== //初回キーワード検索 // 概要 1個目のキーワードを決定する // 引数 なし // 戻値 '@item_data$ :キーワード配列 添数1:検索結果レコード(0のみ) 添数2:アイテムID,アイテム名,先頭文字,末尾文字 //-------------------------------------------------------------------------- function script FncSearchItemFirst { // 初回キーワードとして有効なキーワードの件数を取得する set '@sql$,""; set '@sql$,'@sql$ + "SELECT COUNT(`nameid`)"; set '@sql$,'@sql$ + " FROM `shiritori_db` s"; set '@sql$,'@sql$ + " WHERE `last_char` <> 'ん'"; set '@ret,sqlquery('@sql$,'@max); // 有効なキーワードの中から乱数で1つ選ぶ set '@sql_sub1$,""; set '@sql_sub1$,'@sql_sub1$ + "SELECT @i:=@i+1 as rownum, d.*"; set '@sql_sub1$,'@sql_sub1$ + " FROM `shiritori_db` d,(SELECT @i:=0) as dummy"; set '@sql_sub1$,'@sql_sub1$ + " WHERE `last_char` <> 'ん'"; set '@sql$,""; set '@sql$,'@sql$ + "SELECT `nameid`, `jname`, `first_char`, `last_char`"; set '@sql$,'@sql$ + " FROM (" + '@sql_sub1$ + ") sub"; set '@sql$,'@sql$ + " WHERE rownum = " + rand('@max) + "+1"; set '@ret,sqlquery('@sql$,'@data$); // 戻り値を設定する set getarg(0), '@data$[0][0]; set getarg(1), '@data$[0][1]; set getarg(2), '@data$[0][2]; set getarg(3), '@data$[0][3]; return; } //========================================================================== //次キーワード検索 // 概要 2個目以降のキーワードを決定する // 引数 getarg(0) :NpcID // getarg(1) :AccountID or PartyID or GuildID // getarg(2) :直前のアイテムID // 戻値 getarg(3) :検索したアイテムID // getarg(4) :検索したアイテム名 // getarg(5) :検索した末尾文字 //-------------------------------------------------------------------------- function script FncSearchItemSecond { set '@npc_id,getarg(0); set '@apg_id,getarg(1); set '@nameid,getarg(2); // 履歴にある名前の一覧を取得するSQL set '@sql_sub1$,""; set '@sql_sub1$,'@sql_sub1$ + "SELECT `jname`"; set '@sql_sub1$,'@sql_sub1$ + " FROM `shiritori_db` d,`shiritori_hist` h"; set '@sql_sub1$,'@sql_sub1$ + " WHERE `npc_id` = " + '@npc_id; set '@sql_sub1$,'@sql_sub1$ + " AND `apg_id` = " + '@apg_id; set '@sql_sub1$,'@sql_sub1$ + " AND d.`nameid` = h.`nameid`"; // 履歴にある名前の一覧を取得するSQL set '@sql_sub2$,""; set '@sql_sub2$,'@sql_sub2$ + "SELECT `last_char`"; set '@sql_sub2$,'@sql_sub2$ + " FROM `shiritori_db` d"; set '@sql_sub2$,'@sql_sub2$ + " WHERE `nameid` = " + '@nameid; // 履歴に無く、有効なキーワードの一覧を取得する set '@sql$,""; set '@sql$,'@sql$ + "SELECT `nameid`,`jname`,`last_char` "; set '@sql$,'@sql$ + " FROM `shiritori_db` s"; set '@sql$,'@sql$ + " WHERE `jname` NOT IN (" + '@sql_sub1$ + ")"; set '@sql$,'@sql$ + " AND `first_char` = (" + '@sql_sub2$ + ")"; set '@sql$,'@sql$ + " AND `last_char` <> 'ん'"; set '@ret,sqlquery('@sql$,'@data$); // 一覧の中から乱数で1つ選び、戻り値に設定する if ( '@ret > 1 ) { set '@rnd,rand('@ret); set getarg(3),'@data$['@rnd][0]; set getarg(4),'@data$['@rnd][1]; set getarg(5),'@data$['@rnd][2]; } else { set getarg(3),-1; set getarg(4),""; set getarg(5),""; } return; } //========================================================================== //入力キーワード正否判定 // 概要 成立しているか判定する // 引数 getarg(0) :NpcID // getarg(1) :AccountID or PartyID or GuildID // getarg(2) :アイテムID // 戻値 getarg(3) :判定結果(1:正,-1:否(禁則),-2:否(重複)) //-------------------------------------------------------------------------- function script FncCheckInput { set '@npc_id,getarg(0); set '@apg_id,getarg(1); set '@nameid$,getarg(2); // 入力したNameIDがDBにあるかチェックする set '@sql$,""; set '@sql$,'@sql$ + "SELECT `first_char`,`last_char`"; set '@sql$,'@sql$ + " FROM `shiritori_db` d"; set '@sql$,'@sql$ + " WHERE `nameid` = " + '@nameid$; set '@ret,sqlquery('@sql$,'@db_data$); // 取得件数が0件の場合は"DB無し"を返す //if ( '@ret == 0 ) { // set getarg(3),-3; // return; //} // 末尾の1文字が禁則文字の場合は"否(禁則)"を返す if ( '@db_data$[0][1] == "ん" ) { set getarg(3),-1; return; } // 過去に挙がったものと重複していないかチェックする // 履歴から過去に挙がったもののID一覧を取得するSQL set '@sql_sub1$,""; set '@sql_sub1$,'@sql_sub1$ + "SELECT `nameid`"; set '@sql_sub1$,'@sql_sub1$ + " FROM `shiritori_hist` h"; set '@sql_sub1$,'@sql_sub1$ + " WHERE `npc_id` = " + '@npc_id; set '@sql_sub1$,'@sql_sub1$ + " AND `apg_id` = " + '@apg_id; // 入力したものの名前を取得するSQL set '@sql_sub2$,""; set '@sql_sub2$,'@sql_sub2$ + "SELECT `jname`"; set '@sql_sub2$,'@sql_sub2$ + " FROM `shiritori_db` d"; set '@sql_sub2$,'@sql_sub2$ + " WHERE `nameid` = " + '@nameid$; // 上記SQLを組み合わせて重複データを取得する set '@sql$,""; set '@sql$,'@sql$ + "SELECT COUNT(`nameid`)"; set '@sql$,'@sql$ + " FROM `shiritori_db` s"; set '@sql$,'@sql$ + " WHERE `nameid` IN (" + '@sql_sub1$ + ")"; set '@sql$,'@sql$ + " AND `jname` = (" + '@sql_sub2$ + ")"; set '@ret,sqlquery('@sql$,'@dup_cnt); // COUNT結果が1件以上なら重複があるので"否(重複)"を返す if ( '@dup_cnt >= 1 ) { set getarg(3),-2; return; } //// 前回の最後の文字=入力したものの最初の文字かどうかをチェックする //set '@sql$,""; //set '@sql$,'@sql$ + "SELECT `last_char`"; //set '@sql$,'@sql$ + " FROM `shiritori_db` d,`shiritori_hist` h"; //set '@sql$,'@sql$ + " WHERE `npc_id` = " + '@npc_id; //set '@sql$,'@sql$ + " AND `apg_id` = " + '@apg_id; //set '@sql$,'@sql$ + " AND d.`nameid` = h.`nameid`"; //set '@sql$,'@sql$ + " ORDER BY `cnt` DESC"; //set '@ret,sqlquery('@sql$,'@last$); //// first != lastなら"不成立"を返す //if ( '@db_data$[0][0] != '@last$[0][0] ) { // set getarg(3),-4; // return; //} // "正"を返す set getarg(3),1; return; } //========================================================================== //履歴保存 // 概要 キーワードをHISTに保存する // 引数 getarg(0) :NpcID // getarg(1) :AccountID / PertyID / GuildID // getarg(2) :ItemID // 結果 なし //-------------------------------------------------------------------------- function script FncSaveHist { set '@npc_id,getarg(0); set '@apg_id,getarg(1); set '@nameid,getarg(2); // 件数+1を取得するSQL set '@sql_sub1$,""; set '@sql_sub1$,'@sql_sub1$ + "SELECT COUNT(`cnt`)+1"; set '@sql_sub1$,'@sql_sub1$ + " FROM `shiritori_hist` h"; set '@sql_sub1$,'@sql_sub1$ + " WHERE `npc_id` = " + '@npc_id; set '@sql_sub1$,'@sql_sub1$ + " AND `apg_id` = " + '@apg_id; // 履歴を保存する set '@sql$,""; set '@sql$,'@sql$ + "INSERT INTO `shiritori_hist` ("; set '@sql$,'@sql$ + " `npc_id`"; set '@sql$,'@sql$ + " ,`apg_id`"; set '@sql$,'@sql$ + " ,`cnt`"; set '@sql$,'@sql$ + " ,`nameid`"; set '@sql$,'@sql$ + " ) VALUES ("; set '@sql$,'@sql$ + '@npc_id; set '@sql$,'@sql$ + " ," + '@apg_id; set '@sql$,'@sql$ + " ,(" + '@sql_sub1$ + ")"; set '@sql$,'@sql$ + " ," + '@nameid; set '@sql$,'@sql$ + " )"; set '@ret,sqlquery('@sql$); return; } //========================================================================== //履歴削除 // 概要 HISTを削除する // 引数 getarg(0) :NpcID // getarg(1) :AccountID / PertyID / GuildID // 結果 なし //-------------------------------------------------------------------------- function script FncDelHist { set '@npc_id,getarg(0); set '@apg_id,getarg(1); // 履歴を削除する set '@sql$,""; set '@sql$,'@sql$ + "DELETE FROM `shiritori_hist`"; set '@sql$,'@sql$ + " WHERE `npc_id` = " + '@npc_id; set '@sql$,'@sql$ + " AND `apg_id` = " + '@apg_id; set '@ret,sqlquery('@sql$); return; } //========================================================================== //性別検索 // 概要 loginから性別を取得する // 引数 getarg(0) :AccountID // 結果 getarg(1) :性別(M:男性,F:女性) //-------------------------------------------------------------------------- function script FncSearchSex { set '@account_id,getarg(0); // loginを検索する set '@sql$,""; set '@sql$,'@sql$ + "SELECT `sex`"; set '@sql$,'@sql$ + " FROM `login` l"; set '@sql$,'@sql$ + " WHERE `account_id` = " + '@account_id; set '@ret,sqlquery('@sql$,'@data$); set getarg(1),'@data$[0][0]; return; } //========================================================================== //しりとり少年 //-------------------------------------------------------------------------- prontera.gat,82,313,4 script しりとり少年 706,{ //================================== // 設定部分 //---------------------------------- // NPC-ID set '@npc_id,1; // 勝利時の賞品 set '@win_nameid,748; // 敗北時の賞品 set '@lose_nameid,721; // NPC敗北確率(例.10なら1回毎に10/10000の確率でNPCが敗北) set '@lose_per,500; //================================== // ここから本体 //---------------------------------- // AccountIDを取得 set '@apg_id,getcharid(3); // 性別を取得してPCの呼び方を設定する callfunc "FncSearchSex", getcharid(3), '@sex$; if ( '@sex$ == "M" ) { set '@pc$, "兄ちゃん"; } else { set '@pc$, "姉ちゃん"; } // しりとり履歴を取得 callfunc "FncSearchHist", '@npc_id, '@apg_id, '@cnt, '@pre_jname$, '@pre_last_char$; // 履歴がない場合(しりとりをしていない場合) if ( '@cnt == 0 ) { mes "[しりとり少年]"; mes "に・・・に・・・ニンジン!"; mes "あっ、んがついちゃった。"; mes "また僕の負けかぁ。"; next; mes "[しりとり少年]"; mes "あ、" + '@pc$ + "。"; mes "こんにちわ。"; next; mes "[しりとり少年]"; mes "そうだ" + '@pc$ + "。"; mes "しりとりの練習に付き合ってよ。"; mes "僕、どうしても妹に勝てないんだ。"; mes "付き合ってくれたら僕のコレクションをあげるよ。"; next; switch (select("いいよ","今は忙しい")) { case 1: // 初回キーワード検索 callfunc "FncSearchItemFirst", '@item_id, '@jname$, '@first_char$, '@last_char$; // キーワード保存 callfunc "FncSaveHist", '@npc_id, '@apg_id, '@item_id; mes "[しりとり少年]"; mes "ほんとう?やったあ!"; mes "じゃあ僕からいくよ。"; next; mes "[しりとり少年]"; mes "最初は" + '@jname$ + "の"; mes "「^ff0000" + '@last_char$ + "^000000」からだよ。"; mes "「^ff0000" + '@last_char$ + "^000000」がつくアイテムを持ってきてね。"; close; break; case 2: mes "[しりとり少年]"; mes "えー?いいじゃんやろうよー。"; close; break; } // 履歴がある場合(しりとり中の場合) } else { mes "[しりとり少年]"; mes ('@cnt+1)/2 + "個目のアイテムは持ってこれた?"; mes "一つ前は" + '@pre_jname$ + "だから"; mes "次は「^ff0000" + '@pre_last_char$ + "^000000」から始まるものだよ。"; mes "「^ff0000" + '@pre_last_char$ + "^000000」がつくアイテムを持ってきてね。"; next; // しりとりの候補となるアイテムリストを作成する callfunc "FncGetItemList", '@pre_last_char$, '@nameid, '@jname$; // アイテムリストを画面に表示して選択させる switch (select(printarray('@jname$))) { default: break; } set '@sel_nameid,'@nameid[@menu-1]; // 入力確認 mes "[しりとり少年]"; mes '@jname$[@menu-1] + "でいい?"; if ( '@sel_nameid != -1 ) { mes "^ff0000選んだアイテムは消えちゃう^000000"; mes "から気をつけてね。"; } next; switch (select("いいよ","やっぱりやめる")) { case 1: break; case 2: mes "[しりとり少年]"; mes "よく選んでね。"; close; break; } // ギブアップ判定 if ( '@sel_nameid == -1 ) { // 履歴削除 callfunc "FncDelHist", '@npc_id, '@apg_id; if ( '@cnt == 1 ) { mes "[しりとり少年]"; mes "まだ1回も続いてないじゃん!"; mes "もー、今度はちゃんと遊んでよね。"; close; } else { mes "[しりとり少年]"; mes "やったー、勝った!"; next; mes "[しりとり少年]"; mes "練習に付き合ってくれてありがとう。"; mes "約束してた僕のコレクションだよ。"; next; // 敗北時の賞品 getitem '@lose_nameid,('@cnt/10+1)*('@cnt/2+1); mes "[しりとり少年]"; mes "僕、自信がついたよ。"; mes "今度は妹に負けないぞー。"; close; } } // 入力キーワード正否判定(判定結果 1:正 -1:否(禁則) -2:否(重複) -3:DB無し) callfunc "FncCheckInput", '@npc_id, '@apg_id, '@sel_nameid, '@ret; if ( '@ret == 1 ) { // 手持ちアイテム削除 //delitem '@sel_nameid,1; // 履歴保存 callfunc "FncSaveHist", '@npc_id, '@apg_id, '@sel_nameid; // 次キーワード検索 callfunc "FncSearchItemSecond", '@npc_id, '@apg_id, '@sel_nameid, '@next_nameid, '@next_jname$, '@next_last_char$; // NPC敗北判定 if ( rand(10000) < '@lose_per ) { set '@next_nameid,-1; } // 次キーワードが見つかった場合 if ( '@next_nameid != -1 ) { // 履歴保存 callfunc "FncSaveHist", '@npc_id, '@apg_id, '@next_nameid; mes "[しりとり少年]"; mes "僕の番だね。"; next; mes "[しりとり少年]"; mes "次は" + '@next_jname$ + "の"; mes "「^ff0000" + '@next_last_char$ + "^000000」だよ。"; mes "「^ff0000" + '@next_last_char$ + "^000000」がつくアイテムを持ってきてね。"; close; // 次キーワードが見つからなかった場合 } else { // 履歴削除 callfunc "FncDelHist", '@npc_id, '@apg_id; mes "[しりとり少年]"; mes "僕の番だね。"; next; mes "[しりとり少年]"; mes "うーん・・・"; next; mes "[しりとり少年]"; mes "うーん、うーん・・・"; next; mes "[しりとり少年]"; mes "だめだー、思いつかないや。"; next; mes "[しりとり少年]"; mes "僕の負けだよ。"; mes "すごいよ" + '@pc$ + "。"; mes '@pc$ + "なら妹にも勝てるんじゃないかな。"; next; mes "[しりとり少年]"; mes "練習に付き合ってくれてありがとう。"; mes "約束してた僕のコレクションだよ。"; next; // 勝利時の賞品 getitem '@win_nameid,('@cnt/10+1)*('@cnt/2+1); mes "[しりとり少年]"; mes "また遊んでね。"; mes "約束だよ。"; close; } } else if ( '@ret == -1 ) { mes "[しりとり少年]"; mes "最後が「ん」だからダメだよ。"; mes "他のを持ってきて。"; close; } else { // 履歴削除 callfunc "FncDelHist", '@npc_id, '@apg_id; mes "[しりとり少年]"; mes "これは前にも出たものだよ。"; mes "僕の勝ちだね、" + '@pc$ + "。"; next; mes "[しりとり少年]"; mes "練習に付き合ってくれてありがとう。"; mes "約束してた僕のコレクションだよ。"; next; // 敗北時の賞品 getitem '@lose_nameid,('@cnt/10+1)*('@cnt/2+1); mes "[しりとり少年]"; mes "僕、自信がついたよ。"; mes "今度は妹に負けないぞー。"; close; } } } //========================================================================== //しりとり少女 //-------------------------------------------------------------------------- prontera.gat,80,313,5 script しりとり少女 703,{ //================================== // 設定部分 //---------------------------------- // NPC-ID set '@npc_id,2; // 賞品ランクアップ間隔(10なら10回アイテムを渡すとランクアップ) set '@prize_lankup_interval,10; // 賞品(ランク低0〜高9。敗北時は最高でも8) set '@prize_nameid[0],501; set '@prize_nameid[1],502; set '@prize_nameid[2],503; set '@prize_nameid[3],504; set '@prize_nameid[4],505; set '@prize_nameid[5],506; set '@prize_nameid[6],507; set '@prize_nameid[7],508; set '@prize_nameid[8],509; set '@prize_nameid[9],510; // NPC敗北確率(例.10なら1回毎に10/10000の確率でNPCが敗北) set '@lose_per,100; //================================== // ここから本体 //---------------------------------- // PertyIDを取得 set '@apg_id,getcharid(1); // 性別を取得してPCの呼び方を設定する callfunc "FncSearchSex", getcharid(3), '@sex$; if ( '@sex$ == "M" ) { set '@pc$, "お兄ちゃん"; } else { set '@pc$, "お姉ちゃん"; } // しりとり履歴を取得 callfunc "FncSearchHist", '@npc_id, '@apg_id, '@cnt, '@pre_jname$, '@pre_last_char$; // 履歴がない場合(しりとりをしていない場合) if ( '@cnt == 0 ) { mes "[しりとり少女]"; mes "こんにちわ、" + '@pc$ + "。"; next; mes "[しりとり少女]"; mes '@pc$ + "、しりとりしようよ。"; mes "私のお兄ちゃんったらしりとり弱くて"; mes "つまらないの。"; mes "私に勝てたらプレゼントをあげるよ。"; next; // PTに加入していなかったら会話を終了する if ( '@apg_id == 0 ) { mes "[しりとり少女]"; mes "あ、でもどうせならみんなで遊びたいから。"; mes "お友達とパーティを組んで来て欲しいな。"; close; } else { mes "[しりとり少女]"; mes "あ、" + '@pc$ + "パーティに入ってるんだ。"; mes "パーティのお友達と一緒にしりとりしたいな。"; mes "みんながいたほうが楽しいよ。"; next; } switch (select("いいよ","今は忙しい")) { case 1: // しりとり履歴を再取得 callfunc "FncSearchHist", '@npc_id, '@apg_id, '@cnt, '@pre_jname$, '@pre_last_char$; // 会話中に別のPTメンバーがしりとりを始めていなければしりとり開始 if ( '@cnt == 0 ) { // 初回キーワード検索 callfunc "FncSearchItemFirst", '@item_id, '@jname$, '@first_char$, '@last_char$; // キーワード保存 callfunc "FncSaveHist", '@npc_id, '@apg_id, '@item_id; mes "[しりとり少女]"; mes "わーい!"; mes "じゃあ私からいくよ。"; next; mes "[しりとり少女]"; mes "最初は" + '@jname$ + "の"; mes "「^ff0000" + '@last_char$ + "^000000」からだよ。"; mes "「^ff0000" + '@last_char$ + "^000000」がつくアイテムを持ってきてね。"; close; // 会話中に別のPTメンバーがしりとりを始めていたら会話を終了させる } else { mes "[しりとり少女]"; mes "あっ、ごめんなさい。"; mes '@pc$ + "のパーティメンバーさんと"; mes "しりとり始めちゃった。"; next; mes "[しりとり少女]"; mes "もう一回話しかけてね。"; close; } break; case 2: mes "[しりとり少女]"; mes "えー?じゃあまた今度ね。"; close; break; } // 履歴がある場合(しりとり中の場合) } else { mes "[しりとり少女]"; mes ('@cnt+1)/2 + "個目のアイテムは持ってこれた?"; mes "一つ前は" + '@pre_jname$ + "だから"; mes "次は「^ff0000" + '@pre_last_char$ + "^000000」から始まるものだよ。"; mes "「^ff0000" + '@pre_last_char$ + "^000000」がつくアイテムを持ってきてね。"; next; // しりとりの候補となるアイテムリストを作成する callfunc "FncGetItemList", '@pre_last_char$, '@nameid, '@jname$; // アイテムリストを画面に表示して選択させる switch (select(printarray('@jname$))) { default: break; } set '@sel_nameid,'@nameid[@menu-1]; // 入力確認 mes "[しりとり少女]"; mes '@jname$[@menu-1] + "でいい?"; if ( '@sel_nameid != -1 ) { mes "^ff0000選んだアイテムは消えちゃう^000000"; mes "から気をつけてね。"; } next; switch (select("いいよ","やっぱりやめる")) { case 1: break; case 2: mes "[しりとり少女]"; mes "よく選んでね。"; close; break; } // しりとり履歴を再取得 callfunc "FncSearchHist", '@npc_id, '@apg_id, '@cnt_re, '@pre_jname$, '@pre_last_char$; // 別メンバーがしりとりを進めていたら会話を終了させる if ( '@cnt != '@cnt_re ) { mes "[しりとり少女]"; mes "あっ、ごめんなさい。"; mes '@pc$ + "のパーティメンバーさんが"; mes "別のアイテムを持ってきてたみたい。"; next; mes "[しりとり少女]"; mes "もう一回話しかけてね。"; close; } // ギブアップ判定 if ( '@sel_nameid == -1 ) { // 履歴削除 callfunc "FncDelHist", '@npc_id, '@apg_id; if ( '@cnt == 1 ) { mes "[しりとり少女]"; mes "まだ1回も続いてないよ!"; mes '@pc$ + "のうそつきー。"; close; } else { mes "[しりとり少女]"; mes "私の勝ちね。"; next; mes "[しりとり少女]"; mes "約束してたプレゼントじゃないけど"; mes "楽しかったからこれあげる。"; next; // 賞品 set '@prize_lank,'@cnt/('@prize_lankup_interval*2)+1; if ( '@prize_lank >= 9 ) { getitem '@prize_nameid[8],1; } else { getitem '@prize_nameid['@prize_lank],1; } mes "[しりとり少女]"; mes "私のお兄ちゃんも" + '@pc$ + "くらい強かったらなぁ。"; close; } } // 入力キーワード正否判定(判定結果 1:正 -1:否(禁則) -2:否(重複) -3:DB無し) callfunc "FncCheckInput", '@npc_id, '@apg_id, '@sel_nameid, '@ret; if ( '@ret == 1 ) { // 手持ちアイテム削除 //delitem '@sel_nameid,1; // 履歴保存 callfunc "FncSaveHist", '@npc_id, '@apg_id, '@sel_nameid; // 次キーワード検索 callfunc "FncSearchItemSecond", '@npc_id, '@apg_id, '@sel_nameid, '@next_nameid, '@next_jname$, '@next_last_char$; // NPC敗北判定 if ( rand(10000) < '@lose_per ) { set '@next_nameid,-1; } // 次キーワードが見つかった場合 if ( '@next_nameid != -1 ) { // 履歴保存 callfunc "FncSaveHist", '@npc_id, '@apg_id, '@next_nameid; mes "[しりとり少女]"; mes "私の番だね。"; next; mes "[しりとり少女]"; mes "次は" + '@next_jname$ + "の"; mes "「^ff0000" + '@next_last_char$ + "^000000」だよ。"; mes "「^ff0000" + '@next_last_char$ + "^000000」がつくアイテムを持ってきてね。"; close; // 次キーワードが見つからなかった場合 } else { // 履歴削除 callfunc "FncDelHist", '@npc_id, '@apg_id; mes "[しりとり少女]"; mes "私の番ね。"; next; mes "[しりとり少女]"; mes "うーん・・・"; next; mes "[しりとり少女]"; mes "うーん、うーん・・・"; next; mes "[しりとり少女]"; mes "だめ、思いつかない。"; next; mes "[しりとり少女]"; mes "私の負けよ。"; mes "すごいわ" + '@pc$ + "。"; mes "私、負けるの初めてかも。"; next; mes "[しりとり少女]"; mes "はい、約束してたプレゼントだよ。"; next; // 賞品 set '@prize_lank,'@cnt/('@prize_lankup_interval*2)+1; if ( '@prize_lank >= 10 ) { getitem '@prize_nameid[9],1; } else { getitem '@prize_nameid['@prize_lank],1; } mes "[しりとり少女]"; mes "また遊んでね。"; mes "約束だよ。"; close; } } else if ( '@ret == -1 ) { mes "[しりとり少女]"; mes "最後が「ん」だからダメだよ。"; mes "他のを持ってきて。"; close; } else { // 履歴削除 callfunc "FncDelHist", '@npc_id, '@apg_id; mes "[しりとり少女]"; mes "これは前にも出たものだよ。"; mes "私の勝ちね、" + '@pc$ + "。"; next; mes "[しりとり少女]"; mes "約束してたプレゼントじゃないけど"; mes "楽しかったからこれあげる。"; next; // 賞品 set '@prize_lank,'@cnt/('@prize_lankup_interval*2)+1; if ( '@prize_lank >= 9 ) { getitem '@prize_nameid[8],1; } else { getitem '@prize_nameid['@prize_lank],1; } mes "[しりとり少女]"; mes "私のお兄ちゃんも" + '@pc$ + "くらい強かったらなぁ。"; close; } } } //========================================================================== //しりとりマスター //-------------------------------------------------------------------------- prontera.gat,81,315,5 script しりとりマスター 120,{ //================================== // 設定部分 //---------------------------------- // NPC-ID set '@npc_id,3; // クリアの為のしりとり継続回数(アイテムを渡す数) set '@border,3; // 賞品 set '@prize_nameid,501; // NPC敗北確率(例.10なら1回毎に10/10000の確率でNPCが敗北) set '@lose_per,2000; //================================== // ここから本体 //---------------------------------- // GuildIDを取得 set '@apg_id,getcharid(2); // 性別を取得してPCの呼び方を設定する callfunc "FncSearchSex", getcharid(3), '@sex$; if ( '@sex$ == "M" ) { set '@pc$, "小僧"; } else { set '@pc$, "小娘"; } // しりとり履歴を取得 callfunc "FncSearchHist", '@npc_id, '@apg_id, '@cnt, '@pre_jname$, '@pre_last_char$; // 履歴がない場合(しりとりをしていない場合) if ( '@cnt == 0 ) { mes "[しりとりマスター]"; mes "どうした" + '@pc$ + "。"; mes "ワシとしりとりをしたいのか?"; next; mes "[しりとりマスター]"; mes "ワシと一定回数しりとりを続けられたら"; mes "褒美をやるぞ?"; mes "ただしワシは強いからな。"; mes "ギルド全員でかかって来るがよい。"; next; // PTに加入していなかったら会話を終了する if ( '@apg_id == 0 ) { mes "[しりとりマスター]"; mes "む?お主、ギルドに入っておらんのか。"; mes "お主一人じゃ話にならん。"; mes "ギルドに入って出直してまいれ。"; close; } switch (select("受けて立とう","今は忙しい")) { case 1: // しりとり履歴を再取得 callfunc "FncSearchHist", '@npc_id, '@apg_id, '@cnt, '@pre_jname$, '@pre_last_char$; // 会話中に別のギルドメンバーがしりとりを始めていなければしりとり開始 if ( '@cnt == 0 ) { // 初回キーワード検索 callfunc "FncSearchItemFirst", '@item_id, '@jname$, '@first_char$, '@last_char$; // キーワード保存 callfunc "FncSaveHist", '@npc_id, '@apg_id, '@item_id; mes "[しりとりマスター]"; mes "よろしい。"; mes "ではワシからいかせて貰おう。"; next; mes "[しりとりマスター]"; mes "最初は" + '@jname$ + "の"; mes "「^ff0000" + '@last_char$ + "^000000」からじゃ。"; mes "「^ff0000" + '@last_char$ + "^000000」がつくアイテムを持ってまいれ。"; close; // 会話中に別のPTメンバーがしりとりを始めていたら会話を終了させる } else { mes "[しりとりマスター]"; mes "むっ?"; mes '@pc$ + "のギルドメンバーと"; mes "勝負を始めてしもうとった。"; next; mes "[しりとりマスター]"; mes "すまんが、もう一度話しかけてくれ。"; close; } break; case 2: mes "[しりとりマスター]"; mes "ふん、怖気づいたか。"; close; break; } // 履歴がある場合(しりとり中の場合) } else { mes "[しりとりマスター]"; mes ('@cnt+1)/2 + "個目のアイテムは持ってこれたか?"; mes "一つ前は" + '@pre_jname$ + "じゃから"; mes "次は「^ff0000" + '@pre_last_char$ + "^000000」から始まるものじゃ。"; mes "「^ff0000" + '@pre_last_char$ + "^000000」がつくアイテムを持ってまいれ。"; next; // しりとりの候補となるアイテムリストを作成する callfunc "FncGetItemList", '@pre_last_char$, '@nameid, '@jname$; // アイテムリストを画面に表示して選択させる switch (select(printarray('@jname$))) { default: break; } set '@sel_nameid,'@nameid[@menu-1]; // 入力確認 mes "[しりとりマスター]"; mes '@jname$[@menu-1] + "でいいのじゃな?"; if ( '@sel_nameid != -1 ) { mes "^ff0000選んだアイテムは消える^000000"; mes "から気をつけるのじゃぞ。"; } next; switch (select("いいよ","やっぱりやめる")) { case 1: break; case 2: mes "[しりとりマスター]"; mes "よく選ぶのじゃな。"; close; break; } // しりとり履歴を再取得 callfunc "FncSearchHist", '@npc_id, '@apg_id, '@cnt_re, '@pre_jname$, '@pre_last_char$; // 別メンバーがしりとりを進めていたら会話を終了させる if ( '@cnt != '@cnt_re ) { mes "[しりとりマスター]"; mes "むっ?"; mes '@pc$ + "のギルドメンバーが"; mes "別のアイテムを持ってきておった。"; next; mes "[しりとりマスター]"; mes "すまんが、もう一度話しかけてくれ。"; close; } // ギブアップ判定 if ( '@sel_nameid == -1 ) { // 履歴削除 callfunc "FncDelHist", '@npc_id, '@apg_id; if ( '@cnt == 1 ) { mes "[しりとりマスター]"; mes "1回も続つづかんとは情けない。"; close; } else { mes "[しりとりマスター]"; mes "ワシの勝ちじゃな。"; next; mes "[しりとりマスター]"; mes "なかなかいい線いっとったが"; mes "まだまだワシには遠く及ばんな。"; mes "ワッハッハッハ。"; close; } } // 入力キーワード正否判定(判定結果 1:正 -1:否(禁則) -2:否(重複) -3:DB無し) callfunc "FncCheckInput", '@npc_id, '@apg_id, '@sel_nameid, '@ret; if ( '@ret == 1 ) { // 手持ちアイテム削除 //delitem '@sel_nameid,1; // 一定回数に達した場合は賞品を渡して終了する if ( ('@cnt+1)/2 >= '@border ) { // 履歴削除 callfunc "FncDelHist", '@npc_id, '@apg_id; mes "[しりとりマスター]"; mes "一定回数しりとりを続けられたようじゃな。"; mes "よろしい、褒美をやろう。"; next; getitem '@prize_nameid,1; mes "[しりとりマスター]"; mes "また来るがよいぞ。"; close; } // 履歴保存 callfunc "FncSaveHist", '@npc_id, '@apg_id, '@sel_nameid; // 次キーワード検索 callfunc "FncSearchItemSecond", '@npc_id, '@apg_id, '@sel_nameid, '@next_nameid, '@next_jname$, '@next_last_char$; // NPC敗北判定 if ( rand(10000) < '@lose_per ) { set '@next_nameid,-1; } // 次キーワードが見つかった場合 if ( '@next_nameid != -1 ) { // 履歴保存 callfunc "FncSaveHist", '@npc_id, '@apg_id, '@next_nameid; mes "[しりとりマスター]"; mes "ワシの番じゃな。"; next; mes "[しりとりマスター]"; mes "次は" + '@next_jname$ + "の"; mes "「^ff0000" + '@next_last_char$ + "^000000」じゃ。"; mes "「^ff0000" + '@next_last_char$ + "^000000」がつくアイテムを持ってまいれ。"; close; // 次キーワードが見つからなかった場合 } else { // 履歴削除 callfunc "FncDelHist", '@npc_id, '@apg_id; mes "[しりとりマスター]"; mes "ワシの番じゃな。"; next; mes "[しりとりマスター]"; mes "うーむ・・・"; next; mes "[しりとりマスター]"; mes "うーむ、うーむ・・・"; next; mes "[しりとりマスター]"; mes "だめじゃ、もう思いつかん。"; next; mes "[しりとりマスター]"; mes "ワシの負けじゃ。"; mes '@pc$ + "やりおるな。"; next; mes "[しりとりマスター]"; mes "また来るがよい。"; next; mes "[しりとりマスター]"; mes "・・・"; next; mes "[しりとりマスター]"; mes "・・・ ・・・"; next; mes "[しりとりマスター]"; mes "・・・ ・・・ ・・・"; next; mes "[しりとりマスター]"; mes "何?褒美をくれじゃと?"; mes "あれは^ff0000一定回数しりとりを続けられたら^000000じゃ。"; mes "今回は一定回数に達しとらん。"; mes "修行をして出直してまいれ。"; close; } } else if ( '@ret == -1 ) { mes "[しりとりマスター]"; mes "最後が「ん」だからダメじゃ。"; mes "他のを持ってまいれ。"; close; } else { // 履歴削除 callfunc "FncDelHist", '@npc_id, '@apg_id; mes "[しりとりマスター]"; mes "これは前にも出たものじゃな。"; mes "ワシの勝ちじゃ、" + '@pc$ + "。"; next; mes "[しりとりマスター]"; mes "なかなかいい線いっとったが"; mes "まだまだワシには遠く及ばんな。"; mes "ワッハッハッハ。"; close; } } }