スクリプトメモ:自由にメッセージを変えられるお店

投稿者:Material 303531 2 mini mochi3kan 投稿日:2017/02/04 17:35

こんにちは。リニューアルでいろんなとこがちょこちょこ変わってますね。
そういえば2月で、私がRmakeでごにょごにょし始めてから1年になりました。
おかげさまでゲームや素材をいくつか公開できました。
プレーやコメント、評価くださった方々に感謝ですm(__)m
今年もいろいろ活動出来たらなあと思います。今後ともよろしくお願いします!


それはそうと、かねてより作りたかった「自由にメッセージを変えられるお店」を今更ながら作ってみました。
ある程度は、まとめて台詞を変更しやすくなっているのではないでしょうか。
既存の関数使えばいいじゃない、というかwikiのやついじればいいじゃない!
とかいう声が聞こえてきそうですが、それはそれとして、自分が使い勝手のいいものを作ってみたかったのです。
だって掲示板とか見ても、「店が作れません!」→解決したあとのスクリプトが載ってないんだもん……(´;ω;`)
自力で作れる方も多いとは思うのですが、もう少し初心者がとっつきやすい形のものがあってもいいと思うのよ。
何かご指摘がありましたらぜひぜひ。(ついでに、メッセージウィンドウを見やすくするテストも追加しました)

サンプルゲームはこちら↓


スクリプト目次

注意事項
・「装備しているアイテムを売る」項目はありません。個人的に必要なかったので。
・変数の名前は適当です。また、caseやendの後ろに書いている#case3や#if2などはただの目印です。
・アイテムのIDや値段設定はサンプルゲームのものをそのまま書いています。
・通常変数の配列を使った方がよくない? と思った方はきっとご自分で書き換えられるだけの力を持っているはず。
・開始スクリプトに書くべきお金の単位の設定などは省略しています。
・素材を買い取るお店のスクリプトもとりあえず載せてみました。二次元配列がようやく少し理解できた気がします。

参考
物を売るスクリプト(質問掲示板) ←こちらのスクリプトを基本にしています。
スクリプト/コツ/売ったり買ったりできるお店処理
スクリプト/コツ/自由な位置における画像や文字列の使い方
スクリプト/配列
関数リファレンス

疑問・課題など
・作っている最中、売るところで使っているローカル変数dに、値が入っていない(nullになる)ときがあった。
 半角英数のスペースも変数の名前("d ")として認識されている?そういうわけではないようです。
 原因はよく分かりませんが今は無事動いているので無問題でしょう←
・商品の名前と一緒に値段が表示されると分かりやすいと思いますが力尽きました。
・素材を売るお店は何個かまとめ売りできると楽になると思いますが以下略。
関係ないけどイベントエディタのスクリプト書くとこが狭くなってる……(´;ω;`)広くなったよやったね!

前置きが長くてすみません。以下、スクリプトです。
基本的に、書き換える必要があるのは###で挟まれた所です。


売り買い出来るお店


 
#######所持金表示の設定#######
g = getMoney()
setVariable( "テキスト1", createText(350, 50, 160, 22) )
setText( getVariable("テキスト1"), "所持金 " , g , " " , getDenomination() )
#############################

#####店で買える商品リスト######
a = createArray()
a[0] = createArray()
a[0][0]= 774 #ID
a[0][1]= 50 #値段
a[1] = createArray()
a[1][0]= 20389
a[1][1]= 100
a[2] = createArray()
a[2][0]= 20365
a[2][1]= 800
############################

b = createArray() 
n = 0 
while n < getArrayLength(a) 
z = getValueFromItemParam(getItemParamWithId(a[n][0]), getItemViewNameIndex())
pushArray(b, z) 
n = n+1 
end 
pushArray(b,"やめる")

i = 0
while i >=0

  if i > 0 ##一回目と二回目で台詞を変えたいとき
    s = "店主\n「他に用はあるかい?」"
    i = 0
  elsif i == 0 
    s = "店主\n「いらっしゃい。\n ここは道具屋だよ」"
  end

