スクリプト/コツ/売ったり買ったりできるお店処理(履歴ID:34)

最終投稿者:Zararu128x128 mini dycoon 更新:2010/07/11 12:48:53
アイテムの削除の機能などが付け加わりましたので、
お店でアイテムを売ることもできるようになりました。
サンプルゲームは以下のとおりです。
ゲーム[ID:5105]

使用した関数一覧

以下の関数を組み合わせてお店の機能を実現しました。

toString : 文字列と数値の足し算ができないため
数値をこの関数で文字列に変換します。
http://rmake.jp/document/function_reference#toString%E9%96%A2%E6%95%B0

speakWithSelectArray : 選択肢を配列で受け取って表示します。
http://rmake.jp/document/function_reference#speakWithSelectArray%E9%96%A2%E6%95%B0

getItemParamWithId : アイテムのIDから対応するアイテムのパラメーターを取得します。
http://rmake.jp/document/function_reference#getItemParamWithId%E9%96%A2%E6%95%B0

getValueFromItemParam : アイテムパラメーターの配列からパラメーターの値を取得します。
http://rmake.jp/document/function_reference#getValueFromItemParam%E9%96%A2%E6%95%B0

getValueFromCharacterParam : キャラクターステータス配列からステータスを取得します。
http://rmake.jp/document/function_reference#getValueFromCharacterParam%E9%96%A2%E6%95%B0

getPartyMemberEquipmentIdArray : パーティメンバーが装備しているアイテムのIDの配列を取得します。
http://rmake.jp/document/function_reference#getPartyMemberEquipmentIdArray%E9%96%A2%E6%95%B0

getPartyMemberEquipmentParamWithIndex : パーティメンバーの装備のパラメーター配列をインデックス(どこに装備しているか)から取得します。
http://rmake.jp/document/function_reference#getPartyMemberEquipmentParamWithIndex%E9%96%A2%E6%95%B0

removePartyMemberEquipmentWithIndex : パーティメンバーの指定インデックスの装備アイテムを消去します。
http://rmake.jp/document/function_reference#removePartyMemberEquipmentWithIndex%E9%96%A2%E6%95%B0

removeItemWithIndex : 所持しているアイテムを消去します。
http://rmake.jp/document/function_reference#removeItemWithIndex%E9%96%A2%E6%95%B0

アイテム売買のコード

ここでは、アイテム売買の処理を以下のように記述しました。

#データなど
setVariable("店で使える通貨の変数名", "お金")

a = createArray()
a[0] = createArray()
a[0][0] = 1      #id
a[0][1] = 100  #価格
a[1] = createArray()
a[1][0] = 3
a[1][1] = 200
a[2] = createArray()
a[2][0] = 15
a[2][1] = 100
setVariable("店にあるアイテム", a)

a = createArray()
a[0] = createArray()
a[0][0] = 1
a[0][1] = 50
a[1] = createArray()
a[1][0] = 3
a[1][1] = 100
a[2] = createArray()
a[2][0] = 15
a[2][1] = 50
a[3] = createArray()
a[3][0] = 34
a[3][1] = 100
a[4] = createArray()
a[4][0] = 35
a[4][1] = 50
setVariable("売れるアイテム", a)

#お店処理

selectX = getSelectWindowX()
selectY = getSelectWindowY()
selectWidth = getSelectWindowWidth()
selectHeight = getSelectWindowHeight()

textId = createText(512 - 160, 16, 160, 64)


setSelectWindowRect(256, 100, 240, 200)


loop = true

speak("いらっしゃいませ。")

gold = getVariable(getVariable("店で使える通貨の変数名"))
items = getVariable("店にあるアイテム")
sellItems = getVariable("売れるアイテム")

itemList = createArray()

i = 0
while i < getArrayLength(items)
  param = getItemParamWithId(items[i][0])
  itemList[i] = getValueFromItemParam(param, getItemViewNameIndex()) + " " + toString(items[i][1])
  i = i + 1
end

pushArray(itemList, "買わない")


