[XP] Dynamic Gardening

Started by ForeverZer0, April 14, 2010, 05:44:04 pm

Previous topic - Next topic

KK20

Just a few conditional statement checks in a couple areas in the script as well as configuration for levels and seed level requirements. How does the exp scale? Example: level 1 to 2 is 50 EXP, 2 to 3 is 150 EXP, etc.

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Twb6543

Been looking at my old code  :facepalm:,
Anyway here's a fix for pretty much all the bugs mentioned whilst I was gone.

- Single Seeds Patch for Dynamic Gardening by ForeverZer0 v3.3 -

Change Log:
- Rebuilt on Zer0's v3
- Fixed just about every bug I could find or was mentioned in the last 2.5 years
- Cleaner Source (Sort Of, everything is kind of logical now)

DropBox Link:
- Download the txt file via Dropbox here

If used:
You must give credit to ForeverZer0 for the bulk of the code.




To add Level Requirements and such would be possible, just add a couple of checks in WindowSeed::refresh to remove any seeds that require a higher level. Farming experience could be added via Scene_Garden::update_confirm by just adding a couple of lines at :
ln601: # Gain item, play the harvest SE, then return to the map.

If requested I could probably add a small API wrapper for both places, but it shouldn't really be needed.
If you put a million monkeys at a million keyboards, one of them will eventually write a Java program.
The rest of them will write Perl programs.

AliveDrive

Wow, I've been reading through this thread and this script looks awesome!

It doesn't surprise me that someone else has thought about a Harvest Moon game.

I'll definitely try it out.
Quote from: Blizzard on September 09, 2011, 02:26:33 am
The permanent solution for your problem would be to stop hanging out with stupid people.

KK20

