ある事をすると次のイベントが発生させるには、どうすれば?(質問掲示板

投稿: User icon mini 退会したユーザー 投稿:2011/05/27 22:15:27(最新:2011/08/04 18:10:04)
タイトルだけでは、わからないかもしれません。
例えば、「ドラゴンクエストⅨ」のクエストの様に、
1、ある敵を倒したら、クエストクリアで、クエストを出した人に話しかけると、報酬をもらえるというもの(または同じ敵を、一定の数倒すとクエストクリア。)
(クエストは、何度でも受けられる。)
や、
2、ある敵を倒すと、クエスト専用のアイテムが手に入り、そのアイテムが手に入れば次のアイテムが手に入り、3つ手に入ると、クエストクリアになり、クエストを出した人に話しかけると、報酬をもらえるというもの。
(クエストは、何度でも受けられる。)

(3つアイテムを一定の順番でてにいれられるようにする。)
(クエストを受けたときのみ、その「ある敵」が出てくるというもの。)や、
3、ある敵を、ある技で倒すとクエストクリアでクエストを出した人に話しかけると、報酬をもらえるというもの。
(クエストは、何度でも受けられる。)
こんなに多く、すいません(^_^.)
コピペできるようにしてくれるとありがたいです。
できないものは、教えてください。
2は、特に作りたいものです。
お願いします((+_+))

コメントする

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

コメント一覧

User icon mini 退会したユーザー(投稿日:2011/08/04 18:10, 履歴)
ありがとうございました
   mini ___(投稿日:2011/08/04 18:05, 履歴)
再三書きますが、エラーが出た場合は
エラー番号も一緒に書きこんでいただけると助かります。非常に。


あと こ れ は ひ ど い。

elsif → elseにして試してみてください。

我ながらひどいミスですねぇ、申し訳ない。
途中までelseで書いてるのになんで最後の長文で間違えてるんだろう。
User icon mini 退会したユーザー(投稿日:2011/08/04 17:36, 履歴)
ちょっとこちらのスクリプトを参考に作らせてもらったんですが
if(getFlag("クエ受注"))  # 以下クエストを受けていた場合 
 if(getFlag("クエクリア"))  # クエクリアの場合 
    speak("ありがとうございますこれはほんのお礼です")
    speak("報酬金300Gをもらった!")
    addMoney(300)
    setFlag("クエ受注" , false) 
    setFlag("クエクリア" , false) 
  elsif  # クエクリアしていない場合 
  speak("ここらへんにいっぱいいるので1体倒して来たら教えてください") 
 end 
elsif  # 以下クエストを受けていない場合 
 case speakWithSelect(2,"わかりました","また後で", 
    "僕をこんな体にしたぜりいを1体だけ倒してきてくれますか?お礼はするので。")
  when 0
    speak("ありがとうございます")
    setFlag("クエ受注", true)
  when 1
    speak("そうですか・・・。")
 end
end

これを入れると12行目にエラーが出たんですが・・・。
どこが間違っていますか?教えてください
   mini ___(投稿日:2011/06/04 00:45, 履歴)
endを入れた…? 一体何処に…?

はて。まあそれはそこらへんに置いておきまして、
長々と書いていきます。着いてきてくださいね。

まず、変数名またはフラグ名は、一目で意味がわかるものにするよう
心がけるといいと思います。
ちょっとした所にちょこっと使うのならまだ大丈夫なのですが、
後々に「これ何ぞ?」となってくることがありますので、
その時に意味のある変数名だと助かるんですよね。
人に見せるときにも一々説明しなくても良くなりますし。

さて。
こういう入れ子の場合、外からよりも中から作って、
それを囲んでいくとうまくいくことが多いです。
(もちろん大外から作っていっても大丈夫ですが)

まずは選択肢と、それに対するリアクションを作ります。
クエストを受けていない状態の所です。
case speakWithSelect(2 , "あいよ" , "嫌だ" ,
  "お願いしますぜ旦那ぁ…")
 when 0  # はいの場合
  speak("よろしくー")
  setFlag("クエ受注" , true) # イベントはここで終わってくれます
 when 1  # いいえの場合
  speak("なんでだよー")
end

クエストを受けている場合は上記文を全く使わないので、
これ全てをif文で条件分岐させます。
同じ文を書くと長くなるので、上記文全てをまとめて
スクリプトBとしますね。
if(getFlag("クエ受注"))  # 以下クエストを受けていた場合
 ~処理内容~
elsif  # 以下クエストを受けていない場合
 スクリプトB
end

初めはクエ受注フラグがfalseですので、elsif以下を実行します。
elsif以下スクリプトBにて、質問に「はい」と答えると、
クエ受注フラグがtrueとなり、次回以降elsif以下ではなく、
if~elsif内のスクリプトを実行します。
次に、この部分…スクリプトAを作ります。

クエストを受注している場合、そのクエストを
クリアしているかしていないかで、処理が分岐しますよね?よって、
if(getFlag("クエクリア"))
  ~プチ幽霊を倒している場合~
  (クリアフラグがtrue)
elsif
 ~プチ幽霊を倒していない場合~
  (クリアフラグがfalse)
end

となります。

クエクリアの場合は、お礼の言葉の後、
クリアフラグと受注フラグをfalseにします。
このままですといつまでも御礼の言葉を言われ続けて、
再びクエストを受けることが出来ませんので。
クエクリアしていない場合は、「畑の~」と
ヒントメッセージを表示することにします。
if(getFlag("クエクリア"))  # クエクリアの場合
  speak("マジあんがとー")
 setFlag("クエ受注" , false)
 setFlag("クエクリア" , false)
elsif  # クエクリアしていない場合
 speak("畑に行けばいいんじゃね")
end

これがクエストを受けていた場合のスクリプトAになりますので、
これらを全て組み合わせると以下のようになります。ゲソ。
if(getFlag("クエ受注"))  # 以下クエストを受けていた場合
 if(getFlag("クエクリア"))  # クエクリアの場合
   speak("マジあんがとー")
  setFlag("クエ受注" , false)
  setFlag("クエクリア" , false)
 elsif  # クエクリアしていない場合
  speak("畑に行けばいいんじゃね")
 end
elsif  # 以下クエストを受けていない場合
 case speakWithSelect(2 , "あいよ" , "嫌だ" ,
   "お願いしますぜ旦那ぁ…")
  when 0  # はいの場合
   speak("よろしくー")
   setFlag("クエ受注" , true)
  when 1  # いいえの場合
   speak("なんでだよー")
 end
end


多分こんな感じで書けば動くと思うんですけどねー。
長文乱文失礼しました。何かあればどうぞー。
User icon mini 退会したユーザー(投稿日:2011/06/03 21:47, 履歴)
投稿遅れてすみません。
難しいですね。
「畑にいる『プチ幽霊』ですよ」
が、必ず出てきます。
はいと答えた後に、発言(「お願いします。」)をさせて会話を終わりにして
次話しかけたときには
「畑にいる『プチ幽霊』ですよ」
にしたいのです、ここを明確にしなくてすみませんでした。
endを入れても、フラグが作動し、
「畑にいる『プチ幽霊』ですよ」
が出てきます。
解決方法を、教えてください。
お願いします。
   mini ___(投稿日:2011/05/29 12:27, 履歴)
連投です、ご迷惑をおかけします。

まず、私の認識が誤っていました。ちょっと意図とは違う動きでした…w
こういうことだったんですね。
クエスト受注フラグが…
┣「true」である
┃┗クエストクリアフラグが…
┃ ┣「true」である
┃ ┃┗「ありがとう、これはお礼ぞよ。」
┃ ┃ クエスト受注フラグfalse
┃ ┃ クエストクリアフラグfalse
┃ ┗「false」である
┃  ┗「畑の幽霊ざますよ。」
┗「false」である
 ┗質問と選択肢「クエストを受けるか?」
  ┣「はい」と答えた
  ┃┗クエスト受注フラグtrue
  ┗「いいえ」と答えた
   ┗「まじか…」

まず、全体を
if(getFlag("受注"))
 ~スクリプト~ # 受注しているなら
else
 ~スクリプト~ # 受注していないなら
end

と囲むことで、全体をクエスト受注の有無で場合分けできます。
また、クエストを受注していた場合は、更にそのif文の中で
クエストクリアか?というフラグを見て、if文で場合分けしていきます。

上記文をスクリプトに変えますと、だいたいこんな感じ。
if(getFlag("受注"))
 if(getFlag("クリア"))
  # クエストを受注していて、クリアしている
  ~スクリプト~
 else
  # クエストを受注しているが、クリアしていない
  ~スクリプト~
 end
else
 case speakwithselect()
 when 0
  # クエストを受注していなくて、受けてくれる
  ~スクリプト~
 when 1
  # クエストを受注していなくて、受けてくれない
  ~スクリプト~
 end
end

色々入り組んだ複雑な文になると思いますが、
インデント(字下げ)を上手く活用して、見やすいコードで書くといいですね。

長文乱文連投失礼しました。
また何かありましたらよろしくお願いします。
   mini ___(投稿日:2011/05/29 11:59, 履歴)
Rmake記法というものがありまして、スクリプト全体を{{{code~~}}}で
囲むと、先の私の投稿のように、すっきりした状態で投稿できますよ。
スクリプトを書きこむ際は是非ご活用ください。
さて、
getFlag("ss") 
case speakWithSelect(2,"はい","いいえ", 
  "「あ、王子お願いがあります。以下略。") 
when 0 
 setFlag("ss", false) 
 speak("「お願いします。」") 
end 
 setFlag("ss", true) 
 if getFlag("a") 
  speak("「ありがとうございます!以下略") 
  fadeOut(0,0,0) 
  setFlag("a", false) 
  fadeIn() 
  speak("「畑にいる『プチ幽霊』ですよ」") 
 end 
when 1 speak("そうですか。") 
end 

まあ適当に整形してみましたが、ちょっと色々間違ってるかも。
case文(場合分け)ですが、これの形は
case (値)
  when 0
  # 値が0の時の処理
  when 1
  # 値が1の時の処理
  when 以下略
end

こういう風になります。
ですので、今のままのコードでは、いいえの選択肢を選んでも
何も起きないのではないでしょうか。
また、when 1の後に改行せずスクリプトを書くのは、
構文エラーになるんじゃなかったかな…どうなんでしょ。
とにかく、その一ではなく、改行することを勧めます。
後は、一行目のgetFlag("ss")が無駄な一行でしょうか。
値を調べて、その値を使うこと無く即座に捨てているので勿体無いですね。
その後使っているようにif文に突っ込むとか、変数に格納するとか、
そういうことをしないのなら必要ない一行だと思いました。

うーん。
もちっと分かりやすく回答したいので、連投させていただきます。
長文乱文失礼します。
User icon mini 退会したユーザー(投稿日:2011/05/29 09:28, 履歴)
もう1度質問です、すみません。
wiki/スクリプト/フラグを読んで、挑戦しましたが、
クエストのフラグと別のフラグで管理しようと思ったらtdateikakuさん
の出してくれた

「質問と選択肢~~?」
┣「はい」と答えた
┃ ┣一回目(フラグAがfalse)
┃ ┃ ┗「一回目の会話~~」
┃ ┃  フラグAをtrueにする
┃ ┗二回目(フラグAがtrue)
┃  ┗「二回目の会話~~」
┗「いいえ」と答えた
 ┗「いいえでの会話~~」

の「二回目の会話~~」が、1回目に出てきます
これが、実際に入れてみたものです。↓

getFlag("ss")
case speakWithSelect(2,"はい","いいえ",
"「あ、王子お願いがあります。\n私の畑に現れた、『プチ幽霊』を倒してくれませんか?\n倒すと、しばらくおとなしくなるんで。」\n\n\n\n\nクエストを受けました、実行しますか?\nクエストナンバー1\nクエストレベル1")
when 0
setFlag("ss", false)

speak("「お願いします。」")
end

setFlag("ss", true)

if getFlag("a")
speak("「ありがとうございます!\nこれは、ほんのお礼です。」\n\n\nレベルが1上がった。")
fadeOut(0,0,0)
setFlag("a", false)
fadeIn()
speak("「畑にいる『プチ幽霊』ですよ」")
end


when 1speak("そうですか。")


end


どこが間違ってるか、教えてください。
お願いします。
   mini ___(投稿日:2011/05/29 00:22, 履歴)
スクリプトの丸上げは私は基本的に行いたくありません。
私はスクリプトの丸上げはあまりしたくないのです。
大事なことなのでもう一度書きたいくらいですよ。

今回コピペで済ますことが出来ても、またそのうちに
新たな疑問が現れることになると思います。
さしずめ第二第三の魔王のように。
ですから、コピペではなく原理を理解して、
ご自身で書けるようにならなければならないと思っています。

ゲーム作りに初心者も何も無いんです。
初心者だと仰るのなら、まず手始めに
初心者なりのレベルのものを作ってみてくださいな。


さて、そのご質問の答えですが、そのとおりです。
フラグを使えば、そのような問題はまるっとすぱっと解決できます。
  Wiki/スクリプト/フラグ
「質問と選択肢~~?」
┣「はい」と答えた
┃ ┣一回目(フラグAがfalse)
┃ ┃ ┗「一回目の会話~~」
┃ ┃  フラグAをtrueにする
┃ ┗二回目(フラグAがtrue)
┃  ┗「二回目の会話~~」
┗「いいえ」と答えた
 ┗「いいえでの会話~~」

という風な流れのことを仰っているのだと思います。
(同じ文を~というのがランダムで文を出したいという意味で無いなら)
使用するであろう関数は以下のとおりです。
  質問と選択肢
  フラグのセット、確認
  条件判断(if文)

単純なものですが、これらを組み合わせていくのは、
はじめは考え方が難しいとは思いますが、是非頑張ってください。

意味がわからなかったらまたどうぞ。
長文失礼しました。
User icon mini 退会したユーザー(投稿日:2011/05/28 22:35, 履歴)
投稿遅れてすみません。
フラグで管理してみましたが、選択肢の関数ではいをこたえた後には、
同じ文を出したくないのですが、どうすればいいですか?
あと、すみません書くのを忘れてました。
この質問は、2DRPGの話です。
ずうずうしいようですが、コピペできるようにしていただきたいです。
初心者ですみません(;_;、おねがいします。
   mini ___(投稿日:2011/05/28 01:04, 履歴)
ノベルゲームを主に取り扱っていますので、
勘違いや知識不足等ありますが、回答させていただきます。
また、スクリプトの丸上げは私は基本的に行いたくないので、
分からないことがあったらまた書きこんでください。



まず3についてですが、現状では戦闘システム自体に割り込める
スクリプトが存在しませんので、「敵を倒した技」という
情報を取得することが出来ません。
よって、3の条件は満たすことが出来ません。

1ですが、2DRPGのランダムエンカウントを除けば、
出現する敵はこちら側で指定することが出来ます。
なので、イベント中(適当なフラグON)ならば、その敵を倒した後に
クエスト達成フラグをONにし、その状態で依頼主に話しかければ
クエクリア、という手法を取ることが可能だと思います。

2ですが、同じくランダムエンカウントを除けば中略なので、
戦闘後にアイテムを配布する関数を使用すればいいかと。
アイテム1無しならアイテム1を、1有り2無しなら2を、
というような条件文をつければ、アイテムを一定の順に
渡すことは可能です。
依頼主は、条件式でアイテム1~3を所持ならクエクリア、という風に
指定してやれば大丈夫だと思います。

どれもこれも割と面倒な処理になると思いますので、
のんびりと作成してくださいな。
Nyan mini rurun9(投稿日:2011/05/28 00:59, 履歴)
いらっしゃい。初めての方は必ず通るべき道があります。
・ヘルプ>スクリプト言語のマニュアル
・wiki スクリプト/変数
が基礎知識で、
・ヘルプ>関数リファレンス
・wiki その他/困ったときに(lv.0
・wiki スクリプト/つくってみよう0
・wiki スクリプト/フラグ
あたりを読んでリンクも辿っていきましょー。


1。フラグを用意する、または変数で数を記録して、それを調べるだけ

2。1と全く同じ。進行の段階を変数で記録すればOK

3。RPGですよね?
現状では「どんな攻撃でトドメをさしたか」を判断する事ができないのではないかと思われます。