case speakWithSelect(3, "買う", "売る", "やめる", s) ## 
  when 0 #買う時のスクリプト
    ##########ここから##########
    while i == 0
      c = speakWithSelectArray(b,"店主\n「どれを買うんだい?」") 
      if c == getArrayLength(b)-1 #やめる
        i = i + 1
      else
        i = 0

        #####店で買えるアイテムのID#####
        case a[c] #アイテムID
          when 774  
          when 20389  
          when 20365  
        end
        ##############################

        case speakWithSelect(2,"買う","買わない",
            "店主\n「"+b[c]+"は"+  a[c][1] +"Gだよ。\n 買うかい?」" ) #case2
          when 0
            if g >= a[c][1]  
              giveItem(a[c][0])
              subMoney(a[c][1])
              g = g - a[c][1]
              setText( getVariable("テキスト1"), "所持金 " , g , " " , getDenomination() )
              speak("店主\n「ありがとう。\n はい、どうぞ」")
            else #g < a[c]、お金が足りない時
              speak("店主\n「・・・お金はちゃんと持ってきてもらわないと困るなあ」")
            end
          when 1
            speak("店主\n「あ、そうですか・・・」") #買うのをやめたとき
        end #case2
      end #if
    end #while
    ##########ここまで##########

  when 1 #売るときのスクリプト
    ##########ここから##########
    loop = true
    while loop
  
      A = getItemIdArray()
      B = createArray() 
      N = 0
      while N < getArrayLength(A) 
      Z = getValueFromItemParam(getItemParamWithId(A[N]), getItemViewNameIndex()) 
      pushArray(B, Z) 
      N = N + 1 
      end 
      pushArray(B,"やめる")

      C = speakWithSelectArray(B,"店主\n「どれを売ってくれるんだい?」") 
      if C == getArrayLength(B) - 1 #やめる
        loop = false
        i = i + 1 
      else
        i = 0

        #####店で売れるアイテムのIDと値段#####
        case A[C] #アイテムID、d=売値
          when 20350 d=250 
          when 1099 d=150 
          when 2974 d=100
          when 774 d=25 
          when 20389 d=50 
          when 20365 d=00 
        end
        ##################################

        if d == 00 #if2、特定のアイテムを非売品にする
          speak("店主\n「うーん、\n 残念だけどこれは買い取れないなあ」")
        else 
          case speakWithSelect(2,"売る","やめる",
              "店主\n「"+B[C]+"だったら"+ d +"Gで買い取るよ」" ) #case3
            when 0 
              removeItemWithIndex(C)
              addMoney(d)
              g = g + d
              setText( getVariable("テキスト1"), "所持金 " , g , " " , getDenomination() )
              speak("店主\n「ありがとう。\n 確かに買い取ったよ」")
            when 1 
              speak("店主\n「まだ売らないんだね」") #売るのをやめたとき
          end #case3
        end #if2
      end #if
    end #while
    ##########ここまで##########
    
  when 2
    speak("店主\n「ありがとう、また来てね」") #やめる
    i = i - 10
end #case

end #while

deleteText(getVariable("テキスト1"))
 



買うだけのお店


 
#######所持金表示の設定#######
g = getMoney()
setVariable( "テキスト1", createText(350, 50, 160, 22) )
setText( getVariable("テキスト1"), "所持金 " , g , " " , getDenomination() )
#############################

##########商品リスト##########
a = createArray()
a[0] = createArray()
a[0][0]= 20350 #ID
a[0][1]= 500 #値段
a[1] = createArray()
a[1][0]= 1099
a[1][1]= 300
a[2] = createArray()
a[2][0]= 2974
a[2][1]= 200
#############################

b=createArray() 
n=0 
while n<getArrayLength(a) 
  z = getValueFromItemParam(getItemParamWithId(a[n][0]), getItemViewNameIndex())
  pushArray(b,z) 
  n=n+1 
end 
pushArray(b,"やめる")

##########店主の台詞1##########
s1 = "おばさん\n「いらっしゃいませ、\n ここは装備品屋です」"
s2 = "おばさん\n「どれを買いますか?」"
s3 = "おばさん\n「ありがとうございました。\n またお越しくださいね」"
s8 = "おばさん\n「そうですか、またお越しくださいね」"
#############################

