mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
558 lines
15 KiB
Ruby
558 lines
15 KiB
Ruby
def pbIsOldSpecialType?(type)
|
|
return isConst?(type,PBTypes,:FIRE) ||
|
|
isConst?(type,PBTypes,:WATER) ||
|
|
isConst?(type,PBTypes,:ICE) ||
|
|
isConst?(type,PBTypes,:GRASS) ||
|
|
isConst?(type,PBTypes,:ELECTRIC) ||
|
|
isConst?(type,PBTypes,:PSYCHIC) ||
|
|
isConst?(type,PBTypes,:DRAGON) ||
|
|
isConst?(type,PBTypes,:DARK)
|
|
end
|
|
|
|
def pbGetLegalMoves(species)
|
|
moves = []
|
|
return moves if !species || species<=0
|
|
moveset = pbGetSpeciesMoveset(species)
|
|
moveset.each { |m| moves.push(m[1]) }
|
|
itemData = pbLoadItemsData
|
|
tmdat = pbLoadSpeciesTMData
|
|
for i in 0...itemData.length
|
|
next if !itemData[i]
|
|
atk = itemData[i][8]
|
|
next if !atk || atk==0
|
|
next if !tmdat[atk]
|
|
if tmdat[atk].any? { |item| item==species }
|
|
moves.push(atk)
|
|
end
|
|
end
|
|
babyspecies = pbGetBabySpecies(species)
|
|
eggMoves = pbGetSpeciesEggMoves(babyspecies)
|
|
eggMoves.each { |m| moves.push(m) }
|
|
moves |= []
|
|
return moves
|
|
end
|
|
|
|
def pbSafeCopyFile(x,y,z=nil)
|
|
if safeExists?(x)
|
|
safetocopy = true
|
|
filedata = nil
|
|
if safeExists?(y)
|
|
different = false
|
|
if FileTest.size(x)!=FileTest.size(y)
|
|
different = true
|
|
else
|
|
filedata2 = ""
|
|
File.open(x,"rb") { |f| filedata = f.read }
|
|
File.open(y,"rb") { |f| filedata2 = f.read }
|
|
different = true if filedata!=filedata2
|
|
end
|
|
if different
|
|
safetocopy=pbConfirmMessage(_INTL("A different file named '{1}' already exists. Overwrite it?",y))
|
|
else
|
|
# No need to copy
|
|
return
|
|
end
|
|
end
|
|
if safetocopy
|
|
if !filedata
|
|
File.open(x,"rb") { |f| filedata = f.read }
|
|
end
|
|
File.open((z) ? z : y,"wb") { |f| f.write(filedata) }
|
|
end
|
|
end
|
|
end
|
|
|
|
def pbAllocateAnimation(animations,name)
|
|
for i in 1...animations.length
|
|
anim = animations[i]
|
|
return i if !anim
|
|
# if name && name!="" && anim.name==name
|
|
# # use animation with same name
|
|
# return i
|
|
# end
|
|
if anim.length==1 && anim[0].length==2 && anim.name==""
|
|
# assume empty
|
|
return i
|
|
end
|
|
end
|
|
oldlength = animations.length
|
|
animations.resize(10)
|
|
return oldlength
|
|
end
|
|
|
|
def pbMapTree
|
|
mapinfos = pbLoadRxData("Data/MapInfos")
|
|
maplevels = []
|
|
retarray = []
|
|
for i in mapinfos.keys
|
|
info = mapinfos[i]
|
|
level = -1
|
|
while info
|
|
info = mapinfos[info.parent_id]
|
|
level += 1
|
|
end
|
|
if level>=0
|
|
info = mapinfos[i]
|
|
maplevels.push([i,level,info.parent_id,info.order])
|
|
end
|
|
end
|
|
maplevels.sort! { |a,b|
|
|
next a[1]<=>b[1] if a[1]!=b[1] # level
|
|
next a[2]<=>b[2] if a[2]!=b[2] # parent ID
|
|
next a[3]<=>b[3] # order
|
|
}
|
|
stack = []
|
|
stack.push(0,0)
|
|
while stack.length>0
|
|
parent = stack[stack.length-1]
|
|
index = stack[stack.length-2]
|
|
if index>=maplevels.length
|
|
stack.pop
|
|
stack.pop
|
|
next
|
|
end
|
|
maplevel = maplevels[index]
|
|
stack[stack.length-2] += 1
|
|
if maplevel[2]!=parent
|
|
stack.pop
|
|
stack.pop
|
|
next
|
|
end
|
|
retarray.push([maplevel[0],mapinfos[maplevel[0]].name,maplevel[1]])
|
|
for i in index+1...maplevels.length
|
|
if maplevels[i][2]==maplevel[0]
|
|
stack.push(i)
|
|
stack.push(maplevel[0])
|
|
break
|
|
end
|
|
end
|
|
end
|
|
return retarray
|
|
end
|
|
|
|
|
|
|
|
#===============================================================================
|
|
# Make up internal names for things based on their actual names
|
|
#===============================================================================
|
|
module MakeshiftConsts
|
|
@@consts = []
|
|
|
|
def self.get(c,i,modname=nil)
|
|
@@consts[c] = [] if !@@consts[c]
|
|
return @@consts[c][i] if @@consts[c][i]
|
|
if modname
|
|
v = getConstantName(modname,i) rescue nil
|
|
if v
|
|
@@consts[c][i] = v
|
|
return v
|
|
end
|
|
end
|
|
trname = pbGetMessage(c,i)
|
|
trconst = trname.gsub(/é/,"e")
|
|
trconst = trconst.upcase
|
|
trconst = trconst.gsub(/♀/,"fE")
|
|
trconst = trconst.gsub(/♂/,"mA")
|
|
trconst = trconst.gsub(/[^A-Za-z0-9_]/,"")
|
|
if trconst.length==0
|
|
return nil if trname.length==0
|
|
trconst = sprintf("T_%03d",i)
|
|
elsif !trconst[0,1][/[A-Z]/]
|
|
trconst = "T_"+trconst
|
|
end
|
|
while @@consts[c].include?(trconst)
|
|
trconst = sprintf("%s_%03d",trconst,i)
|
|
end
|
|
@@consts[c][i] = trconst
|
|
return trconst
|
|
end
|
|
end
|
|
|
|
|
|
|
|
def pbGetTypeConst(i)
|
|
ret = MakeshiftConsts.get(MessageTypes::Types,i,PBTypes)
|
|
if !ret
|
|
ret = ["NORMAL","FIGHTING","FLYING","POISON","GROUND",
|
|
"ROCK","BUG","GHOST","STEEL","QMARKS",
|
|
"FIRE","WATER","GRASS","ELECTRIC","PSYCHIC",
|
|
"ICE","DRAGON","DARK"][i]
|
|
end
|
|
return ret
|
|
end
|
|
|
|
def pbGetEvolutionConst(i)
|
|
ret = MakeshiftConsts.get(50,i,PBEvolution)
|
|
if !ret
|
|
ret = ["None",
|
|
"Happiness","HappinessDay","HappinessNight","Level","Trade",
|
|
"TradeItem","Item","AttackGreater","AtkDefEqual","DefenseGreater",
|
|
"Silcoon","Cascoon","Ninjask","Shedinja","Beauty",
|
|
"ItemMale","ItemFemale","DayHoldItem","NightHoldItem","HasMove",
|
|
"HasInParty","LevelMale","LevelFemale","Location","TradeSpecies",
|
|
"Custom1","Custom2","Custom3","Custom4","Custom5"]
|
|
i = 0 if i>=ret.length || i<0
|
|
ret = ret[i]
|
|
end
|
|
return ret
|
|
end
|
|
|
|
def pbGetEggGroupConst(i)
|
|
ret = MakeshiftConsts.get(51,i,PBEggGroups)
|
|
if !ret
|
|
ret = ["Undiscovered",
|
|
"Monster","Water1","Bug","Flying","Field",
|
|
"Fairy","Grass","Humanlike","Water3","Mineral",
|
|
"Amorphous","Water2","Ditto","Dragon"][i]
|
|
i = 0 if i>=ret.length || i<0
|
|
ret = ret[i]
|
|
end
|
|
return ret
|
|
end
|
|
|
|
def pbGetColorConst(i)
|
|
ret = MakeshiftConsts.get(52,i,PBColors)
|
|
if !ret
|
|
ret = ["Red","Blue","Yellow","Green","Black","Brown","Purple","Gray","White","Pink"]
|
|
i = 0 if i>=ret.length || i<0
|
|
ret = ret[i]
|
|
end
|
|
return ret
|
|
end
|
|
|
|
def pbGetGenderConst(i)
|
|
ret = MakeshiftConsts.get(53,i,PBGenderRates)
|
|
if !ret
|
|
ret = ["Genderless","AlwaysMale","FemaleOneEighth","Female25Percent",
|
|
"Female50Percent","Female75Percent","FemaleSevenEighths",
|
|
"AlwaysFemale"]
|
|
i = 0 if i>=ret.length || i<0
|
|
ret = ret[i]
|
|
end
|
|
return ret
|
|
end
|
|
|
|
def pbGetHabitatConst(i)
|
|
ret = MakeshiftConsts.get(53,i,PBHabitats)
|
|
if !ret
|
|
ret = ["","Grassland","Forest","WatersEdge","Sea","Cave","Mountain",
|
|
"RoughTerrain","Urban","Rare"]
|
|
i = 0 if i>=ret.length || i<0
|
|
ret = ret[i]
|
|
end
|
|
return ret
|
|
end
|
|
|
|
# Unused
|
|
#def pbGetAbilityConst(i)
|
|
# return MakeshiftConsts.get(MessageTypes::Abilities,i,PBAbilities)
|
|
#end
|
|
|
|
def pbGetMoveConst(i)
|
|
return MakeshiftConsts.get(MessageTypes::Moves,i,PBMoves)
|
|
end
|
|
|
|
def pbGetItemConst(i)
|
|
return MakeshiftConsts.get(MessageTypes::Items,i,PBItems)
|
|
end
|
|
|
|
def pbGetSpeciesConst(i)
|
|
return MakeshiftConsts.get(MessageTypes::Species,i,PBSpecies)
|
|
end
|
|
|
|
def pbGetTrainerConst(i)
|
|
return MakeshiftConsts.get(MessageTypes::TrainerTypes,i,PBTrainers)
|
|
end
|
|
|
|
|
|
|
|
#===============================================================================
|
|
# List all members of a class
|
|
#===============================================================================
|
|
# Displays a list of all Pokémon species, and returns the ID of the species
|
|
# selected (or 0 if the selection was canceled). "default", if specified, is the
|
|
# ID of the species to initially select. Pressing Input::A will toggle the list
|
|
# sorting between numerical and alphabetical.
|
|
def pbChooseSpeciesList(default=0)
|
|
commands = []
|
|
for i in 1..PBSpecies.maxValue
|
|
cname = getConstantName(PBSpecies,i) rescue nil
|
|
commands.push([i,PBSpecies.getName(i)]) if cname
|
|
end
|
|
return pbChooseList(commands,default,0,-1)
|
|
end
|
|
|
|
# Displays an alphabetically sorted list of all moves, and returns the ID of the
|
|
# move selected (or -1 if the selection was canceled). "default", if specified,
|
|
# is the ID of the move to initially select.
|
|
def pbChooseMoveList(default=0)
|
|
commands = []
|
|
for i in 1..PBMoves.maxValue
|
|
cname = getConstantName(PBMoves,i) rescue nil
|
|
commands.push([i,PBMoves.getName(i)]) if cname
|
|
end
|
|
return pbChooseList(commands,default,0)
|
|
end
|
|
|
|
def pbChooseMoveListForSpecies(species,defaultMoveID=0)
|
|
cmdwin = pbListWindow([],200)
|
|
commands = []
|
|
moveDefault = 0
|
|
legalMoves = pbGetLegalMoves(species)
|
|
for move in legalMoves
|
|
commands.push([move,PBMoves.getName(move)])
|
|
end
|
|
commands.sort! { |a,b| a[1]<=>b[1] }
|
|
if defaultMoveID>0
|
|
commands.each_with_index do |_item,i|
|
|
moveDefault = i if moveDefault==0 && i[0]==defaultMoveID
|
|
end
|
|
end
|
|
commands2 = []
|
|
for i in 1..PBMoves.maxValue
|
|
if PBMoves.getName(i)!=nil && PBMoves.getName(i)!=""
|
|
commands2.push([i,PBMoves.getName(i)])
|
|
end
|
|
end
|
|
commands2.sort! { |a,b| a[1]<=>b[1] }
|
|
if defaultMoveID>0
|
|
commands2.each_with_index do |_item,i|
|
|
moveDefault = i if moveDefault==0 && i[0]==defaultMoveID
|
|
end
|
|
end
|
|
commands.concat(commands2)
|
|
realcommands = []
|
|
for command in commands
|
|
realcommands.push("#{command[1]}")
|
|
end
|
|
ret = pbCommands2(cmdwin,realcommands,-1,moveDefault,true)
|
|
cmdwin.dispose
|
|
return (ret>=0) ? commands[ret][0] : 0
|
|
end
|
|
|
|
# Displays an alphabetically sorted list of all types, and returns the ID of the
|
|
# type selected (or -1 if the selection was canceled). "default", if specified,
|
|
# is the ID of the type to initially select.
|
|
def pbChooseTypeList(default=-1)
|
|
commands = []
|
|
for i in 0..PBTypes.maxValue
|
|
cname = getConstantName(PBTypes,i) rescue nil
|
|
commands.push([i,PBTypes.getName(i)]) if cname && !PBTypes.isPseudoType?(i)
|
|
end
|
|
return pbChooseList(commands,default)
|
|
end
|
|
|
|
# Displays a list of all items, and returns the ID of the item selected (or -1
|
|
# if the selection was canceled). "default", if specified, is the ID of the item
|
|
# to initially select. Pressing Input::A will toggle the list sorting between
|
|
# numerical and alphabetical.
|
|
def pbChooseItemList(default=0)
|
|
commands = []
|
|
for i in 1..PBItems.maxValue
|
|
cname = getConstantName(PBItems,i) rescue nil
|
|
commands.push([i,PBItems.getName(i)]) if cname
|
|
end
|
|
return pbChooseList(commands,default,0,-1)
|
|
end
|
|
|
|
# Displays a list of all abilities, and returns the ID of the ability selected
|
|
# (or -1 if the selection was canceled). "default", if specified, is the ID of
|
|
# the ability to initially select. Pressing Input::A will toggle the list
|
|
# sorting between numerical and alphabetical.
|
|
def pbChooseAbilityList(default=0)
|
|
commands = []
|
|
Data::Ability.each do |a|
|
|
commands.push([a.id_number, a.name])
|
|
end
|
|
return pbChooseList(commands,default,0,-1)
|
|
end
|
|
|
|
def pbChooseBallList(defaultMoveID=-1)
|
|
cmdwin = pbListWindow([],200)
|
|
commands = []
|
|
moveDefault = 0
|
|
for key in $BallTypes.keys
|
|
item = getID(PBItems,$BallTypes[key])
|
|
commands.push([key,item,PBItems.getName(item)]) if item && item>0
|
|
end
|
|
commands.sort! { |a,b| a[2]<=>b[2] }
|
|
if defaultMoveID>=0
|
|
for i in 0...commands.length
|
|
moveDefault = i if defaultMoveID==commands[i][0]
|
|
end
|
|
end
|
|
realcommands = []
|
|
for i in commands
|
|
realcommands.push(i[2])
|
|
end
|
|
ret = pbCommands2(cmdwin,realcommands,-1,moveDefault,true)
|
|
cmdwin.dispose
|
|
return (ret>=0) ? commands[ret][0] : defaultMoveID
|
|
end
|
|
|
|
|
|
|
|
#===============================================================================
|
|
# General list methods
|
|
#===============================================================================
|
|
def pbCommands2(cmdwindow,commands,cmdIfCancel,defaultindex=-1,noresize=false)
|
|
cmdwindow.commands = commands
|
|
cmdwindow.index = defaultindex if defaultindex>=0
|
|
cmdwindow.x = 0
|
|
cmdwindow.y = 0
|
|
if noresize
|
|
cmdwindow.height = Graphics.height
|
|
else
|
|
cmdwindow.width = Graphics.width/2
|
|
end
|
|
cmdwindow.height = Graphics.height if cmdwindow.height>Graphics.height
|
|
cmdwindow.z = 99999
|
|
cmdwindow.visible = true
|
|
cmdwindow.active = true
|
|
command = 0
|
|
loop do
|
|
Graphics.update
|
|
Input.update
|
|
cmdwindow.update
|
|
if Input.trigger?(Input::B)
|
|
if cmdIfCancel>0
|
|
command = cmdIfCancel-1
|
|
break
|
|
elsif cmdIfCancel<0
|
|
command = cmdIfCancel
|
|
break
|
|
end
|
|
elsif Input.trigger?(Input::C) || (cmdwindow.doubleclick? rescue false)
|
|
command = cmdwindow.index
|
|
break
|
|
end
|
|
end
|
|
ret = command
|
|
cmdwindow.active = false
|
|
return ret
|
|
end
|
|
|
|
def pbCommands3(cmdwindow,commands,cmdIfCancel,defaultindex=-1,noresize=false)
|
|
cmdwindow.commands = commands
|
|
cmdwindow.index = defaultindex if defaultindex>=0
|
|
cmdwindow.x = 0
|
|
cmdwindow.y = 0
|
|
if noresize
|
|
cmdwindow.height = Graphics.height
|
|
else
|
|
cmdwindow.width = Graphics.width/2
|
|
end
|
|
cmdwindow.height = Graphics.height if cmdwindow.height>Graphics.height
|
|
cmdwindow.z = 99999
|
|
cmdwindow.visible = true
|
|
cmdwindow.active = true
|
|
command = 0
|
|
loop do
|
|
Graphics.update
|
|
Input.update
|
|
cmdwindow.update
|
|
if Input.trigger?(Input::F5)
|
|
command = [5,cmdwindow.index]
|
|
break
|
|
elsif Input.press?(Input::A)
|
|
if Input.repeat?(Input::UP)
|
|
command = [1,cmdwindow.index]
|
|
break
|
|
elsif Input.repeat?(Input::DOWN)
|
|
command = [2,cmdwindow.index]
|
|
break
|
|
elsif Input.press?(Input::LEFT)
|
|
command = [3,cmdwindow.index]
|
|
break
|
|
elsif Input.press?(Input::RIGHT)
|
|
command = [4,cmdwindow.index]
|
|
break
|
|
end
|
|
elsif Input.trigger?(Input::B)
|
|
if cmdIfCancel>0
|
|
command = [0,cmdIfCancel-1]
|
|
break
|
|
elsif cmdIfCancel<0
|
|
command = [0,cmdIfCancel]
|
|
break
|
|
end
|
|
elsif Input.trigger?(Input::C) || (cmdwindow.doubleclick? rescue false)
|
|
command = [0,cmdwindow.index]
|
|
break
|
|
end
|
|
end
|
|
ret = command
|
|
cmdwindow.active = false
|
|
return ret
|
|
end
|
|
|
|
def pbChooseList(commands,default=0,cancelValue=-1,sortType=1)
|
|
cmdwin = pbListWindow([])
|
|
itemID = default
|
|
itemIndex = 0
|
|
sortMode = (sortType>=0) ? sortType : 0 # 0=ID, 1=alphabetical
|
|
sorting = true
|
|
loop do
|
|
if sorting
|
|
if sortMode==0
|
|
commands.sort! { |a,b| a[0]<=>b[0] }
|
|
elsif sortMode==1
|
|
commands.sort! { |a,b| a[1]<=>b[1] }
|
|
end
|
|
if itemID>0
|
|
commands.each_with_index { |command,i| itemIndex = i if command[0]==itemID }
|
|
end
|
|
realcommands = []
|
|
for command in commands
|
|
if sortType<=0
|
|
realcommands.push(sprintf("%03d: %s",command[0],command[1]))
|
|
else
|
|
realcommands.push(command[1])
|
|
end
|
|
end
|
|
sorting = false
|
|
end
|
|
cmd = pbCommandsSortable(cmdwin,realcommands,-1,itemIndex,(sortType<0))
|
|
if cmd[0]==0 # Chose an option or cancelled
|
|
itemID = (cmd[1]<0) ? cancelValue : commands[cmd[1]][0]
|
|
break
|
|
elsif cmd[0]==1 # Toggle sorting
|
|
itemID = commands[cmd[1]][0]
|
|
sortMode = (sortMode+1)%2
|
|
sorting = true
|
|
end
|
|
end
|
|
cmdwin.dispose
|
|
return itemID
|
|
end
|
|
|
|
def pbCommandsSortable(cmdwindow,commands,cmdIfCancel,defaultindex=-1,sortable=false)
|
|
cmdwindow.commands = commands
|
|
cmdwindow.index = defaultindex if defaultindex >= 0
|
|
cmdwindow.x = 0
|
|
cmdwindow.y = 0
|
|
cmdwindow.width = Graphics.width / 2 if cmdwindow.width < Graphics.width / 2
|
|
cmdwindow.height = Graphics.height
|
|
cmdwindow.z = 99999
|
|
cmdwindow.active = true
|
|
command = 0
|
|
loop do
|
|
Graphics.update
|
|
Input.update
|
|
cmdwindow.update
|
|
if Input.trigger?(Input::A) && sortable
|
|
command = [1,cmdwindow.index]
|
|
break
|
|
elsif Input.trigger?(Input::B)
|
|
command = [0,(cmdIfCancel>0) ? cmdIfCancel-1 : cmdIfCancel]
|
|
break
|
|
elsif Input.trigger?(Input::C) || (cmdwindow.doubleclick? rescue false)
|
|
command = [0,cmdwindow.index]
|
|
break
|
|
end
|
|
end
|
|
ret = command
|
|
cmdwindow.active = false
|
|
return ret
|
|
end
|