while loop
  setText(textId, getVariable("店で使える通貨の変数名") + " " + toString(gold))


  case speakWithSelect(3,"買う","売る","店を出る", 
      "いかがいたしますか?")
    when 0
      buyIndex = -1
      buyIndex = speakWithSelectArray(itemList, 
         "どちらをお買い上げになりますか?")
      if buyIndex >= getArrayLength(itemList) - 1
        buyIndex = -1
      end

      if buyIndex >= 0
        param = getItemParamWithId(items[buyIndex][0])
        if items[buyIndex][1] > gold
          speak("お金が足りません。")
        elsif getValueFromItemParam(param, getItemTypeIdIndex()) == 0
          
          if !giveItem(items[buyIndex][0])
            speak("持ち物がいっぱいです")
          else
            speak("お買い上げありがとうございます。")
            gold = gold - items[buyIndex][1]
          end
        else
          i = 0
          ct = 0
          memberList = createArray()
          memberId = createArray()
          while i < 4
            m = getPartyMember(i)
            if isPartyMember(m)
              a = getPartyMemberParam(m)
              memberList[ct] = getValueFromCharacterParam(a, getCharacterViewNameIndex())
              memberId[ct] =m
              ct = ct + 1
            end
            i = i + 1
          end
          memberList[ct] = "やめる"
          idx = speakWithSelectArray(memberList, "どなたが装備されますか?")
          if idx == ct

          else

            if !giveEquipmentPartyMember(memberId[idx], items[buyIndex][0])
              speak("装備できませんでした。")
            else
              speak("お買い上げありがとうございます。")
              gold = gold - items[buyIndex][1]
            end
          end
        end

      end

    when 1
      case speakWithSelect(3,"装備を売る","持ち物を売る","やめる", 
          "どれを売っていただけるのでしょうか?")
        when 0
          i = 0
          ct = 0
          memberList = createArray()
          memberId = createArray()
          while i < 4
            m = getPartyMember(i)
            if isPartyMember(m)
              a = getPartyMemberParam(m)
              memberList[ct] = getValueFromCharacterParam(a, getCharacterViewNameIndex())
              memberId[ct] =m
              ct = ct + 1
            end
            i = i + 1
          end
          memberList[ct] = "やめる"
          idx = speakWithSelectArray(memberList, "誰の装備を売っていただけるのでしょうか?")
          if idx == ct

          else
            i = 0
            ct = 0
            a = getPartyMemberEquipmentIdArray(memberId[idx])
            el = createArray()
            ei = createArray()
            while i < getArrayLength(a)
              if a[i] >= 0
                me = getPartyMemberEquipmentParamWithIndex(memberId[idx], i)
                el[ct] = getValueFromItemParam(me, getItemViewNameIndex())
                ei[ct] = i
                ct = ct + 1
              end

              i = i + 1
            end

            el[ct] = "やめる"
            idx2 = speakWithSelectArray(el, "どの装備を売っていただけるのでしょうか?")
            if idx2 == ct

            else
              price = 0
              i = 0
              priceLoopEnd = false
              while i < getArrayLength(sellItems) && !priceLoopEnd
                if sellItems[i][0] == a[ei[idx2]]
                  price = sellItems[i][1]
                  priceLoopEnd = true
                end
                i = i + 1
              end
              if priceLoopEnd
                case speakWithSelect(2,"はい","いいえ", 
                    toString(price) + "になりますが売っていただけますか?")
                  when 0
                    speak("売っていただきありがとうございます。")
                    gold = gold + price
                    removePartyMemberEquipmentWithIndex(memberId[idx], ei[idx2])
                  when 1
                    speak("まだ手放されないのですね。了解しました。")
                end
                
              else
                speak("まだ手放されないのですね。了解しました。")
              end

            end

          end

        when 1
          a = getItemIdArray()
          il = createArray()
          ii = createArray()
          i = 0
          ct = 0
          while i < getArrayLength(a)
            if a[i] >= 0
              mi = getItemParamWithIndex(i)
              il[ct] = getValueFromItemParam(mi, getItemViewNameIndex())
              ii[ct] = i
              ct = ct + 1
            end
            i = i + 1
          end
          il[ct] = "やめる"
          idx = speakWithSelectArray(il, "どちらのアイテムを売っていただけますか?")
          if idx == ct

          else
            price = 0
            i = 0
            priceLoopEnd = false
            while i < getArrayLength(sellItems) && !priceLoopEnd
              if sellItems[i][0] == a[ii[idx]]
                price = sellItems[i][1]
                priceLoopEnd = true
              end
              i = i + 1
            end
            if priceLoopEnd
              case speakWithSelect(2,"はい","いいえ", 
                  toString(price) + "になりますが売っていただけますか?")
                when 0
                  speak("売っていただきありがとうございます。")
                  gold = gold + price
                  removeItemWithIndex(ii[idx])
                when 1
                  speak("まだ手放されないのですね。了解しました。")
              end
                
            else
              speak("まだ手放されないのですね。了解しました。")
            end

          end          


        when 2
          
      end

      
    when 2
      speak("またのご来店をお待ちしています。")
      loop = false
  end
  
