Deprecated methods intended to work around filenames with accents, fixed crash when the Compiler wants to rewrite PBS files if they don't exist

This commit is contained in:
Maruno17
2023-05-20 22:10:11 +01:00
parent 276c052822
commit 167155c67d
17 changed files with 130 additions and 158 deletions

View File

@@ -31,12 +31,9 @@ class Dir
return files + subfolders
end
# Checks for existing directory, gets around accents
# Checks for existing directory
def self.safe?(dir)
return false if !FileTest.directory?(dir)
ret = false
self.chdir(dir) { ret = true } rescue nil
return ret
return FileTest.directory?(dir)
end
# Creates all the required directories for filename path
@@ -73,44 +70,20 @@ class Dir
end
end
#===============================================================================
# Extensions for file class
#===============================================================================
class File
# Checks for existing file, gets around accents
def self.safe?(file)
ret = false
self.open(file, "rb") { ret = true } rescue nil
return ret
end
# Checks for existing .rxdata file
def self.safeData?(file)
ret = (load_data(file) ? true : false) rescue false
return ret
end
end
#===============================================================================
# Checking for files and directories
#===============================================================================
# Works around a problem with FileTest.directory if directory contains accent marks
# @deprecated This method is slated to be removed in v22.
def safeIsDirectory?(f)
ret = false
Dir.chdir(f) { ret = true } rescue nil
return ret
Deprecation.warn_method("safeIsDirectory?(f)", "v22", "FileTest.directory?(f)")
return FileTest.directory?(f)
end
# Works around a problem with FileTest.exist if path contains accent marks
# @deprecated This method is slated to be removed in v22.
def safeExists?(f)
return FileTest.exist?(f) if f[/\A[\x20-\x7E]*\z/]
ret = false
begin
File.open(f, "rb") { ret = true }
rescue Errno::ENOENT, Errno::EINVAL, Errno::EACCES
ret = false
end
return ret
Deprecation.warn_method("safeExists?(f)", "v22", "FileTest.exist?(f)")
return FileTest.exist?(f)
end
# Similar to "Dir.glob", but designed to work around a problem with accessing
@@ -211,9 +184,9 @@ module RTP
def self.exists?(filename, extensions = [])
return false if nil_or_empty?(filename)
eachPathFor(filename) do |path|
return true if safeExists?(path)
return true if FileTest.exist?(path)
extensions.each do |ext|
return true if safeExists?(path + ext)
return true if FileTest.exist?(path + ext)
end
end
return false
@@ -230,10 +203,10 @@ module RTP
def self.getPath(filename, extensions = [])
return filename if nil_or_empty?(filename)
eachPathFor(filename) do |path|
return path if safeExists?(path)
return path if FileTest.exist?(path)
extensions.each do |ext|
file = path + ext
return file if safeExists?(file)
return file if FileTest.exist?(file)
end
end
return filename
@@ -307,9 +280,9 @@ end
# NOTE: pbGetFileChar checks anything added in MKXP's RTP setting, and matching
# mount points added through System.mount.
def pbRgssExists?(filename)
return !pbGetFileChar(filename).nil? if safeExists?("./Game.rgssad")
return !pbGetFileChar(filename).nil? if FileTest.exist?("./Game.rgssad")
filename = canonicalize(filename)
return safeExists?(filename)
return FileTest.exist?(filename)
end
# Opens an IO, even if the file is in an encrypted archive.
@@ -318,7 +291,7 @@ end
# mount points added through System.mount.
def pbRgssOpen(file, mode = nil)
# File.open("debug.txt", "ab") { |fw| fw.write([file, mode, Time.now.to_f].inspect + "\r\n") }
if !safeExists?("./Game.rgssad")
if !FileTest.exist?("./Game.rgssad")
if block_given?
File.open(file, mode) { |f| yield f }
return nil
@@ -341,8 +314,8 @@ end
# encrypted archives.
def pbGetFileChar(file)
canon_file = canonicalize(file)
if !safeExists?("./Game.rgssad")
return nil if !safeExists?(canon_file)
if !FileTest.exist?("./Game.rgssad")
return nil if !FileTest.exist?(canon_file)
return nil if file.last == "/" # Is a directory
begin
File.open(canon_file, "rb") { |f| return f.read(1) } # read one byte
@@ -370,8 +343,8 @@ end
# mount points added through System.mount.
def pbGetFileString(file)
file = canonicalize(file)
if !safeExists?("./Game.rgssad")
return nil if !safeExists?(file)
if !FileTest.exist?("./Game.rgssad")
return nil if !FileTest.exist?(file)
begin
File.open(file, "rb") { |f| return f.read } # read all data
rescue Errno::ENOENT, Errno::EINVAL, Errno::EACCES

View File

@@ -32,7 +32,7 @@ module Translator
end
end
# Get script texts from plugin script files
if safeExists?("Data/PluginScripts.rxdata")
if FileTest.exist?("Data/PluginScripts.rxdata")
plugin_scripts = load_data("Data/PluginScripts.rxdata")
plugin_scripts.each do |plugin|
plugin[2].each do |script|
@@ -511,12 +511,12 @@ class Translation
def load_message_files(filename)
begin
core_filename = sprintf("Data/messages_%s_core.dat", filename)
if safeExists?(core_filename)
if FileTest.exist?(core_filename)
pbRgssOpen(core_filename, "rb") { |f| @core_messages = Marshal.load(f) }
end
@core_messages = nil if !@core_messages.is_a?(Array)
game_filename = sprintf("Data/messages_%s_game.dat", filename)
if safeExists?(game_filename)
if FileTest.exist?(game_filename)
pbRgssOpen(game_filename, "rb") { |f| @game_messages = Marshal.load(f) }
end
@game_messages = nil if !@game_messages.is_a?(Array)
@@ -529,11 +529,11 @@ class Translation
def load_default_messages
return if @default_core_messages
begin
if safeExists?("Data/messages_core.dat")
if FileTest.exist?("Data/messages_core.dat")
pbRgssOpen("Data/messages_core.dat", "rb") { |f| @default_core_messages = Marshal.load(f) }
end
@default_core_messages = [] if !@default_core_messages.is_a?(Array)
if safeExists?("Data/messages_game.dat")
if FileTest.exist?("Data/messages_game.dat")
pbRgssOpen("Data/messages_game.dat", "rb") { |f| @default_game_messages = Marshal.load(f) }
end
@default_game_messages = [] if !@default_game_messages.is_a?(Array)

