牧場物語のような畑システムを作ってみたい

えびふらい

ユーザー
初めまして、ツクールMZ触りたての初心者です。
やりたいことはタイトル通りなのですがうまくいかないので、非常に初歩的だとは思うのですが質問させてください。
種をまいた後、【水を与える】→【ベッドで眠るor翌日を迎える】で少しずつ成長していく仕組みを作りたいです。時間経過で成長するのではなく、水を与えて寝ることで成長変数+1されるようにしたいと考えています。
欲張りすぎない方が良いと思い、初めはイベントマップのみで作成しようとしていました。しかし、種・種(水やり後)・苗・苗(水やり後)で成長前に最低4ページ消費してしまいせいぜい3種類程度しか育てる仕組みが作れませんでした。
また、1マス分のイベントを作ってもう1マス…と作っていくと変数が膨大になるのではと思いまして…。(水を与えた場合にスイッチをONにした仕組みで行こうとしましたが、一斉に反映されるのでまだ水を撒いていないはずの別チップが水やり後のチップに代わってしまい失敗を悟りました。)

プラグインも探してみたのですが、時間経過でコントロールするもの以外を見つけられませんでした。
メモ欄に記入して作っているような例も見かけましたが、スクリプトは理解が及ばず躓いてしまっています。

【試してみたことと躓いた段階】
・コモンイベントで作物の成長段階を管理してみる(種を蒔いたら呼び出し):プレイヤーの前にイベントを持ってくる方法が分からず挫折
・キャラクターチップの移動でページ数を抑えてみる(ラベルジャンプを駆使):ラベルジャンプが永遠に繰り返されてしまい挫折

(そもそも初心者がこのシステムを作ってみようとすることがもう欲張りなのでしょうか?)
どのようにすればシステムが作れるのでしょう…または再現できるプラグインを教えて頂けないでしょうか、宜しくお願い致します。
 
初めまして。
畑システムは……率直に言うと初心者(とくにスクリプト理解がない)方には難易度が高いです。
MZで畑システムを作ってあるんですが、解説記事と配布用作ろうと思ったけど分かりやすく説明するのに挫折してそのままですし……。
作物の種類が数種類のみ、肥料とか季節とかで成長速度が変わるとかなし、天候で水やり判定なしとか非常に限定的なものなら
まだマシなくらいには難しいです。

現段階ではえびふらいさんが、どの程度のシステムを作りたいのかまだわからないので
仕様をまとめる所からはじめましょう。

  • 畑イベント(畝)は1マスずつの判定か?
自分の作ったシステムだと畝の数が多ければ多いほど、処理に時間がかかりいわゆるロード画面を挟まないと
更新時に徐々にイベントが変わっていくシーンが見えてしまう問題があります。
たまに処理がすっ飛ばされる可能性も上がったり……。
なので、畝の数や 畑のあるマップが複数あるかないかなども重要です。

  • 水やり判定のタイミングは?
天候で自動的に水やり判定をさせるか?しなかった場合の処理は?枯れる?枯れない?
枯れた時は水をやれば復活するとかそういうシステムの有無?

  • 畝の成長度更新のタイミングは?
ベッドで眠るor翌日を迎えるで更新となると、いわゆる日付システムのようなものがあると思います。
そのシステムが完成されているかどうかもわりと重要です。
時間又は日を一定期間飛ばすようなシステムがあるかないか?あったら、その時の日数分は?
  • 作物の成長段階で採れるものが変化する?
作物完成のまま日数が経つと自動的に枯れて収穫できないとか、枯れ草みたいなアイテムが変わりに採れるとか。
追熟のように日数で収穫できる作物が変化するとか。
  • 畑システムで使用するグラフィックは?
種状態、途中経過、完成状態となると思いますが、途中経過が複数段階あったりそれが作物によってバラバラだったり
水やりをしたら変化するのか、枯れた状態もあるのかなど。
  • 作物の種類数は?
  • 作物の完成までの成長速度は種類別?それとも全部共通?
  • 肥料のような成長速度変化のアイテム等の有無は?
  • 季節概念があれば成長速度の影響有無は?
