//汎用CSV版アイテム交換NPC http://kaoru.orz.site11.com/ - script 交換NPC#dammy 72,{ //--------設定--------- if ('db_first[strnpcinfo(5)] < 1) { set 'itemdb$[strnpcinfo(5)],"script/test/db/" + strnpcinfo(2) + ".csv"; 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必要よ。"; next; mes @name$; break; case 5://選択の後・フッタ mes "どうする?"; next; break; case 6://終わり mes @name$; mes "ありがと!また来てね。"; break; case 94://所持数オーバー mes "・個数が…"; break; case 95://所持種類オーバー mes "・種類が…"; break; case 96://重量オーバー mes "・重量が…"; break; case 97://アイテムorゼニー不足 mes "・アイテムorゼニー不足"; 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]の選択と"やめる"なら終了 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$[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]: 必要アイテム個数 // '@min: 作れる数 // '@Total_Weight: 材料の重量 // '@temp: 一時的に使用 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; set '@min,30000; set '@Total_Weight,0; 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"; set '@temp, (Zeny / '@check_num['@cols] ); } else{ switch(getiteminfo('@check_id['@cols],3)){ case 4: //防具アイテム、ペットの卵、ペット専用装備品 case 5: //武器アイテム case 8: //弓 case 9: //両手武器 case 11: //頭装備上中段 case 12: //頭装備上下段 case 13: //頭装備中下段 case 14: //頭装備上中下段 case 15: //銃 set '@slotname$,"[" + getiteminfo('@check_id['@cols],10) + "]"; break; default: set '@slotname$,""; } message 3,getitemname('@check_id['@cols]) + '@slotname$,'@check_num['@cols] + "個"; set '@temp, ( countitem('@check_id['@cols]) / '@check_num['@cols] ); set '@Total_Weight,'@Total_Weight + getiteminfo('@check_id['@cols],6) * '@check_num['@cols]; } if ( '@min > '@temp ) set '@min,'@temp; set '@cols,'@cols + 1; } message 4; //材料orゼニー関係 if ('@min < 1){ message 97; } //所持数・種類関係 switch(getiteminfo('@name_id,3)){ case 4: //防具アイテム、ペットの卵、ペット専用装備品 case 5: //武器アイテム case 8: //弓 case 9: //両手武器 case 11: //頭装備上中段 case 12: //頭装備上下段 case 13: //頭装備中下段 case 14: //頭装備上中下段 case 15: //銃 getinventorylist; if(@inventorylist_count == 100){ message 95; set '@min,0; } else if('@min > (100 - @inventorylist_count)){ set '@min,100 - @inventorylist_count; } default: if(countitem('@name_id) == 30000){ message 94; set '@min,0; } else if('@min > (30000 - countitem('@name_id))){ set '@min,30000 - countitem('@name_id); } } //重量関係 set '@diff_weight,(getiteminfo('@name_id,6) * '@name_num) - '@Total_Weight; if('@diff_weight > 0){ set '@temp, ((MaxWeight - Weight) / '@diff_weight); if('@temp < 1){ message 96; set '@min,0; } else if('@min > '@temp){ set '@min,'@temp; } } if ('@min < 1) goto L_Exit; message 5; set '@flag, strnpcinfo(5); if ('@flag >= 50 ||'@min == 1) set '@menu_list$[1],"交換する"; else setarray '@menu_list$[1],"1回交換","回数指定",'@min + "回(最大)交換"; set '@menu_list$[4],"やめる"; switch(select(printarray('@menu_list$)) - 1){ 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; } new_1-1.gat,50,110,5 duplicate(交換NPC#dammy) 武器アイテム交換#weapon::エレナ#50 72 new_1-1.gat,55,110,5 duplicate(交換NPC#dammy) 消耗アイテム交換#stone::ティナ#1 72 new_1-1.gat,50,115,5 duplicate(交換NPC#dammy) 回復アイテム交換#juice::マナ#2 72 new_1-1.gat,55,115,5 duplicate(交換NPC#dammy) 装備アイテム交換#equip::ハルナ#51 72