//============================================================================== // アイテム強化職員 by はにわ 2009/09/12 ver1.00 //============================================================================== //■概要 // アイテムにZenyを投資することでアイテムの性能(ATKやスロット数など)を向上させる // //■仕様 // ・db/item_db.txtを書き換えるので全プレイヤーに効果が反映される // // ・強化対象アイテムは、アイテムIDまたはアイテム名から検索する // // ・アイテムIDはアイテム一覧表示機能で調べられるようにしている // // ・投資はアイテム毎/性能毎に行う(例:ナイフのATKに100z投資) // // ・性能毎に強化に必要な金額を設定できる // // ・強化に必要な金額は数十G、数T、それ以上も設定可能 // // ・投資した金額が強化に必要な金額に満たなければ投資状態CSVに投資金額を保存して // 次回に繰り越し // // ・投資した金額が強化に必要な金額を満たしていればアイテムの性能を強化 // // ・投資履歴をCSVで保存(不正チェック、バグチェック、公開などで利用) // // ・強化出来る性能および上限はスクリプト内で制御 // 重量 ・・・ 現在値が20以上なら強化可 // ATK ・・・ 現在値が1以上なら強化可 // DEF ・・・ 現在値が1以上なら強化可 // 射程 ・・・ 現在値が2以上なら強化可 // スロット数 ・・・ 武器防具かつ現在値が3以下なら強化可 // 装備可能性別 ・・・ 武器防具かつ制限有りなら強化可 // //■注意 // ・サーバプログラムの仕様上、db/item_db.txtを直接書き換えられないので、 // 別途用意したcopy.vbsを併用する必要あり // // ・不具合があった時のためdb/item_db.txtのバックアップを取っておく事を推奨 // // ・投資履歴CSVが溜まると重くなる為、ある程度(数万件)で整理する必要あり // //============================================================================== prontera.gat,164,143,4 script アイテム強化職員 861,{ //-------------------------------------------------------------------------- //CSV更新ロックを掛ける // 引数 getarg(0) :文字列:ロックID(アカウントID) // 戻値 getarg(1) :数字 :ロック成否(1:成功 0:失敗) //-------------------------------------------------------------------------- function Lock { debugmes "1"; set '@lid$,getarg(0); //10秒間だけロックを掛けられるか試みる(100ms * 100回) for( set '@i,0; '@i < 100; set '@i,'@i+1 ) { //ロックされていなければロックする if ('lock$ == "0") { debugmes "2"; set 'lock$,'@lid$; } sleep2 100; //ロックしたユーザが自身のアカウントIDであるならロック成功 if ('lock$ == '@lid$) { debugmes "3"; set getarg(1),1; return; } } set getarg(1),0; } //-------------------------------------------------------------------------- //CSV更新ロックを解除する //-------------------------------------------------------------------------- function UnLock { set 'lock$,"0"; } //-------------------------------------------------------------------------- //文字列数値同士の減算("123456"-"1234"="122222" / 結果がマイナスなら"0") // 引数 getarg(0) :文字列:減算対象 // 引数 getarg(1) :文字列:減算値 // 戻値 getarg(2) :文字列:減算結果 //-------------------------------------------------------------------------- function StrSub { set '@a$,getarg(0); set '@b$,getarg(1); set '@a_len,getstrlen('@a$); set '@b_len,getstrlen('@b$); set '@c$,""; set '@down_flg,0; if ('@a_len < '@b_len) { set '@c$,"0"; } else if ('@a_len == '@b_len && '@a$ < '@b$) { set '@c$,"0"; } else if ('@a$ == '@b$) { set '@c$,"0"; } else { while (getstrlen('@a$) >= 1) { //末尾から最大9桁取り出し if (getstrlen('@a$) <= 9) { set '@a_sub$,substr('@a$,(-1) * getstrlen('@a$)); set '@a$,""; } else { set '@a_sub$,substr('@a$,-9); set '@a$,substr('@a$,0,getstrlen('@a$)-9); } if (getstrlen('@b$) <= 9) { set '@b_sub$,substr('@b$,(-1) * getstrlen('@b$)); set '@b$,""; } else { set '@b_sub$,substr('@b$,-9); set '@b$,substr('@b$,0,getstrlen('@b$)-9); } //文字列型→数字型変換 csvwrite "CALC",0,0,'@a_sub$; set '@a_sub,csvread("CALC",0,0); csvwrite "CALC",0,0,'@b_sub$; set '@b_sub,csvread("CALC",0,0); //繰り下げ処理 if ('@down_flg == 1) { set '@a_sub,'@a_sub - 1; } //繰り下げ判定 if ('@a_sub < '@b_sub) { csvwrite "CALC",0,0,"1" + '@a_sub$; set '@a_sub,csvread("CALC",0,0); if ('@down_flg == 1) { set '@a_sub,'@a_sub - 1; } set '@down_flg,1; } else { set '@down_flg,0; } //減算 set '@c_sub$,('@a_sub - '@b_sub) + ""; //9桁になるように先頭に0を付与 if (getstrlen('@a$) >= 1) { while (getstrlen('@c_sub$) < 9) { set '@c_sub$,"0" + '@c_sub$; } } //減算結果結合 set '@c$,'@c_sub$ + '@c$; } } //先頭0削除 while (getstrlen('@c$) >= 2) { if (substr('@c$,0,1) == "0") { set '@c$,substr('@c$,1); } else { break; } } set getarg(2),'@c$; } //-------------------------------------------------------------------------- //文字列を金額形式へ変換(aaabbbccc→aaa,bbb,ccc) // 引数 getarg(0) :文字列:変換前文字列 // 引数 getarg(1) :文字列:変換後文字列 //-------------------------------------------------------------------------- function StrToZeny { set '@inp$,getarg(0); set '@inp_len,getstrlen('@inp$); set '@out$,""; for( set '@i,1; '@i <= '@inp_len; set '@i,'@i+1 ) { set '@out$,substr('@inp$,'@inp_len-'@i,1) + '@out$; if (('@i%3 == 0) && ('@i < '@inp_len)) { set '@out$,"," + '@out$; } } set getarg(1),'@out$; } //-------------------------------------------------------------------------- //必要投資金額取得 // 引数 getarg(0) :数字 :アイテムID // 引数 getarg(1) :数字 :強化対象 // 戻値 getarg(2) :文字列:必要投資金額 //-------------------------------------------------------------------------- function GetNeedZeny { set '@item_id,getarg(0); set '@tag,getarg(1); set '@zeny$,""; //投資状態CSVから必要投資金額を取得 set '@row,csvfind('finv$,'ITDB_ID,'@item_id); if ('@row >= 0) { set '@zeny,csvread('finv$,'@row,'@tag); if ('@zeny >= 1) { set '@zeny$,'@zeny + ""; } } //CSVから取得できなかった場合はデフォルト値を設定 if ('@zeny$ == "") { if ('@tag == 'ITDB_WEIGHT) { set '@zeny$,'ZENY_WEIGHT$; } else if ('@tag == 'ITDB_ATK) { set '@zeny$,'ZENY_ATK$; } else if ('@tag == 'ITDB_DEF) { set '@zeny$,'ZENY_DEF$; } else if ('@tag == 'ITDB_RANGE) { set '@zeny$,'ZENY_RANGE$; } else if ('@tag == 'ITDB_SLOT) { set '@zeny$,'ZENY_SLOT$; } else if ('@tag == 'ITDB_GENDER) { set '@zeny$,'ZENY_GENDER$; } else { set '@zeny$,"1000000000"; } } set getarg(2),'@zeny$; } //-------------------------------------------------------------------------- //アイテム装備可能JOB一覧作成 // 引数 getarg(0) :数字 :装備可能JOB //-------------------------------------------------------------------------- function DispUserList { set '@job,getarg(0); set '@job_list$,""; if ('@job == 195026943 || '@job == 1000333311) { set '@job_list$,'@job_list$ + "全ての職業"; } else if ('@job == 186638334) { set '@job_list$,'@job_list$ + "ノービス系を除く全職業"; } else if ('@job == 2088832) { set '@job_list$,'@job_list$ + "二次職"; } else if ('@job == 35643264) { set '@job_list$,'@job_list$ + "二次職 拳聖"; } else { if ('@job & 1) { set '@job_list$,'@job_list$ + "ノービス "; } if ('@job & 2 && '@job & 128 && '@job & 16384) { set '@job_list$,'@job_list$ + "剣士系 "; } else { if ('@job & 2) { set '@job_list$,'@job_list$ + "剣士 "; } if ('@job & 128) { set '@job_list$,'@job_list$ + "騎士 "; } if ('@job & 16384) { set '@job_list$,'@job_list$ + "クルセイダー "; } } if ('@job & 4 && '@job & 512 && '@job & 65536) { set '@job_list$,'@job_list$ + "マジシャン系 "; } else { if ('@job & 4) { set '@job_list$,'@job_list$ + "マジシャン "; } if ('@job & 512) { set '@job_list$,'@job_list$ + "ウィザード "; } if ('@job & 65536) { set '@job_list$,'@job_list$ + "セージ "; } } if ('@job & 8 && '@job & 2048 && '@job & 524288 && '@job & 1048576) { set '@job_list$,'@job_list$ + "アーチャー系 "; } else { if ('@job & 8) { set '@job_list$,'@job_list$ + "アーチャー "; } if ('@job & 2048) { set '@job_list$,'@job_list$ + "ハンター "; } if ('@job & 524288) { set '@job_list$,'@job_list$ + "バード "; } if ('@job & 1048576) { set '@job_list$,'@job_list$ + "ダンサー "; } } if ('@job & 16 && '@job & 256 && '@job & 32768) { set '@job_list$,'@job_list$ + "アコライト系 "; } else { if ('@job & 16) { set '@job_list$,'@job_list$ + "アコライト "; } if ('@job & 256) { set '@job_list$,'@job_list$ + "プリースト "; } if ('@job & 32768) { set '@job_list$,'@job_list$ + "モンク "; } } if ('@job & 32 && '@job & 1024 && '@job & 262144) { set '@job_list$,'@job_list$ + "商人系 "; } else { if ('@job & 32) { set '@job_list$,'@job_list$ + "商人 "; } if ('@job & 1024) { set '@job_list$,'@job_list$ + "ブラックスミス "; } if ('@job & 262144) { set '@job_list$,'@job_list$ + "アルケミスト "; } } if ('@job & 64 && '@job & 4096 && '@job & 131072) { set '@job_list$,'@job_list$ + "盗賊系 "; } else { if ('@job & 64) { set '@job_list$,'@job_list$ + "盗賊 "; } if ('@job & 4096) { set '@job_list$,'@job_list$ + "アサシン "; } if ('@job & 131072) { set '@job_list$,'@job_list$ + "ローグ "; } } if ('@job & 8388608) { set '@job_list$,'@job_list$ + "スーパーノービス "; } if ('@job & 16777216) { set '@job_list$,'@job_list$ + "テコン "; } if ('@job & 33554432) { set '@job_list$,'@job_list$ + "拳聖 "; } if ('@job & 134217728) { set '@job_list$,'@job_list$ + "ソウルリンカー "; } if ('@job & 268435456) { set '@job_list$,'@job_list$ + "ガンスリンガー "; } if ('@job & 536870912) { set '@job_list$,'@job_list$ + "忍者 "; } } if ('@job_list$ == "") { set '@job_list$,"不明"; } mes "装備:" + '@job_list$; } //-------------------------------------------------------------------------- //アイテム装備箇所表示 // 引数 getarg(0) :装備箇所(数字) //-------------------------------------------------------------------------- function DispLocName { set '@loc,getarg(0); if ('@loc == 256) { mes "系列:兜 位置:上段"; } else if ('@loc == 512) { mes "系列:兜 位置:中段"; } else if ('@loc == 1) { mes "系列:兜 位置:下段"; } else if ('@loc == 256+512+1) { mes "系列:兜 位置:上中下段"; } else if ('@loc == 512+256) { mes "系列:兜 位置:上中段"; } else if ('@loc == 4) { mes "系列:肩にかける物"; } else if ('@loc == 16) { mes "系列:鎧"; } else if ('@loc == 32) { mes "系列:盾"; } else if ('@loc == 64) { mes "系列:靴"; } else if ('@loc == 8 || '@loc == 128 || '@loc == 8+128) { mes "系列:アクセサリ"; } else { mes "系列:不明"; } } //-------------------------------------------------------------------------- //アイテム系列表示 // 引数 getarg(0) :アイテムID //-------------------------------------------------------------------------- function DispAffi { set '@item_id,getarg(0); if ('@item_id >= 1100 && '@item_id <= 1149) { mes "系列:片手剣"; } else if ('@item_id >= 1150 && '@item_id <= 1199) { mes "系列:両手剣"; } else if ('@item_id >= 1200 && '@item_id <= 1249) { mes "系列:短剣"; } else if ('@item_id >= 1250 && '@item_id <= 1299) { mes "系列:カタール"; } else if ('@item_id >= 1300 && '@item_id <= 1349) { mes "系列:片手斧"; } else if ('@item_id >= 1350 && '@item_id <= 1399) { mes "系列:両手斧"; } else if ('@item_id >= 1400 && '@item_id <= 1449) { mes "系列:片手槍"; } else if ('@item_id >= 1450 && '@item_id <= 1499) { mes "系列:両手槍"; } else if ('@item_id >= 1500 && '@item_id <= 1549) { mes "系列:鈍器"; } else if ('@item_id >= 1550 && '@item_id <= 1599) { mes "系列:本"; } else if ('@item_id >= 1600 && '@item_id <= 1649) { mes "系列:杖"; } else if ('@item_id >= 1700 && '@item_id <= 1749) { mes "系列:弓"; } else if ('@item_id >= 1750 && '@item_id <= 1799) { mes "系列:矢"; } else if ('@item_id >= 1800 && '@item_id <= 1849) { mes "系列:ナックル"; } else if ('@item_id >= 1900 && '@item_id <= 1949) { mes "系列:楽器"; } else if ('@item_id >= 1950 && '@item_id <= 1999) { mes "系列:鞭"; } else { mes "系列:不明"; } } //-------------------------------------------------------------------------- //アイテム強化可否判定 // 引数 getarg(0) :数字 :アイテムID // 引数 getarg(1) :数字 :アイテム強化対象 // 戻値 getarg(2) :数字 :強化可否(1:可 0:不可) //-------------------------------------------------------------------------- function ChkPowerUp { set '@item_id,getarg(0); set '@tag,getarg(1); set '@row,csvfind('fitdb$,'ITDB_ID,'@item_id); if ('@row >= 0) { csvreadarray 'fitdb$,'@row,'@di; csvreadarray 'fitdb$,'@row,'@di$; } else { set getarg(2),0; return; } //重量 if ('@tag == 'ITDB_WEIGHT) { if ('@di$['ITDB_WEIGHT] != "" && '@di['ITDB_WEIGHT] >= 20) { set getarg(2),1; } else { set getarg(2),0; } //ATK } else if ('@tag == 'ITDB_ATK) { if ('@di$['ITDB_ATK] != "" && '@di['ITDB_ATK] >= 1) { set getarg(2),1; } else { set getarg(2),0; } //DEF } else if ('@tag == 'ITDB_DEF) { if ('@di$['ITDB_DEF] != "" && '@di['ITDB_DEF] >= 1) { set getarg(2),1; } else { set getarg(2),0; } //射程 } else if ('@tag == 'ITDB_RANGE) { if ('@di$['ITDB_RANGE] != "" && '@di['ITDB_RANGE] >= 2) { set getarg(2),1; } else { set getarg(2),0; } //スロット数 } else if ('@tag == 'ITDB_SLOT) { if ('@di$['ITDB_TYPE] != "" && ('@di['ITDB_TYPE] == 4 || '@di['ITDB_TYPE] == 5)) { if ('@di['ITDB_SLOT] != "" && '@di['ITDB_SLOT] <= 3) { set getarg(2),1; } else { set getarg(2),0; } } else { set getarg(2),0; } //装備可能性別 } else if ('@tag == 'ITDB_GENDER) { if ('@di$['ITDB_TYPE] != "" && ('@di['ITDB_TYPE] == 4 || '@di['ITDB_TYPE] == 5)) { if ('@di$['ITDB_GENDER] != "" && '@di['ITDB_GENDER] != 0 && '@di['ITDB_GENDER] != 2) { set getarg(2),1; } else { set getarg(2),0; } } else { set getarg(2),0; } } else { set getarg(2),0; } } //-------------------------------------------------------------------------- //アイテム強化対象選択肢表示 // 引数 getarg(0) :数字 :アイテムID // 戻値 getarg(1) :数字 :アイテム強化対象("やめる"を選んだ場合は-1) // 戻値 getarg(2) :文字列:アイテム強化対象名称 //-------------------------------------------------------------------------- function DispTarget { set '@item_id,getarg(0); set '@i,0; //重量 ChkPowerUp '@item_id,'ITDB_WEIGHT,'@ret; if ('@ret == 1) { set '@disp$['@i],"重量DOWN"; set '@list['@i],'ITDB_WEIGHT; set '@i,'@i + 1; } //ATK ChkPowerUp '@item_id,'ITDB_ATK,'@ret; if ('@ret == 1) { set '@disp$['@i],"攻撃力UP"; set '@list['@i],'ITDB_ATK; set '@i,'@i + 1; } //DEF ChkPowerUp '@item_id,'ITDB_DEF,'@ret; if ('@ret == 1) { set '@disp$['@i],"防御力UP"; set '@list['@i],'ITDB_DEF; set '@i,'@i + 1; } //射程 ChkPowerUp '@item_id,'ITDB_RANGE,'@ret; if ('@ret == 1) { set '@disp$['@i],"射程UP"; set '@list['@i],'ITDB_RANGE; set '@i,'@i + 1; } //スロット数 ChkPowerUp '@item_id,'ITDB_SLOT,'@ret; if ('@ret == 1) { if ('@di['ITDB_SLOT] <= 3) { set '@disp$['@i],"スロット追加"; set '@list['@i],'ITDB_SLOT; set '@i,'@i + 1; } } //装備可能性別 ChkPowerUp '@item_id,'ITDB_GENDER,'@ret; if ('@ret == 1) { set '@disp$['@i],"性別制限解除"; set '@list['@i],'ITDB_GENDER; set '@i,'@i + 1; } set '@disp$['@i],"やめる"; set '@list['@i],-1; //選択肢表示 switch(select(printarray('@disp$))) { default: set getarg(1),'@list[@menu-1]; set getarg(2),'@disp$[@menu-1]; break; } } //-------------------------------------------------------------------------- //アイテム強化対象選択 // 引数 getarg(0) :数字 :アイテムID // 戻値 getarg(1) :数字 :アイテム強化対象("やめる"を選んだ場合は-1) // 戻値 getarg(2) :文字列:アイテム強化対象名称 //-------------------------------------------------------------------------- function SelectTarget { set '@row,csvfind('fitdb$,'ITDB_ID,getarg(0)); if ('@row >= 0) { csvreadarray 'fitdb$,'@row,'@di; } else { set getarg(1),-1; set getarg(2),""; return; } mes "[アイテム強化職員]"; mes "強化対象を選択して下さい。"; mes "--------------------------"; mes getitemname('@di['ITDB_ID]); //回復剤の場合 if ('@di['ITDB_TYPE] == 0) { mes "回復剤"; mes "重量:" + '@di['ITDB_WEIGHT]/10; //消耗品の場合 } else if ('@di['ITDB_TYPE] == 2) { mes "消耗品"; mes "重量:" + '@di['ITDB_WEIGHT]/10; //収集品の場合 } else if ('@di['ITDB_TYPE] == 3) { mes "収集品"; mes "重量:" + '@di['ITDB_WEIGHT]/10; //武器の場合 } else if ('@di['ITDB_TYPE] == 4) { DispAffi '@di['ITDB_ID]; mes "攻撃:" + '@di['ITDB_ATK]; mes "重量:" + '@di['ITDB_WEIGHT]/10; mes "スロット数:" + '@di['ITDB_SLOT]; mes "武器レベル:" + '@di['ITDB_WLV]; if ('@di['ITDB_ELV] == 0) { mes "要求レベル:無し"; } else { mes "要求レベル:" + '@di['ITDB_ELV]; } if ('@di['ITDB_GENDER] == 0) { mes "(男性限定)"; } else if ('@di['ITDB_GENDER] == 1) { mes "(女性限定)"; } DispUserList '@di['ITDB_JOB]; //防具の場合 } else if ('@di['ITDB_TYPE] == 5) { DispLocName '@di['ITDB_LOC]; mes "防御:" + '@di['ITDB_DEF]; mes "重量:" + '@di['ITDB_WEIGHT]/10; mes "スロット数:" + '@di['ITDB_SLOT]; if ('@di['ITDB_ELV] == 0) { mes "要求レベル:無し"; } else { mes "要求レベル:" + '@di['ITDB_ELV]; } if ('@di['ITDB_GENDER] == 0) { mes "(男性限定)"; } else if ('@di['ITDB_GENDER] == 1) { mes "(女性限定)"; } DispUserList '@di['ITDB_JOB]; //カードの場合 } else if ('@di['ITDB_TYPE] == 6) { mes "カード"; mes "重量:" + '@di['ITDB_WEIGHT]/10; DispLocName '@di['ITDB_LOC]; //ペットの卵の場合 } else if ('@di['ITDB_TYPE] == 7) { mes "ペットの卵"; mes "重量:" + '@di['ITDB_WEIGHT]/10; //ペット専用装備の場合 } else if ('@di['ITDB_TYPE] == 8) { mes "ペット専用装備"; mes "重量:" + '@di['ITDB_WEIGHT]/10; //矢の場合 } else if ('@di['ITDB_TYPE] == 10) { mes "矢"; mes "攻撃:" + '@di['ITDB_ATK]; mes "重量:" + '@di['ITDB_WEIGHT]/10; //弾丸の場合 } else if ('@di['ITDB_TYPE] == 16) { mes "弾丸"; mes "攻撃:" + '@di['ITDB_ATK]; mes "重量:" + '@di['ITDB_WEIGHT]/10; //苦無の場合 } else if ('@di['ITDB_TYPE] == 17) { mes "苦無"; mes "攻撃:" + '@di['ITDB_ATK]; mes "重量:" + '@di['ITDB_WEIGHT]/10; //強化装備アイテムの箱の場合 } else if ('@di['ITDB_TYPE] == 18) { mes "強化装備アイテムの箱"; mes "重量:" + '@di['ITDB_WEIGHT]/10; } else { mes "不明"; } next; //強化対象選択肢表示 DispTarget '@di['ITDB_ID],'@tag,'@tag_name$; if ('@tag == -1) { set getarg(1),-1; return; } //必要投資金額取得 GetNeedZeny '@di['ITDB_ID],'@tag,'@zeny_need$; //文字列を金額形式へ変換 StrToZeny '@zeny_need$,'@zeny_disp$; mes "[アイテム強化職員]"; mes "強化にはあと^ff0000" + '@zeny_disp$ + "z^000000投資する必要があります。"; mes "投資しますか?"; next; switch(select("する","しない")){ case 1: set getarg(1),'@tag; set getarg(2),'@tag_name$; break; case 2: set getarg(1),-1; set getarg(2),""; break; } } //-------------------------------------------------------------------------- //アイテム一覧表示 //-------------------------------------------------------------------------- function DispItemList { while (1) { mes "[アイテム強化職員]"; mes "表示範囲を選んで下さい。"; next; switch(select("ID:1〜1000" ,"ID:1001〜2000" ,"ID:2001〜3000" ,"ID:3001〜4000" ,"ID:4001〜5000" ,"ID:5001〜6000" ,"ID:6001〜7000" ,"ID:7001〜8000" ,"ID:8001〜9000" ,"ID:9001〜10000" ,"ID:10001〜11000" ,"ID:11001〜12000" ,"ID:12001〜13000" ,"ID:13001〜14000" ,"ID:14001〜15000" ,"ID:15001〜16000" ,"やめる")) { case 17: return; default: set '@id_min,(@menu-1)*1000 + 1; set '@id_max,(@menu-1)*1000 + 1000; break; } set '@id_sa,'@id_max - '@id_min + 1; //表示開始IDを探す for( set '@i,'@id_min; '@i <= '@id_max; set '@i,'@i+1 ) { set '@row,csvfind('fitdb$,'ITDB_ID,'@i); if ('@row >= 0) { break; } } //アイテム一覧表示 if ('@row >= 0) { mes "[アイテム強化職員]"; mes "表示ID:" + '@id_min + "〜" + '@id_max; for( set '@i,0; '@i < '@id_sa; set '@i,'@i+1 ) { set '@id,csvread('fitdb$,'@row,'ITDB_ID); if ('@id >= '@id_min) { if ('@id <= '@id_max) { set '@id_jn$,csvread('fitdb$,'@row,'ITDB_JNAME); mes '@id + ":" + '@id_jn$; } else { break; } } else { break; } set '@row,'@row+1; } next; } else { mes "[アイテム強化職員]"; mes "該当するアイテムがありません。"; next; } } } //-------------------------------------------------------------------------- //アイテム選択 // 戻値 getarg(0) :アイテムID(選択成功時0以上/選択失敗時-1) //-------------------------------------------------------------------------- function SelectItem { while (1) { mes "[アイテム強化職員]"; mes "アイテム検索方法を選んで下さい。"; next; switch(select("アイテムIDで検索","アイテム名で検索","やめる")) { case 1: mes "[アイテム強化職員]"; mes "アイテムIDを入力して下さい。"; next; input '@item_id; set '@row,csvfind('fitdb$,'ITDB_ID,'@item_id); if ('@row >= 2) { set getarg(0),'@item_id; return; } break; case 2: mes "[アイテム強化職員]"; mes "アイテム名を入力して下さい。"; next; input '@item_name$; set '@row,csvfind('fitdb$,'ITDB_JNAME,'@item_name$); if ('@row >= 2) { set getarg(0),csvread('fitdb$,'@row,'ITDB_ID); return; } break; case 3: set getarg(0),-1; return; } mes "[アイテム強化職員]"; mes "該当するアイテムがありません。"; next; } } //-------------------------------------------------------------------------- //投資実行 // 引数 getarg(0) :数字 :アイテムID // 引数 getarg(1) :数字 :投資対象 // 引数 getarg(2) :文字列:投資対象名称 // 引数 getarg(3) :数字 :投資金額 //-------------------------------------------------------------------------- function InvestExec { set '@item_id,getarg(0); set '@tag,getarg(1); set '@tag_name$,getarg(2); set '@zeny_inp,getarg(3); if (zeny < '@zeny_inp) { mes "[アイテム強化職員]"; mes "お金が足りません。"; next; return; } //ロック Lock getcharid(3)+"",'@lock_flg; if ('@lock_flg == 0) { mes "[アイテム強化職員]"; mes "混雑しているため処理が"; mes "キャンセルされました。"; next; return; } //強化可否を再チェック ChkPowerUp '@item_id,'@tag,'@ret; if ('@ret == 0) { UnLock; mes "[アイテム強化職員]"; mes "他のプレイヤーが強化を行ったため"; mes "これ以上強化出来なくなりました。"; next; return; } //PCの所持金から投資金額を引く set zeny,zeny - '@zeny_inp; //投資内容をアナウンス StrToZeny '@zeny_inp+"",'@zeny_disp$; announce "アイテム強化職員:" + getcharname(getcharid(0)) + " さんが" + getitemname('@item_id) + "の" + '@tag_name$ + "に " + '@zeny_disp$ + "z 投資しました",0x00; //投資履歴CSVに投資履歴を記録 set '@row_max,csvgetrows('finvhst$); set '@dih[0],getcharid(3); set '@dih[1],'@item_id; set '@dih[2],'@tag; set '@dih[3],'@zeny_inp; csvwritearray 'finvhst$,'@row_max,'@dih; csvflush 'finvhst$; //必要投資金額を再取得 GetNeedZeny '@item_id,'@tag,'@zeny_need$; //必要投資金額残(=必要投資金額-投資金額)を計算 StrSub '@zeny_need$,'@zeny_inp,'@zeny_rem$; //投資状態CSVに必要投資金額残を記録 set '@row,csvfind('finv$,'ITDB_ID,'@item_id); if ('@row >= 0) { csvwrite 'finv$,'@row,'@tag,'@zeny_rem$; } else { set '@row_max,csvgetrows('finv$); set '@di$['ITDB_ID],'@item_id; set '@di$['@tag],'@zeny_rem$; csvwritearray 'finv$,'@row_max,'@di$; } csvflush 'finv$; //必要投資金額残が0ならアイテム強化 if ('@zeny_rem$ == "0") { //投資対象がボーナスではない場合 if ('@tag < 'ITDB_SCRIPT) { set '@row,csvfind('fitdb$,'ITDB_ID,'@item_id); set '@val,csvread('fitdb$,'@row,'@tag); if ('@tag == 'ITDB_WEIGHT) { csvwrite 'fitdb$,'@row,'@tag,'@val-10; } else if ('@tag == 'ITDB_GENDER){ csvwrite 'fitdb$,'@row,'@tag,2; } else { csvwrite 'fitdb$,'@row,'@tag,'@val+1; } csvflush 'fitdb$; //投資対象がボーナスの場合 } else { // } //ロック解除 //外部vbsとの同期を取る為、更新処理ここでは行わずにNPCタイマー内で行う; //db/item_db.txt再読込用のNPCタイマー起動 initnpctimer; announce "アイテム強化職員:" + getitemname('@item_id) + "が強化されて" + '@tag_name$ + "を行います",0x00; mes "[アイテム強化職員]"; mes "必要投資金額に達しましたので"; mes "アイテムが強化されました。"; next; } else { //ロック解除 UnLock; StrToZeny '@zeny_rem$,'@zeny_disp$; mes "[アイテム強化職員]"; mes "投資を行いました。"; mes "残りは^ff0000" + '@zeny_disp$ + "z^000000です。"; next; } } //-------------------------------------------------------------------------- //投資 // 引数 getarg(0) :数字 :アイテムID // 引数 getarg(1) :数字 :投資対象 // 引数 getarg(2) :文字列:投資対象名称 //-------------------------------------------------------------------------- function Invest { set '@item_id,getarg(0); set '@tag,getarg(1); set '@tag_name$,getarg(2); //必要投資金額取得 GetNeedZeny '@item_id,'@tag,'@zeny_need$; //文字列を金額形式へ変換 StrToZeny '@zeny_need$,'@zeny_disp$; mes "[アイテム強化職員]"; mes "投資金額を入力して下さい。"; mes "余剰分は返却できませんのでご注意願います。"; mes " "; mes "強化まであと^ff0000" + '@zeny_disp$ + "^000000z"; next; //入力値が正しくなるまでループする while (1) { input '@zeny_inp; if ('@zeny_inp < 1) { mes "[アイテム強化職員]"; mes "1z以上にして下さい。"; mes "強化まであと^ff0000" + '@zeny_disp$ + "^000000z"; next; } else { break; } } //文字列を金額形式へ変換 StrToZeny '@zeny_inp,'@zeny_inp$; mes "[アイテム強化職員]"; mes "^ff0000" + '@zeny_inp$ + "^000000z投資します。"; mes "よろしいでしょうか?"; next; switch(select("はい","やっぱりやめる")) { case 1: //投資実行 InvestExec '@item_id,'@tag,'@tag_name$,'@zeny_inp; break; case 2: break; } } //-------------------------------------------------------------------------- //メイン処理 //-------------------------------------------------------------------------- mes "[アイテム強化職員]"; mes "どのような御用時でしょうか?"; next; switch (select("アイテム強化","アイテム一覧表示","なんでもない")) { case 1: //アイテム選択 SelectItem '@item_id; if ('@item_id == -1) { break; } //アイテム強化対象選択 SelectTarget '@item_id,'@tag,'@tag_name$; if ('@tag == -1) { break; } //投資 Invest '@item_id,'@tag,'@tag_name$; break; case 2: //アイテム一覧表示 DispItemList; break; case 3: break; } mes "[アイテム強化職員]"; mes "またご利用下さい。"; close; end; //-------------------------------------------------------------------------- //タイマー処理 //-------------------------------------------------------------------------- OnTimer5000: stopnpctimer; //item_db.txt再読み込み gmcommand "@reloaditemdb"; announce "アイテム強化職員:アイテムデータを更新しました",0x00; //ロック解除 UnLock; end; //-------------------------------------------------------------------------- //サーバ起動時処理 //-------------------------------------------------------------------------- OnInit: //item_db(db/item_db.txtのコピー) set 'fitdb$,"ITEMDB"; //投資状態CSVファイル名 set 'finv$,"INVEST"; //投資履歴CSVファイル名 set 'finvhst$,"INVESTLIST"; //item_dbの列定義設定 set 'ITDB_ID , 0; //アイテムID set 'ITDB_NAME , 1; //アイテム名(英名) set 'ITDB_JNAME , 2; //アイテム名(和名) set 'ITDB_TYPE , 3; //種類 set 'ITDB_PRICE , 4; //買値 set 'ITDB_SELL , 5; //売値 set 'ITDB_WEIGHT , 6; //重量 set 'ITDB_ATK , 7; //ATK set 'ITDB_DEF , 8; //DEF set 'ITDB_RANGE , 9; //射程 set 'ITDB_SLOT ,10; //スロット数 set 'ITDB_JOB ,11; //装備可能職業 set 'ITDB_GENDER ,12; //装備可能性別 set 'ITDB_LOC ,13; //装備箇所 set 'ITDB_WLV ,14; //武器レベル set 'ITDB_ELV ,15; //装備可能レベル set 'ITDB_VIEW ,16; //見た目 set 'ITDB_REFINE ,17; //精錬可否 set 'ITDB_SCRIPT ,18; //スクリプト(ボーナス) //アイテム強化に必要な金額を設定 set 'ZENY_WEIGHT$ ,"100"; //重量 set 'ZENY_ATK$ ,"1000"; //ATK set 'ZENY_DEF$ ,"10000"; //DEF set 'ZENY_RANGE$ ,"100000"; //射程 set 'ZENY_SLOT$ ,"1000000"; //スロット数 set 'ZENY_GENDER$ ,"10000000"; //装備可能性別 //ロックフラグを解除状態にする set 'lock$,"0"; }