……とザッとだとこれくらいの仕様は考える必要があるでしょうか。
もし、本気で作りたいとの事であれば こちらもできる限りのお手伝いはしたいと思いますが
真面目に難しいので覚悟と根気が必要です……。
 

えびふらい

ユーザー
白黒洋菓子店様
返信いただきありがとうございます。そんなに難しいものだったのですね…お恥ずかしながら「これがどのくらい難しいのか」すら分かっておりませんでした…。仕様につきましては、以下のように考えておりました。

● 畑イベント(畝)は1マスずつの判定か?
1マスずつを想定しております。1マップに6~9くらいのものを3~4マップ設置できればいいなと考えておりました。
6マスのマップA、8マスのマップBというようなイメージです。

●水やり判定のタイミングは?
雨が降ったら「水を与えたスイッチ」をONにして一括で水やり判定をするつもりでした。
天候については、嵐などの概念はなく晴れか曇りか雨で、全マップ共通の予定です。
また、水やりをしなかった場合でも枯れることはなく、成長しないだけ…というイメージです。

●畝の成長度更新のタイミングは?
日付システムにつきましては、現在うなぎおおとろ様の「時間経過システム」というプラグインを使用させて頂いております。
歩数で時間が経過するシンプルなもので管理に大変重宝しているのですが、ベッドで眠らず翌日を迎えた場合にも成長するような「特定の時間帯を迎えたら判定」の仕組みが私にはうまく作れませんでしたので「ベッドで眠った場合のみ成長変数が+1される」処理の方が簡単なのかな…と思っています。
また、スクリプトで時間帯の変更ができる仕様のようなので、ベッドで眠った場合は時間を朝に変更するスクリプトを入れて「何時であろうと眠ったら翌日の朝から開始」としています。

●作物の成長段階で採れるものが変化する?
作物は完成したら収穫しない限りずっとそのままで、枯れる処理は作らないつもりです。
ですが、例えばトマトやキュウリなどいくつかの品種においては、完成後に収穫したら②に戻って…というような連作のような仕組みも考えていました。
もしやこれも相当難しいのでしょうか…。

●畑システムで使用するグラフィックは?
枯れた場合のグラフィックはなく、【種、苗①、完成】のパターンと 【種、苗①、苗②、完成】 のパターンを想定しています。
(種、苗、完成直前(小さな実がなっているグラフィックなど)、完成の形が理想ではあったのですが、種類ごとにその段階を挟むとページ数が圧迫されたので挫折しています)

●作物の種類数は?
20種類程度を想定しています。また、複数マップが作れるようでしたら1マップで全て育てられなくても良いと思っています。
1マップで20種類作る方が4マップで5種類ずつ作るより処理が重いのかなと勝手に思っているのですが、データの総量が変わらなければ同じだったりするのでしょうか?

●作物の完成までの成長速度は種類別?それとも全部共通?
種から苗、苗から完成までにかかる各日数はある程度は種類別でバラバラに…数パターンあればいいなと考えています。
最小が種1日、苗1日で完成するもの、最大が種5日、苗①5日、苗②5日で完成するものです。
各段階でかかる最大日数は5日の予定です。5→5で完成 や 1→4→5で完成などです。
成長速度のパターンが少なければ少ないほど簡単なのだとは思うのですが、【種、苗①、完成】と【種、苗①、苗②、完成】で各3~4パターンずつ作りたいと思っています。

●肥料のような成長速度変化のアイテム等の有無は?
成長速度や収穫数を操作するアイテムは無しの想定でいます。あれば楽しいのでしょうが目が回りそうで…。

●季節概念があれば成長速度の影響有無は?
季節の概念はありますが、タイルセットの変更で切り替え、あくまで畑システムに関わらない周囲のグラフィックのみにとどめようと思っています。なので季節ごとに成長が速度が変わったり、育てられなかったりといった処理は含まないつもりです。
こちらもあれば楽しいのでしょうがとんでもなく難しくなりそうで…。

以上が確認して頂いた仕様への現時点での考えになります。
初心者でスクリプトへの理解が非常に浅く教えて頂いたことにもトンチンカンな質問を返してしまうかもしれませんが、畑システムを作ってみたいがためにツクールに触り始めたので、可能な範囲で是非教えて頂きたいと思っています。
どうかよろしくお願い致します。
 