end

setVariable(getVariable("店で使える通貨の変数名"), gold)

setSelectWindowRect(selectX, selectY, selectWidth, selectHeight)

deleteText(textId)



結構長いのでコピー&ペーストして
使用するのがよいかと思います。

何を売るか、通貨をどうするかなどは
設定をおこなう必要がありますので、
設定の方法を以下に記します。
基本的に書き換える必要があるのは
"#データなど"のあとから、"#お店処理"の前までです。

通貨

通貨に利用している基本変数の名前を
以下のようにして"店で使える通貨の変数名"に渡します。
setVariable("店で使える通貨の変数名", "お金")


また、注意として開始スクリプトで、"お金"の初期化をする必要があります。

setVariable("お金", 0)


店で売っているアイテム


以下のようにして
idと価格の組の配列の配列を用意します。
a = createArray()
a[0] = createArray()
a[0][0] = 1      #id
a[0][1] = 100  #価格
a[1] = createArray()
a[1][0] = 3
a[1][1] = 200
a[2] = createArray()
a[2][0] = 15
a[2][1] = 100
setVariable("店にあるアイテム", a)

a[i][0]には売るアイテムのid、a[i][1]には売るアイテムの価格を設定します。
最後に基本変数"店にあるアイテム"にaを設定します。

店が買い取れるアイテム


店で売るときと基本的に同じですが、
マップ外のアイテムのidも持ち込まれる可能性があるため
その分も書く必要があります。
a = createArray()
a[0] = createArray()
a[0][0] = 1
a[0][1] = 50
a[1] = createArray()
a[1][0] = 3
a[1][1] = 100
a[2] = createArray()
a[2][0] = 15
a[2][1] = 50
a[3] = createArray()
a[3][0] = 34
a[3][1] = 100
a[4] = createArray()
a[4][0] = 35
a[4][1] = 50
setVariable("売れるアイテム", a)

最後に基本変数"売れるアイテム"にaを設定します。
ゲーム全体で売れるアイテムが同じなら開始スクリプトに
この処理を書いてもよいかと思います。

倒すとお金を落とす敵


マップエディタで配置した敵キャラを倒すと、
お金などを落とす処理を、おまけとしてここに書いておきます。

if getTurnBattleResult() == 
    getTurnBattleWin()
  #勝ったとき
  setVariable("お金", getVariable("お金") + 100)
  speak("お金を", 100, "手に入れた。\n", "現在の所持金額 ", getVariable("お金"))
  if rand(10) == 0
    speak("おや?敵がアイテムを落としていった。")
    if rand(2) == 0
      if giveItem(34)
        speak("炭素繊維プロテクタを手に入れた")
      else
        speak("炭素繊維プロテクタだが、もう持てない。あきらめよう")
      end
    else
      if giveItem(35)
        speak("ヘルメットを手に入れた")
      else
        speak("ヘルメットだが、もう持てない。あきらめよう")
      end
    end
  end

elsif getTurnBattleResult() ==
    getTurnBattleLose()
  #負けたとき
  

elsif getTurnBattleResult() ==
    getTurnBattleRunAway()
  #逃げたとき
  

end



アクションRPG用お店処理


アクションRPGの場合パーティメンバーがいないなどの理由で
使える関数などが変わります。
たとえば以下のようにします。

#データなど
setVariable("店で使える通貨の変数名", "お金")

a = createArray()
a[0] = createArray()
a[0][0] = 1      #id
a[0][1] = 100  #価格
a[1] = createArray()
a[1][0] = 3
a[1][1] = 200
a[2] = createArray()
a[2][0] = 15
a[2][1] = 100
setVariable("店にあるアイテム", a)

a = createArray()
a[0] = createArray()
a[0][0] = 1
a[0][1] = 50
a[1] = createArray()
a[1][0] = 3
a[1][1] = 100
a[2] = createArray()
a[2][0] = 15
a[2][1] = 50
a[3] = createArray()
a[3][0] = 34
a[3][1] = 100
a[4] = createArray()
a[4][0] = 35
a[4][1] = 50
setVariable("売れるアイテム", a)

#お店処理

selectX = getSelectWindowX()
selectY = getSelectWindowY()
selectWidth = getSelectWindowWidth()
selectHeight = getSelectWindowHeight()

textId = createText(512 - 160, 16, 160, 64)


setSelectWindowRect(256, 100, 240, 200)


loop = true

speak("いらっしゃいませ。")

