Implemented GameData::BerryPlant

This commit is contained in:
Maruno17
2020-11-13 21:34:11 +00:00
parent d7e9f6db67
commit d8476d1fa4
5 changed files with 89 additions and 57 deletions

View File

@@ -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

View File

@@ -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| Events.onSpritesetCreate += proc { |_sender,e|
spriteset = e[0] spriteset = e[0]
viewport = e[1] viewport = e[1]
@@ -103,8 +73,6 @@ end
class BerryPlantSprite class BerryPlantSprite
REPLANTS = 9
def initialize(event,map,_viewport) def initialize(event,map,_viewport)
@event=event @event=event
@map=map @map=map
@@ -140,8 +108,8 @@ class BerryPlantSprite
def updatePlantDetails(berryData) def updatePlantDetails(berryData)
return berryData if berryData[0]==0 return berryData if berryData[0]==0
berryvalues=pbGetBerryPlantData(berryData[1]) berryvalues = GameData::BerryPlant.get(berryData[1])
timeperstage=berryvalues[0]*3600 timeperstage = berryvalues.hours_per_stage * 3600
timenow=pbGetTimeNow timenow=pbGetTimeNow
if berryData.length>6 if berryData.length>6
# Gen 4 growth mechanisms # Gen 4 growth mechanisms
@@ -150,9 +118,9 @@ class BerryPlantSprite
return berryData if timeDiff<=0 return berryData if timeDiff<=0
berryData[3]=timenow.to_i # last updated now berryData[3]=timenow.to_i # last updated now
# Mulch modifiers # Mulch modifiers
dryingrate=berryvalues[1] dryingrate = berryvalues.drying_per_hour
maxreplants=REPLANTS maxreplants = GameData::BerryPlant::NUMBER_OF_REPLANTS
ripestages=4 ripestages = 4
case berryData[7] case berryData[7]
when :GROWTHMULCH when :GROWTHMULCH
timeperstage = (timeperstage * 0.75).to_i timeperstage = (timeperstage * 0.75).to_i
@@ -246,8 +214,8 @@ class BerryPlantSprite
berryData[3]+=timeperstage*4 # add to time existed berryData[3]+=timeperstage*4 # add to time existed
berryData[4]=0 # reset total waterings count berryData[4]=0 # reset total waterings count
berryData[5]+=1 # add to replanted count berryData[5]+=1 # add to replanted count
if berryData[5]>REPLANTS # Too many replants if berryData[5] > GameData::BerryPlant::NUMBER_OF_REPLANTS # Too many replants
berryData=[0,0,false,0,0,0] berryData = [0,0,false,0,0,0]
break break
end end
else else
@@ -282,7 +250,7 @@ class BerryPlantSprite
@event.character_name="berrytreeplanted" # Common to all berries @event.character_name="berrytreeplanted" # Common to all berries
@event.turn_down @event.turn_down
else 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) if !pbResolveBitmap("Graphics/Characters/"+filename)
filename=sprintf("berrytree%03d",GameData::Item.get(berryData[1]).id_number) filename=sprintf("berrytree%03d",GameData::Item.get(berryData[1]).id_number)
end end
@@ -427,7 +395,7 @@ def pbBerryPlant
pbFadeOutIn { pbFadeOutIn {
scene = PokemonBag_Scene.new scene = PokemonBag_Scene.new
screen = PokemonBagScreen.new(scene,$PokemonBag) 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 if berry
timenow=pbGetTimeNow timenow=pbGetTimeNow
@@ -470,19 +438,20 @@ def pbBerryPlant
end end
end end
when 5 # X berries when 5 # X berries
berryvalues=pbGetBerryPlantData(berryData[1]) berryvalues = GameData::BerryPlant.get(berryData[1])
# Get berry yield (berrycount) # Get berry yield (berrycount)
berrycount=1 berrycount=1
if berryData.length>6 if berryData.length > 6
# Gen 4 berry yield calculation # Gen 4 berry yield calculation
berrycount=[berryvalues[3]-berryData[6],berryvalues[2]].max berrycount = [berryvalues.maximum_yield - berryData[6], berryvalues.minimum_yield].max
else else
# Gen 3 berry yield calculation # Gen 3 berry yield calculation
if berryData[4]>0 if berryData[4] > 0
randomno=rand(1+berryvalues[3]-berryvalues[2]) berrycount = (berryvalues.maximum_yield - berryvalues.minimum_yield) * (berryData[4] - 1)
berrycount=(((berryvalues[3]-berryvalues[2])*(berryData[4]-1)+randomno)/4).floor+berryvalues[2] berrycount += rand(1 + berryvalues.maximum_yield - berryvalues.minimum_yield)
berrycount = (berrycount / 4) + berryvalues.minimum_yield
else else
berrycount=berryvalues[2] berrycount = berryvalues.minimum_yield
end end
end end
item = GameData::Item.get(berry) item = GameData::Item.get(berry)

View File

@@ -79,6 +79,7 @@ def pbSetUpSystem
consts = [] if !consts consts = [] if !consts
GameData::Ability.load GameData::Ability.load
GameData::Item.load GameData::Item.load
GameData::BerryPlant.load
rescue rescue
consts = [] consts = []
end end

View File

@@ -267,8 +267,6 @@ end
# Save berry plant data to PBS file # Save berry plant data to PBS file
#=============================================================================== #===============================================================================
def pbSaveBerryPlants def pbSaveBerryPlants
berryPlantData = load_data("Data/berry_plants.dat")
return if !berryPlantData || berryPlantData.length==0
File.open("PBS/berryplants.txt","wb") { |f| File.open("PBS/berryplants.txt","wb") { |f|
f.write(0xEF.chr) f.write(0xEF.chr)
f.write(0xBB.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("\# "+_INTL("See the documentation on the wiki to learn how to edit this file."))
f.write("\r\n") f.write("\r\n")
f.write("\#-------------------------------\r\n") f.write("\#-------------------------------\r\n")
keys = berryPlantData.keys.sort GameData::BerryPlant.each do |bp|
keys.each do |key| f.write(sprintf("%s = %d,%d,%d,%d\r\n",
data = berryPlantData[key] csvQuote(bp.id.to_s),
next if !data || !GameData::Item.exists?(key) bp.hours_per_stage,
f.write(sprintf("%s = %d,%d,%d,%d", bp.drying_per_hour,
csvQuote(GameData::Item.get(key).id.to_s), data[0], data[1], data[2], data[3])) bp.minimum_yield,
f.write("\r\n") bp.maximum_yield
))
end end
} }
end end

View File

@@ -139,6 +139,33 @@ module Compiler
#============================================================================= #=============================================================================
# Compile berry plants # 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 def compile_berry_plants
sections = {} sections = {}
if File.exists?("PBS/berryplants.txt") if File.exists?("PBS/berryplants.txt")