Files
infinitefusion-e18/Data/Scripts/021_Debug/004_Editor_Screens.rb
2020-11-19 21:00:29 +00:00

1492 lines
60 KiB
Ruby

#===============================================================================
# Wild encounters editor
#===============================================================================
def pbEncounterEditorTypes(enc,enccmd)
commands = []
indexes = []
haveblank = false
if enc
commands.push(_INTL("Density: {1},{2},{3}",
enc[0][EncounterTypes::Land],
enc[0][EncounterTypes::Cave],
enc[0][EncounterTypes::Water]))
indexes.push(-2)
for i in 0...EncounterTypes::EnctypeChances.length
if enc[1][i]
commands.push(EncounterTypes::Names[i])
indexes.push(i)
else
haveblank = true
end
end
else
commands.push(_INTL("Density: Not Defined Yet"))
indexes.push(-2)
haveblank = true
end
if haveblank
commands.push(_INTL("[New Encounter Type]"))
indexes.push(-3)
end
enccmd.x = 0
enccmd.y = 0
enccmd.height = Graphics.height if enccmd.height>Graphics.height
enccmd.z = 99999
enccmd.commands = commands
enccmd.active = true
enccmd.index = 0
enccmd.visible = true
command = 0
loop do
Graphics.update
Input.update
enccmd.update
if Input.trigger?(Input::A) && indexes[enccmd.index]>=0
if pbConfirmMessage(_INTL("Delete the encounter type {1}?",commands[enccmd.index]))
enc[1][indexes[enccmd.index]] = nil
commands.delete_at(enccmd.index)
indexes.delete_at(enccmd.index)
enccmd.commands = commands
if enccmd.index>=enccmd.commands.length
enccmd.index = enccmd.commands.length
end
end
elsif Input.trigger?(Input::B)
command = -1
break
elsif Input.trigger?(Input::C) || (enccmd.doubleclick? rescue false)
command = enccmd.index
break
end
end
ret = command
enccmd.active = false
return (ret<0) ? -1 : indexes[ret]
end
def pbNewEncounterType(enc)
cmdwin = pbListWindow([])
commands =[]
indexes = []
for i in 0...EncounterTypes::EnctypeChances.length
dogen = false
if !enc[1][i]
if i==0
dogen = true unless enc[1][EncounterTypes::Cave]
elsif i==1
dogen = true unless enc[1][EncounterTypes::Land] ||
enc[1][EncounterTypes::LandMorning] ||
enc[1][EncounterTypes::LandDay] ||
enc[1][EncounterTypes::LandNight] ||
enc[1][EncounterTypes::BugContest]
else
dogen = true
end
end
if dogen
commands.push(EncounterTypes::Names[i])
indexes.push(i)
end
end
ret = pbCommands2(cmdwin,commands,-1)
ret = (ret<0) ? -1 : indexes[ret]
if ret>=0
chances = EncounterTypes::EnctypeChances[ret]
enc[1][ret] = []
chances.length.times do
enc[1][ret].push([1,5,5])
end
end
cmdwin.dispose
return ret
end
def pbEditEncounterType(enc,etype)
commands = []
cmdwin = pbListWindow([])
chances = EncounterTypes::EnctypeChances[etype]
chancetotal = 0
chances.each { |a| chancetotal += a }
enctype = enc[1][etype]
for i in 0...chances.length
enctype[i] = [1,5,5] if !enctype[i]
end
ret = 0
loop do
commands.clear
for i in 0...enctype.length
ch = chances[i]
ch = sprintf("%.1f",100.0*chances[i]/chancetotal) if chancetotal!=100
if enctype[i][1]==enctype[i][2]
commands.push(_INTL("{1}% {2} (Lv.{3})",ch,PBSpecies.getName(enctype[i][0]),enctype[i][1]))
else
commands.push(_INTL("{1}% {2} (Lv.{3}-Lv.{4})",ch,PBSpecies.getName(enctype[i][0]),enctype[i][1],enctype[i][2]))
end
end
ret = pbCommands2(cmdwin,commands,-1,ret)
break if ret<0
species = pbChooseSpeciesList(enctype[ret][0])
next if species<=0
enctype[ret][0] = species if species>0
mLevel = PBExperience.maxLevel
params = ChooseNumberParams.new
params.setRange(1,mLevel)
params.setDefaultValue(enctype[ret][1])
minlevel = pbMessageChooseNumber(_INTL("Set the minimum level."),params)
params = ChooseNumberParams.new
params.setRange(minlevel,mLevel)
params.setDefaultValue(minlevel)
maxlevel = pbMessageChooseNumber(_INTL("Set the maximum level."),params)
enctype[ret][1] = minlevel
enctype[ret][2] = maxlevel
end
cmdwin.dispose
end
def pbEncounterEditorDensity(enc)
params = ChooseNumberParams.new
params.setRange(0,100)
params.setDefaultValue(enc[0][EncounterTypes::Land])
enc[0][EncounterTypes::Land] = pbMessageChooseNumber(
_INTL("Set the density of Pokémon on land (default {1}).",
EncounterTypes::EnctypeDensities[EncounterTypes::Land]),params)
params = ChooseNumberParams.new
params.setRange(0,100)
params.setDefaultValue(enc[0][EncounterTypes::Cave])
enc[0][EncounterTypes::Cave] = pbMessageChooseNumber(
_INTL("Set the density of Pokémon in caves (default {1}).",
EncounterTypes::EnctypeDensities[EncounterTypes::Cave]),params)
params = ChooseNumberParams.new
params.setRange(0,100)
params.setDefaultValue(enc[0][EncounterTypes::Water])
enc[0][EncounterTypes::Water] = pbMessageChooseNumber(
_INTL("Set the density of Pokémon on water (default {1}).",
EncounterTypes::EnctypeDensities[EncounterTypes::Water]),params)
for i in 0...EncounterTypes::EnctypeCompileDens.length
t = EncounterTypes::EnctypeCompileDens[i]
next if !t || t==0
enc[0][i] = enc[0][EncounterTypes::Land] if t==1
enc[0][i] = enc[0][EncounterTypes::Cave] if t==2
enc[0][i] = enc[0][EncounterTypes::Water] if t==3
end
end
def pbEncounterEditorMap(encdata,map)
enccmd = pbListWindow([])
# This window displays the help text
enchelp = Window_UnformattedTextPokemon.new("")
enchelp.x = Graphics.width/2
enchelp.y = 0
enchelp.width = Graphics.width/2 - 32
enchelp.height = 96
enchelp.z = 99999
mapinfos = load_data("Data/MapInfos.rxdata")
mapname = mapinfos[map].name
loop do
enc = encdata[map]
enchelp.text = _ISPRINTF("{1:03d}: {2:s}\r\nChoose a method",map,mapname)
choice = pbEncounterEditorTypes(enc,enccmd)
if !enc
enc = [EncounterTypes::EnctypeDensities.clone,[]]
encdata[map] = enc
end
if choice==-2
pbEncounterEditorDensity(enc)
elsif choice==-1
break
elsif choice==-3
ret = pbNewEncounterType(enc)
if ret>=0
enchelp.text = _ISPRINTF("{1:03d}: {2:s}\r\n{3:s}",map,mapname,EncounterTypes::Names[ret])
pbEditEncounterType(enc,ret)
end
else
enchelp.text = _ISPRINTF("{1:03d}: {2:s}\r\n{3:s}",map,mapname,EncounterTypes::Names[choice])
pbEditEncounterType(enc,choice)
end
end
if encdata[map][1].length==0
encdata[map] = nil
end
enccmd.dispose
enchelp.dispose
Input.update
end
#===============================================================================
# Trainer type editor
#===============================================================================
def pbTrainerTypeEditorNew(trconst)
data = pbLoadTrainerTypesData
# Get the first unused ID after all existing t-types for the new t-type to use.
maxid = -1
for rec in data
next if !rec
maxid = rec[0] if rec[0]>maxid
end
trainertype = maxid+1
trname = pbMessageFreeText(_INTL("Please enter the trainer type's name."),
(trconst) ? trconst.gsub(/_+/," ") : "",false,30)
return -1 if trname=="" && !trconst
# Create an internal name based on the trainer type's name if there is none.
trconst = trname if !trconst
trconst = trconst.gsub(/é/,"e")
trconst = trconst.gsub(/[^A-Za-z0-9_]/,"")
trconst = trconst.upcase
if trconst.length==0
trconst = sprintf("T_%03d",trainertype)
elsif !trconst[0,1][/[A-Z]/]
trconst = "T_"+trconst
end
# Create a default name if there is none.
trname = trconst if trname==""
cname = trconst
if hasConst?(PBTrainers,cname)
suffix = 1
100.times do
tname = sprintf("%s_%d",cname,suffix)
if !hasConst?(PBTrainers,tname)
cname = tname
break
end
suffix += 1
end
end
if hasConst?(PBTrainers,cname)
pbMessage(_INTL("Failed to create the trainer type. Choose a different name."))
return -1
end
record = []
record[0] = trainertype
record[1] = cname
record[2] = trname
record[7] = pbMessage(_INTL("Is the Trainer male, female, or mixed gender?"),[
_INTL("Male"),_INTL("Female"),_INTL("Mixed")],0)
params = ChooseNumberParams.new
params.setRange(0,255)
params.setDefaultValue(30)
record[3] = pbMessageChooseNumber(_INTL("Set the money per level won for defeating the Trainer."),params)
record[8] = record[3]
record[9] = ""
PBTrainers.const_set(cname,record[0])
data[record[0]] = record
save_data(data,"Data/trainer_types.dat")
$PokemonTemp.trainerTypesData = nil
pbConvertTrainerData
pbMessage(_INTL("The Trainer type was created (ID: {1}).",record[0]))
pbMessage(_ISPRINTF("Put the Trainer's graphic (trainer{1:03d}.png or trainer{2:s}.png) in Graphics/Characters, or it will be blank.",
record[0],getConstantName(PBTrainers,record[0])))
return record[0]
end
def pbTrainerTypeEditorSave(trainertype,ttdata)
record = []
record[0] = trainertype
for i in 0..ttdata.length
record.push(ttdata[i])
end
setConstantName(PBTrainers,trainertype,ttdata[0])
data = pbLoadTrainerTypesData
data[record[0]] = record
save_data(data,"Data/trainer_types.dat")
$PokemonTemp.trainerTypesData = nil
pbConvertTrainerData
end
def pbTrainerTypeEditor
selection = 0
trainerTypes = [
[_INTL("Internal Name"), ReadOnlyProperty, _INTL("Internal name that appears in constructs like PBTrainers::XXX.")],
[_INTL("Trainer Name"), StringProperty, _INTL("Name of the trainer type as displayed by the game.")],
[_INTL("Money Per Level"), LimitProperty.new(9999), _INTL("Player earns this amount times the highest level among the trainer's Pokémon.")],
[_INTL("Battle BGM"), BGMProperty, _INTL("BGM played in battles against trainers of this type.")],
[_INTL("Battle End ME"), MEProperty, _INTL("ME played when player wins battles against trainers of this type.")],
[_INTL("Battle Intro ME"), MEProperty, _INTL("ME played before battles against trainers of this type.")],
[_INTL("Gender"), EnumProperty.new([
_INTL("Male"),_INTL("Female"),_INTL("Mixed gender")]),
_INTL("Gender of this Trainer type.")],
[_INTL("Skill"), LimitProperty.new(9999), _INTL("Skill level of this Trainer type.")],
[_INTL("Skill Codes"), StringProperty, _INTL("Letters/phrases representing AI modifications of trainers of this type.")],
]
pbListScreenBlock(_INTL("Trainer Types"),TrainerTypeLister.new(selection,true)) { |button,trtype|
if trtype
if button==Input::A
if trtype[0]>=0
if pbConfirmMessageSerious("Delete this trainer type?")
data = pbLoadTrainerTypesData
removeConstantValue(PBTrainers,trtype[0])
data[trtype[0]] = nil
save_data(data,"Data/trainer_types.dat")
$PokemonTemp.trainerTypesData = nil
pbConvertTrainerData
pbMessage(_INTL("The Trainer type was deleted."))
end
end
elsif button==Input::C
selection = trtype[0]
if selection<0
newid = pbTrainerTypeEditorNew(nil)
if newid>=0
selection = newid
end
else
data = []
for i in 1..trtype.length
data.push(trtype[i])
end
# trtype[2] contains trainer's name to display as title
save = pbPropertyList(trtype[2],data,trainerTypes,true)
if save
pbTrainerTypeEditorSave(selection,data)
end
end
end
end
}
end
#===============================================================================
# Individual trainer editor
#===============================================================================
module TrainerBattleProperty
def self.set(settingname,oldsetting)
return nil if !oldsetting
properties = [
[_INTL("Trainer Type"), TrainerTypeProperty, _INTL("Name of the trainer type for this Trainer.")],
[_INTL("Trainer Name"), StringProperty, _INTL("Name of the Trainer.")],
[_INTL("Battle ID"), LimitProperty.new(9999), _INTL("ID used to distinguish Trainers with the same name and trainer type.")],
[_INTL("Lose Text"), StringProperty, _INTL("Message shown in battle when the Trainer is defeated.")],
[_INTL("Pokémon 1"), TrainerPokemonProperty, _INTL("First Pokémon.")],
[_INTL("Pokémon 2"), TrainerPokemonProperty, _INTL("Second Pokémon.")],
[_INTL("Pokémon 3"), TrainerPokemonProperty, _INTL("Third Pokémon.")],
[_INTL("Pokémon 4"), TrainerPokemonProperty, _INTL("Fourth Pokémon.")],
[_INTL("Pokémon 5"), TrainerPokemonProperty, _INTL("Fifth Pokémon.")],
[_INTL("Pokémon 6"), TrainerPokemonProperty, _INTL("Sixth Pokémon.")],
[_INTL("Item 1"), ItemProperty, _INTL("Item used by the Trainer during battle.")],
[_INTL("Item 2"), ItemProperty, _INTL("Item used by the Trainer during battle.")],
[_INTL("Item 3"), ItemProperty, _INTL("Item used by the Trainer during battle.")],
[_INTL("Item 4"), ItemProperty, _INTL("Item used by the Trainer during battle.")],
[_INTL("Item 5"), ItemProperty, _INTL("Item used by the Trainer during battle.")],
[_INTL("Item 6"), ItemProperty, _INTL("Item used by the Trainer during battle.")],
[_INTL("Item 7"), ItemProperty, _INTL("Item used by the Trainer during battle.")],
[_INTL("Item 8"), ItemProperty, _INTL("Item used by the Trainer during battle.")]
]
if !pbPropertyList(settingname,oldsetting,properties,true)
return nil
end
oldsetting = nil if !oldsetting[0] || oldsetting[0]==0
return oldsetting
end
def self.format(value)
return value.inspect
end
end
def pbTrainerBattleEditor
selection = 0
trainertypes = pbLoadTrainerTypesData
trainers = pbLoadTrainersData
modified = false
for trainer in trainers
trtype = trainer[0]
next if trainertypes && trainertypes[trtype]
trainer[0] = 0
modified = true
end
pbListScreenBlock(_INTL("Trainer Battles"),TrainerBattleLister.new(selection,true)) { |button,trtype|
next if !trtype
index = trtype[0]
trainerdata = trtype[1]
if button==Input::A
# Delete trainer
if index>=0
if pbConfirmMessageSerious("Delete this trainer battle?")
trainers.delete_at(index)
modified = true
pbMessage(_INTL("The Trainer battle was deleted."))
end
end
elsif button==Input::C
# New trainer/edit existing trainer
selection = index
if selection<0
# New trainer
trainertype = -1
ret = pbMessage(_INTL("First, define the type of trainer."),[
_INTL("Use existing type"),
_INTL("Use new type"),
_INTL("Cancel")],3)
if ret==0
trainertype = pbListScreen(_INTL("TRAINER TYPE"),TrainerTypeLister.new(0,false))
next if !trainertype
trainertype = trainertype[0]
next if trainertype<0
elsif ret==1
trainertype = pbTrainerTypeEditorNew(nil)
next if trainertype<0
else
next
end
trainername = pbMessageFreeText(_INTL("Now enter the trainer's name."),"",false,30)
next if trainername==""
trainerparty = pbGetFreeTrainerParty(trainertype,trainername)
if trainerparty<0
pbMessage(_INTL("There is no room to create a trainer of that type and name."))
next
end
t = pbNewTrainer(trainertype,trainername,trainerparty,false)
trainers.push(t) if t
pbMessage(_INTL("The Trainer battle was added."))
else
# Edit existing trainer
data = [trainerdata[0],trainerdata[1],trainerdata[4],trainerdata[5]] # Type, name, ID, lose text
for i in 0...6
data.push(trainerdata[3][i]) # Pokémon
end
for i in 0...8
data.push(trainerdata[2][i]) # Items
end
loop do
data = TrainerBattleProperty.set(trainerdata[1],data)
break if !data
trainerdata = [
data[0],
data[1],
[data[10],data[11],data[12],data[13],data[14],data[15],data[16],data[17]].compact!, # Item list
[data[4],data[5],data[6],data[7],data[8],data[9]].find_all { |i| i && i[TrainerData::SPECIES]!=0 }, # Pokémon list
data[2],
data[3]
]
if !trainerdata[1] || trainerdata[1].length==0
pbMessage(_INTL("Can't save. No name was entered."))
elsif trainerdata[3].length==0
pbMessage(_INTL("Can't save. The Pokémon list is empty."))
else
trainers[index] = trainerdata
modified = true
break
end
end
end
end
}
if modified && pbConfirmMessage(_INTL("Save changes?"))
save_data(trainers,"Data/trainers.dat")
$PokemonTemp.trainersData = nil
pbConvertTrainerData
end
end
#===============================================================================
# Trainer Pokémon editor
#===============================================================================
module TrainerPokemonProperty
def self.set(settingname,initsetting)
initsetting = [0,10] if !initsetting
oldsetting = []
for i in 0...TrainerData::EV
if i==TrainerData::MOVES
for j in 0...4
oldsetting.push((initsetting[TrainerData::MOVES]) ? initsetting[TrainerData::MOVES][j] : nil)
end
else
oldsetting.push(initsetting[i])
end
end
mLevel = PBExperience.maxLevel
properties = [
[_INTL("Species"), SpeciesProperty, _INTL("Species of the Pokémon.")],
[_INTL("Level"), NonzeroLimitProperty.new(mLevel), _INTL("Level of the Pokémon (1-{1}).",mLevel)],
[_INTL("Held item"), ItemProperty, _INTL("Item held by the Pokémon.")],
[_INTL("Move 1"), MoveProperty2.new(oldsetting), _INTL("First move. Leave all moves blank (use Z key) to give it a wild moveset.")],
[_INTL("Move 2"), MoveProperty2.new(oldsetting), _INTL("Second move. Leave all moves blank (use Z key) to give it a wild moveset.")],
[_INTL("Move 3"), MoveProperty2.new(oldsetting), _INTL("Third move. Leave all moves blank (use Z key) to give it a wild moveset.")],
[_INTL("Move 4"), MoveProperty2.new(oldsetting), _INTL("Fourth move. Leave all moves blank (use Z key) to give it a wild moveset.")],
[_INTL("Ability"), LimitProperty2.new(5), _INTL("Ability flag. 0=first ability, 1=second ability, 2-5=hidden ability.")],
[_INTL("Gender"), GenderProperty.new, _INTL("Gender of the Pokémon.")],
[_INTL("Form"), LimitProperty2.new(999), _INTL("Form of the Pokémon.")],
[_INTL("Shiny"), BooleanProperty2, _INTL("If set to true, the Pokémon is a different-colored Pokémon.")],
[_INTL("Nature"), NatureProperty, _INTL("Nature of the Pokémon.")],
[_INTL("IVs"), IVsProperty.new(Pokemon::IV_STAT_LIMIT), _INTL("Individual values for each of the Pokémon's stats.")],
[_INTL("Happiness"), LimitProperty2.new(255), _INTL("Happiness of the Pokémon (0-255).")],
[_INTL("Nickname"), StringProperty, _INTL("Name of the Pokémon.")],
[_INTL("Shadow"), BooleanProperty2, _INTL("If set to true, the Pokémon is a Shadow Pokémon.")],
[_INTL("Ball"), BallProperty.new(oldsetting), _INTL("The kind of Poké Ball the Pokémon is kept in.")],
[_INTL("EVs"), EVsProperty.new(Pokemon::EV_STAT_LIMIT), _INTL("Effort values for each of the Pokémon's stats.")]
]
pbPropertyList(settingname,oldsetting,properties,false)
return nil if !oldsetting[TrainerData::SPECIES] || oldsetting[TrainerData::SPECIES]==0
ret = []
moves = []
for i in 0...oldsetting.length
if i>=TrainerData::MOVES && i<TrainerData::MOVES+4
ret.push(nil) if i==TrainerData::MOVES
moves.push(oldsetting[i])
else
ret.push(oldsetting[i])
end
end
moves.compact!
ret[TrainerData::MOVES] = moves if moves.length>0
# Remove unnecessary nils from the end of ret
ret.pop while ret.last.nil? && ret.size>0
return ret
end
def self.format(value)
return "-" if !value || !value[TrainerData::SPECIES] || value[TrainerData::SPECIES]<=0
return sprintf("%s,%d",PBSpecies.getName(value[TrainerData::SPECIES]),value[TrainerData::LEVEL])
end
end
#===============================================================================
# Metadata editor
#===============================================================================
def pbMetadataScreen(map_id = 0)
loop do
map_id = pbListScreen(_INTL("SET METADATA"), MapLister.new(map_id, true))
break if map_id < 0
pbEditMetadata(map_id)
end
end
def pbEditMetadata(map_id = 0)
mapinfos = pbLoadRxData("Data/MapInfos")
data = []
if map_id == 0 # Global metadata
map_name = _INTL("Global Metadata")
metadata = GameData::Metadata.get
properties = GameData::Metadata.editor_properties
else # Map metadata
map_name = mapinfos[map_id].name
metadata = GameData::MapMetadata.get(map_id)
properties = GameData::MapMetadata.editor_properties
end
properties.each do |property|
data.push(metadata.property_from_string(property[0]))
end
if pbPropertyList(map_name, data, properties, true)
if map_id == 0 # Global metadata
# Construct metadata hash
metadata_hash = {
:id => map_id,
:home => data[0],
:wild_battle_BGM => data[1],
:trainer_battle_BGM => data[2],
:wild_victory_ME => data[3],
:trainer_victory_ME => data[4],
:wild_capture_ME => data[5],
:surf_BGM => data[6],
:bicycle_BGM => data[7],
:player_A => data[8],
:player_B => data[9],
:player_C => data[10],
:player_D => data[11],
:player_E => data[12],
:player_F => data[13],
:player_G => data[14],
:player_H => data[15]
}
# Add metadata's data to records
GameData::Metadata::DATA[map_id] = GameData::Metadata.new(metadata_hash)
GameData::Metadata.save
else # Map metadata
# Construct metadata hash
metadata_hash = {
:id => map_id,
:outdoor_map => data[0],
:announce_location => data[1],
:can_bicycle => data[2],
:always_bicycle => data[3],
:teleport_destination => data[4],
:weather => data[5],
:town_map_position => data[6],
:dive_map_id => data[7],
:dark_map => data[8],
:safari_map => data[9],
:snap_edges => data[10],
:random_dungeon => data[11],
:battle_background => data[12],
:wild_battle_BGM => data[13],
:trainer_battle_BGM => data[14],
:wild_victory_ME => data[15],
:trainer_victory_ME => data[16],
:wild_capture_ME => data[17],
:town_map_size => data[18],
:battle_environment => data[19]
}
# Add metadata's data to records
GameData::MapMetadata::DATA[map_id] = GameData::MapMetadata.new(metadata_hash)
GameData::MapMetadata.save
end
pbSaveMetadata
end
end
#===============================================================================
# Item editor
#===============================================================================
def pbItemEditor
selection = 0
items = [
[_INTL("Internal Name"), ReadOnlyProperty, _INTL("Internal name that is used as a symbol like :XXX.")],
[_INTL("Item Name"), ItemNameProperty, _INTL("Name of the item as displayed by the game.")],
[_INTL("Item Name Plural"), ItemNameProperty, _INTL("Plural name of the item as displayed by the game.")],
[_INTL("Pocket"), PocketProperty, _INTL("Pocket in the bag where the item is stored.")],
[_INTL("Purchase price"), LimitProperty.new(999999), _INTL("Purchase price of the item.")],
[_INTL("Description"), StringProperty, _INTL("Description of the item")],
[_INTL("Use Out of Battle"), EnumProperty.new([
_INTL("Can't Use"), _INTL("On a Pokémon"), _INTL("Use directly"),
_INTL("TM"), _INTL("HM"), _INTL("On a Pokémon reusable")]),
_INTL("Specifies how this item can be used outside of battle.")],
[_INTL("Use In Battle"), EnumProperty.new([
_INTL("Can't Use"), _INTL("On a Pokémon"), _INTL("On Pokémon's move"),
_INTL("On battler"), _INTL("On foe battler"), _INTL("Use directly"),
_INTL("On a Pokémon reusable"), _INTL("On Pokémon's move reusable"),
_INTL("On battler reusable"), _INTL("On foe battler reusable"),
_INTL("Use directly reusable")]),
_INTL("Specifies how this item can be used within a battle.")],
[_INTL("Special Items"), EnumProperty.new([
_INTL("None of below"), _INTL("Mail"), _INTL("Mail with Pictures"),
_INTL("Snag Ball"), _INTL("Poké Ball"), _INTL("Plantable Berry"),
_INTL("Key Item"), _INTL("Evolution Stone"), _INTL("Fossil"),
_INTL("Apricorn"), _INTL("Type-boosting Gem"), _INTL("Mulch"),
_INTL("Mega Stone")]),
_INTL("For special kinds of items.")],
[_INTL("Machine"), MoveProperty, _INTL("Move taught by this TM or HM.")]
]
pbListScreenBlock(_INTL("Items"), ItemLister.new(selection, true)) { |button, item|
if item
if button==Input::A
if item.is_a?(Symbol)
if pbConfirmMessageSerious("Delete this item?")
id_number = GameData::Item.get(item).id_number
GameData::Item::DATA.delete(item)
GameData::Item::DATA.delete(id_number)
GameData::Item.save
pbSaveItems
pbMessage(_INTL("The item was deleted."))
end
end
elsif button==Input::C
if item.is_a?(Symbol)
itm = GameData::Item.get(item)
data = [
itm.id.to_s,
itm.real_name,
itm.real_name_plural,
itm.pocket,
itm.price,
itm.real_description,
itm.field_use,
itm.battle_use,
itm.type,
itm.move
]
if pbPropertyList(itm.id.to_s, data, items, true)
# Construct item hash
item_hash = {
:id_number => itm.id_number,
:id => itm.id,
:name => data[1],
:name_plural => data[2],
:pocket => data[3],
:price => data[4],
:description => data[5],
:field_use => data[6],
:battle_use => data[7],
:type => data[8],
:move => data[9]
}
# Add item's data to records
GameData::Item::DATA[itm.id_number] = GameData::Item::DATA[itm.id] = GameData::Item.new(item_hash)
GameData::Item.save
pbSaveItems
end
else # Add a new item
pbItemEditorNew(nil)
end
end
end
}
end
def pbItemEditorNew(default_name)
# Get an unused ID number for the new item
max_id = 0
GameData::Item.each { |i| max_id = i.id_number if max_id < i.id_number }
id_number = max_id + 1
# Choose a name
name = pbMessageFreeText(_INTL("Please enter the item's name."),
(default_name) ? default_name.gsub(/_+/, " ") : "", false, 30)
if name == ""
return if !default_name
name = default_name
end
# Generate an ID based on the item name
id = name.gsub(/é/, "e")
id = id.gsub(/[^A-Za-z0-9_]/, "")
id = id.upcase
if GameData::Item.exists?(id)
for i in 1..100
trial_id = sprintf("%s_%d", id, i)
next if GameData::Item.exists?(trial_id)
id = trial_id
break
end
end
if GameData::Item.exists?(id)
pbMessage(_INTL("Failed to create the item. Choose a different name."))
return
end
# Choose a pocket
pocket = PocketProperty.set("", 0)
return if pocket == 0
# Choose a price
price = LimitProperty.new(999999).set(_INTL("Purchase price"), -1)
return if price == -1
# Choose a description
description = StringProperty.set(_INTL("Description"), "")
# Construct item hash
item_hash = {
:id_number => id_number,
:id => id.to_sym,
:name => name,
:name_plural => name + "s",
:pocket => pocket,
:price => price,
:description => description
}
# Add item's data to records
GameData::Item::DATA[id_number] = GameData::Item::DATA[id.to_sym] = GameData::Item.new(item_hash)
GameData::Item.save
pbSaveItems
pbMessage(_INTL("The item {1} was created (ID: {2}).", name, id.to_s))
pbMessage(_ISPRINTF("Put the item's graphic (item{1:s}.png or item{2:03d}.png) in Graphics/Icons, or it will be blank.",
id.to_s, id_number))
end
#===============================================================================
# Pokémon species editor
#===============================================================================
def pbPokemonEditor
regionalDexes = pbLoadRegionalDexes
metrics = pbLoadSpeciesMetrics
selection = 0
species = [
[_INTL("Name"), LimitStringProperty.new(Pokemon::MAX_NAME_SIZE), _INTL("Name of the Pokémon.")],
[_INTL("InternalName"), ReadOnlyProperty, _INTL("Internal name of the Pokémon.")],
[_INTL("Type1"), TypeProperty, _INTL("Pokémon's type. If same as Type2, this Pokémon has a single type.")],
[_INTL("Type2"), TypeProperty, _INTL("Pokémon's type. If same as Type1, this Pokémon has a single type.")],
[_INTL("BaseStats"), BaseStatsProperty, _INTL("Base stats of the Pokémon.")],
[_INTL("GenderRate"), EnumProperty.new([
_INTL("Genderless"),_INTL("AlwaysMale"),_INTL("FemaleOneEighth"),
_INTL("Female25Percent"),_INTL("Female50Percent"),_INTL("Female75Percent"),
_INTL("FemaleSevenEighths"),_INTL("AlwaysFemale")]),
_INTL("Proportion of males to females for this species.")],
[_INTL("GrowthRate"), EnumProperty.new([
_INTL("Medium"),_INTL("Erratic"),_INTL("Fluctuating"),_INTL("Parabolic"),
_INTL("Fast"),_INTL("Slow")]),
_INTL("Pokémon's growth rate.")],
[_INTL("BaseEXP"), LimitProperty.new(9999), _INTL("Base experience earned when this species is defeated.")],
[_INTL("EffortPoints"), EffortValuesProperty, _INTL("Effort Value points earned when this species is defeated.")],
[_INTL("Rareness"), LimitProperty.new(255), _INTL("Catch rate of this species (0-255).")],
[_INTL("Happiness"), LimitProperty.new(255), _INTL("Base happiness of this species (0-255).")],
[_INTL("Ability1"), AbilityProperty, _INTL("One ability which the Pokémon can have.")],
[_INTL("Ability2"), AbilityProperty, _INTL("Another ability which the Pokémon can have.")],
[_INTL("HiddenAbility 1"), AbilityProperty, _INTL("A secret ability which the Pokémon can have.")],
[_INTL("HiddenAbility 2"), AbilityProperty, _INTL("A secret ability which the Pokémon can have.")],
[_INTL("HiddenAbility 3"), AbilityProperty, _INTL("A secret ability which the Pokémon can have.")],
[_INTL("HiddenAbility 4"), AbilityProperty, _INTL("A secret ability which the Pokémon can have.")],
[_INTL("Moves"), MovePoolProperty, _INTL("Moves which the Pokémon learns while levelling up.")],
[_INTL("EggMoves"), EggMovesProperty, _INTL("Moves which the Pokémon can learn via breeding.")],
[_INTL("Compat1"), EnumProperty.new([
"Undiscovered","Monster","Water 1","Bug","Flying",
"Field","Fairy","Grass","Human-like","Water 3",
"Mineral","Amorphous","Water 2","Ditto","Dragon"]),
_INTL("Compatibility group (egg group) for breeding purposes.")],
[_INTL("Compat2"), EnumProperty.new([
"Undiscovered","Monster","Water 1","Bug","Flying",
"Field","Fairy","Grass","Human-like","Water 3",
"Mineral","Amorphous","Water 2","Ditto","Dragon"]),
_INTL("Compatibility group (egg group) for breeding purposes.")],
[_INTL("StepsToHatch"), LimitProperty.new(99999), _INTL("Number of steps until an egg of this species hatches.")],
[_INTL("Height"), NonzeroLimitProperty.new(999), _INTL("Height of the Pokémon in 0.1 metres (e.g. 42 = 4.2m).")],
[_INTL("Weight"), NonzeroLimitProperty.new(9999), _INTL("Weight of the Pokémon in 0.1 kilograms (e.g. 42 = 4.2kg).")],
[_INTL("Color"), EnumProperty.new([
_INTL("Red"),_INTL("Blue"),_INTL("Yellow"),_INTL("Green"),_INTL("Black"),
_INTL("Brown"),_INTL("Purple"),_INTL("Gray"),_INTL("White"),_INTL("Pink")]),
_INTL("Pokémon's body color.")],
[_INTL("Shape"), LimitProperty.new(14), _INTL("Body shape of this species (0-14).")],
[_INTL("Habitat"), EnumProperty.new([
_INTL("None"),_INTL("Grassland"),_INTL("Forest"),_INTL("WatersEdge"),
_INTL("Sea"),_INTL("Cave"),_INTL("Mountain"),_INTL("RoughTerrain"),
_INTL("Urban"),_INTL("Rare")]),
_INTL("The habitat of this species.")],
[_INTL("RegionalNumbers"), ReadOnlyProperty, _INTL("Regional Dex numbers for the Pokémon. These are edited elsewhere.")],
[_INTL("Kind"), StringProperty, _INTL("Kind of Pokémon species.")],
[_INTL("Pokédex"), StringProperty, _INTL("Description of the Pokémon as displayed in the Pokédex.")],
[_INTL("FormName"), StringProperty, _INTL("Name of this form of the Pokémon.")],
[_INTL("WildItemCommon"), ItemProperty, _INTL("Item commonly held by wild Pokémon of this species.")],
[_INTL("WildItemUncommon"), ItemProperty, _INTL("Item uncommonly held by wild Pokémon of this species.")],
[_INTL("WildItemRare"), ItemProperty, _INTL("Item rarely held by wild Pokémon of this species.")],
[_INTL("BattlerPlayerX"), ReadOnlyProperty, _INTL("Affects positioning of the Pokémon in battle. This is edited elsewhere.")],
[_INTL("BattlerPlayerY"), ReadOnlyProperty, _INTL("Affects positioning of the Pokémon in battle. This is edited elsewhere.")],
[_INTL("BattlerEnemyX"), ReadOnlyProperty, _INTL("Affects positioning of the Pokémon in battle. This is edited elsewhere.")],
[_INTL("BattlerEnemyY"), ReadOnlyProperty, _INTL("Affects positioning of the Pokémon in battle. This is edited elsewhere.")],
[_INTL("BattlerAltitude"), ReadOnlyProperty, _INTL("Affects positioning of the Pokémon in battle. This is edited elsewhere.")],
[_INTL("BattlerShadowX"), ReadOnlyProperty, _INTL("Affects positioning of the Pokémon in battle. This is edited elsewhere.")],
[_INTL("BattlerShadowSize"), ReadOnlyProperty, _INTL("Affects positioning of the Pokémon in battle. This is edited elsewhere.")],
[_INTL("Evolutions"), EvolutionsProperty.new, _INTL("Evolution paths of this species.")],
[_INTL("Incense"), ItemProperty, _INTL("Item needed to be held by a parent to produce an egg of this species.")],
]
pbListScreenBlock(_INTL("Pokémon species"),SpeciesLister.new(selection,false)) { |button,index|
if index
if button==Input::A
if index>=0
if pbConfirmMessageSerious("Delete this species?")
# A species existing depends on its constant existing, so just need
# to delete that - recompiling pokemon.txt will do the rest.
removeConstantValue(PBSpecies,index)
pbSavePokemonData
pbMessage(_INTL("The species was deleted. You should fully recompile before doing anything else."))
end
end
elsif button==Input::C
selection = index
if selection<0
pbMessage(_INTL("Can't add a new species."))
# newid=pbSpeciesEditorNew(nil)
# selection=newid if newid>=0
else
speciesData = pbGetSpeciesData(selection)
messages = Messages.new("Data/messages.dat") rescue nil
if !speciesData || !messages
raise _INTL("Couldn't find species.dat or messages.dat to get Pokémon data from.")
end
speciesname = messages.get(MessageTypes::Species,selection)
kind = messages.get(MessageTypes::Kinds,selection)
entry = messages.get(MessageTypes::Entries,selection)
cname = getConstantName(PBSpecies,selection) rescue sprintf("POKE%03d",selection)
formname = messages.get(MessageTypes::FormNames,selection)
abilities = speciesData[SpeciesData::ABILITIES]
if abilities.is_a?(Array)
ability1 = abilities[0]
ability2 = abilities[1]
else
ability1 = abilities
ability2 = nil
end
color = speciesData[SpeciesData::COLOR]
habitat = speciesData[SpeciesData::HABITAT]
type1 = speciesData[SpeciesData::TYPE1]
type2 = speciesData[SpeciesData::TYPE2]
type2 = nil if type2==type1
baseStats = speciesData[SpeciesData::BASE_STATS].clone if speciesData[SpeciesData::BASE_STATS]
rareness = speciesData[SpeciesData::RARENESS]
shape = speciesData[SpeciesData::SHAPE]
genderrate = speciesData[SpeciesData::GENDER_RATE]
happiness = speciesData[SpeciesData::HAPPINESS]
growthrate = speciesData[SpeciesData::GROWTH_RATE]
stepstohatch = speciesData[SpeciesData::STEPS_TO_HATCH]
effort = speciesData[SpeciesData::EFFORT_POINTS].clone if speciesData[SpeciesData::EFFORT_POINTS]
compats = speciesData[SpeciesData::COMPATIBILITY]
if compats.is_a?(Array)
compat1 = compats[0]
compat2 = compats[1]
else
compat1 = compats
compat2 = nil
end
height = speciesData[SpeciesData::HEIGHT]
weight = speciesData[SpeciesData::WEIGHT]
baseexp = speciesData[SpeciesData::BASE_EXP]
hiddenAbils = speciesData[SpeciesData::HIDDEN_ABILITY]
if hiddenAbils.is_a?(Array)
hiddenability1 = hiddenAbils[0]
hiddenability2 = hiddenAbils[1]
hiddenability3 = hiddenAbils[2]
hiddenability4 = hiddenAbils[3]
else
hiddenability1 = hiddenAbils
hiddenability2 = nil
hiddenability3 = nil
hiddenability4 = nil
end
item1 = speciesData[SpeciesData::WILD_ITEM_COMMON]
item2 = speciesData[SpeciesData::WILD_ITEM_UNCOMMON]
item3 = speciesData[SpeciesData::WILD_ITEM_RARE]
incense = speciesData[SpeciesData::INCENSE]
originalMoveset = pbGetSpeciesMoveset(selection)
movelist = []
originalMoveset.each_with_index { |m,i| movelist.push([m[0],m[1],i]) }
movelist.sort! { |a,b| (a[0]==b[0]) ? a[2]<=>b[2] : a[0]<=>b[0] }
originalEggMoves = pbGetSpeciesEggMoves(selection)
eggmovelist = []
originalEggMoves.each { |m| eggmovelist.push(m) }
regionallist = []
for i in 0...regionalDexes.length
regionallist.push(regionalDexes[i][selection])
end
numb = regionallist.size-1
while numb>=0 # Remove every 0 at end of array
(regionallist[numb]==0) ? regionallist.pop : break
numb -= 1
end
evolutions = pbGetEvolvedFormData(selection)
data = []
data.push(speciesname) # 0
data.push(cname) # 1
data.push(type1) # 2
data.push(type2) # 3
data.push(baseStats) # 4
data.push(genderrate) # 5
data.push(growthrate) # 6
data.push(baseexp) # 7
data.push(effort) # 8
data.push(rareness) # 9
data.push(happiness) # 10
data.push(ability1) # 11
data.push(ability2) # 12
data.push(hiddenability1) # 13
data.push(hiddenability2) # 14
data.push(hiddenability3) # 15
data.push(hiddenability4) # 16
data.push(movelist) # 17
data.push(eggmovelist) # 18
data.push(compat1) # 19
data.push(compat2) # 20
data.push(stepstohatch) # 21
data.push(height) # 22
data.push(weight) # 23
data.push(color) # 24
data.push(shape) # 25
data.push(habitat) # 26
data.push(regionallist) # 27
data.push(kind) # 28
data.push(entry) # 29
data.push(formname) # 30
data.push(item1) # 31
data.push(item2) # 32
data.push(item3) # 33
for i in 0...6
data.push(metrics[i][selection] || 0) # 34, 35, 36, 37, 38, 39
end
data.push(metrics[SpeciesData::METRIC_SHADOW_SIZE][selection] || 2) # 40
data.push(evolutions) # 41
data.push(incense) # 42
# Edit the properties
save = pbPropertyList(data[0],data,species,true)
if save
# Make sure both Type1 and Type2 are recorded correctly
data[2] = (data[3] || 0) if !data[2]
data[3] = data[2] if !data[3]
# Make sure both Compatibilities are recorded correctly
data[19] = (data[20] && data[20]!=0) ? data[20] : PBEggGroups::Undiscovered if !data[19] || data[19]==0
data[20] = data[19] if !data[20] || data[20]==0
compats = (data[20] && data[20]>0) ? [data[19],data[20]] : data[19]
# Make sure both Abilities are recorded correctly
data[11] = data[12] if !data[11]
data[12] = nil if data[11] == data[12]
abils = (data[12]) ? [data[11], data[12]] : data[11]
# Make sure all Hidden Abilities are recorded correctly
hiddenAbils = [data[13], data[14], data[15], data[16]]
hiddenAbils.compact!
hiddenAbils = hiddenAbils[0] if hiddenAbils.length <= 1
# Save data
speciesData[SpeciesData::ABILITIES] = abils
speciesData[SpeciesData::COLOR] = data[24]
speciesData[SpeciesData::HABITAT] = data[26]
speciesData[SpeciesData::TYPE1] = data[2]
speciesData[SpeciesData::TYPE2] = data[3]
speciesData[SpeciesData::BASE_STATS] = data[4]
speciesData[SpeciesData::RARENESS] = data[9]
speciesData[SpeciesData::SHAPE] = data[25]
speciesData[SpeciesData::GENDER_RATE] = data[5]
speciesData[SpeciesData::HAPPINESS] = data[10]
speciesData[SpeciesData::GROWTH_RATE] = data[6]
speciesData[SpeciesData::STEPS_TO_HATCH] = data[21]
speciesData[SpeciesData::EFFORT_POINTS] = data[8]
speciesData[SpeciesData::COMPATIBILITY] = compats
speciesData[SpeciesData::HEIGHT] = data[22]
speciesData[SpeciesData::WEIGHT] = data[23]
speciesData[SpeciesData::BASE_EXP] = data[7]
speciesData[SpeciesData::HIDDEN_ABILITY] = hiddenAbils
speciesData[SpeciesData::WILD_ITEM_COMMON] = data[31]
speciesData[SpeciesData::WILD_ITEM_UNCOMMON] = data[32]
speciesData[SpeciesData::WILD_ITEM_RARE] = data[33]
speciesData[SpeciesData::INCENSE] = data[42]
save_data(pbLoadSpeciesData,"Data/species.dat")
namearray = []
kindarray = []
entryarray = []
formarray = []
for i in 1..(PBSpecies.maxValue rescue PBSpecies.getCount-1 rescue messages.getCount(MessageTypes::Species)-1)
namearray[i] = messages.get(MessageTypes::Species,i)
kindarray[i] = messages.get(MessageTypes::Kinds,i)
entryarray[i] = messages.get(MessageTypes::Entries,i)
formarray[i] = messages.get(MessageTypes::FormNames,i)
end
namearray[selection] = data[0]
kindarray[selection] = data[28]
entryarray[selection] = data[29]
formarray[selection] = data[30]
MessageTypes.addMessages(MessageTypes::Species,namearray)
MessageTypes.addMessages(MessageTypes::Kinds,kindarray)
MessageTypes.addMessages(MessageTypes::Entries,entryarray)
MessageTypes.addMessages(MessageTypes::FormNames,formarray)
MessageTypes.saveMessages
# Save moves data
movesetsData = pbLoadMovesetsData
movesetsData[selection] = data[17]
save_data(movesetsData,"Data/species_movesets.dat")
# Save egg moves data
data[18].delete_if { |x| !x || x==0 }
eggMovesData = pbLoadEggMovesData
eggMovesData[selection] = data[18]
save_data(eggMovesData,"Data/species_eggmoves.dat")
# Save evolutions data
evos = []
for sp in 1..PBSpecies.maxValueF
evos[sp] = []
if sp==selection
for i in 0...data[41].length
evos[sp].push([data[41][i][2],data[41][i][0],data[41][i][1],false])
end
else
t = pbGetEvolvedFormData(sp)
for i in 0...t.length
evos[sp].push([t[i][2],t[i][0],t[i][1],false])
end
end
end
for e in 0...evos.length
evolist = evos[e]
next if !evos
parent = nil
child = -1
for f in 0...evos.length
evolist = evos[f]
next if !evolist || e==f
for g in evolist
if g[0]==e && !g[3] # f evolves into e
parent = g
child = f
break
end
end
break if parent
end
if parent # parent[1]=method, parent[2]=level - both are unused
# Found a species that evolves into e, record it as a prevolution
evos[e] = [[child,parent[1],parent[2],true]].concat(evos[e])
end
end
save_data(evos,"Data/species_evolutions.dat")
# Don't need to save metrics or regional numbers
# because they can't be edited here
# TODO: Only need to reload whichever sets of Pokémon data were
# edited here (species, movesets, egg moves, evolutions).
# These are likely to be merged into a single data file.
pbClearData
pbSavePokemonData # Rewrite PBS files pokemon.txt and pokemonforms.txt
pbMessage(_INTL("Data saved."))
end
end
end
end
}
end
def pbSpeciesEditorNew(defaultname)
end
#===============================================================================
# Regional Dexes editor
#===============================================================================
def pbRegionalDexEditor(dex)
viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
viewport.z = 99999
info = Window_AdvancedTextPokemon.new(_INTL("Z+Up/Down: Rearrange entries\nZ+Right: Insert new entry\nZ+Left: Delete entry\nF: Clear entry"))
info.x = Graphics.width/2
info.y = 64
info.width = Graphics.width/2
info.height = Graphics.height-64
info.viewport = viewport
info.z = 2
ret = dex
tdex = dex.clone
tdex.compact!
cmdwin = pbListWindow([])
refreshlist = true
commands = []
cmd = [0,0]
loop do
if refreshlist
if tdex.length>0
i = tdex.length-1
loop do break unless tdex[i]==0
tdex[i] = nil
i -= 1
break if i<0
end
tdex.compact!
end
tdex.push(0) if tdex.length==0 || tdex[tdex.length-1]!=0
commands = []
for i in 0...tdex.length
text = "----------"
if tdex[i]>0 && (getConstantName(PBSpecies,tdex[i]) rescue false)
text = PBSpecies.getName(tdex[i])
end
commands.push(sprintf("%03d: %s",i+1,text))
end
end
refreshlist = false
cmd = pbCommands3(cmdwin,commands,-1,cmd[1],true)
case cmd[0]
when 1 # Swap entry up
if cmd[1]<tdex.length-1
tdex[cmd[1]+1],tdex[cmd[1]] = tdex[cmd[1]],tdex[cmd[1]+1]
refreshlist = true
end
when 2 # Swap entry down
if cmd[1]>0
tdex[cmd[1]-1],tdex[cmd[1]] = tdex[cmd[1]],tdex[cmd[1]-1]
refreshlist = true
end
when 3 # Delete spot
tdex[cmd[1]] = nil
tdex.compact!
cmd[1] = [cmd[1],tdex.length-1].min
refreshlist = true
when 4 # Insert spot
i = tdex.length
loop do break unless i>=cmd[1]
tdex[i+1] = tdex[i]
i -= 1
end
tdex[cmd[1]] = 0
refreshlist = true
when 5 # Clear spot
tdex[cmd[1]] = 0
refreshlist = true
when 0
if cmd[1]>=0 # Edit entry
cmd2 = pbMessage(_INTL("\\ts[]Do what with this entry?"),
[_INTL("Change species"),_INTL("Clear"),_INTL("Insert entry"),_INTL("Delete entry"),_INTL("Cancel")],5)
case cmd2
when 0
newspecies = pbChooseSpeciesList(tdex[cmd[1]])
if newspecies>0
tdex[cmd[1]] = newspecies
for i in 0...tdex.length
next if i==cmd[1]
tdex[i] = 0 if tdex[i]==newspecies
end
refreshlist = true
end
when 1
tdex[cmd[1]] = 0
refreshlist = true
when 2
i = tdex.length
loop do break unless i>=cmd[1]
tdex[i+1] = tdex[i]
i -= 1
end
tdex[cmd[1]] = 0
refreshlist = true
when 3
if cmd[1]<tdex.length-1
tdex[cmd[1]] = nil
tdex.compact!
cmd[1] = [cmd[1],tdex.length-1].min
refreshlist = true
end
end
else # Cancel
cmd2 = pbMessage(_INTL("Save changes?"),
[_INTL("Yes"),_INTL("No"),_INTL("Cancel")],3)
if cmd2==0 # Yes
if tdex.length>0
i = tdex.length-1
loop do break unless tdex[i]==0
tdex[i] = nil
i -= 1
break if i<0
end
tdex.compact!
end
tdex = [nil].concat(tdex)
ret = tdex
break
elsif cmd2==1 # No
break
end
end
end
end
info.dispose
cmdwin.dispose
viewport.dispose
return ret
end
def pbRegionalDexEditorMain
dexList = pbLoadRegionalDexes
regionallist = []
for i in 0...dexList.length
regionallist[i] = []
for j in 0...dexList[i].length
regionallist[i][dexList[i][j]] = j if dexList[i][j] && dexList[i][j]>0
end
for j in 1...regionallist[i].length # Replace nils with 0s
regionallist[i][j] = 0 if !regionallist[i][j]
end
end
viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
viewport.z = 99999
cmdwin = pbListWindow([])
cmdwin.viewport = viewport
cmdwin.z = 2
title = Window_UnformattedTextPokemon.new(_INTL("Regional Dexes Editor"))
title.x = Graphics.width/2
title.y = 0
title.width = Graphics.width/2
title.height = 64
title.viewport = viewport
title.z = 2
info = Window_AdvancedTextPokemon.new(_INTL("Z+Up/Down: Rearrange Dexes"))
info.x = Graphics.width/2
info.y = 64
info.width = Graphics.width/2
info.height = Graphics.height-64
info.viewport = viewport
info.z = 2
commands = []
refreshlist = true; oldsel = -1
cmd = [0,0]
loop do
if refreshlist
commands = [_INTL("[ADD DEX]")]
for i in 0...regionallist.length
commands.push(_INTL("Dex {1} (size {2})",i+1,regionallist[i].length-1))
end
end
refreshlist = false; oldsel = -1
cmd = pbCommands3(cmdwin,commands,-1,cmd[1],true)
case cmd[0]
when 1 # Swap dex up
if cmd[1]>0 && cmd[1]<commands.length-1
regionallist[cmd[1]-1],regionallist[cmd[1]] = regionallist[cmd[1]],regionallist[cmd[1]-1]
refreshlist = true
end
when 2 # Swap dex down
if cmd[1]>1
regionallist[cmd[1]-2],regionallist[cmd[1]-1] = regionallist[cmd[1]-1],regionallist[cmd[1]-2]
refreshlist = true
end
when 0
if cmd[1]==0 # Add new dex
cmd2 = pbMessage(_INTL("Fill in this new Dex?"),
[_INTL("Leave blank"),_INTL("Fill with National Dex"),_INTL("Cancel")],3)
if cmd2<2
newdex = [nil]
if cmd2==1 # Fill with National Dex
for i in 1...PBSpecies.maxValue
newdex[i] = i
end
end
regionallist[regionallist.length] = newdex
refreshlist = true
end
elsif cmd[1]>0 # Edit a dex
cmd2 = pbMessage(_INTL("\\ts[]Do what with this Dex?"),
[_INTL("Edit"),_INTL("Copy"),_INTL("Delete"),_INTL("Cancel")],4)
case cmd2
when 0 # Edit
regionallist[cmd[1]-1] = pbRegionalDexEditor(regionallist[cmd[1]-1])
refreshlist = true
when 1 # Copy
regionallist[regionallist.length] = regionallist[cmd[1]-1].clone
cmd[1] = regionallist.length
refreshlist = true
when 2 # Delete
regionallist[cmd[1]-1] = nil
regionallist.compact!
cmd[1] = [cmd[1],regionallist.length].min
refreshlist = true
end
else # Cancel
cmd2 = pbMessage(_INTL("Save changes?"),
[_INTL("Yes"),_INTL("No"),_INTL("Cancel")],3)
if cmd2==0
# Save new dexes here
tosave = []
for i in 0...regionallist.length
tosave[i] = []
for j in 0...regionallist[i].length
tosave[i][regionallist[i][j]] = j if regionallist[i][j]
end
end
save_data(tosave,"Data/regional_dexes.dat")
$PokemonTemp.regionalDexes = nil
pbSavePokemonData
pbMessage(_INTL("Data saved."))
break
elsif cmd2==1
break
end
end
end
end
title.dispose
info.dispose
cmdwin.dispose
viewport.dispose
end
def pbAppendEvoToFamilyArray(species,array,seenarray)
return if seenarray[species]
array.push(species); seenarray[species] = true
evos = pbGetEvolvedFormData(species)
if evos.length>0
evos.sort! { |a,b| a[2]<=>b[2] }
subarray = []
for i in evos
pbAppendEvoToFamilyArray(i[2],subarray,seenarray)
end
array.push(subarray) if subarray.length>0
end
end
def pbGetEvoFamilies
seen = []
ret = []
for sp in 1..PBSpecies.maxValue
species = pbGetBabySpecies(sp)
next if seen[species]
subret = []
pbAppendEvoToFamilyArray(species,subret,seen)
ret.push(subret.flatten) if subret.length>0
end
return ret
end
def pbEvoFamiliesToStrings
ret = []
families = pbGetEvoFamilies
for fam in 0...families.length
string = ""
for p in 0...families[fam].length
if p>=3
string += " + #{families[fam].length-3} more"
break
end
string += "/" if p>0
string += PBSpecies.getName(families[fam][p])
end
ret[fam] = string
end
return ret
end
#===============================================================================
# Battle animations rearranger
#===============================================================================
def pbAnimationsOrganiser
list = pbLoadBattleAnimations
if !list || !list[0]
pbMessage(_INTL("No animations exist."))
return
end
viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
viewport.z = 99999
cmdwin = pbListWindow([])
cmdwin.viewport = viewport
cmdwin.z = 2
title = Window_UnformattedTextPokemon.new(_INTL("Animations Organiser"))
title.x = Graphics.width/2
title.y = 0
title.width = Graphics.width/2
title.height = 64
title.viewport = viewport
title.z = 2
info = Window_AdvancedTextPokemon.new(_INTL("Z+Up/Down: Swap\nZ+Left: Delete\nZ+Right: Insert"))
info.x = Graphics.width/2
info.y = 64
info.width = Graphics.width/2
info.height = Graphics.height-64
info.viewport = viewport
info.z = 2
commands = []
refreshlist = true; oldsel = -1
cmd = [0,0]
loop do
if refreshlist
commands = []
for i in 0...list.length
commands.push(sprintf("%d: %s",i,(list[i]) ? list[i].name : "???"))
end
end
refreshlist = false; oldsel = -1
cmd = pbCommands3(cmdwin,commands,-1,cmd[1],true)
if cmd[0]==1 # Swap animation up
if cmd[1]>=0 && cmd[1]<commands.length-1
list[cmd[1]+1],list[cmd[1]] = list[cmd[1]],list[cmd[1]+1]
refreshlist = true
end
elsif cmd[0]==2 # Swap animation down
if cmd[1]>0
list[cmd[1]-1],list[cmd[1]] = list[cmd[1]],list[cmd[1]-1]
refreshlist = true
end
elsif cmd[0]==3 # Delete spot
list.delete_at(cmd[1])
cmd[1] = [cmd[1],list.length-1].min
refreshlist = true
pbWait(Graphics.frame_rate*2/10)
elsif cmd[0]==4 # Insert spot
list.insert(cmd[1],PBAnimation.new)
refreshlist = true
pbWait(Graphics.frame_rate*2/10)
elsif cmd[0]==0
cmd2 = pbMessage(_INTL("Save changes?"),
[_INTL("Yes"),_INTL("No"),_INTL("Cancel")],3)
if cmd2==0 || cmd2==1
if cmd2==0
# Save animations here
save_data(list,"Data/PkmnAnimations.rxdata")
$PokemonTemp.battleAnims = nil
pbMessage(_INTL("Data saved."))
end
break
end
end
end
title.dispose
info.dispose
cmdwin.dispose
viewport.dispose
end