スクリプト/コツ/売ったり買ったりできるお店処理
最終投稿者: dycoon
更新:2011/07/29 12:24:51
アイテムの削除の機能などが付け加わりましたので、
お店でアイテムを売ることもできるようになりました。
サンプルゲームは以下のとおりです。
ゲーム[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
アイテム売買のコード
ここでは、アイテム売買の処理を以下のように記述しました。
結構長いのでコピー&ペーストして
使用するのがよいかと思います。
何を売るか、通貨をどうするかなどは
設定をおこなう必要がありますので、
設定の方法を以下に記します。
基本的に書き換える必要があるのは
"#データなど"のあとから、"#お店処理"の前までです。
通貨
通貨に利用している基本変数の名前を
以下のようにして"店で使える通貨の変数名"に渡します。
また、注意として開始スクリプトで、"お金"の初期化をする必要があります。
店で売っているアイテム
以下のようにして
idと価格の組の配列の配列を用意します。
a[i][0]には売るアイテムのid、a[i][1]には売るアイテムの価格を設定します。
最後に基本変数"店にあるアイテム"にaを設定します。
店が買い取れるアイテム
店で売るときと基本的に同じですが、
マップ外のアイテムのidも持ち込まれる可能性があるため
その分も書く必要があります。
最後に基本変数"売れるアイテム"にaを設定します。
ゲーム全体で売れるアイテムが同じなら開始スクリプトに
この処理を書いてもよいかと思います。
倒すとお金を落とす敵
マップエディタで配置した敵キャラを倒すと、
お金などを落とす処理を、おまけとしてここに書いておきます。
アクションRPG用お店処理
アクションRPGの場合パーティメンバーがいないなどの理由で
使える関数などが変わります。
たとえば以下のようにします。
ツイート
お店でアイテムを売ることもできるようになりました。
サンプルゲームは以下のとおりです。
ゲーム[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)
コメントする
コメントするには、ログインする必要があります。
文法エラーなのですが、
別に何も変えていないところに間違いがあるってでます。
どういうことでしょう?