gold = getVariable(getVariable("店で使える通貨の変数名"))
items = getVariable("店にあるアイテム")
sellItems = getVariable("売れるアイテム")

itemList = createArray()

i = 0
while i < getArrayLength(items)
  param = getItemParamWithId(items[i][0])
  itemList[i] = getValueFromItemParam(param, getItemViewNameIndex()) + " " + toString(items[i][1])
  i = i + 1
end

pushArray(itemList, "買わない")


while loop
  setText(textId, getVariable("店で使える通貨の変数名") + " " + toString(gold))


  case speakWithSelect(3,"買う","売る","店を出る", 
      "いかがいたしますか?")
    when 0
      buyIndex = -1
      buyIndex = speakWithSelectArray(itemList, 
         "どちらをお買い上げになりますか?")
      if buyIndex >= getArrayLength(itemList) - 1
        buyIndex = -1
      end

      if buyIndex >= 0
        param = getItemParamWithId(items[buyIndex][0])
        if items[buyIndex][1] > gold
          speak("お金が足りません。")
        elsif getValueFromItemParam(param, getItemTypeIdIndex()) == 0
          
          if !giveItem(items[buyIndex][0])
            speak("持ち物がいっぱいです")
          else
            speak("お買い上げありがとうございます。")
            gold = gold - items[buyIndex][1]
          end
        else

          if !giveEquipment(items[buyIndex][0])
            speak("装備できませんでした。")
          else
            speak("お買い上げありがとうございます。")
            gold = gold - items[buyIndex][1]
          end
        end

      end

    when 1
      case speakWithSelect(3,"装備を売る","持ち物を売る","やめる", 
          "どれを売っていただけるのでしょうか?")
        when 0
          i = 0
          ct = 0
          a = getEquipmentIdArray()
          el = createArray()
          ei = createArray()
          while i < getArrayLength(a)
            if a[i] >= 0
              me = getEquipmentParamWithIndex(i)
              el[ct] = getValueFromItemParam(me, getItemViewNameIndex())
              ei[ct] = i
              ct = ct + 1
            end

            i = i + 1
          end

          el[ct] = "やめる"
          idx2 = speakWithSelectArray(el, "どの装備を売っていただけるのでしょうか?")
          if idx2 == ct

          else
            price = 0
            i = 0
            priceLoopEnd = false
            while i < getArrayLength(sellItems) && !priceLoopEnd
              if sellItems[i][0] == a[ei[idx2]]
                price = sellItems[i][1]
                priceLoopEnd = true
              end
              i = i + 1
            end
            if priceLoopEnd
              case speakWithSelect(2,"はい","いいえ", 
                  toString(price) + "になりますが売っていただけますか?")
                when 0
                  speak("売っていただきありがとうございます。")
                  gold = gold + price
                  removeEquipmentWithIndex(ei[idx2])
                when 1
                  speak("まだ手放されないのですね。了解しました。")
              end
                
            else
              speak("まだ手放されないのですね。了解しました。")
            end

          end

        when 1
          a = getItemIdArray()
          il = createArray()
          ii = createArray()
          i = 0
          ct = 0
          while i < getArrayLength(a)
            if a[i] >= 0
              mi = getItemParamWithIndex(i)
              il[ct] = getValueFromItemParam(mi, getItemViewNameIndex())
              ii[ct] = i
              ct = ct + 1
            end
            i = i + 1
          end
          il[ct] = "やめる"
          idx = speakWithSelectArray(il, "どちらのアイテムを売っていただけますか?")
          if idx == ct

          else
            price = 0
            i = 0
            priceLoopEnd = false
            while i < getArrayLength(sellItems) && !priceLoopEnd
              if sellItems[i][0] == a[ii[idx]]
                price = sellItems[i][1]
                priceLoopEnd = true
              end
              i = i + 1
            end
            if priceLoopEnd
              case speakWithSelect(2,"はい","いいえ", 
                  toString(price) + "になりますが売っていただけますか?")
                when 0
                  speak("売っていただきありがとうございます。")
                  gold = gold + price
                  removeItemWithIndex(ii[idx])
                when 1
                  speak("まだ手放されないのですね。了解しました。")
              end
                
            else
              speak("まだ手放されないのですね。了解しました。")
            end

          end          


        when 2
          
      end

      
    when 2
      speak("またのご来店をお待ちしています。")
      loop = false
  end
  
end

setVariable(getVariable("店で使える通貨の変数名"), gold)

setSelectWindowRect(selectX, selectY, selectWidth, selectHeight)

deleteText(textId)