//汎用CSV版スロットエンチャントNPC http://ro-server.net84.net/ //成功率付きのアイテム交換スクリプトというイメージです。 //7行目の'itemdb$のパスを確認してください。 - script SE_NPC#slot 72,{ //--------設定--------- if ('db_first != 1) { set 'itemdb$,"script/original/db/slotenchant-csv.txt"; csvreload 'itemdb$; set 'db_first, 1; } //--------終了--------- set @name$, "[" + strnpcinfo(4) + "]"; //名前(NPC) //メッセージの管理 function message { // 関数の定義 switch (getarg(0)){ case 1://初めに話したとき mes @name$; mes "エンチャントしたい物を選んでね。"; next; break; case 2://選択の後・作成名 mes @name$; mes getarg(1) + "にエンチャントするには、^3355FF"; break; case 3://選択の後・必要材料 mes getarg(1) + " が " + getarg(2); break; case 4://選択の後・フッタ mes "^000000必要よ。確率は" + getarg(1) +"%ね。"; break; case 5://選択の後・フッタ next; mes @name$; mes "あと、注意点なんだけど、"; mes "スロットエンチャントを行うと"; mes "成否に関わらず材料は全てなくなるよ。"; mes "また、例え成功したとしても"; mes "精錬・カード・属性等の付与効果は"; mes "全部消えちゃうの。"; mes "それでもやる?"; next; break; case 6://終わり mes @name$; mes "ありがと!また来てね。"; break; case 10://成功 mes @name$; mes "成功したわ!"; break; case 11://失敗 mes @name$; mes "失敗したわ…"; break; case 12://ループ mes " "; mes "もう一回、やる?"; next; break; case 98://エラー mes @name$; mes "材料がなくなっちゃった。"; mes "また来てね。"; break; case 99://キャンセル mes "また来てね。"; break; } return; } //メイン処理 message 1; //選択 // '@level: 選択肢の深度 // '@line: 選択肢の数 // 'itemdb$: CSVファイルの場所 // '@row_num: 一時的なCSVファイルの行数 // '@row['@level]['@line]: CSVファイルの行数を格納 // '@type$['@level]['@line]: 選択肢の内容を格納 // '@temp: 一時的に使用 set '@level,1; set '@row_num,1; while (1) { //無限ループ('@lineの初期化、'@row_numは+1) for(set '@line,1;'@row_num < 999;set '@row_num,'@row_num+1) { set '@temp, csvread('itemdb$, '@row_num, 0); //CSVの行頭の文字が深度より大きいならcontinue //CSVの行頭の文字が深度より小さいならbreak if ( '@temp > '@level ) continue; if ( '@temp < '@level ) break; //つまり深度が同じなら'@type$['@level]['@line]に格納 set '@type$['@level]['@line],csvread('itemdb$, '@row_num, 1); //その時の行の次の行数を記憶 set '@row['@level]['@line],'@row_num+1; set '@line,'@line+1; } //'@type$['@level]['@line]の最後に"やめる"を追加 set '@line,'@line+1; set '@type$['@level]['@line],"やめる"; //'@type$['@level]の選択と"やめる"なら終了 set @menu,select(printarray('@type$['@level][0])) - 1; if (@menu == '@line) goto L_Cancel2; set '@row_num,'@row['@level][@menu]; set '@name$,'@type$['@level][@menu]; //CSVの次の行の行頭の文字が深度以下ならbreak set '@temp, csvread('itemdb$, '@row_num, 0); if ('@temp <= '@level) break; //深度をあげる set '@level,'@level+1; } //材料読み込み // 'itemdb$: CSVファイルの場所 // '@line: CSVの行数 // '@name$ アイテム名の格納 // '@name_id アイテムIDの格納 // '@success 成功率 // '@cols: アイテムの種類カウント // '@check_id['@cols]: 必要アイテムID // '@check_num['@cols]: 必要アイテム個数 set '@line,'@row_num-1; set '@name_id, csvread('itemdb$, '@line, 2); set '@success, csvread('itemdb$, '@line, 3); set '@cols,1; message 2,'@name$; while (1) { set '@check_id['@cols], csvread('itemdb$, '@line, ('@cols * 2 + 2)); if ( '@check_id['@cols] == 0 ) break; set '@check_num['@cols], csvread('itemdb$, '@line, ('@cols * 2 + 3)); if ( '@check_id['@cols] < 0 ) message 3,"ゼニー",'@check_num['@cols] + "z"; else message 3,getitemname('@check_id['@cols]),'@check_num['@cols] + "個"; set '@cols,'@cols + 1; } message 4,'@success; //チェック・選択 // '@ng_flag: チェックフラグ // '@cols: アイテムの種類カウント // '@check_id['@cols]: 必要アイテムID // '@check_num['@cols]: 必要アイテム個数 // '@temp: 一時的に使用 set '@cols,1; //1回目のチェック while (1) { if ( '@check_id['@cols] == 0 ) break; if ( '@check_id['@cols] == -1 ) set '@temp, ( Zeny - '@check_num['@cols] ); else set '@temp, ( countitem('@check_id['@cols]) - '@check_num['@cols] ); if ( '@temp < 0 ) set '@ng_flag, 1; set '@cols,'@cols + 1; } if ('@ng_flag) close; message 5; //最終チェック・作成 while (1) { set '@cols,1; if (select("やる","やめる") == 2) goto L_Cancel2; while (1) { if ( '@check_id['@cols] == 0 ) break; if ( '@check_id['@cols] == -1 ) set '@temp, ( Zeny - '@check_num['@cols] ); else set '@temp, ( countitem('@check_id['@cols]) - '@check_num['@cols] ); if ( '@temp < 0 ) set '@ng_flag, 1; set '@cols,'@cols + 1; } if ('@ng_flag){ message 98; close;} set '@cols,1; while (1) { if ( '@check_id['@cols] == 0 ) break; if ( '@check_id['@cols] == -1 ) set Zeny, Zeny - '@check_num['@cols]; else delitem '@check_id['@cols], '@check_num['@cols]; set '@cols,'@cols + 1; } if(rand(100) < '@success) { misceffect 113,getcharid(0);; message 10; getitem '@name_id,1; } else{ misceffect 183,getcharid(0);; message 11; } message 12; } L_Cancel2: mes @name$; L_Cancel: message 99; if(getgmlevel() > 10) set 'db_first, 0; L_Exit: close; } payo1.gat,55,122,4 duplicate(SE_NPC#slot) SE_NPC#slot::セレナ 72