Oh yeah, I completely forgot about updating this script. xP
Thanks for your fix (haven't checked it yet) and welcome back :D

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

AliveDrive

So, how does the single seed method work? How does the double seed method work? I read the post but I'm still a little unclear.

Is it like a genetic hybrid for the multiple seeds?

I assume the single seed works similar to Harvest Moon? (Plant one get one).
Quote from: Blizzard on September 09, 2011, 02:26:33 am
The permanent solution for your problem would be to stop hanging out with stupid people.

Twb6543

January 20, 2014, 12:41:23 pm #65 Last Edit: January 20, 2014, 12:44:11 pm by Twb6543
I actually posted the wrong script  :^_^':, Dropbox should contain the right version now.
I had actually added the functions for the Single Seed produce and Growth as I was coding but removed them for testing and posted the testing script. :shy:

As to Produce return, The script currently just selects a random Item from the array for that combination, just only include 1 id to make sure its a certain type, and Yes currently it only provides 1 of the return Produce, I'll probably add a config for that when I get the chance.

The script should make more sense now that the produce and Growth functions are re-added, however here's a partial example of a set-up. I can probably do a more in depth at some point if you need one.


module Garden
 
 #=====
 # Database has 5 Seeds (ids 21 to 25) and 9 Produces (ids 9 to 17)
 #=====

 SEED_IDS = [21, 22, 23, 24] # The Seeds that can be planted with another seed
 # IDs of the items in the database that are seeds. Add them into the array in
 # the order of value/rarity in your game
 #* CAN BE LEFT BLANK (e.g. = []) TO DISABLE DOUBLE SEEDS
 
 SINGLE_IDS = [21, 25]
 #* IDs of the items in the database that can be planted by themselves
 #* The IDs do not have to be in the SEED_ID Array!
 #* CAN BE LEFT BLANK (e.g. = []) TO DISABLE SINGLE SEEDS
 
 def self.growth_rate(seed)
   return case seed
   #* when ITEM_ID then SECONDS
   when 21 then 10
   when 22 then 12
   when 23 then 15
   when 24 then 20
   else
     10 #* Default Return Value : Set this just in case of Bugs
   end
 end

 def self.growth_rate_Single(seed)
   return case seed
   # when ITEM_ID then SECONDS
   when 21 then 10
   when 25 then 12
   else
     10 #* Default Return Value : Set this just in case of Bugs
   end
 end
 end

 # For Seed at position 1 the index is 0
 # For Seed at position 2 the index is 1
 def self.produce(seed)
   return case seed
   # when Combined Array Index then Array of Produce Item Ids
   when 0 then [9, 10]   # Result of 21,21
   when 1 then [10, 11] # Result of 22,21
   when 2 then [12, 13] # Result of 23,21 or 22,22
   when 3 then [13, 14, 15] # Result of 24,21 or 23,22
   when 4 then [14, 15] # Result of 24,22 or 23,23
   when 5 then [15, 16] # Result of 24,23
   when 6 then [17] # Result of 24,24
   else
     [9,10] #* Default Return Values : Set this just in case of Bugs
   end
 end
 
 # For Seed at position 1 the index is 0
 # For Seed at position 2 the index is 1
 # ... etc ...
 def self.produceSingle(seed)
   return case seed
   # when Index then ArrayOfProduce
   when 0 then [9,10] # Result of 21
   when 1 then [10,11] # Result of 25
   else
     [9,10] #* Default Return Values : Set this just in case of Bugs
   end
 end

If you put a million monkeys at a million keyboards, one of them will eventually write a Java program.
The rest of them will write Perl programs.

AliveDrive

Oh so it's based on rarity?

Is this a similar manner to say the method for breeding rare chocobos?



Not sure why I thought of this example but could you use this to "discover" new breeds of plant/seed?
Quote from: Blizzard on September 09, 2011, 02:26:33 am
The permanent solution for your problem would be to stop hanging out with stupid people.

ForeverZer0

January 20, 2014, 02:45:07 pm #67 Last Edit: January 22, 2014, 06:31:09 pm by ForeverZer0
The whole 2 seed method, and inspiration for the script, was based on Legend of Mana for the PlayStation, not so much Harvest Moon, which I have never played.  In LoM, you plant two seeds, which can have a number of different results, each with different odds.


EDIT:
I was thinking a small configuration program might be helpful for this script.  I might work on something like that when I get some free time.

EDIT 2:
Actually, I am just going to rewrite this script before I do that. I see room for improvement, and it has gotten quite messy with the addition of all the single seed edits. I am already almost done, and it seems much better. Now there is just an additional setting that determines how many seeds are required for a plant, so you can set it to '1' for a single seed variation, or however many you wish for a combo variation.

It will also make the config program much easier to make...
I am done scripting for RMXP. I will likely not offer support for even my own scripts anymore, but feel free to ask on the forum, there are plenty of other talented scripters that can help you.

Ruffsta

December 11, 2017, 11:05:39 am #68 Last Edit: December 11, 2017, 01:19:47 pm by Ruffsta
i would like to use both scripts in my game, however.. i see 1 issue right off the bat..

when creating the event.. both are to commented Garden Event... personally i think they should have been commented differently so both would work without issue.. the reason i want to use both in the same game is because there may be a time i want to use 2 seeds to say make a crossplant and other times i just want to plant 1 seed...

any help on this?
I have TONS of script ideas.. If yer a scriptor just ask me and i will help - i do NOT code scripts but if yer gonna code one of mine i will help with any questions to see it through as to how it's supposed to act/do.

KK20

Looking at Twb6543's edit, it looks like you can choose to plant one or two seeds at a time. It's not ONLY one seed. So just use his script instead.

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Ruffsta

if that's the case.. that would be AWESOME!!!!! i shall try.. wish there was a demo like the original from forever0.
I have TONS of script ideas.. If yer a scriptor just ask me and i will help - i do NOT code scripts but if yer gonna code one of mine i will help with any questions to see it through as to how it's supposed to act/do.

Ruffsta

nope, i replaced his code in forever0's demo.. still asks for 2 seeds.. :/

i see alot of scripts on here but not a lot of demos or screenshots.. really kinda disappointing.. anybody have a demo they can make real quick with Twb6543's edit? would really be helpful
I have TONS of script ideas.. If yer a scriptor just ask me and i will help - i do NOT code scripts but if yer gonna code one of mine i will help with any questions to see it through as to how it's supposed to act/do.

KK20

December 11, 2017, 04:53:48 pm #72 Last Edit: December 11, 2017, 05:03:28 pm by KK20
Send F0 a PM to re-upload the demo.

BTW, just checked, and yes, you can choose to plant one seed. You need to configure it.

  SINGLE_IDS = []
  # IDS of the items in the database that are seeds that are grown singularly.
  # These can be any Id's (They used to have to be different to the SEED_IDS)
  # Any reference to SEED_ID in the Configuration also refers to this


But the seed selection process is a bit broken (i.e. windows displaying wrong text). I'll take a look at it later.

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Ruffsta

ok, i still don't know what to do to make it 1 seed when i want to have 1 seed and what to do when i want to have 2 seeds..
I have TONS of script ideas.. If yer a scriptor just ask me and i will help - i do NOT code scripts but if yer gonna code one of mine i will help with any questions to see it through as to how it's supposed to act/do.

KK20

You fill the array I mentioned in my last post with item ID values. Put a 1 into SINGLE_IDS and you're telling the game "item ID 1 can be used alone".

Please read through the configuration and instructions thoroughly.

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

Ruffsta

i did put a 1 in there.. still asked me to plant 2 seeds..:/


again, i think the script needs to be commented... just my opinion.
I have TONS of script ideas.. If yer a scriptor just ask me and i will help - i do NOT code scripts but if yer gonna code one of mine i will help with any questions to see it through as to how it's supposed to act/do.

ThallionDarkshine

At the request of Ruffsta, I modified the script to allow the player to choose between planting 1 or 2 seeds when planting seeds. In addition, I fixed a minor bug with the help window displaying the incorrect content.

Single/Double Planting Script
Spoiler: ShowHide

#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
# Dynamic Gardening
# Authors: ForeverZer0, Twb6543, ThallionDarkshine
# Date: 7.17.2011
# Version: v.3.3
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
#                            VERSION HISTORY
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
#  v.1.1  (4.15.2010)
#   - Improved coding
#   - No longer uses game variables, events use self-switches instead
#   - Added ability to create different graphics for every plant, without
#     having to use more event pages
#   - Much less tedious setting up multiple events and changing the every
#     condition variable.
#  v.2.0  (10.10.2010)
#   - Total re-write. Code has been vastly improved and is much more efficient.
#   - Event setup has been simplified. Now requires only a single comment, and
#     does not require multiple pages.
#   - Added configurability for the number of stages each item requires.
#   - The timers no longer use Game_System to constantly update, but simply
#     compare themselves with the Graphics.frame_count when the event exists
#     on the current map, which also allows the plants to grow during scenes
#     other than Scene_Map and Scene_Battle.
#   - Got rid of Scene_Harvest. Scene_Garden now handles both aspects, and has
#     been improved.
#   - Added item icons to the help window display.
# v.3.0  (5.13.2011)
#   - Restructured code completely
#   - Increased compatibility and performance
#   - Fixed bug with final graphic not behaving correctly
# v.3.1  (7.14.2011) by Twb6543
#   - Changed Script to allow for Single Seeds
#   - Added the ability to set default values
# v.3.2 (7.17.2011) by Twb6543
#   - Changed Script to fix bugs in the last release
#   - Fixed Bugs from version 3.0 (May not be completely fixed but I(Twb6543)
#     believe that it is mostly fixed)
# v.3.3 (12.19.2017) by ThallionDarkshine
#   - Modified script to allow players to choose between single and double seed
#     when planting seeds.
#   - Fixed a bug where help window would not update correctly.
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
#
# Explanation:
#
#   This system allows the player to plant seeds, which will eventually grow
#   into plants that can be harvested for items. The system is very similar in
#   nature to that found in Legend of Mana. Seed's can be combined in different
#   ways, which will effect the total growth duration, the number of stages the
#   plant passes through, the graphics used, and of course the final result.
#
# Features:
#
#  - Totally configurable growth rates, results, and graphics for every plant.
#  - Can use arrays of items for each result, so the final item is not
#    neccessarily the same every time.
#  - Each plant timer is independent, and its progress is saved with the game.
#  - Easy setup. Need only a single comment in one of the event's pages.
#
# Instructions:
#   
#  - Place script below Debug and above Main
#  - Configure the options below (instructions are with each setting)
#  - Create an event, setting the graphic to whatever you want. This will be the
#    graphics used when nothing is growing on the plant.
#  - At the very top event's page, place a comment that reads "Garden Event",
#    omitting the quotation marks.
#  - As long as the page's conditions are met, this event can be clicked on to
#    initiate the Garden scene, and can grow plants.
#  - Note that plants can be harvested early, but they will yield nothing until
#    they are ripe.
#
# Note:
#
#  - Any method modified or added in 3.1 or 3.2 has an headed attached to it.
#  - The header will be "Double and Single Seed" or
#    "Double and Single Seed Method" for modified Methods.
#  - The header will be "Double and Single Seed New Method" for new Methods.
#  - Headers may also have extra information.
#  - The Code for Scene_Garden and Window_Seed can definitely be optimised
#    but as I(Twb6543) finally squashed the bug preventing release of v 3.2
#    I do not want to change anything with out a bit of forethought.
#
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#  BEGIN CONFIGURATION
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
#===============================================================================
# ** Garden
#===============================================================================

module Garden
 
  SEED_IDS = [1, 2, 3, 4, 5, 6, 7, 8]
  # IDs of the items in the database that are seeds. Add them into the array in
  # the order of value/rarity in your game this currently includes any single
  # seeds
 
  HARVEST_SE = '056-Right02'
  # This is the SE that will be played when the player harvests the plant.
 
  SEED_DISPLAY = true
  # If true, all seeds will be displayed in the seed window, including those
  # that the player does not have, though they will be disabled. If false, only
  # seeds that that the player currently has will be displayed.
 
  # Define the growth rates here. (the average of both seeds will be used)
  def self.growth_rate(seed)
    return case seed
    # when SEED_ID then SECONDS
    when 1 then 10
    when 2 then 12
    when 3 then 15
    when 4 then 20
    when 5 then 23
    when 6 then 25
    when 7 then 30
    when 8 then 35
    else
      10 # Default Value to return if no speed is specified
    end
  end
 
#-------------------------------------------------------------------------------
# Define the number of stages that each item uses. The stages will still cycle
# in the same order, but only use up to the defined number of them before going
# to the final graphic. This will not effect the duration that the seed takes to
# grow, only how many times the graphic changes.
#
# You do not have to define anything that uses a three stage configuration.
#-------------------------------------------------------------------------------
  def self.number_stages(result)
    case result
    when 8..16
      return 4
    when 17..24
      return 5
    else
      return 3
    end
  end
 
#-------------------------------------------------------------------------------
# Define the final result of the seeds. A random item from the array will be
# given as the final result.

# Each seed is given a value from 0 to the total number of seeds in the SEED_IDS
# array, and both values are added together to determine which 'produce' array
# will be used for the final result. This is why it is important that you have
# the SEED_IDS array in order of value/rarity. You can find the total number of
# cases you will need by subtracting 1 from the total number of different seeds
# in SEED_IDS, and multiplying that number by 2.
#
#   EX. Player uses one each of the first and last seed in the SEED_IDS array,
#       and there are 8 total seeds in the array...
#
#       FIRST_SEED = 2
#       LAST_SEED = 5         2 + 5 = RESULT
#
# By placing multiple copies of the same value in an array, you can increase
# the odds of receiving that item over another in the same array.
#-------------------------------------------------------------------------------

  #-------------------------------#
  #   - Double and Single Seed -  #
  #-------------------------------#
  #  Now with Else/Defualt Clause #
  #-------------------------------#
  def self.produce(seed)
    return case seed
    when 0 then [9, 10]      # Only if both seed are the lowest seeds
    when 1 then [10, 11]
    when 2 then [12, 13]
    when 3 then [13, 14]
    when 4 then [14, 15]
    when 5 then [15, 16]
    when 6 then [16, 17]      # Every combination in between
    when 7 then [17, 18]
    when 8 then [18, 19]
    when 9 then [19, 20]
    when 10 then [20, 21]
    when 11 then [21, 22]
    when 12 then [22, 23]
    when 13 then [23, 24]
    when 14 then [24]         # Only if both seeds are the highest seeds
    else
      [9] # Default Value to return, Brackets are important,
          # May contain more than one value e.g [9,10] or [9,10,11,12,13]
    end
  end
 
  #------------------------------------------#
  #   - Double and Single Seed New Method -  #
  #------------------------------------------#
  #   Table set up much in the same way as   #
  #  .produce, however items come from seed  #
  #        _ID_  not position in array       #
  #------------------------------------------#
  #  Also the ids are taken from SINGLE_IDS  #
  #                   Array                  #
  #------------------------------------------#
  def self.produce_single(seed)
    return case seed
    when 25 then [9, 10]      # Only if seed is item with Id 25
    else
      [9] # Default Value to return, Brackets are important,
          # May contain more than one value e.g [9,10] or [9,10,11,12,13]
    end
  end
 
#-------------------------------------------------------------------------------
#  Define graphics for the final results, and each stage. Follow the below
#  template to set it up.
#
#   when ITEM_ID/STAGE then ['FILENAME', X, Y]
#
#   ITEM_ID = The ID number of the item in your database
#   STAGE = The stage during which to display the graphic
#
#   FILENAME = The name of the character file the needed graphic is on
#   X = The x-coordinate of the correct picture on the charset (1 - 4)
#   Y = The y-coordinate of the correct picture on the charset (1 - 4)
#
#           ← X →             Ex.   If the needed graphic was in the bottom
#         1  2  3  4                left corner:   X = 1    Y = 4
#       ┌──┬──┬──┬──┐                   
#     1 │  │  │  │  │
#       ├──┼──┼──┼──┤
#  ↑  2 │  │  │  │  │
#  Y    ├──┼──┼──┼──┤
#  ↓  3 │  │  │  │  │
#       ├──┼──┼──┼──┤
#     4 │  │  │  │  │
#       └──┴──┴──┴──┘
#-------------------------------------------------------------------------------

  def self.stage_graphics(stage)
    return case stage
    when 0 then ['Plants1', 1, 1]
    when 1 then ['Plants1', 2, 3]
    when 2 then ['Plants1', 2, 1]
    when 3 then ['Plants1', 4, 2]
    when 4 then ['Plants1', 2, 4]
    end
  end

  def self.final_graphic(item)
    return case item   
    when 9 then  ['Garden Plants', 1, 1]
    when 10 then ['Garden Plants', 2, 4]
    when 11 then ['Garden Plants', 3, 4]
    when 12 then ['Garden Plants', 4, 4]
    when 13 then ['Garden Plants', 1, 4]
    when 14 then ['Garden Plants', 2, 2]
    when 15 then ['Garden Plants', 3, 2]   
    when 16 then ['Garden Plants', 4, 2]
    when 17 then ['Garden Plants', 1, 2]
    when 18 then ['Garden Plants', 2, 3]
    when 19 then ['Garden Plants', 3, 3]
    when 20 then ['Garden Plants', 4, 3]
    when 21 then ['Garden Plants', 1, 3]
    when 22 then ['Garden Plants', 2, 1]
    when 23 then ['Garden Plants', 3, 1]
    when 24 then ['Garden Plants', 4, 1]
    end
  end
 
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#  END CONFIGURATION
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

  #--------------------------------------#
  #   - Double and Single Seed Method -  #
  #--------------------------------------#
  #              ! Warning !             #
  #                                      #
  # This rearranges the order of the def #
  #  variables to allow for Single Seed  #
  #--------------------------------------#
  def self.plant_seeds(event_id, seed1, seed2=nil)
    # Create a new instance of a Garden::Plant
    if seed2 != nil
      # Double Seed Method
      plant = self::Plant.new(event_id, seed1, seed2)
      if $game_system.garden[$game_map.map_id] == nil
        $game_system.garden[$game_map.map_id] = [plant]
      else
        $game_system.garden[$game_map.map_id].push(plant)
      end
    else
      #Single Seed Method
      plant = self::Plant.new(event_id, seed1)
      if $game_system.garden[$game_map.map_id] == nil
        $game_system.garden[$game_map.map_id] = [plant]
      else
        $game_system.garden[$game_map.map_id].push(plant)
      end
    end
     
  end
 
  def self.harvest(id)
    # Find the appropriate plant.
    plant = $game_system.garden[$game_map.map_id].find {|plant| plant.id == id }
    return nil if plant == nil
    # Return the result, and delete plant data from array.
    result = plant.produce
    plant.restore_event
    $game_system.garden[$game_map.map_id] -= [plant]
    return result
  end

#===============================================================================
# ** Garden::Plant
#===============================================================================

  class Plant
   
    attr_reader :id, :ripe
   
    #--------------------------------------#
    #   - Double and Single Seed Method -  #
    #--------------------------------------#
    def initialize(id, seed1, seed2=nil)
      if seed2 != nil
        # Initialize needed instance variables.
        @id, @seed1, @seed2, @single = id, seed1, seed2, false
      else
        # Initialize needed instance variables.
        @id, @seed1, @single = id, seed1, true
      end
      @ripe, @stage = false, -1
      # Run setup method, using data in Garden config for this plant's seeds
       setup
    end
   
    #--------------------------------------#
    #   - Double and Single Seed Method -  #
    #--------------------------------------#
    #   Similar to old method but adds a   #
    #       check for the single flag      #
    #--------------------------------------#
    def setup
      # Store original graphic, direction, and pattern in variable.
      event = $game_map.events[@id]
      @original_event = [event.character_name, event.direction, event.pattern]
      # Calculate the total duration of the seed combination.
      if @single == true # If single then only the duration of that seed
        @duration = Garden.growth_rate(@seed1)
      else # IF double then duration of both seeds
        @duration = (Garden.growth_rate(@seed1) + Garden.growth_rate(@seed2))
      end
      # Find the produce that this combination will grow into
      if @single == true
        @produce = Garden.produce_single(@seed1)
        # Get a random produce from case Seed1 id
        @produce = @produce[rand(@produce.size)]
      else
        comb = Garden::SEED_IDS.index(@seed1) + Garden::SEED_IDS.index(@seed2)
        @produce = Garden.produce(comb)
        @produce = @produce[rand(@produce.size)]
      end
      # Get the number of stages this plant will use, then setup counts for it
      number, count = Garden.number_stages(@produce), 0
      dur = (@duration / number.to_f).to_i
      @stages = (0...number).to_a
      @stages.collect! {|i| $game_system.garden_counter + (i * dur) }
      # Refresh the plant to apply changes
      refresh
    end
   
    def refresh
      unless @ripe
        # Initialize local variable that will determine if graphic needs redrawn.
        previous = @stage
        count = @stages.find_all {|rate| $game_system.garden_counter <= rate }
        @stage = (@stages.size - count.size)
        @ripe = (@stage >= @stages.size - 1)
        # Redraw bitmap if needed.
        change_graphic(@ripe) if previous != @stage
      end
    end
   
    def change_graphic(final)
      # Set local variable to this plant's event
      event = $game_map.events[@id]
      data = final ? Garden.final_graphic(@produce) :
        Garden.stage_graphics(@stage)
      # Apply graphical change by simply altering event's stance and source
      event.character_name = data[0] # If you get an error on this line it means
      # that the final or stage graphics have not been set up properly or that
      # there is missing data in the config for a certain (pair of) item(s).
      event.direction = (2 * data[2])
      event.pattern = (data[1] - 1)
      event.refresh
    end
   
    def restore_event
      # Restore event to original state before planting.
      event = $game_map.events[@id]
      event.character_name = @original_event[0]
      event.direction = @original_event[1]
      event.pattern = @original_event[2]
    end
   
    def produce
      # Return nil if not yet ripe, else return an item ID.
      return (@ripe ? @produce : nil)
    end
  end
end

#===============================================================================
# ** Game_System
#===============================================================================

class Game_System
 
  attr_accessor :garden, :garden_counter
 
  alias zer0_garden_init initialize
  def initialize
    # Initialize variables used for the garden system.
    @garden_counter = 0
    @garden = {}
    zer0_garden_init
  end
 
  alias zer0_garden_upd update
  def update
    # Increase garden counter and check if update is needed every second.
    if (Graphics.frame_count % 40) == 0
      @garden_counter += 1
      # Check if current map has any plants on it. If so, refresh them.
      if @garden[$game_map.map_id] != nil && !@garden[$game_map.map_id].empty?
        @garden[$game_map.map_id].each {|plant| plant.refresh }
      end
    end
    zer0_garden_upd
  end
end

#===============================================================================
# ** Game_Event
#===============================================================================

class Game_Event
 
  attr_accessor :character_name, :direction, :pattern
 
  alias zer0_garden_event_refresh refresh
  def refresh
    # Normal refresh method.
    zer0_garden_event_refresh
    # Set flag for this event being a garden event.
    @garden_event = (@page != nil && @page.list[0].code == 108 &&
      @page.list[0].parameters[0] == 'Garden Event')
  end
 
  alias zer0_garden_upd update
  def update
    # Skip update method foe this event if it is a plant.
    @garden_event ? return : zer0_garden_upd
  end
 
  alias zer0_garden_event_start start
  def start
    # Redefine the 'start' method if Garden Event flag is present.
    if @garden_event
      plants, harvest = $game_system.garden[$game_map.map_id], false
      # Check if plant exists, and if so check if it is ripe.
      pick = plants != nil ? (plants.find {|obj| obj.id == @id }) != nil : false
      $scene = Scene_Garden.new(@id, pick)
    else
      zer0_garden_event_start
    end
  end
end
 
#===============================================================================
# ** Game_Map
#===============================================================================

class Game_Map
 
  alias zer0_garden_setup setup
  def setup(map_id)
    zer0_garden_setup(map_id)
    # Refresh each plant when map is set up
    if $game_system.garden[@map_id] != nil
      $game_system.garden[@map_id].each {|obj| obj.change_graphic(obj.ripe) }
    end
  end
end

#===============================================================================
# * Window_Seed
#===============================================================================

class Window_Seed < Window_Selectable
 
  def initialize
    super(160, 304, 320, 160)
    self.index = 0
    refresh
  end
 
  def refresh
    # Clear the bitmap.
    self.contents = self.contents.dispose if self.contents != nil
    # Determine what seeds to display.
    @seeds = Garden::SEED_IDS.collect {|id| $data_items[id] }
    unless Garden::SEED_DISPLAY
      @seeds.reject! {|seed| $game_party.item_number(seed.id) < 1 }
    end
    @item_max = @seeds.size
    # Draw the items on the bitmap.
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, @item_max * 32)
      @seeds.each_index {|i|
        item = @seeds[i]
        number = $game_party.item_number(item.id)
        self.contents.font.color = number > 0 ? normal_color : disabled_color
        opacity = number > 0 ? 255 : 128
        # Find icon bitmap and set it to window, and draw the text.
        bitmap = RPG::Cache.icon(item.icon_name)
        self.contents.blt(4, i*32+4, bitmap, Rect.new(0, 0, 24, 24), opacity)
        self.contents.draw_text(32, i*32, 288, 32, item.name)
        self.contents.draw_text(-32, i*32, 288, 32, ':', 2)
        self.contents.draw_text(-4, i*32, 288, 32, number.to_s, 2)
      }
    end
  end
 
  def seed
    # Returns currently highlighted seed item.
    return @seeds[self.index]
  end