View File

@@ -471,7 +471,7 @@ module PluginManager
# Get a list of all the plugin directories to inspect
def self.listAll
return [] if !$DEBUG || safeExists?("Game.rgssad") || !Dir.safe?("Plugins")
return [] if !$DEBUG || FileTest.exist?("Game.rgssad") || !Dir.safe?("Plugins")
# get a list of all directories in the `Plugins/` folder
dirs = []
Dir.get("Plugins").each { |d| dirs.push(d) if Dir.safe?(d) }
@@ -534,7 +534,7 @@ module PluginManager
# plugins.
self.listAll.each do |dir|
# skip if there is no meta file
next if !safeExists?(dir + "/meta.txt")
next if !FileTest.exist?(dir + "/meta.txt")
ndx = order.length
meta = self.readMeta(dir, "meta.txt")
meta[:dir] = dir
@@ -556,8 +556,8 @@ module PluginManager
# Check if plugins need compiling
def self.needCompiling?(order, plugins)
# fixed actions
return false if !$DEBUG || safeExists?("Game.rgssad")
return true if !safeExists?("Data/PluginScripts.rxdata")
return false if !$DEBUG || FileTest.exist?("Game.rgssad")
return true if !FileTest.exist?("Data/PluginScripts.rxdata")
Input.update
return true if Input.press?(Input::SHIFT) || Input.press?(Input::CTRL)
# analyze whether or not to push recompile
@@ -655,7 +655,7 @@ module PluginManager
# go through the plugins folder
Dir.get("Plugins").each do |dir|
next if !Dir.safe?(dir)
next if !safeExists?(dir + "/meta.txt")
next if !FileTest.exist?(dir + "/meta.txt")
# read meta
meta = self.readMeta(dir, "meta.txt")
return dir if meta[:name] == name

View File