case speakWithSelect(2, "買う", "やめる", s1) #case1
  when 0
    loop = true
    while loop
      c=speakWithSelectArray(b, s2) 
      if c==getArrayLength(b)-1 
        speak( s3 )#やめたとき
        loop = false
      else

##########店主の台詞2##########
s4 = "おばさん\n「"+b[c]+"でしたら"+  a[c][1] +"Gになります。\n 買いますか?」"
s5 = "おばさん\n「ありがとうございます。\n どうぞお受け取りください」"
s6 = "おばさん\n「金が足りねえじゃねえか!\n 出直してこいや!」"
s7 = "おばさん\n「買わねえのかよ!」"
#############################

         #####店で買えるアイテムのID#####
         case a[c] #アイテムID
          when 20350  
          when 1099  
          when 2974  
         end
        ##############################

        case speakWithSelect(2,"買う","買わない", s4)
          when 0
             if g >= a[c][1]  
              giveItem(a[c][0])
              subMoney(a[c][1])
              g = g - a[c][1]
              setText( getVariable("テキスト1"), "所持金 " , g , " " , getDenomination() )
              speak( s5 )
            else #g< a[c]
              speak( s6 )
            end
          when 1 
            speak( s7 ) #買うのをやめたとき
        end #case
      end #if
    end #while
   
  when 1
    speak( s8 ) #やめる
end #case1


deleteText(getVariable("テキスト1"))
 



売るだけのお店


 
#######所持金表示の設定#######
g = getMoney()
setVariable( "テキスト1", createText(350, 50, 160, 22) )
setText( getVariable("テキスト1"), "所持金 " , g , " " , getDenomination() )
#############################

##########店主の台詞1##########
s1 = "おじさん\n「おう、らっしゃい!\n アイテムを売りに来たのか?」"
s2 = "おじさん\n「どれを売ってくれるんだ?」"
s3 = "おじさん\n「ありがとよ、\n また来てくれよな!」"
s8 = "おじさん\n「おう、また来てくれよな!」"
#############################

case speakWithSelect(2,"売る","やめる", s1)
  when 0
    loop = true
    while loop

      a=getItemIdArray() 
      b=createArray() 
      n=0 
      while n<getArrayLength(a) 
         z = getValueFromItemParam(getItemParamWithId(a[n]), 
           getItemViewNameIndex() 
           ) 
        pushArray(b,z) 
        n=n+1 
      end 
      pushArray(b,"やめる")

      c=speakWithSelectArray(b, s2) 
      if c==getArrayLength(b)-1 
        speak( s3 )#やめたとき
        loop = false
      else

        #####店で売れるアイテムのIDと値段#####
        case a[c] #アイテムID、d=売値
          when 20350 d=250 
          when 1099 d=150 
          when 2974 d=100
          when 774 d=25 
          when 20389 d=50 
          when 20365 d=00 
        end
        ##################################

##########店主の台詞2##########
s4 = "おじさん\n「"+b[c]+"か・・・\n うちじゃちょっと買い取れねえな」"
s5 = "おじさん\n「"+b[c]+"だったら"+d+"Gで買い取るぜ。\n どうする?」"
s6 = "おじさん\n「おう、確かに買い取ったぜ」"
s7 = "おじさん\n「そうか、まだ売らねえんだな。\n そういうこともあるわな」"
#############################

        if d == 0 ##特定のアイテムを非売品にする
          speak( s4 )
        else ##if2
          case speakWithSelect(2,"売る","やめる", s5 ) 
            when 0 
              removeItemWithIndex(c)
              addMoney(d)
              g = g + d
              setText( getVariable("テキスト1"), "所持金 " , g , " " , getDenomination() )
              speak( s6 ) 
    
            when 1 
              speak( s7 ) #売るのをやめたとき
          end #case2
        end ##if2
      end #if
    end #while

  when 1
    speak( s8 ) #やめる
end #case1

deleteText(getVariable("テキスト1"))
 



素材売却のお店


開始スクリプト
 