end

#===============================================================================
# * Scene_Garden
#===============================================================================

class Scene_Garden
 
  def initialize(id, harvest)
    @event_id, @harvest = id, harvest
    # Play SE to give impression that scene never changed.
    $game_system.se_play($data_system.decision_se)
    $game_player.straighten
    garden = $game_system.garden[$game_map.map_id]
    if garden != nil
      @plant = garden.find {|plant| plant.id == id }
    end
  end
 
  #--------------------------------------#
  #   - Double and Single Seed Method -  #
  #--------------------------------------#
  def main
    # Create map sprite and required windows.
    @map, @help_window = Spriteset_Map.new, Window_Help.new
    # Create Confirmation window.
    @confirm_window = Window_Command.new(128, ['Yes', 'No'])
    @confirm_window.x, @confirm_window.y = 496, 336
    # Initialize sprites array. Used to handle all the sprites together.
    @sprites = [@map, @help_window, @confirm_window]
    # Create seed window if plant is not being harvested.
    unless @harvest
      @seed_window = Window_Seed.new
      @sprites.push(@seed_window)
      @seed_window.active = @seed_window.visible = false
      # Create Seed Count window
      @seed_count_window = Window_Command.new(192, ['Yes, plant 1 seed', 'Yes, plant 2 seeds', "No"])
      @seed_count_window.x, @seed_count_window.y = 640 - 192 - 16, 480 - 3 * 24 - 96
      @sprites.push(@seed_count_window)
      @confirm_window.visible = @confirm_window.active = false
      @help_window.set_text('Plant seeds here?')
    else
      @data = $game_system.garden[$game_map.map_id][@event_id]
      if @plant != nil && @plant.ripe
        text = 'This plant is ripe. Would you like to harvest it?'
      else
        text = 'Nothing is growing yet on this plant. Harvest it anyway?'
      end
      @help_window.set_text(text)
    end
    # Transition instantly then start main loop.
    Graphics.transition(0)
    loop { Graphics.update; Input.update; update; break if $scene != self }
    # Dispose of all the sprites.
    @sprites.each {|sprite| sprite.dispose }
    # Have map refresh to update any changes made.
    $game_map.need_refresh = true
  end
 
  def update
    @sprites.each {|sprite| sprite.update }
    # Branch update method depending on what window is active.
    if @confirm_window.active
      update_confirm
    elsif @seed_count_window != nil && @seed_count_window.active
      update_seed_count_select
    elsif @seed_window != nil && @seed_window.active
      update_seed_select
    end
  end
 
  #--------------------------------------#
  #   - Double and Single Seed Method -  #
  #--------------------------------------#
  def update_confirm
    if Input.trigger?(Input::B)
      # Branch by what action is being canceled.
      if @harvest
        back_to_map
      else
        cancel_seed_selection
      end
    elsif Input.trigger?(Input::C)
      # Branch by what action is being confirmed.
      if @harvest
        if @confirm_window.index == 0
          item_id = Garden.harvest(@event_id)
          if item_id != nil
            @confirm_window.active = @confirm_window.visible = false
            # Gain item, play the harvest SE, then return to the map.
            $game_party.gain_item(item_id, 1)
            $game_system.se_play(RPG::AudioFile.new(Garden::HARVEST_SE, 80, 100))
            show_results($data_items[item_id])
            $scene = Scene_Map.new
          else
            back_to_map
          end
        else
          back_to_map
        end
      else
        # If asking if player would like to plant seeds at this location.
        if @seed1 == nil
          back_to_map
          return
        else # If confirming seed selection.
          if @confirm_window.index == 0
            # Plant seeds and return to map.
            @single = @seed_count_window.index == 0
            # This is how Twb6543 reloaded the single command (in case of index
            # movement)
            if @single == true && @seed2 == nil
              # If Single only
              Garden.plant_seeds(@event_id, @seed1.id)
            else
              # If Double or Includes Double Seed
              Garden.plant_seeds(@event_id, @seed1.id, @seed2.id)
            end
            $scene = Scene_Map.new
          else # If canceling seed selection
            cancel_seed_selection
            return
          end
        end
        $game_system.se_play($data_system.decision_se)
      end
    end
  end
 
  def update_seed_count_select
    if Input.trigger?(Input::B)
      back_to_map
    elsif Input.trigger?(Input::C)
      case @seed_count_window.index
      when 0
        @seed_window.active = @seed_window.visible = true
        @seed_count_window.active = @seed_count_window.visible = false
        @help_window.set_text('Which seed would you like to plant?')
      when 1
        @seed_window.active = @seed_window.visible = true
        @seed_count_window.active = @seed_count_window.visible = false
        @help_window.set_text('Which seeds would you like to plant?')
      when 2
        back_to_map
        return
      end
      $game_system.se_play($data_system.decision_se)
    end
  end
 
  def show_results(result)
    @help_window.contents.clear
    # Display the message in the help window.
    @help_window.draw_item_name(result, 0, 0)
    cw = @help_window.contents.text_size(result.name).width + 32
    @help_window.contents.draw_text(cw, 0, 608, 32, ' received!')
    # Call Input.update to the clear key press.
    Input.update
    # Loop until it is pressed again.
    until Input.trigger?(Input::C)
      Graphics.update; Input.update; update
    end
  end
 
  #------------------------------------------#
  #   - Double and Single Seed New Method -  #
  #------------------------------------------#
  def cancel_seed_selection
    # Play cancel SE, reset seeds, and activate/deactivate windows.
    $game_system.se_play($data_system.cancel_se)
    $game_party.gain_item(@seed1.id, 1) unless @seed1.nil? # Added to re add the seeds
    $game_party.gain_item(@seed2.id, 1) unless @seed2.nil? # Added to re add the seeds
    @seed_window.active = @seed_window.visible = true
    @seed_window.refresh
    @confirm_window.active = @confirm_window.visible = false
    @help_window.set_text('Which seeds would you like to plant?')
    @seed1 = @seed2 = nil
  end
 
  def back_to_map
    # Play cancel SE and return to map.
    $game_system.se_play($data_system.cancel_se)
    $scene = Scene_Map.new
  end
 
  #--------------------------------------#
  #   - Double and Single Seed Method -  #
  #--------------------------------------#
  def update_seed_select
    if Input.trigger?(Input::B)
      # If first seed is selected, go back to re-select, else return to map.
      if @seed1 != nil
        cancel_seed_selection
      else
        back_to_map
      end
    elsif Input.trigger?(Input::C)
      # Play Cancle SE if displayed and party has none.
      if $game_party.item_number(@seed_window.seed.id) < 1
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      @single = @seed_count_window.index == 0
      # Can use @idsingle = @seed_window.seed.id
      if @single == true && @seed1 == nil
        # Set first seed then continue
        @seed1 = @seed_window.seed
        $game_party.lose_item(@seed1.id, 1)
        @seed_window.active = false
        @confirm_window.active = @confirm_window.visible = true
      elsif @single == true && @seed1 != nil
        # Set second seed then continue
        @seed2, @seed_window.active = @seed_window.seed, false
        $game_party.lose_item(@seed2.id, 1)
        @confirm_window.active = @confirm_window.visible = true
      else # 2 seeds
        # Set first seed if not defined, else set the second seed and continue.
        if @seed1 == nil
          @seed1 = @seed_window.seed
          $game_party.lose_item(@seed1.id, 1)
        else
          @seed2, @seed_window.active = @seed_window.seed, false
          $game_party.lose_item(@seed2.id, 1)
          @confirm_window.active = @confirm_window.visible = true
        end
      end
      # Refresh seed window to show changes in inventory.
      set_help
      @seed_window.refresh
    end
  end
 
  #--------------------------------------#
  #   - Double and Single Seed Method -  #
  #--------------------------------------#
  def set_help
    # Clear help window.
    @help_window.contents.clear
    # Draw items
    @single = @seed_count_window.index == 0
    if @single == true && @seed2 == nil
      text = 'Plant this seed?'
    else
      text = @seed2 != nil ? 'Plant these two seeds?' : 'Select second seed...'
    end
    @help_window.set_text(text)
    @help_window.draw_item_name(@seed1, 224, 0)
    if @seed2 != nil
      cw = @help_window.contents.text_size(@seed1.name).width + 320
      @help_window.draw_item_name(@seed2, cw, 0)
    end
  end
