------------------------------------------------------------------------------   Vidar β5 精錬スクリプトについての説明+α ------------------------------------------------------------------------------ 他のスクリプトと比べて比較的理解が難しいかと思われる、精錬スクリプトについて、 私なりの解釈でもって説明をさせていただきます。 ------------------------------------------------------------------------------ 【基本説明】 スクリプトにおける基本的な流れは以下の通りになります 1. 精錬する箇所を選択(アイテムを選択ではない) 2. 選択された箇所にアイテムが装備されているかどうかを判定 3. 選択されたアイテムが精錬可能装備であるかどうかを判定 4. 選択されたアイテムが精錬限界値に達していないかを判定 5. 選択されたアイテムの武器レベルを判定 6. 条件提示(鉱石+お金が必要だけどやるか?というもの) 7. 選択されたアイテムの精錬値を判定し、次の精錬が過剰精錬であるかを判定 8. 過剰精錬でない場合は、成功値を 99 に設定 9. 過剰精錬の場合は、ほんとにやるかどうかの確認メッセージ表示 10. 精錬値に合わせて成功値を設定 11. 0〜99 の乱数を取得(精錬乱数とする) 12. 精錬乱数と成功値を比較    → 成功値の方が大きければ成功    → 成功値が精錬乱数以下であれば失敗 ------------------------------------------------------------------------------ 【スクリプト説明】 Vidar\script\Town\Town_Refine.txt  66行目以降プロンテラ精錬所ホルグレンのスクリプトを使って説明します ※69〜78行目 set @POS[x]_ALLOW = [y];  精錬可否を設定します   [x] = 1:頭上段 2:体 3:左手 4:右手 5:肩にかけるもの      6:足 7:アクセサリ1 8:アクセサリ2 9:頭中段 10:頭下段   [y] = 1:精錬可 0:精錬不可 ※80〜84行目 set @LV[x]_REF_PRC = [y];  精錬費用を設定します   [x] = 0:防具 1:LV1武器 2:LV2武器 3:LV3武器 4:LV4武器   [y] = 任意の数字(精錬時に消費する値段) ※86行目 lockitem 1;  アイテムをロックしますこれ以降の装備の変更を不可能にする  ・・・はずなのに、実際はロックされてないです(´・ω・`) ※92行目 check @POSITION == 0,L_LOOT_7,-;  何も選択していないならば、ラベル「L_LOOT_7」へジャンプ ※93行目 check @WEAPONLEVEL == 99,-,PRCHK;  武器レベルが 99 ではないならばラベル「PRCHK」へジャンプ   武器レベル 99 = 何も装備していないことを示す ※94〜132行目 [前提:武器レベルが99である(選択箇所が何も装備されていない)] check @POSITION == 1,-,L_LOOT_1;  選択された箇所を判定  選択された箇所にあったエラー文を表示(頭装備なら「足りない脳みそを〜〜」)  以下、L_LOOT_[x] で逐一選択された箇所を判定しエラー文を表示、ラベル「L_EXIT」へ移動 ※135〜168行目 [前提:選択された箇所に装備がされている] check @POSITION = 1,CHK_POS1_ALLOW,-; (中略) CHK_POS1_ALLOW: check @POS1_ALLOW = 1,L_START_1,NOT_ALLOWED;  選択された箇所を判定し、それぞれに対応したラベルに移動  精錬可能であるかどうかを判定   → 可能ならラベル「L_START_1」へ移動   → 不可能ならラベル「NOT_ALLOWED」へ移動 ※170行目(ラベル「L_START_1」) [前提:精錬可能であることが判定された] check @REFINELEVEL == 99,-,L_START_2;  精錬値が 99 でなければラベル「L_START_2」へ移動  (精錬値が99であることが何を示すのか不明) ※175行目(ラベル「L_START_2」) check @REFINELEVEL == 10,-,L_START_3;  精錬値が 10 でなければラベル「L_START_3」へ移動  精錬値が 10 であれば、精錬値が限界であるメッセージを表示してラベル「L_EXIT」へ移動 ※180〜395行目(ラベル「L_START_3」以降) check @WEAPONLEVEL == 0,-,L_START_4;  武器レベルが 0 であればこのまま続ける  それ以外ならばラベル「L_START_4」へ移動   → 武器レベルが 0 は防具であることを示しています  ※188行目  set @REF_SUCCESS = 99;   成功値を 99 に設定(成功率=99%)  ※189行目  check @REFINELEVEL >= 4,-,L_SUB_3_1;   精錬値が 4 以上であれば、そのまま続ける   そうでない(3未満)ならば、ラベル「L_SUB_3_1」へ移動  ※190行目  [前提:精錬値が 4 以上である]  check @REFINELEVEL == 4,-,L_LOOT_3_1;   精錬値が 4 であればそのまま続ける   そうでない(5以上)ならば、ラベル「L_LOOT_3_1」へ移動  ※191〜192行目  [前提:精錬値が 4 である]  set @REF_SUCCESS = 60;  goto L_SUB_3_0;   成功値を 60 に設定(成功率=60%)   ラベル「L_SUB_3_0」へ移動  ※194行目(ラベル「L_LOOT_3_1」)  [前提:精錬値が 5 以上である]  check @REFINELEVEL <= 6,-,L_LOOT_3_2;   精錬値が 6 以下であればそのまま続ける    → 前提が 5 以上なので、精錬値は 5 か 6 のどちらかになる   そうでない(7以上)ならば、ラベル「L_LOOT_3_2」へ移動  ※195〜196行目  [前提:精錬値が 5 か 6 のどちらかである]  set @REF_SUCCESS = 40;  goto L_SUB_3_0;   成功値を 40 に設定(成功率=40%)   ラベル「L_SUB_3_0」へ移動  ※198行目(ラベル「L_LOOT_3_2」)  [前提:精錬値が 7 以上である]  check @REFINELEVEL <= 8,-,L_LOOT_3_3;   精錬値が 8 以下であればそのまま続ける(精錬値は 7 か 8)   そうでない(精錬値=9)ならば、ラベル「L_LOOT_3_3」へ移動  ※199〜200行目  [前提:精錬値が 7 か 8 のどちらかである]  set @REF_SUCCESS = 20;  goto L_SUB_3_0;   成功値を 20 に設定(成功率=20%)   ラベル「L_SUB_3_0」へ移動  ※202行目(ラベル「L_LOOT_3_3」)  [前提:精錬値が 9 である]  set @REF_SUCCESS = 10;   成功値を 10 に設定(成功率=10%)  ※204〜216行目(ラベル「L_SUB_3_0」)   → 202行目の精錬値設定の後、そのまま何もラベルへ飛ばす設定が書かれていないが、     何もない場合はそのまま下へ流れて実行される仕組みになっているので問題はない   menu "Yes",L_SUB_3_1,"No",-;    これからやろうとしている精錬が過剰であることを示し、その確認を取る     はい → ラベル「L_SUB_3_1」へ移動     いいえ → このまま下を実行させ、ラベル「L_EXIT」へ移動  ※218行目(ラベル「L_SUB_3_1」  check item 985,1,-,L_SUB_3_2;   アイテムID 985(エルニウム)が1つ持っているかどうかをチェック    もっているならばこのまま下を実行    ないならば、ラベル「L_SUB_3_2」へ移動  ※219行目  [前提:エルニウムを少なくとも1個は持っていることを確認済]  check Zeny >= @LV0_REF_PRC,-,L_SUB_3_2;   所持金の額が、変数 @LV0_REF_PRC(防具精錬費用の額)よりも大きいかをチェック    大きいならば、このまま続ける    小さいならば(所持金が足りない)、ラベル「L_SUB_3_2」へ移動  ※220行目  [前提:精錬に必要なアイテムと金額を所持していることを確認済]  delitem 985,1;   アイテムID 985(エルニウム)を1つ削除  ※221行目  [前提:精錬に必要なもののうち、エルニウム1つ没収済]  set Zeny -= @LV0_REF_PRC,0;  goto L_START_8;   所持金から 変数 @LV0_REF_PRC(防具精錬費用)を減算   ラベル「L_START_8」へ移動  ※224〜229行目(ラベル「L_SUB_3_2」)  [前提:必要アイテムもしくは精錬費用が足りないことを検出]   必要なものが足りないことを表示し、ラベル「L_EXIT」へ移動  ※231〜233行目(ラベル「L_MENU_3_1」)  [前提:必要アイテムと必要金額を提示した結果、「精錬しない」を選ばれている]   「やりたくないならそれでいい」という旨のメッセージを表示し、ラベル「L_EXIT」へ移動  ※235〜273行目(ラベル「L_START_4」)   武器LV1の場合の処理基本的な流れは防具と同じ  ※275〜313行目(ラベル「L_START_5」)   武器LV2の場合の処理基本的な流れは防具と同じ  ※315〜353行目(ラベル「L_START_6」)   武器LV3の場合の処理基本的な流れは防具と同じ  ※355〜395行目(ラベル「L_START_7」)   武器LV4の場合の処理基本的な流れは防具と同じ ※400行目(ラベル「L_START_8」) random @REF_RAND,100;  乱数を100個取り、変数 @REF_RANDへ格納   → 指定がないので 0 から 100個取る為実際に格納される数字は 0 〜 99 の 100個である ※401行目 check @REF_RAND < @REF_SUCCESS,-,L_START_9;  変数 @REF_RAND と変数 @REF_SUCCESS を比較   @REF_SUCCESS の方が @REF_RAND よりも大きい場合は、このまま続ける(成功判定)   @REF_SUCCESS が @REF_RAND 以下ならば、ラベル「L_START_9」へ移動(失敗判定)    *過剰精錬でない場合は、成功値 @REF_SUCCESS が 99 になっているので、     @REF_RAND に 99 が格納された場合、@REF_SUCCESS が @REF_RAND「以下」に判定されるので     失敗となるつまり、1/100 の確率で失敗するので成功率は 100% ではなく 99% である    *100% にしたい場合は、上の式の比較関数を < から <= に変えるか、過剰でない精錬値の成功率     を 99 から 100 にするとよい     前者の場合、@REF_SUCCESS が @REF_RAND 以上の場合に成功し、@REF_SUCCESS が @REF_RAND     未満の場合に失敗することになる     後者の場合、判定方法は変わらないが、@REF_RAND は 99 までしか格納されないのでそれより     大きい 100 を設定することで 100% 成功にすることができる ※402行目 [前提:精錬が成功] set @REFINELEVEL += 1;  精錬値を 1 増加させる ※403〜408行目 refinery @POSITION,0,@REFINELEVEL;  @POSITION の位置の装備(選択された箇所である)の精錬値を @REFINELEVEL に変更する  真ん中の 0 は、カンカン→SUCCESS のエフェクトを発生させる  以下、成功したことを示すメッセージを表示し、ラベル「L_EXIT」へ移動 ※410〜419行目(ラベル「L_START_9」) [前提:精錬が失敗] refinery @POSITION,1,0;  @POSITION の位置の装備(選択された箇所である)の精錬値を 0 に変更する  真ん中の 1 は、カンカン→FAILED のエフェクトを発生させる  以下、失敗したことを示すメッセージを表示し、ラベル「L_EXIT」へ移動 ※420行目(ラベル「L_EXIT」) lockitem 0;  アイテムロックを解除し、終了する ------------------------------------------------- 以下、他の町の精錬NPCも同様の処理をする ------------------------------------------------------------------------------ 【おまけ】 精錬成功率にブラックスミスのスキル「武器研究」の効果を上乗せする方法を紹介します 上の【スクリプト説明】と同様、プロンテラのホルグレンのスクリプトを元に説明します 〔基本的な流れ〕 1. スキル「武器研究」のレベルを取得し、武器研究レベル変数に格納する 2. 武器研究レベル変数に成功係数を乗算する 3. 武器研究レベル変数を成功値に加算する 4. カンカン 〔スクリプト操作〕 ※400行目(ラベル「L_START_8」) random @REF_RAND,100; の上の行に、以下を追加する // ↓「武器研究」上乗せ処理↓ getskilllevel 107,@W_RES; set @W_RES *= 1; set @REF_SUCCESS += @W_RES; // ↑「武器研究」上乗せ処理↑ ---------------------↓スクリプト記入例↓---------------------------- ※396行目から表示 --------------------------------------------------------------------- L_START_8: mes "$[$@REF_NPC_NAME]"; mes "Clang! Clang! Clang!!"; next; // ↓「武器研究」上乗せ処理↓ getskilllevel 107,@W_RES; set @W_RES *= 1; set @REF_SUCCESS += @W_RES; // ↑「武器研究」上乗せ処理↑ random @REF_RAND,100; check @REF_RAND < @REF_SUCCESS,-,L_START_9; set @REFINELEVEL += 1; refinery @POSITION,0,@REFINELEVEL; ---------------------↑スクリプト記入例↑---------------------------- 〔スクリプト説明〕 getskilllevel 107,@W_RES;  スキルID 107(武器研究)のスキルレベルと取得し、変数 @W_RES に格納 set @W_RES *= 1;  変数 @W_RES に成功係数を乗算する   → これは、LV1ごとに 1% 成功させる設定である     例えば、LV1ごとに 3% 成功させたい場合は、@W_RES *= 3; にすればよい set @REF_SUCCESS += @W_RES;  変数 @REF_SUCCESS に 変数 @W_RES を加算する  これで実際に成功率に、武器研究の効果を乗せることになる  ※他の町の精錬NPCにも追加しないと、その精錬NPCには適用されませんのでお気をつけください ------------------------------------------------------------------------------ 【その他お約束】 ・この説明文は、私個人で解釈したものを説明しています。ここは違う!というものがありましたら、  掲示板なりでご一報いただければと思います。 ・この説明文によって生じた損害については、当方は一切責任は負いません。各人の責任で利用してください。 製作:ごめち 2004/10/12