最後に編集:
だいたい把握しました。
● 畝数
1マスずつで1マップ6~9であれば、更新速度問題は大丈夫そうですね。
複数MAP存在するのはまだ制作したことないので、お手伝いする際にこちらがミスするかもしれないですが
多分、いけると思います。
6~9マス分の範囲内なので、MAPごとに変わるのも多分 そこまで管理の手間にはならないと思いますが
ひとまず、全部6マスずつという形から入った方が良さそうですね。
追加する分には、簡単なので。

●水やり判定
畑のある場所が屋内にあるパターン等も大丈夫でしょうか?

●畝の成長度更新のタイミング
該当プラグインをザッと見た感じ、成長更新フラグ用スイッチ1つで対応できますね。
特定の時間帯に変化した時にフラグスイッチをONにする形になると思います。
問題はおっしゃる通り、時間帯変化を常に取得しないといけない……筈なので、プラグインに直接入れ込んだ方が手っ取り早いんですが
ちょっとプラグイン知識がリセットされてるので該当箇所探すのに時間がかかりそうです。
有識者の方……

●作物の成長段階で採れるものが変化
連作仕様……(忘れていた顔)
自作の畑システムの仕様ならこれはすぐに対応出来るので問題ないと思います。
が、枯れることがないという事は今植えられている作物を撤去するシステムも必要そうですね。
撤去もとくに問題ないのでいけると思います。

●畑システムで使用するグラフィック
パターンが少ない方が管理や設定が楽です。
一応、こちらでのシステムでは細かく作物ごとに指定することが出来るものなので大丈夫ですけど。
まぁ、まずは簡易版で作りましょうかね。

●作物の種類数
処理の重さに関してはMZくんが優秀なので大丈夫だと思います。
それよりも1マスずつ順番に処理させる仕組みなので、畝が多いと先述した通り変化していくさまが見えてしまうという
見た目の問題ですね。
これはまぁ、畑マップに移動する際に更新終わるまでロード画面みたいなのを挟んでおけば問題ないです。
とは言え、畝数自体が少ないようなのでそこまで気にすることはない筈です。
種類数が多いと設定するのが大変(つまり根気)という話なので。

●作物の完成までの成長速度
バラつきありなら、自作のそのままで大丈夫そうですね。

●肥料のような成長速度変化のアイテム等の有無
基礎システムさえできれば、そこまで大変ではないですが。
その基礎が難しいので、今はその想定でいきましょう。

●季節概念があれば成長速度の影響有無は?
これも上記肥料と同じく。


自作の畑システムは思いっきり、スクリプト使いまくるものです。
スクリプトでスイッチや変数の値を変更、代入が出来ることが最低でも理解し使えるようになるのが必須です。
で、肝心要の畑システムで使うスクリプトは
「配列」なるものです。変数の中に複数の値を保存して、それぞれの畝に対応させて必要な値を取り出して……
はい、意味がわかりませんよね。お気持ちよくわかります。
一応、参考記事としてとんび様のこちらをはっておきます。でも多分、畑システムを作りながらの方が
実用的で分かりやすくなる筈なので 用意が出来るまで少々お時間をください。
このシステム作ったの随分前なので、まず思い出すところから始める必要ががが……
 
最後に編集:
どうも、とりあえず実際の挙動がどういうものかの参考として
自作仕様の畑システムの動画を作りましたので、ご確認ください。
あくまで自作仕様のものなので、えびふらいさんが求めている仕様とは多少違うのはご了承ください。

あと、合わせて作った日付天候システムの方も一応載せておきます。
畑システムはこのシステムもないとお話にならないので……。
 

えびふらい

ユーザー
白黒洋菓子店様