@@ -83,20 +83,20 @@ end
# Gets the length of an audio file in seconds. Supports WAV, MP3, and OGG files.
def getPlayTime(filename)
if safeExists?(filename)
if FileTest.exist?(filename)
return [getPlayTime2(filename), 0].max
elsif safeExists?(filename + ".wav")
elsif FileTest.exist?(filename + ".wav")
return [getPlayTime2(filename + ".wav"), 0].max
elsif safeExists?(filename + ".mp3")
elsif FileTest.exist?(filename + ".mp3")
return [getPlayTime2(filename + ".mp3"), 0].max
elsif safeExists?(filename + ".ogg")
elsif FileTest.exist?(filename + ".ogg")
return [getPlayTime2(filename + ".ogg"), 0].max
end
return 0
end
def getPlayTime2(filename)
return -1 if !safeExists?(filename)
return -1 if !FileTest.exist?(filename)
time = -1
fgetdw = proc { |file|
(file.eof? ? 0 : (file.read(4).unpack("V")[0] || 0))

View File

@@ -26,7 +26,7 @@ module GameData
singleton_class.alias_method(:__orig__load, :load) unless singleton_class.method_defined?(:__orig__load)
def self.load
__orig__load if safeExists?("Data/#{self::DATA_FILENAME}")
__orig__load if FileTest.exist?("Data/#{self::DATA_FILENAME}")
end
# @param species [Symbol, self, String]

View File

@@ -59,7 +59,7 @@ def pbEditMysteryGift(type, item, id = 0, giftname = "")
if id == 0
master = []
idlist = []
if safeExists?("MysteryGiftMaster.txt")
if FileTest.exist?("MysteryGiftMaster.txt")
master = IO.read("MysteryGiftMaster.txt")
master = pbMysteryGiftDecrypt(master)
end
@@ -101,7 +101,7 @@ def pbCreateMysteryGift(type, item)
gift = pbEditMysteryGift(type, item)
if gift
begin
if safeExists?("MysteryGiftMaster.txt")
if FileTest.exist?("MysteryGiftMaster.txt")
master = IO.read("MysteryGiftMaster.txt")
master = pbMysteryGiftDecrypt(master)
master.push(gift)
@@ -124,7 +124,7 @@ end
# file to be uploaded.
#===============================================================================
def pbManageMysteryGifts
if !safeExists?("MysteryGiftMaster.txt")
if !FileTest.exist?("MysteryGiftMaster.txt")
pbMessage(_INTL("There are no Mystery Gifts defined."))
return
end

View File

@@ -14,10 +14,10 @@ def pbGetLegalMoves(species)
end
def pbSafeCopyFile(x, y, z = nil)
if safeExists?(x)
if FileTest.exist?(x)
safetocopy = true
filedata = nil
if safeExists?(y)
if FileTest.exist?(y)
different = false
if FileTest.size(x) == FileTest.size(y)
filedata2 = ""

View File

@@ -596,10 +596,10 @@ end
def pbImportAllAnimations
animationFolders = []
if safeIsDirectory?("Animations")
if FileTest.directory?("Animations")
Dir.foreach("Animations") do |fb|
f = "Animations/" + fb
animationFolders.push(f) if safeIsDirectory?(f) && fb != "." && fb != ".."
animationFolders.push(f) if FileTest.directory?(f) && fb != "." && fb != ".."
end
end
if animationFolders.length == 0
@@ -639,14 +639,14 @@ def pbImportAllAnimations
textdata.id = -1 # This is not an RPG Maker XP animation
BattleAnimationEditor.pbConvertAnimToNewFormat(textdata)
if textdata.graphic && textdata.graphic != "" &&
!safeExists?(folder + "/" + textdata.graphic) &&
!FileTest.exist?(folder + "/" + textdata.graphic) &&
!FileTest.image_exist?("Graphics/Animations/" + textdata.graphic)
textdata.graphic = ""
missingFiles.push(textdata.graphic)
end
textdata.timing.each do |timing|
next if !timing.name || timing.name == "" ||
safeExists?(folder + "/" + timing.name) ||
FileTest.exist?(folder + "/" + timing.name) ||
FileTest.audio_exist?("Audio/SE/Anim/" + timing.name)
timing.name = ""
missingFiles.push(timing.name)

View File

@@ -1018,7 +1018,7 @@ module Compiler
Console.echo_li(_INTL("Saving messages..."))
Translator.gather_script_and_event_texts
MessageTypes.save_default_messages
MessageTypes.load_default_messages if safeExists?("Data/messages_core.dat")
MessageTypes.load_default_messages if FileTest.exist?("Data/messages_core.dat")
Console.echo_done(true)
Console.echoln_li_done(_INTL("Successfully compiled all game data"))
end
@@ -1026,6 +1026,14 @@ module Compiler
def main
return if !$DEBUG
begin
mustCompile = false
# If no PBS file, create one and fill it, then recompile
if !FileTest.directory?("PBS")
Dir.mkdir("PBS") rescue nil
GameData.load_all
write_all
mustCompile = true
end
# Get all data files and PBS files to be checked for their last modified times
data_files = GameData.get_all_data_filenames
data_files += [ # Extra .dat files for data that isn't a GameData class
@@ -1036,19 +1044,11 @@ module Compiler
text_files = get_all_pbs_files_to_compile
latestDataTime = 0
latestTextTime = 0
mustCompile = false
# Should recompile if new maps were imported
mustCompile |= import_new_maps
# If no PBS file, create one and fill it, then recompile
if !safeIsDirectory?("PBS")
Dir.mkdir("PBS") rescue nil
GameData.load_all
write_all
mustCompile = true
end
# Check data files for their latest modify time
data_files.each do |filename| # filename = [string, boolean (whether mandatory)]
if safeExists?("Data/" + filename[0])
if FileTest.exist?("Data/" + filename[0])
begin
File.open("Data/#{filename[0]}") do |file|
latestDataTime = [latestDataTime, file.mtime.to_i].max
@@ -1080,7 +1080,7 @@ module Compiler
if mustCompile
data_files.each do |filename|
begin
File.delete("Data/#{filename[0]}") if safeExists?("Data/#{filename[0]}")
File.delete("Data/#{filename[0]}") if FileTest.exist?("Data/#{filename[0]}")
rescue SystemCallError
end
end
@@ -1093,7 +1093,7 @@ module Compiler
pbPrintException(e)
data_files.each do |filename|
begin
File.delete("Data/#{filename[0]}") if safeExists?("Data/#{filename[0]}")
File.delete("Data/#{filename[0]}") if FileTest.exist?("Data/#{filename[0]}")
rescue SystemCallError
end
end

View File

@@ -3,7 +3,7 @@ module Compiler
def compile_PBS_file_generic(game_data, *paths)
if game_data.const_defined?(:OPTIONAL) && game_data::OPTIONAL
return if paths.none? { |p| safeExists?(p) }
return if paths.none? { |p| FileTest.exist?(p) }
end
game_data::DATA.clear
schema = game_data.schema
@@ -947,7 +947,7 @@ module Compiler
"Pokemon" => [1, "s"],
"Challenges" => [2, "*s"]
}
if !safeExists?(path)
if !FileTest.exist?(path)
File.open(path, "wb") do |f|
f.write(0xEF.chr)
f.write(0xBB.chr)
@@ -987,12 +987,12 @@ module Compiler
rsection[3] = rsection[0]
rsection[4] = rsection[1]
rsection[5] = (name == "DefaultTrainerList")
if safeExists?("PBS/" + rsection[0])
if FileTest.exist?("PBS/" + rsection[0])
rsection[0] = compile_battle_tower_trainers("PBS/" + rsection[0])
else
rsection[0] = []
end
if safeExists?("PBS/" + rsection[1])
if FileTest.exist?("PBS/" + rsection[1])
filename = "PBS/" + rsection[1]
rsection[1] = []
pbCompilerEachCommentedLine(filename) do |line, _lineno|
@@ -1027,7 +1027,7 @@ module Compiler
beginspeech = []
endspeechwin = []
endspeechlose = []
if safeExists?(filename)
if FileTest.exist?(filename)
File.open(filename, "rb") do |f|
FileLineData.file = filename
pbEachFileSection(f) do |section, name|

View File

@@ -24,7 +24,7 @@ end
def mainFunctionDebug
begin
MessageTypes.load_default_messages if safeExists?("Data/messages_core.dat")
MessageTypes.load_default_messages if FileTest.exist?("Data/messages_core.dat")
PluginManager.runPlugins
Compiler.main
Game.initialize

View File

@@ -185,7 +185,7 @@ RockSmash,50
90,NOSEPASS,13,14
10,GEODUDE,12,15
#-------------------------------
[049] # Rock Cave
[049] # Rock Cave 1F
Cave,5
20,MAGNETON,14,16
20,MAGNETON,14,17
@@ -194,7 +194,7 @@ Cave,5
10,GEODUDE,13,15
10,MAWILE,14,16
#-------------------------------
[050] # Rock Cave
[050] # Rock Cave B1F
Cave,5
20,MAGNETON,14,16
20,MAGNETON,14,17
@@ -212,7 +212,7 @@ Cave,5
10,RIOLU,1
10,TYROGUE,1
#-------------------------------
[066] # Safari Zone
[066] # Safari Zone outside
Land,21
20,ABRA,12,15
20,DODUO,13,15
@@ -282,7 +282,7 @@ SuperRod
15,CORSOLA,15,18
5,STARYU,15,17
#-------------------------------
[070] # Underwater
[070] # Route 8 underwater
Land,21
20,CHINCHOU,17,21
20,CLAMPERL,18,20

View File

@@ -2511,8 +2511,8 @@ Description = One of a variety of mysterious Mega Stones. Have Venusaur hold it,
Name = Charizardite X
NamePlural = Charizardite Xs
Pocket = 1
BPPrice = 50
Price = 0
BPPrice = 50
Flags = MegaStone,Fling_80
Description = One of a variety of mysterious Mega Stones. Have Charizard hold it, and it will be able to Mega Evolve.
#-------------------------------

View File

@@ -1,12 +1,12 @@
# See the documentation on the wiki to learn how to edit this file.
#-------------------------------
# Route 5 (41) - Route 4 (40)
# Route 5 (41) - Route 4 Cycling Road (40)
41,N,0,40,S,0
# Route 5 (41) - Route 6 (45)
# Route 5 (41) - Route 6 Cycling Road (45)
41,S,6,45,N,0
# Route 6 (44) - Route 1 (5)
44,S,43,5,N,0
# Safari Zone (66) - Route 1 (5)
# Safari Zone outside (66) - Route 1 (5)
66,N,18,5,S,0
# Cedolan City (7) - Route 1 (5)
7,S,0,5,N,2
@@ -14,11 +14,11 @@
2,N,0,5,S,4
# Cedolan City (7) - Route 6 (44)
7,W,5,44,E,0
# Lappet Town (2) - Safari Zone (66)
# Lappet Town (2) - Safari Zone outside (66)
2,W,0,66,E,0
# Route 8 (69) - Safari Zone (66)
# Route 8 (69) - Safari Zone outside (66)
69,N,0,66,S,10
# Ingido Plateau (35) - Route 4 (39)
# Ingido Plateau outside (35) - Route 4 (39)
35,W,11,39,E,0
# Cedolan City (7) - Lerucean Town (23)
7,E,0,23,W,78
@@ -30,7 +30,7 @@
47,W,0,7,E,0
# Route 2 (21) - Cedolan City (7)
21,S,0,7,N,21
# Route 3 (31) - Ingido Plateau (35)
# Route 3 (31) - Ingido Plateau outside (35)
31,W,0,35,E,10
# Route 8 (69) - Lappet Town (2)
69,N,12,2,S,0

View File

@@ -17,7 +17,6 @@ MapPosition = 0,13,12
#-------------------------------
[004] # Pokémon Lab
Name = Pokémon Lab
ShowArea = false
MapPosition = 0,13,12
#-------------------------------
[005] # Route 1

View File

@@ -5284,6 +5284,7 @@ Evolutions = MISMAGIUS,Item,DUSKSTONE
#-------------------------------
[UNOWN]
Name = Unown
FormName = A
Types = PSYCHIC
BaseStats = 48,72,48,48,72,48
GenderRatio = Genderless
@@ -5304,7 +5305,6 @@ Shape = Head
Habitat = Rare
Category = Symbol
Pokedex = This Pokémon is shaped like ancient text characters. Although research is ongoing, it is a mystery as to which came first, the ancient writings or the various Unown.
FormName = A
Generation = 2
#-------------------------------
[WOBBUFFET]
@@ -9249,6 +9249,7 @@ Generation = 3
#-------------------------------
[CASTFORM]
Name = Castform
FormName = Normal Form
Types = NORMAL
BaseStats = 70,70,70,70,70,70
GenderRatio = Female50Percent
@@ -9270,7 +9271,6 @@ Shape = Head
Habitat = Grassland
Category = Weather
Pokedex = It alters its form depending on the weather. Changes in the climate such as the temperature and humidity appear to affect its cellular structure.
FormName = Normal Form
Generation = 3
WildItemCommon = MYSTICWATER
WildItemUncommon = MYSTICWATER
@@ -10176,6 +10176,7 @@ WildItemRare = STARPIECE
#-------------------------------
[DEOXYS]
Name = Deoxys
FormName = Normal Forme
Types = PSYCHIC
BaseStats = 50,150,50,150,150,50
GenderRatio = Genderless
@@ -10196,7 +10197,6 @@ Shape = Bipedal
Habitat = Rare
Category = DNA
Pokedex = A Pokémon that mutated from an extraterrestrial virus exposed to a laser beam. Its body is configured for superior agility and speed.
FormName = Normal Forme
Generation = 3
Flags = Mythical
#-------------------------------
@@ -10831,6 +10831,7 @@ Generation = 4
#-------------------------------
[BURMY]
Name = Burmy
FormName = Plant Cloak
Types = BUG
BaseStats = 40,29,45,36,29,45
GenderRatio = Female50Percent
@@ -10851,13 +10852,13 @@ Color = Green
Shape = HeadBase
Category = Bagworm
Pokedex = To shelter itself from cold, wintry winds, it covers itself with a cloak made of twigs and leaves.
FormName = Plant Cloak
Generation = 4
Flags = InheritFormFromMother
Evolutions = WORMADAM,LevelFemale,20,MOTHIM,LevelMale,20
#-------------------------------
[WORMADAM]
Name = Wormadam
FormName = Plant Cloak
Types = BUG,GRASS
BaseStats = 60,59,85,36,79,105
GenderRatio = AlwaysFemale
@@ -10878,7 +10879,6 @@ Color = Green
Shape = HeadBase
Category = Bagworm
Pokedex = When Burmy evolved, its cloak became a part of this Pokémon's body. The cloak is never shed.
FormName = Plant Cloak
Generation = 4
Flags = InheritFormFromMother
WildItemUncommon = SILVERPOWDER
@@ -11063,6 +11063,7 @@ Evolutions = CHERRIM,Level,25
#-------------------------------
[CHERRIM]
Name = Cherrim
FormName = Overcast Form
Types = GRASS
BaseStats = 70,60,70,85,87,78
GenderRatio = Female50Percent
@@ -11082,12 +11083,12 @@ Color = Purple
Shape = HeadLegs
Category = Blossom
Pokedex = Its folded petals are pretty tough. Bird Pokémon can peck at them all they want, and Cherrim won't be bothered at all.
FormName = Overcast Form
Generation = 4
WildItemUncommon = MIRACLESEED
#-------------------------------
[SHELLOS]
Name = Shellos
FormName = West Sea
Types = WATER
BaseStats = 76,48,48,34,57,62
GenderRatio = Female50Percent
@@ -11109,13 +11110,13 @@ Color = Purple
Shape = Serpentine
Category = Sea Slug
Pokedex = This Pokémon's habitat shapes its physique. According to some theories, life in warm ocean waters causes this variation to develop.
FormName = West Sea
Generation = 4
Flags = InheritFormFromMother
Evolutions = GASTRODON,Level,30
#-------------------------------
[GASTRODON]
Name = Gastrodon
FormName = West Sea
Types = WATER,GROUND
BaseStats = 111,83,68,39,92,82
GenderRatio = Female50Percent
@@ -11136,7 +11137,6 @@ Color = Purple
Shape = Serpentine
Category = Sea Slug
Pokedex = Its search for food sometimes leads it onto land, where it leaves behind a sticky trail of slime as it passes through.
FormName = West Sea
Generation = 4
Flags = InheritFormFromMother
#-------------------------------
@@ -12526,6 +12526,7 @@ Generation = 4
#-------------------------------
[ROTOM]
Name = Rotom
FormName = Rotom
Types = ELECTRIC,GHOST
BaseStats = 50,50,77,91,95,77
GenderRatio = Genderless
@@ -12545,7 +12546,6 @@ Color = Red
Shape = Head
Category = Plasma
Pokedex = Its body is composed of plasma. It is known to infiltrate electronic devices and wreak havoc.
FormName = Rotom
Generation = 4
#-------------------------------
[UXIE]
@@ -12721,6 +12721,7 @@ Flags = Legendary
#-------------------------------
[GIRATINA]
Name = Giratina
FormName = Altered Forme
Types = GHOST,DRAGON
BaseStats = 150,100,120,90,100,120
GenderRatio = Genderless
@@ -12741,7 +12742,6 @@ Color = Black
Shape = Multiped
Category = Renegade
Pokedex = A Pokémon that is said to live in a world on the reverse side of ours. It appears in an ancient cemetery.
FormName = Altered Forme
Generation = 4
Flags = Legendary
#-------------------------------
@@ -12844,6 +12844,7 @@ Flags = Mythical
#-------------------------------
[SHAYMIN]
Name = Shaymin
FormName = Land Forme
Types = GRASS
BaseStats = 100,100,100,100,100,100
GenderRatio = Genderless
@@ -12863,7 +12864,6 @@ Color = Green
Shape = Quadruped
Category = Gratitude
Pokedex = It lives in flower patches and avoids detection by curling up to look like a flowering plant.
FormName = Land Forme
Generation = 4
Flags = Mythical
WildItemCommon = LUMBERRY
@@ -12872,6 +12872,7 @@ WildItemRare = LUMBERRY
#-------------------------------
[ARCEUS]
Name = Arceus
FormName = Normal Type
Types = NORMAL
BaseStats = 120,120,120,120,120,120
GenderRatio = Genderless
@@ -12891,7 +12892,6 @@ Color = White
Shape = Quadruped
Category = Alpha
Pokedex = It is described in mythology as the Pokémon that shaped the universe with its 1,000 arms.
FormName = Normal Type
Generation = 4
Flags = Mythical
#-------------------------------
@@ -14314,6 +14314,7 @@ WildItemUncommon = ABSORBBULB
#-------------------------------
[BASCULIN]
Name = Basculin
FormName = Red-Striped
Types = WATER
BaseStats = 70,92,65,98,80,55
GenderRatio = Female50Percent
@@ -14335,7 +14336,6 @@ Color = Green
Shape = Finned
Category = Hostile
Pokedex = Savage, violent Pokémon, red and blue Basculin are always fighting each other over territory.
FormName = Red-Striped
Generation = 5
Flags = InheritFormFromMother
WildItemUncommon = DEEPSEATOOTH
@@ -14446,6 +14446,7 @@ Evolutions = DARMANITAN,Level,35
#-------------------------------
[DARMANITAN]
Name = Darmanitan
FormName = Standard Mode
Types = FIRE
BaseStats = 105,140,55,95,30,55
GenderRatio = Female50Percent
@@ -14466,7 +14467,6 @@ Color = Red
Shape = Quadruped
Category = Blazing
Pokedex = When weakened in battle, it transforms into a stone statue. Then it sharpens its mind and fights on mentally.
FormName = Standard Mode
Generation = 5
#-------------------------------
[MARACTUS]
@@ -15203,6 +15203,7 @@ WildItemCommon = NEVERMELTICE
#-------------------------------
[DEERLING]
Name = Deerling
FormName = Spring Form
Types = NORMAL,GRASS
BaseStats = 60,60,50,75,40,50
GenderRatio = Female50Percent
@@ -15224,12 +15225,12 @@ Color = Pink
Shape = Quadruped
Category = Season
Pokedex = The turning of the seasons changes the color and scent of this Pokémon's fur. People use it to mark the seasons.
FormName = Spring Form
Generation = 5
Evolutions = SAWSBUCK,Level,34
#-------------------------------
[SAWSBUCK]
Name = Sawsbuck
FormName = Spring Form
Types = NORMAL,GRASS
BaseStats = 80,100,70,95,60,70
GenderRatio = Female50Percent
@@ -15250,7 +15251,6 @@ Color = Brown
Shape = Quadruped
Category = Season
Pokedex = The plants growing on its horns change according to the season. The leaders of the herd possess magnificent horns.
FormName = Spring Form
Generation = 5
#-------------------------------
[EMOLGA]
@@ -16603,6 +16603,7 @@ Flags = Legendary
#-------------------------------
[TORNADUS]
Name = Tornadus
FormName = Incarnate Forme
Types = FLYING
BaseStats = 79,115,70,111,125,80
GenderRatio = AlwaysMale
@@ -16623,12 +16624,12 @@ Color = Green
Shape = HeadArms
Category = Cyclone
Pokedex = Tornadus expels massive energy from its tail, causing severe storms. Its power is great enough to blow houses away.
FormName = Incarnate Forme
Generation = 5
Flags = Legendary
#-------------------------------
[THUNDURUS]
Name = Thundurus
FormName = Incarnate Forme
Types = ELECTRIC,FLYING
BaseStats = 79,115,70,111,125,80
GenderRatio = AlwaysMale
@@ -16649,7 +16650,6 @@ Color = Blue
Shape = HeadArms
Category = Bolt Strike
Pokedex = The spikes on its tail discharge immense bolts of lightning. It flies around the Unova region firing off lightning bolts.
FormName = Incarnate Forme
Generation = 5
Flags = Legendary
#-------------------------------
@@ -16703,6 +16703,7 @@ Flags = Legendary
#-------------------------------
[LANDORUS]
Name = Landorus
FormName = Incarnate Forme
Types = GROUND,FLYING
BaseStats = 89,125,90,101,115,80
GenderRatio = AlwaysMale
@@ -16723,7 +16724,6 @@ Color = Brown
Shape = HeadArms
Category = Abundance
Pokedex = The energy that comes pouring from its tail increases the nutrition in the soil, making crops grow to great size.
FormName = Incarnate Forme
Generation = 5
Flags = Legendary
#-------------------------------
@@ -16753,6 +16753,7 @@ Flags = Legendary
#-------------------------------
[KELDEO]
Name = Keldeo
FormName = Ordinary Form
Types = WATER,FIGHTING
BaseStats = 91,72,90,108,129,90
GenderRatio = Genderless
@@ -16772,12 +16773,12 @@ Color = Yellow
Shape = Quadruped
Category = Colt
Pokedex = It crosses the world, running over the surfaces of oceans and rivers. It appears at scenic waterfronts.
FormName = Ordinary Form
Generation = 5
Flags = Mythical
#-------------------------------
[MELOETTA]
Name = Meloetta
FormName = Aria Forme
Types = NORMAL,PSYCHIC
BaseStats = 100,77,77,90,128,128
GenderRatio = Genderless
@@ -16797,7 +16798,6 @@ Color = White
Shape = Bipedal
Category = Melody
Pokedex = Many famous songs have been inspired by the melodies that Meloetta plays.
FormName = Aria Forme
Generation = 5
Flags = Mythical
WildItemCommon = STARPIECE
@@ -16806,6 +16806,7 @@ WildItemRare = STARPIECE
#-------------------------------
[GENESECT]
Name = Genesect
FormName = Normal
Types = BUG,STEEL
BaseStats = 71,120,95,99,120,95
GenderRatio = Genderless
@@ -16825,7 +16826,6 @@ Color = Purple
Shape = Bipedal
Category = Paleozoic
Pokedex = This ancient bug Pokémon was altered by Team Plasma. They upgraded the cannon on its back.
FormName = Normal
Generation = 5
Flags = Mythical
#-------------------------------
@@ -17232,6 +17232,7 @@ Evolutions = VIVILLON,Level,12
#-------------------------------
[VIVILLON]
Name = Vivillon
FormName = Archipelago Pattern
Types = BUG,FLYING
BaseStats = 80,52,50,89,90,50
GenderRatio = Female50Percent
@@ -17252,7 +17253,6 @@ Color = White
Shape = MultiWinged
Category = Scale
Pokedex = Vivillon with many different patterns are found all over the world. These patterns are affected by the climate of their habitat.
FormName = Archipelago Pattern
Generation = 6
#-------------------------------
[LITLEO]
@@ -17307,6 +17307,7 @@ Generation = 6
#-------------------------------
[FLABEBE]
Name = Flabébé
FormName = Red Flower
Types = FAIRY
BaseStats = 44,38,39,42,61,79
GenderRatio = AlwaysFemale
@@ -17328,13 +17329,13 @@ Color = White
Shape = HeadArms
Category = Single Bloom
Pokedex = When it finds a flower it likes, it dwells on that flower its whole life long. It floats in the wind's embrace with an untroubled heart.
FormName = Red Flower
Generation = 6
Flags = InheritFormFromMother
Evolutions = FLOETTE,Level,19
#-------------------------------
[FLOETTE]
Name = Floette
FormName = Red Flower
Types = FAIRY
BaseStats = 54,45,47,52,75,98
GenderRatio = AlwaysFemale
@@ -17355,13 +17356,13 @@ Color = White
Shape = HeadArms
Category = Single Bloom
Pokedex = It flutters around fields of flowers and cares for flowers that are starting to wilt. It draws out the power of flowers to battle.
FormName = Red Flower
Generation = 6
Flags = InheritFormFromMother
Evolutions = FLORGES,Item,SHINYSTONE
#-------------------------------
[FLORGES]
Name = Florges
FormName = Red Flower
Types = FAIRY
BaseStats = 78,65,68,75,112,154
GenderRatio = AlwaysFemale
@@ -17382,7 +17383,6 @@ Color = White
Shape = HeadArms
Category = Garden
Pokedex = It claims exquisite flower gardens as its territory, and it obtains power from basking in the energy emitted by flowering plants.
FormName = Red Flower
Generation = 6
Flags = InheritFormFromMother
#-------------------------------
@@ -17490,6 +17490,7 @@ WildItemUncommon = MENTALHERB
#-------------------------------
[FURFROU]
Name = Furfrou
FormName = Natural Form
Types = NORMAL
BaseStats = 75,80,60,102,65,90
GenderRatio = Female50Percent
@@ -17510,7 +17511,6 @@ Color = White
Shape = Quadruped
Category = Poodle
Pokedex = Trimming its fluffy fur not only makes it more elegant but also increases the swiftness of its movements.
FormName = Natural Form
Generation = 6
#-------------------------------
[ESPURR]
@@ -17541,6 +17541,7 @@ Evolutions = MEOWSTIC,Level,25
#-------------------------------
[MEOWSTIC]
Name = Meowstic
FormName = Male
Types = PSYCHIC
BaseStats = 74,48,76,104,83,81
GenderRatio = Female50Percent
@@ -17561,7 +17562,6 @@ Color = Blue
Shape = BipedalTail
Category = Constraint
Pokedex = Revealing the eyelike patterns on the insides of its ears will unleash its psychic powers. It normally keeps the patterns hidden, however.
FormName = Male
Generation = 6
#-------------------------------
[HONEDGE]
@@ -17615,6 +17615,7 @@ Evolutions = AEGISLASH,Item,DUSKSTONE
#-------------------------------
[AEGISLASH]
Name = Aegislash
FormName = Shield Forme
Types = STEEL,GHOST
BaseStats = 60,50,140,60,50,140
GenderRatio = Female50Percent
@@ -17634,7 +17635,6 @@ Color = Brown
Shape = HeadBase
Category = Royal Sword
Pokedex = In this defensive stance, Aegislash uses its steel body and a force field of spectral power to reduce the damage of any attack.
FormName = Shield Forme
Generation = 6
#-------------------------------
[SPRITZEE]
@@ -18338,6 +18338,7 @@ Generation = 6
#-------------------------------
[PUMPKABOO]
Name = Pumpkaboo
FormName = Small Size
Types = GHOST,GRASS
BaseStats = 44,66,70,56,44,55
GenderRatio = Female50Percent
@@ -18358,13 +18359,13 @@ Color = Brown
Shape = Head
Category = Pumpkin
Pokedex = When taking spirits to the afterlife, small Pumpkaboo prefer the spirits of children to those of adults.
FormName = Small Size
Generation = 6
Flags = InheritFormFromMother
Evolutions = GOURGEIST,Trade,
#-------------------------------
[GOURGEIST]
Name = Gourgeist
FormName = Small Size
Types = GHOST,GRASS
BaseStats = 55,85,122,99,58,75
GenderRatio = Female50Percent
@@ -18384,7 +18385,6 @@ Color = Brown
Shape = HeadBase
Category = Pumpkin
Pokedex = Small Gourgeist pretend to be children to fool adults. Anyone who falls for the act gets carried away to the hereafter.
FormName = Small Size
Generation = 6
Flags = InheritFormFromMother
#-------------------------------
@@ -18490,6 +18490,7 @@ Generation = 6
#-------------------------------
[XERNEAS]
Name = Xerneas
FormName = Neutral Mode
Types = FAIRY
BaseStats = 126,131,95,99,131,98
GenderRatio = Genderless
@@ -18509,7 +18510,6 @@ Color = Blue
Shape = Quadruped
Category = Life
Pokedex = Legends say it can share eternal life. It slept for a thousand years in the form of a tree before its revival.
FormName = Neutral Mode
Generation = 6
Flags = Legendary
#-------------------------------
@@ -18539,6 +18539,7 @@ Flags = Legendary
#-------------------------------
[ZYGARDE]
Name = Zygarde
FormName = 50% Forme
Types = DRAGON,GROUND
BaseStats = 108,100,121,95,81,95
GenderRatio = Genderless
@@ -18558,7 +18559,6 @@ Color = Green
Shape = Serpentine
Category = Order
Pokedex = It's thought to be monitoring the ecosystem. There are rumors that even greater power lies hidden within it.
FormName = 50% Forme
Generation = 6
Flags = Legendary
#-------------------------------
@@ -18588,6 +18588,7 @@ Flags = Mythical
#-------------------------------
[HOOPA]
Name = Hoopa
FormName = Hoopa Confined
Types = PSYCHIC,GHOST
BaseStats = 80,110,60,70,150,130
GenderRatio = Genderless
@@ -18607,7 +18608,6 @@ Color = Purple
Shape = HeadArms
Category = Mischief
Pokedex = This troublemaker sends anything and everything to faraway places using its loop, which can warp space.
FormName = Hoopa Confined
Generation = 6
Flags = Mythical
#-------------------------------
@@ -19117,6 +19117,7 @@ WildItemUncommon = CHERIBERRY
#-------------------------------
[ORICORIO]
Name = Oricorio
FormName = Baile Style
Types = FIRE,FLYING
BaseStats = 75,70,70,93,98,70
GenderRatio = Female75Percent
@@ -19137,7 +19138,6 @@ Color = Red
Shape = Winged
Category = Dancing
Pokedex = It beats its wings together to create fire. As it moves in the steps of its beautiful dance, it bathes opponents in intense flames.
FormName = Baile Style
Generation = 7
Flags = InheritFormFromMother
WildItemUncommon = HONEY
@@ -19222,6 +19222,7 @@ Evolutions = LYCANROC,Level,25
#-------------------------------
[LYCANROC]
Name = Lycanroc
FormName = Midday Form
Types = ROCK
BaseStats = 75,115,65,112,55,65
GenderRatio = Female50Percent
@@ -19242,11 +19243,11 @@ Color = Brown
Shape = Quadruped
Category = Wolf
Pokedex = Its quick movements confuse its enemies. Well equipped with claws and fangs, it also uses the sharp rocks in its mane as weapons.
FormName = Midday Form
Generation = 7
#-------------------------------
[WISHIWASHI]
Name = Wishiwashi
FormName = Solo Form
Types = WATER
BaseStats = 45,20,20,40,25,25
GenderRatio = Female50Percent
@@ -19267,7 +19268,6 @@ Color = Blue
Shape = Finned
Category = Small Fry
Pokedex = It's awfully weak and notably tasty, so everyone is always out to get it. As it happens, anyone trying to bully it receives a painful lesson.
FormName = Solo Form
Generation = 7
#-------------------------------
[MAREANIE]
@@ -19940,6 +19940,7 @@ Evolutions = SILVALLY,Happiness,
#-------------------------------
[SILVALLY]
Name = Silvally
FormName = Type: Normal
Types = NORMAL
BaseStats = 95,95,95,95,95,95
GenderRatio = Genderless
@@ -19959,12 +19960,12 @@ Color = Gray
Shape = Quadruped
Category = Synthetic
Pokedex = Its trust in its partner is what awakens it. This Pokémon is capable of changing its type, a flexibility that is well displayed in battle.
FormName = Type: Normal
Generation = 7
Flags = Legendary
#-------------------------------
[MINIOR]
Name = Minior
FormName = Meteor Form
Types = ROCK,FLYING
BaseStats = 60,60,100,60,60,100
GenderRatio = Genderless
@@ -19984,7 +19985,6 @@ Color = Brown
Shape = Head
Category = Meteor
Pokedex = Originally making its home in the ozone layer, it hurtles to the ground when the shell enclosing its body grows too heavy.
FormName = Meteor Form
Generation = 7
WildItemUncommon = STARPIECE
#-------------------------------
@@ -20065,6 +20065,7 @@ WildItemUncommon = ELECTRICSEED
#-------------------------------
[MIMIKYU]
Name = Mimikyu
FormName = Disguised Form
Types = GHOST,FAIRY
BaseStats = 55,90,80,96,50,105
GenderRatio = Female50Percent
@@ -20085,7 +20086,6 @@ Color = Yellow
Shape = Serpentine
Category = Disguise
Pokedex = A lonely Pokémon, it conceals its terrifying appearance beneath an old rag so it can get closer to people and other Pokémon.
FormName = Disguised Form
Generation = 7
WildItemUncommon = CHESTOBERRY
#-------------------------------
@@ -21828,6 +21828,7 @@ Evolutions = TOXTRICITY,Level,30
#-------------------------------
[TOXTRICITY]
Name = Toxtricity
FormName = Amped Form
Types = ELECTRIC,POISON
BaseStats = 75,98,70,75,114,70
GenderRatio = Female50Percent
@@ -21848,7 +21849,6 @@ Color = Purple
Shape = BipedalTail
Category = Punk
Pokedex = When this Pokémon sounds as if it's strumming a guitar, it's actually clawing at the protrusions on its chest to generate electricity.
FormName = Amped Form
Generation = 8
#-------------------------------
[SIZZLIPEDE]
@@ -21953,6 +21953,7 @@ Generation = 8
#-------------------------------
[SINISTEA]
Name = Sinistea
FormName = Phony Form
Types = GHOST
BaseStats = 40,45,45,50,74,54
GenderRatio = Genderless
@@ -21973,12 +21974,12 @@ Color = Purple
Shape = Head
Category = Black Tea
Pokedex = The teacup in which this Pokémon makes its home is a famous piece of antique tableware. Many forgeries are in circulation.
FormName = Phony Form
Generation = 8
Evolutions = POLTEAGEIST,Item,CRACKEDPOT
#-------------------------------
[POLTEAGEIST]
Name = Polteageist
FormName = Phony Form
Types = GHOST
BaseStats = 60,65,65,70,134,114
GenderRatio = Genderless
@@ -21999,7 +22000,6 @@ Color = Purple
Shape = Head
Category = Black Tea
Pokedex = This species lives in antique teapots. Most pots are forgeries, but on rare occasions, an authentic work is found.
FormName = Phony Form
Generation = 8
#-------------------------------
[HATENNA]
@@ -22335,6 +22335,7 @@ Evolutions = ALCREMIE,HoldItem,STRAWBERRYSWEET,ALCREMIE,HoldItem,BERRYSWEET,ALCR
#-------------------------------
[ALCREMIE]
Name = Alcremie
FormName = Vanilla Cream
Types = FAIRY
BaseStats = 65,60,75,64,110,121
GenderRatio = AlwaysFemale
@@ -22355,7 +22356,6 @@ Color = White
Shape = HeadBase
Category = Cream
Pokedex = When Alcremie is content, the cream it secretes from its hands becomes sweeter and richer.
FormName = Vanilla Cream
Generation = 8
#-------------------------------
[FALINKS]
@@ -22484,6 +22484,7 @@ Generation = 8
#-------------------------------
[EISCUE]
Name = Eiscue
FormName = Ice Face
Types = ICE
BaseStats = 75,80,110,50,65,90
GenderRatio = Female50Percent
@@ -22504,11 +22505,11 @@ Color = Blue
Shape = BipedalTail
Category = Penguin
Pokedex = It drifted in on the flow of ocean waters from a frigid place. It keeps its head iced constantly to make sure it stays nice and cold.
FormName = Ice Face
Generation = 8
#-------------------------------
[INDEEDEE]
Name = Indeedee
FormName = Male
Types = PSYCHIC,NORMAL
BaseStats = 60,65,55,95,105,95
GenderRatio = Female50Percent
@@ -22530,11 +22531,11 @@ Color = Purple
Shape = BipedalTail
Category = Emotion
Pokedex = It uses the horns on its head to sense the emotions of others. Males will act as valets for those they serve, looking after their every need.
FormName = Male
Generation = 8
#-------------------------------
[MORPEKO]
Name = Morpeko
FormName = Full Belly Mode
Types = ELECTRIC,DARK
BaseStats = 58,95,58,97,70,58
GenderRatio = Female50Percent
@@ -22555,7 +22556,6 @@ Color = Yellow
Shape = Bipedal
Category = Two-Sided
Pokedex = As it eats the seeds stored up in its pocket-like pouches, this Pokémon is not just satisfying its constant hunger. It's also generating electricity.
FormName = Full Belly Mode
Generation = 8
#-------------------------------
[CUFANT]
@@ -22808,6 +22808,7 @@ Generation = 8
#-------------------------------
[ZACIAN]
Name = Zacian
FormName = Hero of Many Battles
Types = FAIRY
BaseStats = 92,130,115,138,80,115
GenderRatio = Genderless
@@ -22827,7 +22828,6 @@ Color = Blue
Shape = Quadruped
Category = Warrior
Pokedex = Known as a legendary hero, this Pokémon absorbs metal particles, transforming them into a weapon it uses to battle.
FormName = Hero of Many Battles
Generation = 8
Flags = Legendary
WildItemCommon = RUSTEDSWORD
@@ -22836,6 +22836,7 @@ WildItemRare = RUSTEDSWORD
#-------------------------------
[ZAMAZENTA]
Name = Zamazenta
FormName = Hero of Many Battles
Types = FIGHTING
BaseStats = 92,130,115,138,80,115
GenderRatio = Genderless
@@ -22855,7 +22856,6 @@ Color = Red
Shape = Quadruped
Category = Warrior
Pokedex = This Pokémon slept for aeons while in the form of a statue. It was asleep for so long, people forgot that it ever existed.
FormName = Hero of Many Battles
Generation = 8
Flags = Legendary
WildItemCommon = RUSTEDSHIELD
@@ -22913,6 +22913,7 @@ Evolutions = URSHIFU,Event,1
#-------------------------------
[URSHIFU]
Name = Urshifu
FormName = Single Strike Style
Types = FIGHTING,DARK
BaseStats = 100,130,100,97,63,60
GenderRatio = FemaleOneEighth
@@ -22932,7 +22933,6 @@ Color = Gray
Shape = Bipedal
Category = Wushu
Pokedex = Inhabiting the mountains of a distant region, this Pokémon races across sheer cliffs, training its legs and refining its moves.
FormName = Single Strike Style
Generation = 8
Flags = Legendary
#-------------------------------

View File

@@ -1,4 +1,4 @@
# See the documentation on the wiki to learn how to edit this file.
# See the documentation on the wiki to learn how to edit this file.
#-------------------------------
[CAMPER,Liam]
LoseText = A very good battle, indeed!
@@ -9,31 +9,31 @@ Pokemon = BONSLY,11
Items = FULLRESTORE,FULLRESTORE
LoseText = Very good.
Pokemon = GEODUDE,12
Gender = male
Moves = DEFENSECURL,HEADSMASH,ROCKPOLISH,ROCKTHROW
AbilityIndex = 0
Gender = male
IV = 20,20,20,20,20,20
Pokemon = ONIX,14
Name = Rocky
Gender = male
Shiny = yes
Moves = HEADSMASH,ROCKTHROW,RAGE,ROCKTOMB
AbilityIndex = 0
Item = SITRUSBERRY
Gender = male
IV = 20,20,20,20,20,20
Shiny = true
Ball = HEAVYBALL
#-------------------------------
[TEAMROCKET_M,Grunt,1]
LoseText = You're too good for me!
Pokemon = WEEPINBELL,21
Shadow = yes
Shadow = true
#-------------------------------
[TEAMROCKET_F,Grunt,1]
LoseText = You're too good for me!
Pokemon = BURMY,19
Pokemon = WINGULL,19
Pokemon = ELECTABUZZ,20
Shadow = yes
Shadow = true
#-------------------------------
[YOUNGSTER,Ben]
LoseText = Aww, I lost.