//汎用CSV版アイテム交換NPC http://test-ro.net78.net/ - script 交換NPC#dammy 72,{ //--------設定--------- if ('db_first[strnpcinfo(5)] < 1) { set 'itemdb$[strnpcinfo(5)],"script/original/db/" + strnpcinfo(2) + ".txt"; csvreload 'itemdb$[strnpcinfo(5)]; set 'db_first[strnpcinfo(5)], 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) + "を" + getarg(2) + "個作るには、^3355FF"; break; case 3://選択の後・必要材料 mes getarg(1) + " が " + getarg(2); break; case 4://選択の後・フッタ mes "^000000必要よ。"; break; case 5://選択の後・フッタ mes "どうする?"; next; break; case 6://終わり mes @name$; mes "ありがと!また来てね。"; break; case 98://エラー mes @name$; mes "エラーです。"; mes "交換を中止しますね。"; break; case 99://キャンセル mes "また来てね。"; break; } return; } //メイン処理 message 1; //選択 // '@level: 選択肢の深度 // '@line: 選択肢の数 // 'itemdb$[strnpcinfo(5)]: 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$[strnpcinfo(5)], '@row_num, 0); //CSVの行頭の文字が深度より大きいならcontinue //CSVの行頭の文字が深度より小さいならbreak if ( '@temp > '@level ) continue; if ( '@temp < '@level ) break; //つまり深度が同じなら'@type$['@level]['@line]に格納 set '@type$['@level]['@line],csvread('itemdb$[strnpcinfo(5)], '@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]の選択と"やめる"なら終了 if (arrayselect('@type$['@level][0]) == '@line) goto L_Cancel2; set '@row_num,'@row['@level][@menu]; set '@name$,'@type$['@level][@menu]; //CSVの次の行の行頭の文字が深度以下ならbreak set '@temp, csvread('itemdb$[strnpcinfo(5)], '@row_num, 0); if ('@temp <= '@level) break; //深度をあげる set '@level,'@level+1; } //材料読み込み // 'itemdb$[strnpcinfo(5)]: CSVファイルの場所 // '@line: CSVの行数 // '@name$ アイテム名の格納 // '@name_id アイテムIDの格納 // '@name_num アイテム数の格納 // '@cols: アイテムの種類カウント // '@check_id['@cols]: 必要アイテムID // '@check_num['@cols]: 必要アイテム個数 set '@line,'@row_num-1; set '@name_id, csvread('itemdb$[strnpcinfo(5)], '@line, 2); set '@name_num, csvread('itemdb$[strnpcinfo(5)], '@line, 3); set '@cols,1; message 2,'@name$,'@name_num; while (1) { set '@check_id['@cols], csvread('itemdb$[strnpcinfo(5)], '@line, ('@cols * 2 + 2)); if ( '@check_id['@cols] == 0 ) break; set '@check_num['@cols], csvread('itemdb$[strnpcinfo(5)], '@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; //チェック・選択 // '@min: 作れる数 // '@cols: アイテムの種類カウント // '@check_id['@cols]: 必要アイテムID // '@check_num['@cols]: 必要アイテム個数 // '@temp: 一時的に使用 set '@min,30000; set '@cols,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 ( '@min > '@temp ) set '@min,'@temp; set '@cols,'@cols + 1; } if ('@min < 1) goto L_Exit; message 5; switch(select("1回交換","回数指定",'@min + "回(最大)交換","やめる")){ case 1: set '@number,1; break; case 2: input '@number; break; case 3: set '@number,'@min; break; case 4: goto L_Cancel2; } //最終チェック・作成 if ('@number < 1){ message 98; goto L_Exit;} set '@cols,1; while (1) { if ( '@check_id['@cols] == 0 ) break; set '@check_num['@cols], '@check_num['@cols] * '@number; 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 '@min, 0; set '@cols,'@cols + 1; } if ('@min < 1){ message 98; goto L_Exit;} 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; } gmcommand "@item " + '@name_id + " " + ('@name_num * '@number); close2; end; L_Cancel2: mes @name$; L_Cancel: message 99; if(getgmlevel() > 10) set 'db_first[strnpcinfo(5)], 0; L_Exit: close2; end; } hugel.gat,106,169,5 duplicate(交換NPC#dammy) 武器アイテム交換#weapon::エレナ#0 72 hugel.gat,90,151,5 duplicate(交換NPC#dammy) 鉱石アイテム交換#stone::ティナ#1 72 hugel.gat,104,170,5 duplicate(交換NPC#dammy) 回復アイテム交換#juice::マナ#2 72 hugel.gat,102,171,5 duplicate(交換NPC#dammy) 装備アイテム交換#equip::ハルナ#3 72