end


Original script w/bugfix
Spoiler: ShowHide

#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
# Dynamic Gardening
# Author: ForeverZer0, ThallionDarkshine
# Date: 5.13.2011
# Version: v.3.01
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
#                            VERSION HISTORY
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
#  v.1.1  (4.15.2010)
#   - Improved coding
#   - No longer uses game variables, events use self-switches instead
#   - Added ability to create different graphics for every plant, without
#     having to use more event pages
#   - Much less tedious setting up multiple events and changing the every
#     condition variable.
#  v.2.0  (10.10.2010)
#   - Total re-write. Code has been vastly improved and is much more efficient.
#   - Event setup has been simplified. Now requires only a single comment, and
#     does not require multiple pages.
#   - Added configurability for the number of stages each item requires.
#   - The timers no longer use Game_System to constantly update, but simply
#     compare themselves with the Graphics.frame_count when the event exists
#     on the current map, which also allows the plants to grow during scenes
#     other than Scene_Map and Scene_Battle.
#   - Got rid of Scene_Harvest. Scene_Garden now handles both aspects, and has
#     been improved.
#   - Added item icons to the help window display.
# v.3.0  (5.13.2011)
#   - Restructured code completely
#   - Increased compatibility and performance
#   - Fixed bug with final graphic not behaving correctly
# v.3.01 (12.19.2017) by ThallionDarkshine
#   - Fixed bug with help window not updating correctly.
#:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:=:
#
# Explanation:
#
#   This system allows the player to plant seeds, which will eventually grow
#   into plants that can be harvested for items. The system is very similar in
#   nature to that found in Legend of Mana. Seed's can be combined in different
#   ways, which will effect the total growth duration, the number of stages the
#   plant passes through, the graphics used, and of course the final result.
#
# Features:
#
#  - Totally configurable growth rates, results, and graphics for every plant.
#  - Can use arrays of items for each result, so the final item is not
#    neccessarily the same every time.
#  - Each plant timer is independent, and its progress is saved with the game.
#  - Easy setup. Need only a single comment in one of the event's pages.
#
# Instructions:
#   
#  - Place script below Debug and above Main
#  - Configure the options below (instructions are with each setting)
#  - Create an event, setting the graphic to whatever you want. This will be the
#    graphics used when nothing is growing on the plant.
#  - At the very top event's page, place a comment that reads "Garden Event",
#    omitting the quotation marks.
#  - As long as the page's conditions are met, this event can be clicked on to
#    initiate the Garden scene, and can grow plants.
#  - Note that plants can be harvested early, but they will yield nothing until
#    they are ripe.
#
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#  BEGIN CONFIGURATION
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
#===============================================================================
# ** Garden
#===============================================================================