返信と動画を拝見いたしました。
私の想像をはるかに超える畑システムに驚き、感動しております。これが実装できればゲームがどんなに楽しくなることでしょう!
白黒洋菓子店様のようにツクールの仕様を理解するとここまで素晴らしいものを作り出せるものなのですね…!何を植えているのかが看板ですぐに分かる点も非常に親切な表示だと感じました!(私がなんとか作ろうとしていたものは条件分岐でセリフを出して…というような良くわからない代物でしたので…)
また、日付天候システムの“天気予報も作成できる”“BGMは自動で切り替わる”などの小回りが利く点も含めて素晴らしいものだと感じています。
しかしながらお察しいただきました通り、スクリプトの“配列”に頭が追い付いておりませんので示して頂いたリンク先の記事を読み込んで現在勉強しております。(例えば成長段階ごとのグラフィックに数字を当てはめて配列として記述…したりするのでしょうか…トンチンカンなイメージかもしれません)

また、我儘を申し上げるようで大変恐縮なのですが、この先畑システムのなんたるかを教えて頂くとともに日付天候システムについても併せて教えて頂けませんでしょうか?これらの素晴らしいシステムを是非どちらも理解したいと思っております、なんとか宜しくお願い致します。

3/22追記: 有難うございます!有難うございます!サンプルプロジェクトまで!!初心者ゆえ前提として導入すべきプラグインも提示して頂いて本当にありがたいです!!
 
最後に編集:
日付天候システムは、牧物的なゲームを作ろうとしたらどうしても色々付随機能があるので
プラグイン素材よりも勝手がいいという利点が大きいですね。

現在、解説記事を作成中です。そのついでに日付天候の方も作る予定だったので問題ないですよ。
記事作成はちょっと時間がかかりそうですので、気長にお待ちいただければ……。

03/23 追記
他の方がすぐに見つけやすいよう、更新内容やリンクはここでまとめておきます。

畑システムの解説講座
ツクールテクニック講座の「特殊システム制作講座」【MZ】畑システム 参照。
サンプルプロジェクトは「【MZ】畑システム-準備編-」からDLできます。
【サンプルプロジェクト更新内容】2023/03/23
  • ベッドの不具合修正
  • どのMAPにいても作物の更新がされる仕様に変更
  • 畑MAPにいる場合のみ作物の成長更新がされる仕様は一応残してありますが、今後のアプデで削除予定
2023/03/24
  • 作物収穫時の不具合修正
  • 萎れる仕様時の画像更新設定の修正

【講座 更新内容】2023/03/29
「実行処理作り編-1-」公開


日付天候システムの解説講座
現在、準備中。
サンプルプロジェクトは「【MZ】畑システム-準備編-」からDLできます。(畑システムと同じプロジェクト内に入っています)
【更新内容】2023/03/23 更新
  • 天候の変更と予報のサンプルイベントを追加(ベッド脇のキラキラ)
2023/03/25
  • ベッドによる日付更新処理の追加(ベッドEV、コモン「暦システム」)


サンプルプロジェクト内でもある程度、注釈なりイベントなりで解説はしていますが
まだ解説不十分な箇所もあると思います。
こちらで質問していただければ、都度更新をかけますのでお気軽にどうぞ。
 
最後に編集:

えびふらい

ユーザー
ありがとうございます!お恥ずかしながらスクリプトの&&も||も知らない状態でのスタートでしたので、今更ながらどれだけ難易度の高いことに挑戦しようと思っていたのか思い知らされるばかりです。注釈等を参考に、少しずつではありますがスクリプトへの理解に努めております。

一つ確認させて頂きたいのですが、作成して頂きましたサンプルプロジェクトにおいて、ベッドで眠った場合に時計や曜日、日付が更新されなくなるようです。また、昼・夜を示す明るさも更新されなくなります。なお、畑作業をしながら日を跨いだ場合は問題なくすべて更新されておりました。
すでに私が処理を間違えた可能性があるでしょうか…。
現在までに:導入すべき2種のプラグインの導入(ARTM~とMPP~)とそれらのON、イベントマップの注釈に書き加える形で自分用のメモを追記
上記を行っております。逆に言うとそれ以外に必要な処理があった場合手つかずです…。

お忙しい中サンプルプロジェクトまで作って頂いたというのに本当に申し訳ないのですが、お手すきの時に教えて頂けますでしょうか?宜しくお願い致します。
 
「ベッドの不具合」
コモンイベント「暦システム」の最後で設定している時間間隔の設定が2分ずつ増加させているので
ベッドの方も変数「分」の代入設定を58など偶数に設定する必要があります。
※すみません、ここの設定を変更するのを忘れてました。

