From 49655165e1eb4d8cd4c62f34f4f99f14f36aee5a Mon Sep 17 00:00:00 2001 From: Maruno17 Date: Sat, 19 Jun 2021 18:48:33 +0100 Subject: [PATCH] Added conversion of berry plant data, removed all uses of ID numbers for abilities and berry plants, fixed mulch not being consumed, removed use of ID numbers in map of moves to animation IDs --- .../002_Save data/005_Game_SaveConversions.rb | 89 +++++++++++++++++++ .../010_Data/002_PBS data/004_Ability.rb | 8 +- .../010_Data/002_PBS data/007_BerryPlant.rb | 8 +- .../010_Data/002_PBS data/013_Trainer.rb | 5 +- .../005_Battle scene/009_Scene_Animations.rb | 8 +- .../006_Overworld_BerryPlants.rb | 25 +++--- Data/Scripts/014_Pokemon/001_Pokemon.rb | 5 +- .../021_Compiler/002_Compiler_CompilePBS.rb | 28 +++--- .../021_Compiler/003_Compiler_WritePBS.rb | 6 +- 9 files changed, 134 insertions(+), 48 deletions(-) diff --git a/Data/Scripts/002_Save data/005_Game_SaveConversions.rb b/Data/Scripts/002_Save data/005_Game_SaveConversions.rb index 554864de6..f054848d6 100644 --- a/Data/Scripts/002_Save data/005_Game_SaveConversions.rb +++ b/Data/Scripts/002_Save data/005_Game_SaveConversions.rb @@ -146,6 +146,95 @@ SaveData.register_conversion(:v19_1_fix_phone_contacts) do end end +SaveData.register_conversion(:v19_1_1_fix_berry_plants) do + essentials_version 19.1.1 + display_title 'Fixing berry plant data' + to_value :global_metadata do |global| + berry_conversion = { + 389 => :CHERIBERRY, + 390 => :CHESTOBERRY, + 391 => :PECHABERRY, + 392 => :RAWSTBERRY, + 393 => :ASPEARBERRY, + 394 => :LEPPABERRY, + 395 => :ORANBERRY, + 396 => :PERSIMBERRY, + 397 => :LUMBERRY, + 398 => :SITRUSBERRY, + 399 => :FIGYBERRY, + 400 => :WIKIBERRY, + 401 => :MAGOBERRY, + 402 => :AGUAVBERRY, + 403 => :IAPAPABERRY, + 404 => :RAZZBERRY, + 405 => :BLUKBERRY, + 406 => :NANABBERRY, + 407 => :WEPEARBERRY, + 408 => :PINAPBERRY, + 409 => :POMEGBERRY, + 410 => :KELPSYBERRY, + 411 => :QUALOTBERRY, + 412 => :HONDEWBERRY, + 413 => :GREPABERRY, + 414 => :TAMATOBERRY, + 415 => :CORNNBERRY, + 416 => :MAGOSTBERRY, + 417 => :RABUTABERRY, + 418 => :NOMELBERRY, + 419 => :SPELONBERRY, + 420 => :PAMTREBERRY, + 421 => :WATMELBERRY, + 422 => :DURINBERRY, + 423 => :BELUEBERRY, + 424 => :OCCABERRY, + 425 => :PASSHOBERRY, + 426 => :WACANBERRY, + 427 => :RINDOBERRY, + 428 => :YACHEBERRY, + 429 => :CHOPLEBERRY, + 430 => :KEBIABERRY, + 431 => :SHUCABERRY, + 432 => :COBABERRY, + 433 => :PAYAPABERRY, + 434 => :TANGABERRY, + 435 => :CHARTIBERRY, + 436 => :KASIBBERRY, + 437 => :HABANBERRY, + 438 => :COLBURBERRY, + 439 => :BABIRIBERRY, + 440 => :CHILANBERRY, + 441 => :LIECHIBERRY, + 442 => :GANLONBERRY, + 443 => :SALACBERRY, + 444 => :PETAYABERRY, + 445 => :APICOTBERRY, + 446 => :LANSATBERRY, + 447 => :STARFBERRY, + 448 => :ENIGMABERRY, + 449 => :MICLEBERRY, + 450 => :CUSTAPBERRY, + 451 => :JABOCABERRY, + 452 => :ROWAPBERRY + } + mulch_conversion = { + 59 => :GROWTHMULCH, + 60 => :DAMPMULCH, + 61 => :STABLEMULCH, + 62 => :GOOEYMULCH + } + global.eventvars.each do |var| + next if !var || !var.ia_a?(Array) + next if var.length < 6 || var.length > 8 # Neither old nor new berry plant + if !var[1].is_a?(Symbol) # Planted berry item + var[1] = berry_conversion[var[1]] || :ORANBERRY + end + if var[7] && !var[7].is_a?(Symbol) # Mulch + var[7] = mulch_conversion[var[7]] + end + end + end +end + SaveData.register_conversion(:v19_convert_bag) do essentials_version 19 display_title 'Converting item IDs in Bag' diff --git a/Data/Scripts/010_Data/002_PBS data/004_Ability.rb b/Data/Scripts/010_Data/002_PBS data/004_Ability.rb index 2de14fccf..2c1406c44 100644 --- a/Data/Scripts/010_Data/002_PBS data/004_Ability.rb +++ b/Data/Scripts/010_Data/002_PBS data/004_Ability.rb @@ -1,31 +1,29 @@ module GameData class Ability attr_reader :id - attr_reader :id_number attr_reader :real_name attr_reader :real_description DATA = {} DATA_FILENAME = "abilities.dat" - extend ClassMethods + extend ClassMethodsSymbols include InstanceMethods def initialize(hash) @id = hash[:id] - @id_number = hash[:id_number] || -1 @real_name = hash[:name] || "Unnamed" @real_description = hash[:description] || "???" end # @return [String] the translated name of this ability def name - return pbGetMessage(MessageTypes::Abilities, @id_number) + return pbGetMessageFromHash(MessageTypes::Abilities, @real_name) end # @return [String] the translated description of this ability def description - return pbGetMessage(MessageTypes::AbilityDescs, @id_number) + return pbGetMessageFromHash(MessageTypes::AbilityDescs, @real_description) end end end diff --git a/Data/Scripts/010_Data/002_PBS data/007_BerryPlant.rb b/Data/Scripts/010_Data/002_PBS data/007_BerryPlant.rb index ad47a4e75..720f28e0c 100644 --- a/Data/Scripts/010_Data/002_PBS data/007_BerryPlant.rb +++ b/Data/Scripts/010_Data/002_PBS data/007_BerryPlant.rb @@ -1,7 +1,6 @@ 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 @@ -12,16 +11,15 @@ module GameData NUMBER_OF_REPLANTS = 9 - extend ClassMethods + extend ClassMethodsSymbols include InstanceMethods def initialize(hash) @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 + @minimum_yield = hash[:minimum_yield] || 2 + @maximum_yield = hash[:maximum_yield] || 5 end end end diff --git a/Data/Scripts/010_Data/002_PBS data/013_Trainer.rb b/Data/Scripts/010_Data/002_PBS data/013_Trainer.rb index 4276b876c..8a61aa739 100644 --- a/Data/Scripts/010_Data/002_PBS data/013_Trainer.rb +++ b/Data/Scripts/010_Data/002_PBS data/013_Trainer.rb @@ -128,7 +128,7 @@ module GameData else pkmn.reset_moves end - pkmn.ability_index = pkmn_data[:ability_index] + pkmn.ability_index = pkmn_data[:ability_index] || 0 pkmn.ability = pkmn_data[:ability] pkmn.gender = pkmn_data[:gender] || ((trainer.male?) ? 0 : 1) pkmn.shiny = (pkmn_data[:shininess]) ? true : false @@ -137,7 +137,8 @@ module GameData else # Make the nature random but consistent for the same species used by the same trainer type species_num = GameData::Species.keys.index(species) || 1 tr_type_num = GameData::TrainerType.keys.index(@trainer_type) || 1 - pkmn.nature = (species_num + tr_type_num) % GameData::Nature.count + idx = (species_num + tr_type_num) % GameData::Nature.count + pkmn.nature = GameData::Nature.get(GameData::Nature.keys[idx]).id end GameData::Stat.each_main do |s| if pkmn_data[:iv] diff --git a/Data/Scripts/011_Battle/005_Battle scene/009_Scene_Animations.rb b/Data/Scripts/011_Battle/005_Battle scene/009_Scene_Animations.rb index 0bd3ab098..50c6e47e2 100644 --- a/Data/Scripts/011_Battle/005_Battle scene/009_Scene_Animations.rb +++ b/Data/Scripts/011_Battle/005_Battle scene/009_Scene_Animations.rb @@ -383,14 +383,14 @@ class PokeBattle_Scene # Returns the animation ID to use for a given move/user. Returns nil if that # move has no animations defined for it. def pbFindMoveAnimDetails(move2anim,moveID,idxUser,hitNum=0) - id_number = GameData::Move.get(moveID).id_number + real_move_id = GameData::Move.get(moveID).id noFlip = false if (idxUser&1)==0 # On player's side - anim = move2anim[0][id_number] + anim = move2anim[0][real_move_id] else # On opposing side - anim = move2anim[1][id_number] + anim = move2anim[1][real_move_id] noFlip = true if anim - anim = move2anim[0][id_number] if !anim + anim = move2anim[0][real_move_id] if !anim end return [anim+hitNum,noFlip] if anim return nil diff --git a/Data/Scripts/012_Overworld/006_Overworld_BerryPlants.rb b/Data/Scripts/012_Overworld/006_Overworld_BerryPlants.rb index 5b82a5141..ff1889607 100644 --- a/Data/Scripts/012_Overworld/006_Overworld_BerryPlants.rb +++ b/Data/Scripts/012_Overworld/006_Overworld_BerryPlants.rb @@ -142,7 +142,7 @@ class BerryPlantSprite if secondsalive+timeDiff>=timeperstage*numlifestages # Should replant if berryData[5]>=maxreplants # Too many replants - return [0,0,0,0,0,0,0,0] + return [0,nil,0,0,0,0,0,nil] end # Replant berryData[0]=2 # replants start in sprouting stage @@ -215,7 +215,7 @@ class BerryPlantSprite berryData[4]=0 # reset total waterings count berryData[5]+=1 # add to replanted count if berryData[5] > GameData::BerryPlant::NUMBER_OF_REPLANTS # Too many replants - berryData = [0,0,false,0,0,0] + berryData = [0,nil,false,0,0,0] break end else @@ -272,18 +272,18 @@ def pbBerryPlant berryData=interp.getVariable if !berryData if Settings::NEW_BERRY_PLANTS - berryData=[0,nil,0,0,0,0,0,0] + berryData=[0,nil,0,0,0,0,0,nil] else berryData=[0,nil,false,0,0,0] end end # Stop the event turning towards the player case berryData[0] - when 1 then thisEvent.turn_down # X planted - when 2 then thisEvent.turn_down # X sprouted - when 3 then thisEvent.turn_left # X taller - when 4 then thisEvent.turn_right # X flowering - when 5 then thisEvent.turn_up # X berries + when 1 then thisEvent.turn_down # X planted + when 2 then thisEvent.turn_down # X sprouted + when 3 then thisEvent.turn_left # X taller + when 4 then thisEvent.turn_right # X flowering + when 5 then thisEvent.turn_up # X berries end watering = [:SPRAYDUCK, :SQUIRTBOTTLE, :WAILMERPAIL, :SPRINKLOTAD] berry=berryData[1] @@ -291,13 +291,13 @@ def pbBerryPlant when 0 # empty if Settings::NEW_BERRY_PLANTS # Gen 4 planting mechanics - if !berryData[7] || berryData[7]==0 # No mulch used yet + if !berryData[7] # No mulch used yet cmd=pbMessage(_INTL("It's soft, earthy soil."),[ _INTL("Fertilize"), _INTL("Plant Berry"), _INTL("Exit")],-1) if cmd==0 # Fertilize - ret=0 + ret=nil pbFadeOutIn { scene = PokemonBag_Scene.new screen = PokemonBagScreen.new(scene,$PokemonBag) @@ -306,6 +306,7 @@ def pbBerryPlant if ret if GameData::Item.get(ret).is_mulch? berryData[7]=ret + $PokemonBag.pbDeleteItem(ret, 1) pbMessage(_INTL("The {1} was scattered on the soil.\1",GameData::Item.get(ret).name)) if pbConfirmMessage(_INTL("Want to plant a Berry?")) pbFadeOutIn { @@ -468,7 +469,7 @@ def pbBerryPlant $Trainer.name,itemname,pocket,PokemonBag.pocketNames()[pocket])) if Settings::NEW_BERRY_PLANTS pbMessage(_INTL("The soil returned to its soft and earthy state.")) - berryData=[0,nil,0,0,0,0,0,0] + berryData=[0,nil,0,0,0,0,0,nil] else pbMessage(_INTL("The soil returned to its soft and loamy state.")) berryData=[0,nil,false,0,0,0] @@ -531,7 +532,7 @@ def pbPickBerry(berry, qty = 1) $Trainer.name,itemname,pocket,PokemonBag.pocketNames()[pocket])) if Settings::NEW_BERRY_PLANTS pbMessage(_INTL("The soil returned to its soft and earthy state.")) - berryData=[0,nil,0,0,0,0,0,0] + berryData=[0,nil,0,0,0,0,0,nil] else pbMessage(_INTL("The soil returned to its soft and loamy state.")) berryData=[0,nil,false,0,0,0] diff --git a/Data/Scripts/014_Pokemon/001_Pokemon.rb b/Data/Scripts/014_Pokemon/001_Pokemon.rb index 6296a2220..ef7ed5ec2 100644 --- a/Data/Scripts/014_Pokemon/001_Pokemon.rb +++ b/Data/Scripts/014_Pokemon/001_Pokemon.rb @@ -456,7 +456,10 @@ class Pokemon # @return [GameData::Nature, nil] a Nature object corresponding to this Pokémon's nature def nature - @nature = GameData::Nature.get(@personalID % GameData::Nature.count).id if !@nature + if !@nature + idx = @personalID % GameData::Nature.count + @nature = GameData::Nature.get(GameData::Nature.keys[idx]).id + end return GameData::Nature.try_get(@nature) end diff --git a/Data/Scripts/021_Compiler/002_Compiler_CompilePBS.rb b/Data/Scripts/021_Compiler/002_Compiler_CompilePBS.rb index ffc5ade04..5b94d6b06 100644 --- a/Data/Scripts/021_Compiler/002_Compiler_CompilePBS.rb +++ b/Data/Scripts/021_Compiler/002_Compiler_CompilePBS.rb @@ -212,30 +212,26 @@ module Compiler ability_names = [] ability_descriptions = [] pbCompilerEachPreppedLine(path) { |line, line_no| - line = pbGetCsvRecord(line, line_no, [0, "vnss"]) - ability_number = line[0] + line = pbGetCsvRecord(line, line_no, [0, "snss"]) ability_symbol = line[1].to_sym - if GameData::Ability::DATA[ability_number] - raise _INTL("Ability ID number '{1}' is used twice.\r\n{2}", ability_number, FileLineData.linereport) - elsif GameData::Ability::DATA[ability_symbol] + if GameData::Ability::DATA[ability_symbol] raise _INTL("Ability ID '{1}' is used twice.\r\n{2}", ability_symbol, FileLineData.linereport) end # Construct ability hash ability_hash = { :id => ability_symbol, - :id_number => ability_number, :name => line[2], :description => line[3] } # Add ability's data to records GameData::Ability.register(ability_hash) - ability_names[ability_number] = ability_hash[:name] - ability_descriptions[ability_number] = ability_hash[:description] + ability_names.push(ability_hash[:name]) + ability_descriptions.push(ability_hash[:description]) } # Save all data GameData::Ability.save - MessageTypes.setMessages(MessageTypes::Abilities, ability_names) - MessageTypes.setMessages(MessageTypes::AbilityDescs, ability_descriptions) + MessageTypes.setMessagesAsHash(MessageTypes::Abilities, ability_names) + MessageTypes.setMessagesAsHash(MessageTypes::AbilityDescs, ability_descriptions) Graphics.update end @@ -350,13 +346,11 @@ module Compiler if line[/^\s*(\w+)\s*=\s*(.*)$/] # Of the format XXX = YYY key = $1 value = $2 - item_symbol = parseItem(key) - item_number = GameData::Item.get(item_symbol).id_number + item_id = parseItem(key) line = pbGetCsvRecord(value, line_no, [0, "vuuv"]) # Construct berry plant hash berry_plant_hash = { - :id => item_symbol, - :id_number => item_number, + :id => item_id, :hours_per_stage => line[0], :drying_per_hour => line[1], :minimum_yield => line[2], @@ -1419,7 +1413,7 @@ module Compiler pbanims = PBAnimations.new end changed = false - move2anim = [[],[]] + move2anim = [{}, {}] =begin anims = load_data("Data/Animations.rxdata") for anim in anims @@ -1438,13 +1432,13 @@ module Compiler next if !pbanims[i] if pbanims[i].name[/^OppMove\:\s*(.*)$/] if GameData::Move.exists?($~[1]) - moveid = GameData::Move.get($~[1]).id_number + moveid = GameData::Move.get($~[1]).id changed = true if !move2anim[0][moveid] || move2anim[1][moveid] != i move2anim[1][moveid] = i end elsif pbanims[i].name[/^Move\:\s*(.*)$/] if GameData::Move.exists?($~[1]) - moveid = GameData::Move.get($~[1]).id_number + moveid = GameData::Move.get($~[1]).id changed = true if !move2anim[0][moveid] || move2anim[0][moveid] != i move2anim[0][moveid] = i end diff --git a/Data/Scripts/021_Compiler/003_Compiler_WritePBS.rb b/Data/Scripts/021_Compiler/003_Compiler_WritePBS.rb index dd2c68730..983eee3c9 100644 --- a/Data/Scripts/021_Compiler/003_Compiler_WritePBS.rb +++ b/Data/Scripts/021_Compiler/003_Compiler_WritePBS.rb @@ -158,13 +158,15 @@ module Compiler File.open("PBS/abilities.txt", "wb") { |f| add_PBS_header_to_file(f) f.write("\#-------------------------------\r\n") + idx = 1 GameData::Ability.each do |a| - f.write(sprintf("%d,%s,%s,%s\r\n", - a.id_number, + f.write(sprintf("%s,%s,%s,%s\r\n", + idx, csvQuote(a.id.to_s), csvQuote(a.real_name), csvQuoteAlways(a.real_description) )) + idx += 1 end } Graphics.update