module Garden
 
  SEED_IDS = [1, 2, 3, 4, 5, 6, 7, 8]
  # IDs of the items in the database that are seeds. Add them into the array in
  # the order of value/rarity in your game
 
  HARVEST_SE = '056-Right02'
  # This is the SE that will be played when the player harvests the plant.
 
  SEED_DISPLAY = true
  # If true, all seeds will be displayed in the seed window, including those
  # that the player does not have, though they will be disabled. If false, only
  # seeds that that the player currently has will be displayed.
 
  # Define the growth rates here. (the average of both seeds will be used)
  def self.growth_rate(seed)
    return case seed
    # when SEED_ID then SECONDS
    when 1 then 10
    when 2 then 12
    when 3 then 15
    when 4 then 20
    when 5 then 23
    when 6 then 25
    when 7 then 30
    when 8 then 35
    end
  end
 
#-------------------------------------------------------------------------------
# Define the number of stages that each item uses. The stages will still cycle
# in the same order, but only use up to the defined number of them before going
# to the final graphic. This will not effect the duration that the seed takes to
# grow, only how many times the graphic changes.
#
# You do not have to define anything that uses a three stage configuration.
#-------------------------------------------------------------------------------
  def self.number_stages(result)
    case result
    when 8..16
      return 4
    when 17..24
      return 5
    else
      return 3
    end
  end
 