あとはコモンイベント「暦システム」の最初の条件分岐「分=60」を「分>=60(60以上)」にするだけでも
いいと思います。


解説記事の続きはもうしばらくお待ち下さい。
 
最後に編集:

えびふらい

ユーザー
いつも有難うございます、講座やサンプルプロジェクトのスクリプトを日々拝見して勉強させて頂いております。
ベッドで眠っては「朝だ!」、マップ移動しては「雪だ!」とはしゃいでおります。ベッドについても解説有難うございます!

【以下は質問になります】
更新して頂いたサンプルプロジェクトについてなのですが、畑に"種を蒔く"または"肥料をやる"を選択すると
"Cannot read property 'x' of undefined"というエラーメッセージが表示されてしまいます。種・肥料の入手前・入手後ともにエラーメッセージは同様のものでした。水やりに関しては何ら問題なく動作しております。

スクリプトの解説等を読んだのですが「多分…多分$gameVariables.value(11)をどうにか定義…?できたらどうにかなるんではなかろうか…?」というところまでしか理解が及ばず(しかもこの理解もフワッとしておりまるで自信がありません)、肝心の「どうすれば修正できるのか」を把握できずにおります…。(アップデート前のサンプルプロジェクトと比較してみればわかったのでしょうが、即刻置き換えてしまいまして…)

何から何まで本当にお世話になっているのですが、修正方法について教えて頂けませんでしょうか?宜しくお願い致します。
 
サンプルプロジェクトを更新しました。

質問について:
すみません、こちらではちょっと分かりませんでした。が、調査した時に別の問題を見つけたので更新をかけました。
エラーメッセージを見るに「x」という文字に関連するとは思うのですが、サンプルプロジェクトでは「x」は使ってない……筈なので。
畑作業動作も想定通り動いているので、そちらでどこか追記したり変更したりしていませんか?
現時点で考えられるのは以下ですが、思い当たりますかね。
  • コメントアウトのし忘れ
 

えびふらい

ユーザー
いつもお世話になっております、質問とご報告と謝罪のため今回の書き込みとなります。

【質問について】
時間の流れをもうすこしゆっくりに(1未満の数値で)したい場合、剰余を用いるのでしょうか…?AIにスクリプトについて尋ねたところ
if ($gameVariables.value(45) % 120 === 0) { $gameVariables.setValue(46, $gameVariables.value(46) + 1); }と出てきました。AIの解説はもっともらしいのですが、変数のスクリプト欄からはみ出してしまって案の定エラーでした…。
例えば0.5秒で1加算する仕組みにしたい場合は、どのような処理が必要になるのでしょう?少数は定数で扱えないようなので1秒で0.5増加=2秒で1増加になる…とは思うのですが…。
また、スクリプトや剰余をねじ込んで変数を弄り少数加算にしても、頂いたプログラムに影響はないものなのでしょうか?

【ご報告と謝罪】
大変申し訳ございませんでした!新たなサンプルプロジェクトでは全く問題なく動作しております、ありがとうございます!私が何か余計なことをしての"Cannot read property 'x' of undefined"のエラーであることは明白です…!本当に申し訳ございません!
自分でも'x'なんて打ち込んだ記憶がなく…おそらくスクリプトをコピーして眺めてみたり、メモ帳に張り付けてスクリプトの勉強に使わせて頂いたりしているうちに操作ミスか何かをやらかしたのだと思います。

まだ何をやらかしたのかまでは整理できていないのですが、取り急ぎご報告と謝罪をと思いまして失礼いたします!!
 
最後に編集:
時間の流れの調整は「ウェイト」を調整するのがいいと思います。
変数加算は1にして、ウェイトフレーム数を増やすのが本番用には向いてるかと。
サンプルプロジェクトのはあくまでテスト用なので、爆速にしています。
※変数を変更した場合は、ベッドの処理の方もお忘れなく
※ウェイト60フレーム=1秒

追記:
時間経過を遅く(本番用)でテストしてなかった事を思い出しました……。
ベッドで寝た際の処理が現行では不十分だった為、プロジェクトの更新をしています。
 
最後に編集:
トップ