スクリプト/コツ/アイテム合成(履歴ID:144)

最終投稿者:User icon mini 退会したユーザー 更新:2011/12/06 22:06:54
タクミ2310号です。
今回はアイテムの合成についてです。
結構難しいですが、ここの図鑑の応用なので、頑張ってください。
というか、僕も難しくてうまく説明ができないので、加筆、訂正してください。ご協力をお願いします。

まずは下準備、関数の定義からです。
def sv(a,b)
  setVariable(a, b)
end

def gv(a)
  return getVariable(a)
end

def HMI(a) #アイテムの個数チェック
  many = 0
  ItemIDParam = getItemIdArray()
  i = 0
  while i < getArrayLength(ItemIDParam)
    if ItemIDParam[i] == a
      many = many + 1
    end
    i = i + 1 
  end
  return many
end

HMI関数はIDで指定したアイテムの個数を返します。

次に、こちらを記入。開始スクリプトでもそうでなくても構いません。
  setFlag("合成可",true)
  sv("合成", createArray());  i = 0

  while i < 9
    gv("合成")[i] = createArray()
    gv("合成")[i][0] = false
    gv("合成")[i][2] = createArray()
    gv("合成")[i][3] = createArray()
    gv("合成")[i][4] = createArray()
    i = i + 1
  end

    #0 = レシピの有無, 1 = できるアイテムのID,  2,3,4 = 材料のIDと必要な個数の配列, 5 = 必要なアイテムの種類数, 6,7,8 = 必要なアイテムの文章

    Index = 0
    #高級回復薬
    gv("合成")[Index][1] = 6533
    gv("合成")[Index][2][0] = 6529
    gv("合成")[Index][2][1] = 2
    gv("合成")[Index][5] = 1
    gv("合成")[Index][6] = "回復薬 2個"
    #極限回復薬
    Index = Index + 1
    gv("合成")[Index][1] = 6534
    gv("合成")[Index][2][0] = 6533
    gv("合成")[Index][2][1] = 3
    gv("合成")[Index][5] = 1
    gv("合成")[Index][6] = "高級回復薬 3個"
    #高級魔法薬
    Index = Index + 1
    gv("合成")[Index][1] = 6833
    gv("合成")[Index][2][0] = 6832
    gv("合成")[Index][2][1] = 2
    gv("合成")[Index][3][0] = 6533
    gv("合成")[Index][3][1] = 1
    gv("合成")[Index][4][0] = 8424
    gv("合成")[Index][4][1] = 2
    gv("合成")[Index][5] = 3
    gv("合成")[Index][6] = "魔法薬 2個"
    gv("合成")[Index][7] = "高級回復薬 1個"
    gv("合成")[Index][8] = "魔獣の赤皮 2個"
    #極限魔法薬
    Index = Index + 1
    gv("合成")[Index][1] = 6834
    gv("合成")[Index][2][0] = 6833
    gv("合成")[Index][2][1] = 2
    gv("合成")[Index][3][0] = 6534
    gv("合成")[Index][3][1] = 1
    gv("合成")[Index][5] = 2
    gv("合成")[Index][6] = "高級魔法薬 2個"
    gv("合成")[Index][7] = "極限回復薬 1個"
    #普通の剣
    Index = Index + 1
    gv("合成")[Index][1] = 8192
    gv("合成")[Index][2][0] = 9140
    gv("合成")[Index][2][1] = 3
    gv("合成")[Index][5] = 1
    gv("合成")[Index][6] = "鉄球 3個"
    #革の盾
    Index = Index + 1
    gv("合成")[Index][1] = 8193
    gv("合成")[Index][2][0] = 8424
    gv("合成")[Index][2][1] = 2
    gv("合成")[Index][3][0] = 6529
    gv("合成")[Index][3][1] = 1
    gv("合成")[Index][5] = 2
    gv("合成")[Index][6] = "魔獣の赤皮 2個"
    gv("合成")[Index][7] = "回復薬 1個"
    #鉄の盾
    Index = Index + 1
    gv("合成")[Index][1] = 8194
    gv("合成")[Index][2][0] = 8193
    gv("合成")[Index][2][1] = 1
    gv("合成")[Index][3][0] = 9140
    gv("合成")[Index][3][1] = 2
    gv("合成")[Index][5] = 2
    gv("合成")[Index][6] = "革の盾 1個"
    gv("合成")[Index][7] = "鉄球 2個"
    #皮のベスト
    Index = Index + 1
    gv("合成")[Index][1] = 8195
    gv("合成")[Index][2][0] = 8424
    gv("合成")[Index][2][1] = 4
    gv("合成")[Index][5] = 1
    gv("合成")[Index][6] = "魔獣の赤皮 4個"
    #鋼のベスト
    Index = Index + 1
    gv("合成")[Index][1] = 8196
    gv("合成")[Index][2][0] = 8195
    gv("合成")[Index][2][1] = 1
    gv("合成")[Index][3][0] = 9140
    gv("合成")[Index][3][1] = 3
    gv("合成")[Index][5] = 2
    gv("合成")[Index][6] = "皮のベスト 1個"
    gv("合成")[Index][7] = "鉄球 3個"