#-------------------------------------------------------------------------------
# Define the final result of the seeds. A random item from the array will be
# given as the final result.

# Each seed is given a value from 0 to the total number of seeds in the SEED_IDS
# array, and both values are added together to determine which 'produce' array
# will be used for the final result. This is why it is important that you have
# the SEED_IDS array in order of value/rarity. You can find the total number of
# cases you will need by subtracting 1 from the total number of different seeds
# in SEED_IDS, and multiplying that number by 2.
#
#   EX. Player uses one each of the first and last seed in the SEED_IDS array,
#       and there are 8 total seeds in the array...
#
#       FIRST_SEED = 2
#       LAST_SEED = 5         2 + 5 = RESULT
#
# By placing multiple copies of the same value in an array, you can increase
# the odds of receiving that item over another in the same array.
#-------------------------------------------------------------------------------

  def self.produce(seed)
    return case seed
    when 0 then [9, 10]      # Only if both seed are the lowest seeds
    when 1 then [10, 11]
    when 2 then [12, 13]
    when 3 then [13, 14]
    when 4 then [14, 15]
    when 5 then [15, 16]
    when 6 then [16, 17]      # Every combination in between
    when 7 then [17, 18]
    when 8 then [18, 19]
    when 9 then [19, 20]
    when 10 then [20, 21]
    when 11 then [21, 22]
    when 12 then [22, 23]
    when 13 then [23, 24]
    when 14 then [24]         # Only if both seeds are the highest seeds
    end
  end
 
#-------------------------------------------------------------------------------
#  Define graphics for the final results, and each stage. Follow the below
#  template to set it up.
#
#   when ITEM_ID/STAGE then ['FILENAME', X, Y]
#
#   ITEM_ID = The ID number of the item in your database
#   STAGE = The stage during which to display the graphic
#
#   FILENAME = The name of the character file the needed graphic is on
#   X = The x-coordinate of the correct picture on the charset (1 - 4)
#   Y = The y-coordinate of the correct picture on the charset (1 - 4)
#
#           ? X ?             Ex.   If the needed graphic was in the bottom
#         1  2  3  4                left corner:   X = 1    Y = 4
#       +-----------+                   
#     1 ¦  ¦  ¦  ¦  ¦
#       +--+--+--+--¦
#  ?  2 ¦  ¦  ¦  ¦  ¦
#  Y    +--+--+--+--¦
#  ?  3 ¦  ¦  ¦  ¦  ¦
#       +--+--+--+--¦
#     4 ¦  ¦  ¦  ¦  ¦
#       +-----------+
#-------------------------------------------------------------------------------

  def self.stage_graphics(stage)
    return case stage
    when 0 then ['Plants1', 1, 1]
    when 1 then ['Plants1', 2, 3]
    when 2 then ['Plants1', 2, 1]
    when 3 then ['Plants1', 4, 2]
    when 4 then ['Plants1', 2, 4]
    end
  end

  def self.final_graphic(item)
    return case item   
    when 9 then  ['Garden Plants', 1, 1]
    when 10 then ['Garden Plants', 2, 4]
    when 11 then ['Garden Plants', 3, 4]
    when 12 then ['Garden Plants', 4, 4]
    when 13 then ['Garden Plants', 1, 4]
    when 14 then ['Garden Plants', 2, 2]
    when 15 then ['Garden Plants', 3, 2]   
    when 16 then ['Garden Plants', 4, 2]
    when 17 then ['Garden Plants', 1, 2]
    when 18 then ['Garden Plants', 2, 3]
    when 19 then ['Garden Plants', 3, 3]
    when 20 then ['Garden Plants', 4, 3]
    when 21 then ['Garden Plants', 1, 3]
    when 22 then ['Garden Plants', 2, 1]
    when 23 then ['Garden Plants', 3, 1]
    when 24 then ['Garden Plants', 4, 1]
    end
  end
 
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#  END CONFIGURATION
#:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

  def self.plant_seeds(seed1, seed2, event_id)
    # Create a new instance of a Garden::Plant
    plant = self::Plant.new(event_id, seed1, seed2)
    if $game_system.garden[$game_map.map_id] == nil
      $game_system.garden[$game_map.map_id] = [plant]
    else
      $game_system.garden[$game_map.map_id].push(plant)
    end
  end
 
  def self.harvest(id)
    # Find the appropriate plant.
    plant = $game_system.garden[$game_map.map_id].find {|plant| plant.id == id }
    return nil if plant == nil
    # Return the result, and delete plant data from array.
    result = plant.produce
    plant.restore_event
    $game_system.garden[$game_map.map_id] -= [plant]
    return result
  end