#####素材の名前、最初の個数、売却価格設定#####
setVariable("素材", createArray())
getVariable("素材")[0] = createArray()
getVariable("素材")[0][0] = "赤水玉きのこ" #名前
getVariable("素材")[0][1] = 0 #個数
getVariable("素材")[0][2] = 100 #売値
getVariable("素材")[1] = createArray()
getVariable("素材")[1][0] = "白かぶ" #名前 
getVariable("素材")[1][1] = 0 #個数
getVariable("素材")[1][2] = 300 #売値
getVariable("素材")[2] = createArray()
getVariable("素材")[2][0] = "ピンクの花" #名前
getVariable("素材")[2][1] = 0 #個数
getVariable("素材")[2][2] = 50 #売値
#こんな感じで増やしていけます
 
#####素材を手に入れるときのスクリプトもついでに#####
##※こちらは開始スクリプトではなくそれぞれのイベント時に書きます
if getVariable("素材")[2][1] >= 7 #持てる個数を制限したいときに書く
speak("『ピンクの花』はこれ以上持てそうにない・・・")

else
speak("綺麗な花が咲いている。\n\n『ピンクの花』を手に入れた!")
getVariable("素材")[2][1] = getVariable("素材")[2][1] + 1
end
###################################



イベントスクリプト
 
setSelectWindowRect(304, 128, 176, 240) #選択肢ウィンドウの幅を変えて見やすくする

#######所持金表示の設定#######
g = getMoney()
setVariable( "テキスト1", createText(350, 50, 160, 22) )
setText( getVariable("テキスト1"), "所持金 " , g , " " , getDenomination() )
##############################

a = getVariable("素材")

case speakWithSelect(2,"売る","やめる", 
    "お嬢さん\n「はーい、\n こちらは素材売却専用カウンターでーす」") #case1
  when 0
    loop = true
    while loop 
      b = createArray() 
      n = 0 
      while n < getArrayLength(a) 
        z = a[n][0]+ " : " + a[n][1] + " 個"
        pushArray(b, z) 
        n = n+1 
      end 
      pushArray(b,"やめる")

      c = speakWithSelectArray(b,"お嬢さん\n「何を売ってくれますかー?」") 
      if c == getArrayLength(b)-1 #やめる #if1
        speak("お嬢さん\n「また来てくださいねー!」")
        loop = false
      else
        case a[c] 
          when a[0][0]  
          when a[1][0]  
          when a[2][0]  
        end

      if a[c][1] == 0 #if2 #素材の個数が0個のとき
       speak("お嬢さん\n「持ってない物は買い取れませんよー。」")
      else
        case speakWithSelect(2,"売る","売らない", 
         "お嬢さん\n「『"+a[c][0]+"』なら"+ a[c][2] +"Gで買い取りまーす」")
        when 0
          speak("お嬢さん\n「ありがとうございまーす」")
          g = g + a[c][2]
          setText( getVariable("テキスト1"), "所持金 " , g , " " , getDenomination() )
          addMoney(a[c][2])
          a[c][1] = a[c][1] - 1
        when 1
          speak("お嬢さん\n「えー、売って下さいよぉ」") #売るのをやめたとき
        end #case
      end #if2
    end #if1
  end #while

when 1
  speak("お嬢さん\n「また来てくださいねー!」")
end #case1

deleteText(getVariable("テキスト1"))

setSelectWindowRect(324, 128, 156, 240) #選択肢ウィンドウデフォルト値
 

コメントする

コメントするには、ログインする必要があります。

コメント一覧

            mini mosmoss(投稿日:2017/02/04 18:07, 履歴)
セリフだけ場所をまとめてあったり
親切なコメントが付いていたり
演出をしたい時に使いやすいですね
Material 303531 2 mini mochi3kan(投稿日:2017/02/05 13:41, 履歴)
コメントありがとうございます。
台詞の変えやすさと汎用性の高さを重視して書きました。
いろいろ削った分だいぶ簡素になりましたが
お店ごとに台詞を変えたい場合にいいのではないでしょうか。
あとはユーザ定義関数とか使えばもっと簡潔になるかもしれませんね。