「合成可」のフラグがtrueなら、合成の準備ができたことになります。
0のレシピについては後ほど説明します。
1は合成後できるアイテムのIDです。
2~4は三次元配列になってますが、材料のIDと個数です。
5は何種類混ぜるかです。
6~8は2~4を文章化したものです。

実際に合成するときは、
b = createArray()
i = 0
while i < getArrayLength(gv("合成")) #1
  if gv("合成")[i][0] #2
    str = getValueFromItemParam(getItemParamWithId(gv("合成")[i][1]), getItemViewNameIndex())
    pushArray(b, str) #所持品だけの選択肢配列 b をつくる
  else #2
    pushArray(b, "???") #所持品でなければ???が入る
  end #2
  i = i + 1
end #1

pushArray(b,"やめる") #終わらせる選択肢も追加

k = true
setSelectWindowRect(64, 64, 192, 300)
while k #kループ
 c = speakWithSelectArray(b,"何を作りますか?")
  if b[c] == "やめる" #3
    k = false
  elsif b[c]=="???" #3
    speak("レシピがありません")
  elsif b[c] == getValueFromItemParam(getItemParamWithId(gv("合成")[c][1]), getItemViewNameIndex()) #3
    i = 0;  out = false
    while (i < gv("合成")[c][5]) && (!out) #4
      if HMI(gv("合成")[c][i + 2][0]) >= gv("合成")[c][i + 2][1] #アイテムが足りているか #5
        i = i + 1
      else #5
        out = true
      end #5
    end #4
    i = 0;  str = ""
    while i < gv("合成")[c][5] #6
      str = str + gv("合成")[c][i + 6]
      if i < gv("合成")[c][5] - 1
        str = str + "\n"
      end
      i = i + 1
    end #6
    if !out #7
      case speakWithSelect(2, "はい", "いいえ",
                                         str + "が必要です。\nよろしいですか?」") #8
        when 0 #8
          i = 0
          while i < gv("合成")[c][5] #9
            ii = 0
            while ii < gv("合成")[c][i + 2][1] #10
              removeItemWithIndex(getItemIndexWithId(gv("合成")[c][i + 2][0]))
              ii = ii + 1
            end #10
            i = i + 1
          end #9
          waitTime(500);  giveItem(gv("合成")[c][1])
          speak(getValueFromItemParam(getItemParamWithId(gv("合成")[c][1]), getItemViewNameIndex()) + "の完成です!」")
      end #8
    else #7
      speak("アイテムが足りません。\n(" + str + "が必要です。)")
    end #7
  end #3
end #kループ終
setSelectWindowRect(64, 64, 192, 400)

・・・こんな感じです。
実は自分でもどう説明すればいいのか分からなかったりする

今回もサンプルゲームを作りました。
参考になれば幸いです。