#===============================================================================
# ** Garden::Plant
#===============================================================================

  class Plant
   
    attr_reader :id, :ripe
   
    def initialize(id, seed1, seed2)
      # Initialize needed instance variables.
      @id, @seed1, @seed2 = id, seed1, seed2
      @ripe, @stage = false, -1
      # Run setup method, using data in Garden config for this plant's seeds
      setup
    end
   
    def setup
      # Store original graphic, direction, and pattern in variable.
      event = $game_map.events[@id]
      @original_event = [event.character_name, event.direction, event.pattern]
      # Calculate the total duration of the seed combination.
      @duration = (Garden.growth_rate(@seed1) + Garden.growth_rate(@seed2))
      # Find the produce that this combination will grow into
      comb = Garden::SEED_IDS.index(@seed1) + Garden::SEED_IDS.index(@seed2)
      @produce = Garden.produce(comb)
      @produce = @produce[rand(@produce.size)]
      # Get the number of stages this plant will use, then setup counts for it
      number, count = Garden.number_stages(@produce), 0
      dur = (@duration / number.to_f).to_i
      @stages = (0...number).to_a
      @stages.collect! {|i| $game_system.garden_counter + (i * dur) }
      # Refresh the plant to apply changes
      refresh
    end
   
    def refresh
      unless @ripe
        # Initialize local variable that will determine if graphic needs redrawn.
        previous = @stage
        count = @stages.find_all {|rate| $game_system.garden_counter <= rate }
        @stage = (@stages.size - count.size)
        @ripe = (@stage >= @stages.size - 1)
        # Redraw bitmap if needed.
        change_graphic(@ripe) if previous != @stage
      end
    end
   
    def change_graphic(final)
      # Set local variable to this plant's event
      event = $game_map.events[@id]
      data = final ? Garden.final_graphic(@produce) :
        Garden.stage_graphics(@stage)
      # Apply graphical change by simply altering event's stance and source
      event.character_name = data[0]
      event.direction = (2 * data[2])
      event.pattern = (data[1] - 1)
      event.refresh
    end
   
    def restore_event
      # Restore event to original state before planting.
      event = $game_map.events[@id]
      event.character_name = @original_event[0]
      event.direction = @original_event[1]
      event.pattern = @original_event[2]
    end
   
    def produce
      # Return nil if not yet ripe, else return an item ID.
      return (@ripe ? @produce : nil)
    end
  end
end

#===============================================================================
# ** Game_System
#===============================================================================

class Game_System
 
  attr_accessor :garden, :garden_counter
 
  alias zer0_garden_init initialize
  def initialize
    # Initialize variables used for the garden system.
    @garden_counter = 0
    @garden = {}
    zer0_garden_init
  end
 
  alias zer0_garden_upd update
  def update
    # Increase garden counter and check if update is needed every second.
    if (Graphics.frame_count % 40) == 0
      @garden_counter += 1
      # Check if current map has any plants on it. If so, refresh them.
      if @garden[$game_map.map_id] != nil && !@garden[$game_map.map_id].empty?
        @garden[$game_map.map_id].each {|plant| plant.refresh }
      end
    end
    zer0_garden_upd
  end
end

#===============================================================================
# ** Game_Event
#===============================================================================

class Game_Event
 
  attr_accessor :character_name, :direction, :pattern
 
  alias zer0_garden_event_refresh refresh
  def refresh
    # Normal refresh method.
    zer0_garden_event_refresh
    # Set flag for this event being a garden event.
    @garden_event = (@page != nil && @page.list[0].code == 108 &&
      @page.list[0].parameters[0] == 'Garden Event')
  end
 
  alias zer0_garden_upd update
  def update
    # Skip update method foe this event if it is a plant.
    @garden_event ? return : zer0_garden_upd
  end
 
  alias zer0_garden_event_start start
  def start
    # Redefine the 'start' method if Garden Event flag is present.
    if @garden_event
      plants, harvest = $game_system.garden[$game_map.map_id], false
      # Check if plant exists, and if so check if it is ripe.
      pick = plants != nil ? (plants.find {|obj| obj.id == @id }) != nil : false
      $scene = Scene_Garden.new(@id, pick)
    else
      zer0_garden_event_start
    end
  end
end
 
#===============================================================================
# ** Game_Map
#===============================================================================

class Game_Map
 
  alias zer0_garden_setup setup
  def setup(map_id)
    zer0_garden_setup(map_id)
    # Refresh each plant when map is set up
    if $game_system.garden[@map_id] != nil
      $game_system.garden[@map_id].each {|obj| obj.change_graphic(obj.ripe) }
    end
  end
end

#===============================================================================
# * Window_Seed
#===============================================================================

class Window_Seed < Window_Selectable
 
  def initialize
    super(160, 304, 320, 160)
    self.index = 0
    refresh
  end
 
  def refresh
    # Clear the bitmap.
    self.contents = self.contents.dispose if self.contents != nil
    # Determine what seeds to display.
    @seeds = Garden::SEED_IDS.collect {|id| $data_items[id] }
    unless Garden::SEED_DISPLAY
      @seeds.reject! {|seed| $game_party.item_number(seed.id) < 1 }
    end
    @item_max = @seeds.size
    # Draw the items on the bitmap.
    if @item_max > 0
      self.contents = Bitmap.new(width - 32, @item_max * 32)
      @seeds.each_index {|i|
        item = @seeds[i]
        number = $game_party.item_number(item.id)
        self.contents.font.color = number > 0 ? normal_color : disabled_color
        opacity = number > 0 ? 255 : 128
        # Find icon bitmap and set it to window, and draw the text.
        bitmap = RPG::Cache.icon(item.icon_name)
        self.contents.blt(4, i*32+4, bitmap, Rect.new(0, 0, 24, 24), opacity)
        self.contents.draw_text(32, i*32, 288, 32, item.name)
        self.contents.draw_text(-32, i*32, 288, 32, ':', 2)
        self.contents.draw_text(-4, i*32, 288, 32, number.to_s, 2)
      }
    end
  end
 
  def seed
    # Returns currently highlighted seed item.
    return @seeds[self.index]
  end
end

#===============================================================================
# * Scene_Garden
#===============================================================================

