diff --git a/Data/Scripts/011_Data/017_Berry_Plant_Data.rb b/Data/Scripts/011_Data/017_Berry_Plant_Data.rb new file mode 100644 index 000000000..7cd3ae377 --- /dev/null +++ b/Data/Scripts/011_Data/017_Berry_Plant_Data.rb @@ -0,0 +1,36 @@ +module GameData + class BerryPlant + attr_reader :id + attr_reader :id_number + attr_reader :hours_per_stage + attr_reader :drying_per_hour + attr_reader :minimum_yield + attr_reader :maximum_yield + + DATA = {} + DATA_FILENAME = "berry_plants.dat" + + NUMBER_OF_REPLANTS = 9 + + extend ClassMethods + include InstanceMethods + + def initialize(hash) + validate hash => Hash, hash[:id] => Symbol + @id = hash[:id] + @id_number = hash[:id_number] || -1 + @hours_per_stage = hash[:hours_per_stage] || 3 + @drying_per_hour = hash[:drying_per_hour] || 15 + @minimum_yield = hash[:minimum_yield] || 2 + @maximum_yield = hash[:maximum_yield] || 5 + end + end +end + +#=============================================================================== +# Deprecated methods +#=============================================================================== +def pbGetBerryPlantData(item) + Deprecation.warn_method('pbGetBerryPlantData', 'v20', 'GameData::BerryPlant.get(item)') + return GameData::BerryPlant.get(item) +end diff --git a/Data/Scripts/013_Overworld/012_PField_BerryPlants.rb b/Data/Scripts/013_Overworld/012_PField_BerryPlants.rb index 25d3787a5..d58eb9f72 100644 --- a/Data/Scripts/013_Overworld/012_PField_BerryPlants.rb +++ b/Data/Scripts/013_Overworld/012_PField_BerryPlants.rb @@ -1,33 +1,3 @@ -class PokemonTemp - attr_accessor :berryPlantData -end - - - -def pbLoadBerryPlantData - $PokemonTemp = PokemonTemp.new if !$PokemonTemp - if !$PokemonTemp.berryPlantData - if pbRgssExists?("Data/berry_plants.dat") - $PokemonTemp.berryPlantData = load_data("Data/berry_plants.dat") - else - $PokemonTemp.berryPlantData = {} - end - end - return $PokemonTemp.berryPlantData -end - -def pbGetBerryPlantData(item) - data = pbLoadBerryPlantData - return data[item] if data[item] - return [3, 15, 2, 5] # Hours/stage, drying/hour, min yield, max yield -end - -alias __berryPlant__pbClearData pbClearData -def pbClearData - $PokemonTemp.berryPlantData = nil if $PokemonTemp - __berryPlant__pbClearData -end - Events.onSpritesetCreate += proc { |_sender,e| spriteset = e[0] viewport = e[1] @@ -103,8 +73,6 @@ end class BerryPlantSprite - REPLANTS = 9 - def initialize(event,map,_viewport) @event=event @map=map @@ -140,8 +108,8 @@ class BerryPlantSprite def updatePlantDetails(berryData) return berryData if berryData[0]==0 - berryvalues=pbGetBerryPlantData(berryData[1]) - timeperstage=berryvalues[0]*3600 + berryvalues = GameData::BerryPlant.get(berryData[1]) + timeperstage = berryvalues.hours_per_stage * 3600 timenow=pbGetTimeNow if berryData.length>6 # Gen 4 growth mechanisms @@ -150,9 +118,9 @@ class BerryPlantSprite return berryData if timeDiff<=0 berryData[3]=timenow.to_i # last updated now # Mulch modifiers - dryingrate=berryvalues[1] - maxreplants=REPLANTS - ripestages=4 + dryingrate = berryvalues.drying_per_hour + maxreplants = GameData::BerryPlant::NUMBER_OF_REPLANTS + ripestages = 4 case berryData[7] when :GROWTHMULCH timeperstage = (timeperstage * 0.75).to_i @@ -246,8 +214,8 @@ class BerryPlantSprite berryData[3]+=timeperstage*4 # add to time existed berryData[4]=0 # reset total waterings count berryData[5]+=1 # add to replanted count - if berryData[5]>REPLANTS # Too many replants - berryData=[0,0,false,0,0,0] + if berryData[5] > GameData::BerryPlant::NUMBER_OF_REPLANTS # Too many replants + berryData = [0,0,false,0,0,0] break end else @@ -282,7 +250,7 @@ class BerryPlantSprite @event.character_name="berrytreeplanted" # Common to all berries @event.turn_down else - filename=sprintf("berrytree%s",GameData::Item.get(berryData[1]).id.to_s) rescue nil + filename=sprintf("berrytree%s",GameData::Item.get(berryData[1]).id.to_s) if !pbResolveBitmap("Graphics/Characters/"+filename) filename=sprintf("berrytree%03d",GameData::Item.get(berryData[1]).id_number) end @@ -427,7 +395,7 @@ def pbBerryPlant pbFadeOutIn { scene = PokemonBag_Scene.new screen = PokemonBagScreen.new(scene,$PokemonBag) - berry = screen.pbChooseItemScreen(Proc.new { |item| GameData::Item.get(item).is_berry? }) + berry = screen.pbChooseItemScreen(Proc.new { |item| GameData::Item.get(item).is_berry? }) } if berry timenow=pbGetTimeNow @@ -470,19 +438,20 @@ def pbBerryPlant end end when 5 # X berries - berryvalues=pbGetBerryPlantData(berryData[1]) + berryvalues = GameData::BerryPlant.get(berryData[1]) # Get berry yield (berrycount) berrycount=1 - if berryData.length>6 + if berryData.length > 6 # Gen 4 berry yield calculation - berrycount=[berryvalues[3]-berryData[6],berryvalues[2]].max + berrycount = [berryvalues.maximum_yield - berryData[6], berryvalues.minimum_yield].max else # Gen 3 berry yield calculation - if berryData[4]>0 - randomno=rand(1+berryvalues[3]-berryvalues[2]) - berrycount=(((berryvalues[3]-berryvalues[2])*(berryData[4]-1)+randomno)/4).floor+berryvalues[2] + if berryData[4] > 0 + berrycount = (berryvalues.maximum_yield - berryvalues.minimum_yield) * (berryData[4] - 1) + berrycount += rand(1 + berryvalues.maximum_yield - berryvalues.minimum_yield) + berrycount = (berrycount / 4) + berryvalues.minimum_yield else - berrycount=berryvalues[2] + berrycount = berryvalues.minimum_yield end end item = GameData::Item.get(berry) diff --git a/Data/Scripts/020_System and utilities/002_PSystem_System.rb b/Data/Scripts/020_System and utilities/002_PSystem_System.rb index c0266024c..b301961d3 100644 --- a/Data/Scripts/020_System and utilities/002_PSystem_System.rb +++ b/Data/Scripts/020_System and utilities/002_PSystem_System.rb @@ -79,6 +79,7 @@ def pbSetUpSystem consts = [] if !consts GameData::Ability.load GameData::Item.load + GameData::BerryPlant.load rescue consts = [] end diff --git a/Data/Scripts/021_Debug/005_Editor_SaveData.rb b/Data/Scripts/021_Debug/005_Editor_SaveData.rb index 60559fa14..f1c4eace8 100644 --- a/Data/Scripts/021_Debug/005_Editor_SaveData.rb +++ b/Data/Scripts/021_Debug/005_Editor_SaveData.rb @@ -267,8 +267,6 @@ end # Save berry plant data to PBS file #=============================================================================== def pbSaveBerryPlants - berryPlantData = load_data("Data/berry_plants.dat") - return if !berryPlantData || berryPlantData.length==0 File.open("PBS/berryplants.txt","wb") { |f| f.write(0xEF.chr) f.write(0xBB.chr) @@ -276,13 +274,14 @@ def pbSaveBerryPlants f.write("\# "+_INTL("See the documentation on the wiki to learn how to edit this file.")) f.write("\r\n") f.write("\#-------------------------------\r\n") - keys = berryPlantData.keys.sort - keys.each do |key| - data = berryPlantData[key] - next if !data || !GameData::Item.exists?(key) - f.write(sprintf("%s = %d,%d,%d,%d", - csvQuote(GameData::Item.get(key).id.to_s), data[0], data[1], data[2], data[3])) - f.write("\r\n") + GameData::BerryPlant.each do |bp| + f.write(sprintf("%s = %d,%d,%d,%d\r\n", + csvQuote(bp.id.to_s), + bp.hours_per_stage, + bp.drying_per_hour, + bp.minimum_yield, + bp.maximum_yield + )) end } end diff --git a/Data/Scripts/022_Compiler/003_Compiler_PBS.rb b/Data/Scripts/022_Compiler/003_Compiler_PBS.rb index 1e0b83595..67da03e92 100644 --- a/Data/Scripts/022_Compiler/003_Compiler_PBS.rb +++ b/Data/Scripts/022_Compiler/003_Compiler_PBS.rb @@ -139,6 +139,33 @@ module Compiler #============================================================================= # Compile berry plants #============================================================================= + def compile_berry_plants + GameData::BerryPlant::DATA.clear + pbCompilerEachCommentedLine("PBS/berryplants.txt") { |line, line_no| + if line[/^\s*(\w+)\s*=\s*(.*)$/] # Of the format XXX = YYY + key = $1 + value = $2 + item_symbol = parseItem(key).to_sym + item_number = GameData::Item.get(item_symbol).id_number + line = pbGetCsvRecord(value, line_no, [0, "vuuv"]) + # Construct berry plant hash + berry_plant_hash = { + :id => item_symbol, + :id_number => item_number, + :hours_per_stage => line[0], + :drying_per_hour => line[1], + :minimum_yield => line[2], + :maximum_yield => line[3] + } + # Add berry plant's data to records + GameData::BerryPlant::DATA[item_number] = GameData::BerryPlant::DATA[item_symbol] = GameData::BerryPlant.new(berry_plant_hash) + end + } + # Save all data + GameData::BerryPlant.save + Graphics.update + end + def compile_berry_plants sections = {} if File.exists?("PBS/berryplants.txt")