class Scene_Garden
 
  def initialize(id, harvest)
    @event_id, @harvest = id, harvest
    # Play SE to give impression that scene never changed.
    $game_system.se_play($data_system.decision_se)
    $game_player.straighten
    garden = $game_system.garden[$game_map.map_id]
    if garden != nil
      @plant = garden.find {|plant| plant.id == id }
    end
  end
 
  def main
    # Create map sprite and required windows.
    @map, @help_window = Spriteset_Map.new, Window_Help.new
    # Create Confirmation window.
    @confirm_window = Window_Command.new(128, ['Yes', 'No'])
    @confirm_window.x, @confirm_window.y = 496, 336
    # Initialize sprites array. Used to handle all the sprites together.
    @sprites = [@map, @help_window, @confirm_window]
    # Create seed window if plant is not being harvested.
    unless @harvest
      @seed_window = Window_Seed.new
      @sprites.push(@seed_window)
      @seed_window.active = @seed_window.visible = false
      @help_window.set_text('Plant seeds here?')
    else
      @data = $game_system.garden[$game_map.map_id][@event_id]
      if @plant != nil && @plant.ripe
        text = 'This plant is ripe. Would you like to harvest it?'
      else
        text = 'Nothing is growing yet on this plant. Harvest it anyway?'
      end
      @help_window.set_text(text)
    end
    # Transition instantly then start main loop.
    Graphics.transition(0)
    loop { Graphics.update; Input.update; update; break if $scene != self }
    # Dispose of all the sprites.
    @sprites.each {|sprite| sprite.dispose }
    # Have map refresh to update any changes made.
    $game_map.need_refresh = true
  end
 
  def update
    @sprites.each {|sprite| sprite.update }
    # Branch update method depending on what window is active.
    if @confirm_window.active
      update_confirm
    elsif @seed_window != nil && @seed_window.active
      update_seed_select
    end
  end
 
  def update_confirm
    if Input.trigger?(Input::B)
      # Branch by what action is being canceled.
      if @harvest
        back_to_map
      else
        @seed1 == nil ? back_to_map : cancel_seed_selection
      end
    elsif Input.trigger?(Input::C)
      # Branch by what action is being confirmed.
      if @harvest
        if @confirm_window.index == 0
          item_id = Garden.harvest(@event_id)
          if item_id != nil
            @confirm_window.active = @confirm_window.visible = false
            # Gain item, play the harvest SE, then return to the map.
            $game_party.gain_item(item_id, 1)
            $game_system.se_play(RPG::AudioFile.new(Garden::HARVEST_SE, 80, 100))
            show_results($data_items[item_id])
            $scene = Scene_Map.new
          else
            back_to_map
          end
        else
          back_to_map
        end
      else
        # If asking if player would like to plant seeds at this location.
        if @seed1 == nil
          if @confirm_window.index == 0
            @seed_window.active = @seed_window.visible = true
            @confirm_window.active = @confirm_window.visible = false
            @help_window.set_text('Which seeds would you like to plant?')
          else
            back_to_map
            return
          end
        else # If confirming seed selection.
          if @confirm_window.index == 0
            # Plant seeds and return to map.
            Garden.plant_seeds(@seed1.id, @seed2.id, @event_id)
            $scene = Scene_Map.new
          else # If canceling seed selection
            cancel_seed_selection
            return
          end
        end
        $game_system.se_play($data_system.decision_se)
      end
    end
  end
 
  def show_results(result)
    @help_window.contents.clear
    # Display the message in the help window.
    @help_window.draw_item_name(result, 0, 0)
    cw = @help_window.contents.text_size(result.name).width + 32
    @help_window.contents.draw_text(cw, 0, 608, 32, ' received!')
    # Call Input.update to the clear key press.
    Input.update
    # Loop until it is pressed again.
    until Input.trigger?(Input::C)
      Graphics.update; Input.update; update
    end
  end
 
  def cancel_seed_selection
    # Play cancel SE, reset seeds, and activate/deactivate windows.
    $game_system.se_play($data_system.cancel_se)
    $game_party.gain_item(@seed1.id, 1) unless @seed1.nil? # Added to re add the seeds
    $game_party.gain_item(@seed2.id, 1) unless @seed2.nil? # Added to re add the seeds
    @seed_window.active = @seed_window.visible = true
    @seed_window.refresh
    @confirm_window.active = @confirm_window.visible = false
    @help_window.set_text('Which seeds would you like to plant?')
    @seed1 = @seed2 = nil
  end
 
  def back_to_map
    # Play cancel SE and return to map.
    $game_system.se_play($data_system.cancel_se)
    $scene = Scene_Map.new
  end
 
  def update_seed_select
    if Input.trigger?(Input::B)
      # If first seed is selected, go back to re-select, else return to map.
      if @seed1 != nil
        cancel_seed_selection
      else
        back_to_map
      end
    elsif Input.trigger?(Input::C)
      # Play Cancle SE if displayed and party has none.
      if $game_party.item_number(@seed_window.seed.id) < 1
        $game_system.se_play($data_system.buzzer_se)
        return
      end
      $game_system.se_play($data_system.decision_se)
      # Set first seed if not defined, else set the second seed and continue.
      if @seed1 == nil
        @seed1 = @seed_window.seed
        $game_party.lose_item(@seed1.id, 1)
      else
        @seed2, @seed_window.active = @seed_window.seed, false
        $game_party.lose_item(@seed2.id, 1)
        @confirm_window.active = @confirm_window.visible = true
      end
      # Refresh seed window to show changes in inventory.
      set_help
      @seed_window.refresh
    end
  end
 
  def set_help
    # Clear help window.
    @help_window.contents.clear
    # Draw items
    text = @seed2 != nil ? 'Plant these two seeds?' : 'Select second seed...'
    @help_window.set_text(text)
    @help_window.draw_item_name(@seed1, 224, 0)
    if @seed2 != nil
      cw = @help_window.contents.text_size(@seed1.name).width + 320
      @help_window.draw_item_name(@seed2, cw, 0)
    end
  end
end

KK20

December 19, 2017, 09:57:56 pm #77 Last Edit: December 19, 2017, 10:14:25 pm by KK20
Script looks good. But the request was to make it so an event can be configured to plant only 1 or only 2 seeds, not just give the player the option to choose. This can probably be made with a quick edit to the naming of the event. Do something like "Garden Event 1" or "Garden Event 2" to specify. If no number specified, then do what your script currently does.

To get you started, you can use

/Garden Event(\s*\d)?/.match(@page.list[0].parameters[0])

for checking if the event is properly named.

I can move it to the front page once you make that edit.

Other Projects
RPG Maker XP Ace  Upgrade RMXP to RMVXA performance!
XPA Tilemap  Tilemap rewrite with many features, including custom resolution!

Nintendo Switch Friend Code: 8310-1917-5318
Discord: KK20 Tyler#8901

Join the CP Discord Server!

ThallionDarkshine

I was talking with Ruffsta to see what he wanted, and implemented it how he told me. He hasn't complained at all about that aspect of its functionality, so I assume it's working correctly.

Ruffsta

ThallionDarkshine's edit works just fine..
I have TONS of script ideas.. If yer a scriptor just ask me and i will help - i do NOT code scripts but if yer gonna code one of mine i will help with any questions to see it through as to how it's supposed to act/do.