Initial commit

This commit is contained in:
Maruno17
2020-09-04 22:00:59 +01:00
commit ba94119d02
300 changed files with 227558 additions and 0 deletions

View File

@@ -0,0 +1,277 @@
class PokemonPauseMenu_Scene
def pbStartScene
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99999
@sprites = {}
@sprites["cmdwindow"] = Window_CommandPokemon.new([])
@sprites["cmdwindow"].visible = false
@sprites["cmdwindow"].viewport = @viewport
@sprites["infowindow"] = Window_UnformattedTextPokemon.newWithSize("",0,0,32,32,@viewport)
@sprites["infowindow"].visible = false
@sprites["helpwindow"] = Window_UnformattedTextPokemon.newWithSize("",0,0,32,32,@viewport)
@sprites["helpwindow"].visible = false
@infostate = false
@helpstate = false
pbSEPlay("GUI menu open")
end
def pbShowInfo(text)
@sprites["infowindow"].resizeToFit(text,Graphics.height)
@sprites["infowindow"].text = text
@sprites["infowindow"].visible = true
@infostate = true
end
def pbShowHelp(text)
@sprites["helpwindow"].resizeToFit(text,Graphics.height)
@sprites["helpwindow"].text = text
@sprites["helpwindow"].visible = true
pbBottomLeft(@sprites["helpwindow"])
@helpstate = true
end
def pbShowMenu
@sprites["cmdwindow"].visible = true
@sprites["infowindow"].visible = @infostate
@sprites["helpwindow"].visible = @helpstate
end
def pbHideMenu
@sprites["cmdwindow"].visible = false
@sprites["infowindow"].visible = false
@sprites["helpwindow"].visible = false
end
def pbShowCommands(commands)
ret = -1
cmdwindow = @sprites["cmdwindow"]
cmdwindow.commands = commands
cmdwindow.index = $PokemonTemp.menuLastChoice
cmdwindow.resizeToFit(commands)
cmdwindow.x = Graphics.width-cmdwindow.width
cmdwindow.y = 0
cmdwindow.visible = true
loop do
cmdwindow.update
Graphics.update
Input.update
pbUpdateSceneMap
if Input.trigger?(Input::B)
pbPlayCloseMenuSE
ret = -1
break
elsif Input.trigger?(Input::C)
pbPlayDecisionSE
ret = cmdwindow.index
$PokemonTemp.menuLastChoice = ret
break
end
end
return ret
end
def pbEndScene
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
def pbRefresh; end
end
class PokemonPauseMenu
def initialize(scene)
@scene = scene
end
def pbShowMenu
@scene.pbRefresh
@scene.pbShowMenu
end
def pbStartPokemonMenu
if !$Trainer
if $DEBUG
pbMessage(_INTL("The player trainer was not defined, so the pause menu can't be displayed."))
pbMessage(_INTL("Please see the documentation to learn how to set up the trainer player."))
end
return
end
pbSetViableDexes
@scene.pbStartScene
endscene = true
commands = []
cmdPokedex = -1
cmdPokemon = -1
cmdBag = -1
cmdTrainer = -1
cmdSave = -1
cmdOption = -1
cmdPokegear = -1
cmdDebug = -1
cmdQuit = -1
cmdEndGame = -1
commands[cmdPokedex = commands.length] = _INTL("Pokédex") if $Trainer.pokedex && $PokemonGlobal.pokedexViable.length>0
commands[cmdPokemon = commands.length] = _INTL("Pokémon") if $Trainer.party.length>0
commands[cmdBag = commands.length] = _INTL("Bag") if !pbInBugContest?
commands[cmdPokegear = commands.length] = _INTL("Pokégear") if $Trainer.pokegear
commands[cmdTrainer = commands.length] = $Trainer.name
if pbInSafari?
if SAFARI_STEPS<=0
@scene.pbShowInfo(_INTL("Balls: {1}",pbSafariState.ballcount))
else
@scene.pbShowInfo(_INTL("Steps: {1}/{2}\nBalls: {3}",
pbSafariState.steps,SAFARI_STEPS,pbSafariState.ballcount))
end
commands[cmdQuit = commands.length] = _INTL("Quit")
elsif pbInBugContest?
if pbBugContestState.lastPokemon
@scene.pbShowInfo(_INTL("Caught: {1}\nLevel: {2}\nBalls: {3}",
PBSpecies.getName(pbBugContestState.lastPokemon.species),
pbBugContestState.lastPokemon.level,
pbBugContestState.ballcount))
else
@scene.pbShowInfo(_INTL("Caught: None\nBalls: {1}",pbBugContestState.ballcount))
end
commands[cmdQuit = commands.length] = _INTL("Quit Contest")
else
commands[cmdSave = commands.length] = _INTL("Save") if $game_system && !$game_system.save_disabled
end
commands[cmdOption = commands.length] = _INTL("Options")
commands[cmdDebug = commands.length] = _INTL("Debug") if $DEBUG
commands[cmdEndGame = commands.length] = _INTL("Quit Game")
loop do
command = @scene.pbShowCommands(commands)
if cmdPokedex>=0 && command==cmdPokedex
if USE_CURRENT_REGION_DEX
pbFadeOutIn {
scene = PokemonPokedex_Scene.new
screen = PokemonPokedexScreen.new(scene)
screen.pbStartScreen
@scene.pbRefresh
}
else
if $PokemonGlobal.pokedexViable.length==1
$PokemonGlobal.pokedexDex = $PokemonGlobal.pokedexViable[0]
$PokemonGlobal.pokedexDex = -1 if $PokemonGlobal.pokedexDex==$PokemonGlobal.pokedexUnlocked.length-1
pbFadeOutIn {
scene = PokemonPokedex_Scene.new
screen = PokemonPokedexScreen.new(scene)
screen.pbStartScreen
@scene.pbRefresh
}
else
pbFadeOutIn {
scene = PokemonPokedexMenu_Scene.new
screen = PokemonPokedexMenuScreen.new(scene)
screen.pbStartScreen
@scene.pbRefresh
}
end
end
elsif cmdPokemon>=0 && command==cmdPokemon
hiddenmove = nil
pbFadeOutIn {
sscene = PokemonParty_Scene.new
sscreen = PokemonPartyScreen.new(sscene,$Trainer.party)
hiddenmove = sscreen.pbPokemonScreen
(hiddenmove) ? @scene.pbEndScene : @scene.pbRefresh
}
if hiddenmove
$game_temp.in_menu = false
pbUseHiddenMove(hiddenmove[0],hiddenmove[1])
return
end
elsif cmdBag>=0 && command==cmdBag
item = 0
pbFadeOutIn {
scene = PokemonBag_Scene.new
screen = PokemonBagScreen.new(scene,$PokemonBag)
item = screen.pbStartScreen
(item>0) ? @scene.pbEndScene : @scene.pbRefresh
}
if item>0
$game_temp.in_menu = false
pbUseKeyItemInField(item)
return
end
elsif cmdPokegear>=0 && command==cmdPokegear
pbFadeOutIn {
scene = PokemonPokegear_Scene.new
screen = PokemonPokegearScreen.new(scene)
screen.pbStartScreen
@scene.pbRefresh
}
elsif cmdTrainer>=0 && command==cmdTrainer
pbFadeOutIn {
scene = PokemonTrainerCard_Scene.new
screen = PokemonTrainerCardScreen.new(scene)
screen.pbStartScreen
@scene.pbRefresh
}
elsif cmdQuit>=0 && command==cmdQuit
@scene.pbHideMenu
if pbInSafari?
if pbConfirmMessage(_INTL("Would you like to leave the Safari Game right now?"))
@scene.pbEndScene
pbSafariState.decision = 1
pbSafariState.pbGoToStart
return
else
pbShowMenu
end
else
if pbConfirmMessage(_INTL("Would you like to end the Contest now?"))
@scene.pbEndScene
pbBugContestState.pbStartJudging
return
else
pbShowMenu
end
end
elsif cmdSave>=0 && command==cmdSave
@scene.pbHideMenu
scene = PokemonSave_Scene.new
screen = PokemonSaveScreen.new(scene)
if screen.pbSaveScreen
@scene.pbEndScene
endscene = false
break
else
pbShowMenu
end
elsif cmdOption>=0 && command==cmdOption
pbFadeOutIn {
scene = PokemonOption_Scene.new
screen = PokemonOptionScreen.new(scene)
screen.pbStartScreen
pbUpdateSceneMap
@scene.pbRefresh
}
elsif cmdDebug>=0 && command==cmdDebug
pbFadeOutIn {
pbDebugMenu
@scene.pbRefresh
}
elsif cmdEndGame>=0 && command==cmdEndGame
@scene.pbHideMenu
if pbConfirmMessage(_INTL("Are you sure you want to quit the game?"))
scene = PokemonSave_Scene.new
screen = PokemonSaveScreen.new(scene)
if screen.pbSaveScreen
@scene.pbEndScene
end
@scene.pbEndScene
$scene = nil
return
else
pbShowMenu
end
else
break
end
end
@scene.pbEndScene if endscene
end
end

View File

@@ -0,0 +1,126 @@
#===============================================================================
# Pokédex Regional Dexes list menu screen
# * For choosing which region list to view. Only appears when there is more
# than one viable region list to choose from, and if USE_CURRENT_REGION_DEX is
# false.
#===============================================================================
class Window_DexesList < Window_CommandPokemon
def initialize(commands,commands2,width)
@commands2 = commands2
super(commands,width)
@selarrow = AnimatedBitmap.new("Graphics/Pictures/selarrow_white")
self.baseColor = Color.new(248,248,248)
self.shadowColor = Color.new(0,0,0)
self.windowskin = nil
end
def drawItem(index,count,rect)
super(index,count,rect)
if index>=0 && index<@commands2.length
pbDrawShadowText(self.contents,rect.x+254,rect.y,64,rect.height,
sprintf("%d",@commands2[index][0]),self.baseColor,self.shadowColor,1)
pbDrawShadowText(self.contents,rect.x+350,rect.y,64,rect.height,
sprintf("%d",@commands2[index][1]),self.baseColor,self.shadowColor,1)
allseen = (@commands2[index][0]>=@commands2[index][2])
allown = (@commands2[index][1]>=@commands2[index][2])
pbDrawImagePositions(self.contents,[
["Graphics/Pictures/Pokedex/icon_menuseenown",rect.x+236,rect.y+4,(allseen) ? 24 : 0,0,24,24],
["Graphics/Pictures/Pokedex/icon_menuseenown",rect.x+332,rect.y+4,(allown) ? 24 : 0,24,24,24]
])
end
end
end
class PokemonPokedexMenu_Scene
def pbUpdate
pbUpdateSpriteHash(@sprites)
end
def pbStartScene(commands,commands2)
@commands = commands
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99999
@sprites = {}
@sprites["background"] = IconSprite.new(0,0,@viewport)
@sprites["background"].setBitmap(_INTL("Graphics/Pictures/Pokedex/bg_menu"))
@sprites["headings"]=Window_AdvancedTextPokemon.newWithSize(
_INTL("<c3=F8F8F8,C02028>SEEN<r>OBTAINED</c3>"),286,136,208,64,@viewport)
@sprites["headings"].windowskin = nil
@sprites["commands"] = Window_DexesList.new(commands,commands2,Graphics.width-84)
@sprites["commands"].x = 40
@sprites["commands"].y = 192
@sprites["commands"].height = 192
@sprites["commands"].viewport = @viewport
pbFadeInAndShow(@sprites) { pbUpdate }
end
def pbScene
ret = -1
loop do
Graphics.update
Input.update
pbUpdate
if Input.trigger?(Input::B)
pbPlayCloseMenuSE
break
elsif Input.trigger?(Input::C)
ret = @sprites["commands"].index
(ret==@commands.length-1) ? pbPlayCloseMenuSE : pbPlayDecisionSE
break
end
end
return ret
end
def pbEndScene
pbFadeOutAndHide(@sprites) { pbUpdate }
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
end
class PokemonPokedexMenuScreen
def initialize(scene)
@scene = scene
end
def pbStartScreen
commands = []
commands2 = []
dexnames = pbDexNames
for i in 0...$PokemonGlobal.pokedexViable.length
index = $PokemonGlobal.pokedexViable[i]
if dexnames[index]==nil
commands[i] = _INTL("Pokédex")
else
if dexnames[index].is_a?(Array)
commands[i] = dexnames[index][0]
else
commands[i] = dexnames[index]
end
end
index = -1 if index>=$PokemonGlobal.pokedexUnlocked.length-1
commands2[i] = [$Trainer.pokedexSeen(index),
$Trainer.pokedexOwned(index),
pbGetRegionalDexLength(index)]
end
commands.push(_INTL("Exit"))
@scene.pbStartScene(commands,commands2)
loop do
cmd = @scene.pbScene
break if cmd<0 || cmd>=commands2.length # Cancel/Exit
$PokemonGlobal.pokedexDex = $PokemonGlobal.pokedexViable[cmd]
$PokemonGlobal.pokedexDex = -1 if $PokemonGlobal.pokedexDex==$PokemonGlobal.pokedexUnlocked.length-1
pbFadeOutIn {
scene = PokemonPokedex_Scene.new
screen = PokemonPokedexScreen.new(scene)
screen.pbStartScreen
}
end
@scene.pbEndScene
end
end

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,586 @@
def pbFindEncounter(encounter,species)
return false if !encounter
for i in 0...encounter.length
next if !encounter[i]
for j in 0...encounter[i].length
return true if encounter[i][j][0]==species
end
end
return false
end
class PokemonPokedexInfo_Scene
def pbStartScene(dexlist,index,region)
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99999
@dexlist = dexlist
@index = index
@region = region
@page = 1
@typebitmap = AnimatedBitmap.new(_INTL("Graphics/Pictures/Pokedex/icon_types"))
@sprites = {}
@sprites["background"] = IconSprite.new(0,0,@viewport)
@sprites["infosprite"] = PokemonSprite.new(@viewport)
@sprites["infosprite"].setOffset(PictureOrigin::Center)
@sprites["infosprite"].x = 104
@sprites["infosprite"].y = 136
@mapdata = pbLoadTownMapData
mappos = ($game_map) ? pbGetMetadata($game_map.map_id,MetadataMapPosition) : nil
if @region<0 # Use player's current region
@region = (mappos) ? mappos[0] : 0 # Region 0 default
end
@sprites["areamap"] = IconSprite.new(0,0,@viewport)
@sprites["areamap"].setBitmap("Graphics/Pictures/#{@mapdata[@region][1]}")
@sprites["areamap"].x += (Graphics.width-@sprites["areamap"].bitmap.width)/2
@sprites["areamap"].y += (Graphics.height+32-@sprites["areamap"].bitmap.height)/2
for hidden in REGION_MAP_EXTRAS
if hidden[0]==@region && hidden[1]>0 && $game_switches[hidden[1]]
pbDrawImagePositions(@sprites["areamap"].bitmap,[
["Graphics/Pictures/#{hidden[4]}",
hidden[2]*PokemonRegionMap_Scene::SQUAREWIDTH,
hidden[3]*PokemonRegionMap_Scene::SQUAREHEIGHT]
])
end
end
@sprites["areahighlight"] = BitmapSprite.new(Graphics.width,Graphics.height,@viewport)
@sprites["areaoverlay"] = IconSprite.new(0,0,@viewport)
@sprites["areaoverlay"].setBitmap("Graphics/Pictures/Pokedex/overlay_area")
@sprites["formfront"] = PokemonSprite.new(@viewport)
@sprites["formfront"].setOffset(PictureOrigin::Center)
@sprites["formfront"].x = 130
@sprites["formfront"].y = 158
@sprites["formback"] = PokemonSprite.new(@viewport)
@sprites["formback"].setOffset(PictureOrigin::Bottom)
@sprites["formback"].x = 382 # y is set below as it depends on metrics
@sprites["formicon"] = PokemonSpeciesIconSprite.new(0,@viewport)
@sprites["formicon"].setOffset(PictureOrigin::Center)
@sprites["formicon"].x = 82
@sprites["formicon"].y = 328
@sprites["uparrow"] = AnimatedSprite.new("Graphics/Pictures/uparrow",8,28,40,2,@viewport)
@sprites["uparrow"].x = 242
@sprites["uparrow"].y = 268
@sprites["uparrow"].play
@sprites["uparrow"].visible = false
@sprites["downarrow"] = AnimatedSprite.new("Graphics/Pictures/downarrow",8,28,40,2,@viewport)
@sprites["downarrow"].x = 242
@sprites["downarrow"].y = 348
@sprites["downarrow"].play
@sprites["downarrow"].visible = false
@sprites["overlay"] = BitmapSprite.new(Graphics.width,Graphics.height,@viewport)
pbSetSystemFont(@sprites["overlay"].bitmap)
pbUpdateDummyPokemon
@available = pbGetAvailableForms
drawPage(@page)
pbFadeInAndShow(@sprites) { pbUpdate }
end
def pbStartSceneBrief(species) # For standalone access, shows first page only
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99999
# @region = 0
dexnum = species
dexnumshift = false
if $PokemonGlobal.pokedexUnlocked[$PokemonGlobal.pokedexUnlocked.length-1]
dexnumshift = true if DEXES_WITH_OFFSETS.include?(-1)
else
dexnum = 0
for i in 0...$PokemonGlobal.pokedexUnlocked.length-1
next if !$PokemonGlobal.pokedexUnlocked[i]
num = pbGetRegionalNumber(i,species)
next if num<=0
dexnum = num
dexnumshift = true if DEXES_WITH_OFFSETS.include?(i)
# @region = pbDexNames[i][1] if pbDexNames[i].is_a?(Array)
break
end
end
@dexlist = [[species,"",0,0,dexnum,dexnumshift]]
@index = 0
@page = 1
@brief = true
@typebitmap = AnimatedBitmap.new(_INTL("Graphics/Pictures/Pokedex/icon_types"))
@sprites = {}
@sprites["background"] = IconSprite.new(0,0,@viewport)
@sprites["infosprite"] = PokemonSprite.new(@viewport)
@sprites["infosprite"].setOffset(PictureOrigin::Center)
@sprites["infosprite"].x = 104
@sprites["infosprite"].y = 136
@sprites["overlay"] = BitmapSprite.new(Graphics.width,Graphics.height,@viewport)
pbSetSystemFont(@sprites["overlay"].bitmap)
pbUpdateDummyPokemon
drawPage(@page)
pbFadeInAndShow(@sprites) { pbUpdate }
end
def pbEndScene
pbFadeOutAndHide(@sprites) { pbUpdate }
pbDisposeSpriteHash(@sprites)
@typebitmap.dispose
@viewport.dispose
end
def pbUpdate
if @page==2
intensity = (Graphics.frame_count%40)*12
intensity = 480-intensity if intensity>240
@sprites["areahighlight"].opacity = intensity
end
pbUpdateSpriteHash(@sprites)
end
def pbUpdateDummyPokemon
@species = @dexlist[@index][0]
@gender = ($Trainer.formlastseen[@species][0] rescue 0)
@form = ($Trainer.formlastseen[@species][1] rescue 0)
@sprites["infosprite"].setSpeciesBitmap(@species,(@gender==1),@form)
if @sprites["formfront"]
@sprites["formfront"].setSpeciesBitmap(@species,(@gender==1),@form)
end
if @sprites["formback"]
@sprites["formback"].setSpeciesBitmap(@species,(@gender==1),@form,false,false,true)
@sprites["formback"].y = 256
fSpecies = pbGetFSpeciesFromForm(@species,@form)
@sprites["formback"].y += (pbLoadSpeciesMetrics[MetricBattlerPlayerY][fSpecies] || 0)*2
end
if @sprites["formicon"]
@sprites["formicon"].pbSetParams(@species,@gender,@form)
end
end
def pbGetAvailableForms
available = [] # [name, gender, form]
formdata = pbLoadFormToSpecies
possibleforms = []
multiforms = false
if formdata[@species]
for i in 0...formdata[@species].length
fSpecies = pbGetFSpeciesFromForm(@species,i)
formname = pbGetMessage(MessageTypes::FormNames,fSpecies)
genderRate = pbGetSpeciesData(@species,i,SpeciesGenderRate)
if i==0 || (formname && formname!="")
multiforms = true if i>0
case genderRate
when PBGenderRates::AlwaysMale,
PBGenderRates::AlwaysFemale,
PBGenderRates::Genderless
gendertopush = (genderRate==PBGenderRates::AlwaysFemale) ? 1 : 0
if $Trainer.formseen[@species][gendertopush][i] || DEX_SHOWS_ALL_FORMS
gendertopush = 2 if genderRate==PBGenderRates::Genderless
possibleforms.push([i,gendertopush,formname])
end
else # Both male and female
for g in 0...2
if $Trainer.formseen[@species][g][i] || DEX_SHOWS_ALL_FORMS
possibleforms.push([i,g,formname])
break if (formname && formname!="")
end
end
end
end
end
end
for thisform in possibleforms
if thisform[2] && thisform[2]!="" # Has a form name
thisformname = thisform[2]
else # Necessarily applies only to form 0
case thisform[1]
when 0; thisformname = _INTL("Male")
when 1; thisformname = _INTL("Female")
else
thisformname = (multiforms) ? _INTL("One Form") : _INTL("Genderless")
end
end
# Push to available array
gendertopush = (thisform[1]==2) ? 0 : thisform[1]
available.push([thisformname,gendertopush,thisform[0]])
end
return available
end
def drawPage(page)
overlay = @sprites["overlay"].bitmap
overlay.clear
# Make certain sprites visible
@sprites["infosprite"].visible = (@page==1)
@sprites["areamap"].visible = (@page==2) if @sprites["areamap"]
@sprites["areahighlight"].visible = (@page==2) if @sprites["areahighlight"]
@sprites["areaoverlay"].visible = (@page==2) if @sprites["areaoverlay"]
@sprites["formfront"].visible = (@page==3) if @sprites["formfront"]
@sprites["formback"].visible = (@page==3) if @sprites["formback"]
@sprites["formicon"].visible = (@page==3) if @sprites["formicon"]
# Draw page-specific information
case page
when 1; drawPageInfo
when 2; drawPageArea
when 3; drawPageForms
end
end
def drawPageInfo
@sprites["background"].setBitmap(_INTL("Graphics/Pictures/Pokedex/bg_info"))
overlay = @sprites["overlay"].bitmap
base = Color.new(88,88,80)
shadow = Color.new(168,184,184)
imagepos = []
if @brief
imagepos.push([_INTL("Graphics/Pictures/Pokedex/overlay_info"),0,0])
end
# Write various bits of text
indexText = "???"
if @dexlist[@index][4]>0
indexNumber = @dexlist[@index][4]
indexNumber -= 1 if @dexlist[@index][5]
indexText = sprintf("%03d",indexNumber)
end
textpos = [
[_INTL("{1}{2} {3}",indexText," ",PBSpecies.getName(@species)),
246,42,0,Color.new(248,248,248),Color.new(0,0,0)],
[_INTL("Height"),314,158,0,base,shadow],
[_INTL("Weight"),314,190,0,base,shadow]
]
if $Trainer.owned[@species]
speciesData = pbGetSpeciesData(@species,@form)
fSpecies = pbGetFSpeciesFromForm(@species,@form)
# Write the kind
kind = pbGetMessage(MessageTypes::Kinds,fSpecies)
kind = pbGetMessage(MessageTypes::Kinds,@species) if !kind || kind==""
textpos.push([_INTL("{1} Pokémon",kind),246,74,0,base,shadow])
# Write the height and weight
height = speciesData[SpeciesHeight] || 1
weight = speciesData[SpeciesWeight] || 1
if pbGetCountry==0xF4 # If the user is in the United States
inches = (height/0.254).round
pounds = (weight/0.45359).round
textpos.push([_ISPRINTF("{1:d}'{2:02d}\"",inches/12,inches%12),460,158,1,base,shadow])
textpos.push([_ISPRINTF("{1:4.1f} lbs.",pounds/10.0),494,190,1,base,shadow])
else
textpos.push([_ISPRINTF("{1:.1f} m",height/10.0),470,158,1,base,shadow])
textpos.push([_ISPRINTF("{1:.1f} kg",weight/10.0),482,190,1,base,shadow])
end
# Draw the Pokédex entry text
entry = pbGetMessage(MessageTypes::Entries,fSpecies)
entry = pbGetMessage(MessageTypes::Entries,@species) if !entry || entry==""
drawTextEx(overlay,40,240,Graphics.width-(40*2),4,entry,base,shadow)
# Draw the footprint
footprintfile = pbPokemonFootprintFile(@species,@form)
if footprintfile
footprint = BitmapCache.load_bitmap(footprintfile)
overlay.blt(226,138,footprint,footprint.rect)
footprint.dispose
end
# Show the owned icon
imagepos.push(["Graphics/Pictures/Pokedex/icon_own",212,44])
# Draw the type icon(s)
type1 = speciesData[SpeciesType1] || 0
type2 = speciesData[SpeciesType2] || type1
type1rect = Rect.new(0,type1*32,96,32)
type2rect = Rect.new(0,type2*32,96,32)
overlay.blt(296,120,@typebitmap.bitmap,type1rect)
overlay.blt(396,120,@typebitmap.bitmap,type2rect) if type1!=type2
else
# Write the kind
textpos.push([_INTL("????? Pokémon"),246,74,0,base,shadow])
# Write the height and weight
if pbGetCountry()==0xF4 # If the user is in the United States
textpos.push([_INTL("???'??\""),460,158,1,base,shadow])
textpos.push([_INTL("????.? lbs."),494,190,1,base,shadow])
else
textpos.push([_INTL("????.? m"),470,158,1,base,shadow])
textpos.push([_INTL("????.? kg"),482,190,1,base,shadow])
end
end
# Draw all text
pbDrawTextPositions(@sprites["overlay"].bitmap,textpos)
# Draw all images
pbDrawImagePositions(overlay,imagepos)
end
def drawPageArea
@sprites["background"].setBitmap(_INTL("Graphics/Pictures/Pokedex/bg_area"))
overlay = @sprites["overlay"].bitmap
base = Color.new(88,88,80)
shadow = Color.new(168,184,184)
@sprites["areahighlight"].bitmap.clear
# Fill the array "points" with all squares of the region map in which the
# species can be found
points = []
mapwidth = 1+PokemonRegionMap_Scene::RIGHT-PokemonRegionMap_Scene::LEFT
encdata = pbLoadEncountersData
for enc in encdata.keys
enctypes = encdata[enc][1]
if pbFindEncounter(enctypes,@species)
mappos = pbGetMetadata(enc,MetadataMapPosition)
if mappos && mappos[0]==@region
showpoint = true
for loc in @mapdata[@region][2]
showpoint = false if loc[0]==mappos[1] && loc[1]==mappos[2] &&
loc[7] && !$game_switches[loc[7]]
end
if showpoint
mapsize = pbGetMetadata(enc,MetadataMapSize)
if mapsize && mapsize[0] && mapsize[0]>0
sqwidth = mapsize[0]
sqheight = (mapsize[1].length*1.0/mapsize[0]).ceil
for i in 0...sqwidth
for j in 0...sqheight
if mapsize[1][i+j*sqwidth,1].to_i>0
points[mappos[1]+i+(mappos[2]+j)*mapwidth] = true
end
end
end
else
points[mappos[1]+mappos[2]*mapwidth] = true
end
end
end
end
end
# Draw coloured squares on each square of the region map with a nest
pointcolor = Color.new(0,248,248)
pointcolorhl = Color.new(192,248,248)
sqwidth = PokemonRegionMap_Scene::SQUAREWIDTH
sqheight = PokemonRegionMap_Scene::SQUAREHEIGHT
for j in 0...points.length
if points[j]
x = (j%mapwidth)*sqwidth
x += (Graphics.width-@sprites["areamap"].bitmap.width)/2
y = (j/mapwidth)*sqheight
y += (Graphics.height+32-@sprites["areamap"].bitmap.height)/2
@sprites["areahighlight"].bitmap.fill_rect(x,y,sqwidth,sqheight,pointcolor)
if j-mapwidth<0 || !points[j-mapwidth]
@sprites["areahighlight"].bitmap.fill_rect(x,y-2,sqwidth,2,pointcolorhl)
end
if j+mapwidth>=points.length || !points[j+mapwidth]
@sprites["areahighlight"].bitmap.fill_rect(x,y+sqheight,sqwidth,2,pointcolorhl)
end
if j%mapwidth==0 || !points[j-1]
@sprites["areahighlight"].bitmap.fill_rect(x-2,y,2,sqheight,pointcolorhl)
end
if (j+1)%mapwidth==0 || !points[j+1]
@sprites["areahighlight"].bitmap.fill_rect(x+sqwidth,y,2,sqheight,pointcolorhl)
end
end
end
# Set the text
textpos = []
if points.length==0
pbDrawImagePositions(overlay,[
[sprintf("Graphics/Pictures/Pokedex/overlay_areanone"),108,188]
])
textpos.push([_INTL("Area unknown"),Graphics.width/2,Graphics.height/2,2,base,shadow])
end
textpos.push([pbGetMessage(MessageTypes::RegionNames,@region),414,44,2,base,shadow])
textpos.push([_INTL("{1}'s area",PBSpecies.getName(@species)),
Graphics.width/2,352,2,base,shadow])
pbDrawTextPositions(overlay,textpos)
end
def drawPageForms
@sprites["background"].setBitmap(_INTL("Graphics/Pictures/Pokedex/bg_forms"))
overlay = @sprites["overlay"].bitmap
base = Color.new(88,88,80)
shadow = Color.new(168,184,184)
# Write species and form name
formname = ""
for i in @available
if i[1]==@gender && i[2]==@form
formname = i[0]; break
end
end
textpos = [
[PBSpecies.getName(@species),Graphics.width/2,Graphics.height-88,2,base,shadow],
[formname,Graphics.width/2,Graphics.height-56,2,base,shadow],
]
# Draw all text
pbDrawTextPositions(overlay,textpos)
end
def pbGoToPrevious
newindex = @index
while newindex>0
newindex -= 1
if $Trainer.seen[@dexlist[newindex][0]]
@index = newindex
break
end
end
end
def pbGoToNext
newindex = @index
while newindex<@dexlist.length-1
newindex += 1
if $Trainer.seen[@dexlist[newindex][0]]
@index = newindex
break
end
end
end
def pbChooseForm
index = 0
for i in 0...@available.length
if @available[i][1]==@gender && @available[i][2]==@form
index = i
break
end
end
oldindex = -1
loop do
if oldindex!=index
$Trainer.formlastseen[@species][0] = @available[index][1]
$Trainer.formlastseen[@species][1] = @available[index][2]
pbUpdateDummyPokemon
drawPage(@page)
@sprites["uparrow"].visible = (index>0)
@sprites["downarrow"].visible = (index<@available.length-1)
oldindex = index
end
Graphics.update
Input.update
pbUpdate
if Input.trigger?(Input::UP)
pbPlayCursorSE
index = (index+@available.length-1)%@available.length
elsif Input.trigger?(Input::DOWN)
pbPlayCursorSE
index = (index+1)%@available.length
elsif Input.trigger?(Input::B)
pbPlayCancelSE
break
elsif Input.trigger?(Input::C)
pbPlayDecisionSE
break
end
end
@sprites["uparrow"].visible = false
@sprites["downarrow"].visible = false
end
def pbScene
pbPlayCrySpecies(@species,@form)
loop do
Graphics.update
Input.update
pbUpdate
dorefresh = false
if Input.trigger?(Input::A)
pbSEStop
pbPlayCrySpecies(@species,@form) if @page==1
elsif Input.trigger?(Input::B)
pbPlayCloseMenuSE
break
elsif Input.trigger?(Input::C)
if @page==2 # Area
# dorefresh = true
elsif @page==3 # Forms
if @available.length>1
pbPlayDecisionSE
pbChooseForm
dorefresh = true
end
end
elsif Input.trigger?(Input::UP)
oldindex = @index
pbGoToPrevious
if @index!=oldindex
pbUpdateDummyPokemon
@available = pbGetAvailableForms
pbSEStop
(@page==1) ? pbPlayCrySpecies(@species,@form) : pbPlayCursorSE
dorefresh = true
end
elsif Input.trigger?(Input::DOWN)
oldindex = @index
pbGoToNext
if @index!=oldindex
pbUpdateDummyPokemon
@available = pbGetAvailableForms
pbSEStop
(@page==1) ? pbPlayCrySpecies(@species,@form) : pbPlayCursorSE
dorefresh = true
end
elsif Input.trigger?(Input::LEFT)
oldpage = @page
@page -= 1
@page = 1 if @page<1
@page = 3 if @page>3
if @page!=oldpage
pbPlayCursorSE
dorefresh = true
end
elsif Input.trigger?(Input::RIGHT)
oldpage = @page
@page += 1
@page = 1 if @page<1
@page = 3 if @page>3
if @page!=oldpage
pbPlayCursorSE
dorefresh = true
end
end
if dorefresh
drawPage(@page)
end
end
return @index
end
def pbSceneBrief
pbPlayCrySpecies(@species,@form)
loop do
Graphics.update
Input.update
pbUpdate
if Input.trigger?(Input::A)
pbSEStop
pbPlayCrySpecies(@species,@form)
elsif Input.trigger?(Input::B)
pbPlayCloseMenuSE
break
elsif Input.trigger?(Input::C)
pbPlayDecisionSE
break
end
end
end
end
class PokemonPokedexInfoScreen
def initialize(scene)
@scene = scene
end
def pbStartScreen(dexlist,index,region)
@scene.pbStartScene(dexlist,index,region)
ret = @scene.pbScene
@scene.pbEndScene
return ret # Index of last species viewed in dexlist
end
def pbStartSceneSingle(species) # For use from a Pokémon's summary screen
region = -1
if USE_CURRENT_REGION_DEX
region = pbGetCurrentRegion
region = -1 if region>=$PokemonGlobal.pokedexUnlocked.length-1
else
region = $PokemonGlobal.pokedexDex # National Dex -1, regional dexes 0 etc.
end
dexnum = pbGetRegionalNumber(region,species)
dexnumshift = DEXES_WITH_OFFSETS.include?(region)
dexlist = [[species,PBSpecies.getName(species),0,0,dexnum,dexnumshift]]
@scene.pbStartScene(dexlist,0,region)
@scene.pbScene
@scene.pbEndScene
end
def pbDexEntry(species) # For use when capturing a new species
@scene.pbStartSceneBrief(species)
@scene.pbSceneBrief
@scene.pbEndScene
end
end

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,716 @@
class Window_PokemonBag < Window_DrawableCommand
attr_reader :pocket
attr_accessor :sorting
def initialize(bag,filterlist,pocket,x,y,width,height)
@bag = bag
@filterlist = filterlist
@pocket = pocket
@sorting = false
@adapter = PokemonMartAdapter.new
super(x,y,width,height)
@selarrow = AnimatedBitmap.new("Graphics/Pictures/Bag/cursor")
@swaparrow = AnimatedBitmap.new("Graphics/Pictures/Bag/cursor_swap")
self.windowskin = nil
end
def dispose
@swaparrow.dispose
super
end
def pocket=(value)
@pocket = value
@item_max = (@filterlist) ? @filterlist[@pocket].length+1 : @bag.pockets[@pocket].length+1
self.index = @bag.getChoice(@pocket)
end
def page_row_max; return PokemonBag_Scene::ITEMSVISIBLE; end
def page_item_max; return PokemonBag_Scene::ITEMSVISIBLE; end
def item
return 0 if @filterlist && !@filterlist[@pocket][self.index]
thispocket = @bag.pockets[@pocket]
item = (@filterlist) ? thispocket[@filterlist[@pocket][self.index]] : thispocket[self.index]
return (item) ? item[0] : 0
end
def itemCount
return (@filterlist) ? @filterlist[@pocket].length+1 : @bag.pockets[@pocket].length+1
end
def itemRect(item)
if item<0 || item>=@item_max || item<self.top_item-1 ||
item>self.top_item+self.page_item_max
return Rect.new(0,0,0,0)
else
cursor_width = (self.width-self.borderX-(@column_max-1)*@column_spacing) / @column_max
x = item % @column_max * (cursor_width + @column_spacing)
y = item / @column_max * @row_height - @virtualOy
return Rect.new(x, y, cursor_width, @row_height)
end
end
def drawCursor(index,rect)
if self.index==index
bmp = (@sorting) ? @swaparrow.bitmap : @selarrow.bitmap
pbCopyBitmap(self.contents,bmp,rect.x,rect.y+2)
end
end
def drawItem(index,count,rect)
textpos = []
rect = Rect.new(rect.x+16,rect.y+16,rect.width-16,rect.height)
ypos = rect.y+4
thispocket = @bag.pockets[@pocket]
if index==self.itemCount-1
textpos.push([_INTL("CLOSE BAG"),rect.x,ypos,false,self.baseColor,self.shadowColor])
else
item = (@filterlist) ? thispocket[@filterlist[@pocket][index]][0] : thispocket[index][0]
baseColor = self.baseColor
shadowColor = self.shadowColor
if @sorting && index==self.index
baseColor = Color.new(224,0,0)
shadowColor = Color.new(248,144,144)
end
textpos.push(
[@adapter.getDisplayName(item),rect.x,ypos,false,baseColor,shadowColor]
)
if !pbIsImportantItem?(item) # Not a Key item or HM (or infinite TM)
qty = (@filterlist) ? thispocket[@filterlist[@pocket][index]][1] : thispocket[index][1]
qtytext = _ISPRINTF("x{1: 3d}",qty)
xQty = rect.x+rect.width-self.contents.text_size(qtytext).width-16
textpos.push([qtytext,xQty,ypos,false,baseColor,shadowColor])
end
if pbIsImportantItem?(item)
if @bag.pbIsRegistered?(item)
pbDrawImagePositions(self.contents,[
["Graphics/Pictures/Bag/icon_register",rect.x+rect.width-72,ypos+4,0,0,-1,24]
])
elsif pbCanRegisterItem?(item)
pbDrawImagePositions(self.contents,[
["Graphics/Pictures/Bag/icon_register",rect.x+rect.width-72,ypos+4,0,24,-1,24]
])
end
end
end
pbDrawTextPositions(self.contents,textpos)
end
def refresh
@item_max = itemCount()
self.update_cursor_rect
dwidth = self.width-self.borderX
dheight = self.height-self.borderY
self.contents = pbDoEnsureBitmap(self.contents,dwidth,dheight)
self.contents.clear
for i in 0...@item_max
next if i<self.top_item-1 || i>self.top_item+self.page_item_max
drawItem(i,@item_max,itemRect(i))
end
drawCursor(self.index,itemRect(self.index))
end
def update
super
@uparrow.visible = false
@downarrow.visible = false
end
end
#===============================================================================
# Bag visuals
#===============================================================================
class PokemonBag_Scene
ITEMLISTBASECOLOR = Color.new(88,88,80)
ITEMLISTSHADOWCOLOR = Color.new(168,184,184)
ITEMTEXTBASECOLOR = Color.new(248,248,248)
ITEMTEXTSHADOWCOLOR = Color.new(0,0,0)
POCKETNAMEBASECOLOR = Color.new(88,88,80)
POCKETNAMESHADOWCOLOR = Color.new(168,184,184)
ITEMSVISIBLE = 7
def pbUpdate
pbUpdateSpriteHash(@sprites)
end
def pbStartScene(bag,choosing=false,filterproc=nil,resetpocket=true)
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99999
@bag = bag
@choosing = choosing
@filterproc = filterproc
pbRefreshFilter
lastpocket = @bag.lastpocket
numfilledpockets = @bag.pockets.length-1
if @choosing
numfilledpockets = 0
if @filterlist!=nil
for i in 1...@bag.pockets.length
numfilledpockets += 1 if @filterlist[i].length>0
end
else
for i in 1...@bag.pockets.length
numfilledpockets += 1 if @bag.pockets[i].length>0
end
end
lastpocket = (resetpocket) ? 1 : @bag.lastpocket
if (@filterlist && @filterlist[lastpocket].length==0) ||
(!@filterlist && @bag.pockets[lastpocket].length==0)
for i in 1...@bag.pockets.length
if @filterlist && @filterlist[i].length>0
lastpocket = i; break
elsif !@filterlist && @bag.pockets[i].length>0
lastpocket = i; break
end
end
end
end
@bag.lastpocket = lastpocket
@sliderbitmap = AnimatedBitmap.new(_INTL("Graphics/Pictures/Bag/icon_slider"))
@pocketbitmap = AnimatedBitmap.new(_INTL("Graphics/Pictures/Bag/icon_pocket"))
@sprites = {}
@sprites["background"] = IconSprite.new(0,0,@viewport)
@sprites["overlay"] = BitmapSprite.new(Graphics.width,Graphics.height,@viewport)
pbSetSystemFont(@sprites["overlay"].bitmap)
@sprites["bagsprite"] = IconSprite.new(30,20,@viewport)
@sprites["pocketicon"] = BitmapSprite.new(186,32,@viewport)
@sprites["pocketicon"].x = 0
@sprites["pocketicon"].y = 224
@sprites["leftarrow"] = AnimatedSprite.new("Graphics/Pictures/leftarrow",8,40,28,2,@viewport)
@sprites["leftarrow"].x = -4
@sprites["leftarrow"].y = 76
@sprites["leftarrow"].visible = (!@choosing || numfilledpockets>1)
@sprites["leftarrow"].play
@sprites["rightarrow"] = AnimatedSprite.new("Graphics/Pictures/rightarrow",8,40,28,2,@viewport)
@sprites["rightarrow"].x = 150
@sprites["rightarrow"].y = 76
@sprites["rightarrow"].visible = (!@choosing || numfilledpockets>1)
@sprites["rightarrow"].play
@sprites["itemlist"] = Window_PokemonBag.new(@bag,@filterlist,lastpocket,168,-8,314,40+32+ITEMSVISIBLE*32)
@sprites["itemlist"].viewport = @viewport
@sprites["itemlist"].pocket = lastpocket
@sprites["itemlist"].index = @bag.getChoice(lastpocket)
@sprites["itemlist"].baseColor = ITEMLISTBASECOLOR
@sprites["itemlist"].shadowColor = ITEMLISTSHADOWCOLOR
@sprites["itemicon"] = ItemIconSprite.new(48,Graphics.height-48,-1,@viewport)
@sprites["itemtext"] = Window_UnformattedTextPokemon.new("")
@sprites["itemtext"].x = 72
@sprites["itemtext"].y = 270
@sprites["itemtext"].width = Graphics.width-72-24
@sprites["itemtext"].height = 128
@sprites["itemtext"].baseColor = ITEMTEXTBASECOLOR
@sprites["itemtext"].shadowColor = ITEMTEXTSHADOWCOLOR
@sprites["itemtext"].visible = true
@sprites["itemtext"].viewport = @viewport
@sprites["itemtext"].windowskin = nil
@sprites["helpwindow"] = Window_UnformattedTextPokemon.new("")
@sprites["helpwindow"].visible = false
@sprites["helpwindow"].viewport = @viewport
@sprites["msgwindow"] = Window_AdvancedTextPokemon.new("")
@sprites["msgwindow"].visible = false
@sprites["msgwindow"].viewport = @viewport
pbBottomLeftLines(@sprites["helpwindow"],1)
pbDeactivateWindows(@sprites)
pbRefresh
pbFadeInAndShow(@sprites)
end
def pbFadeOutScene
@oldsprites = pbFadeOutAndHide(@sprites)
end
def pbFadeInScene
pbFadeInAndShow(@sprites,@oldsprites)
@oldsprites = nil
end
def pbEndScene
pbFadeOutAndHide(@sprites) if !@oldsprites
@oldsprites = nil
pbDisposeSpriteHash(@sprites)
@sliderbitmap.dispose
@pocketbitmap.dispose
@viewport.dispose
end
def pbDisplay(msg,brief=false)
UIHelper.pbDisplay(@sprites["msgwindow"],msg,brief) { pbUpdate }
end
def pbConfirm(msg)
UIHelper.pbConfirm(@sprites["msgwindow"],msg) { pbUpdate }
end
def pbChooseNumber(helptext,maximum,initnum=1)
return UIHelper.pbChooseNumber(@sprites["helpwindow"],helptext,maximum,initnum) { pbUpdate }
end
def pbShowCommands(helptext,commands,index=0)
return UIHelper.pbShowCommands(@sprites["helpwindow"],helptext,commands,index) { pbUpdate }
end
def pbRefresh
# Set the background image
@sprites["background"].setBitmap(sprintf("Graphics/Pictures/Bag/bg_#{@bag.lastpocket}"))
# Set the bag sprite
fbagexists = pbResolveBitmap(sprintf("Graphics/Pictures/Bag/bag_#{@bag.lastpocket}_f"))
if $Trainer.female? && fbagexists
@sprites["bagsprite"].setBitmap("Graphics/Pictures/Bag/bag_#{@bag.lastpocket}_f")
else
@sprites["bagsprite"].setBitmap("Graphics/Pictures/Bag/bag_#{@bag.lastpocket}")
end
# Draw the pocket icons
@sprites["pocketicon"].bitmap.clear
if @choosing && @filterlist
for i in 1...@bag.pockets.length
if @filterlist[i].length==0
@sprites["pocketicon"].bitmap.blt(6+(i-1)*22,6,
@pocketbitmap.bitmap,Rect.new((i-1)*20,28,20,20))
end
end
end
@sprites["pocketicon"].bitmap.blt(2+(@sprites["itemlist"].pocket-1)*22,2,
@pocketbitmap.bitmap,Rect.new((@sprites["itemlist"].pocket-1)*28,0,28,28))
# Refresh the item window
@sprites["itemlist"].refresh
# Refresh more things
pbRefreshIndexChanged
end
def pbRefreshIndexChanged
itemlist = @sprites["itemlist"]
overlay = @sprites["overlay"].bitmap
overlay.clear
# Draw the pocket name
pbDrawTextPositions(overlay,[
[PokemonBag.pocketNames[@bag.lastpocket],94,180,2,POCKETNAMEBASECOLOR,POCKETNAMESHADOWCOLOR]
])
# Draw slider arrows
showslider = false
if itemlist.top_row>0
overlay.blt(470,16,@sliderbitmap.bitmap,Rect.new(0,0,36,38))
showslider = true
end
if itemlist.top_item+itemlist.page_item_max<itemlist.itemCount
overlay.blt(470,228,@sliderbitmap.bitmap,Rect.new(0,38,36,38))
showslider = true
end
# Draw slider box
if showslider
sliderheight = 174
boxheight = (sliderheight*itemlist.page_row_max/itemlist.row_max).floor
boxheight += [(sliderheight-boxheight)/2,sliderheight/6].min
boxheight = [boxheight.floor,38].max
y = 54
y += ((sliderheight-boxheight)*itemlist.top_row/(itemlist.row_max-itemlist.page_row_max)).floor
overlay.blt(470,y,@sliderbitmap.bitmap,Rect.new(36,0,36,4))
i = 0; while i*16<boxheight-4-18
height = [boxheight-4-18-i*16,16].min
overlay.blt(470,y+4+i*16,@sliderbitmap.bitmap,Rect.new(36,4,36,height))
i += 1
end
overlay.blt(470,y+boxheight-18,@sliderbitmap.bitmap,Rect.new(36,20,36,18))
end
# Set the selected item's icon
@sprites["itemicon"].item = itemlist.item
# Set the selected item's description
@sprites["itemtext"].text = (itemlist.item==0) ? _INTL("Close bag.") :
pbGetMessage(MessageTypes::ItemDescriptions,itemlist.item)
end
def pbRefreshFilter
@filterlist = nil
return if !@choosing
return if @filterproc==nil
@filterlist = []
for i in 1...@bag.pockets.length
@filterlist[i] = []
for j in 0...@bag.pockets[i].length
@filterlist[i].push(j) if @filterproc.call(@bag.pockets[i][j][0])
end
end
end
# Called when the item screen wants an item to be chosen from the screen
def pbChooseItem
@sprites["helpwindow"].visible = false
itemwindow = @sprites["itemlist"]
thispocket = @bag.pockets[itemwindow.pocket]
swapinitialpos = -1
pbActivateWindow(@sprites,"itemlist") {
loop do
oldindex = itemwindow.index
Graphics.update
Input.update
pbUpdate
if itemwindow.sorting && itemwindow.index>=thispocket.length
itemwindow.index = (oldindex==thispocket.length-1) ? 0 : thispocket.length-1
end
if itemwindow.index!=oldindex
# Move the item being switched
if itemwindow.sorting
thispocket.insert(itemwindow.index,thispocket.delete_at(oldindex))
end
# Update selected item for current pocket
@bag.setChoice(itemwindow.pocket,itemwindow.index)
pbRefresh
end
if itemwindow.sorting
if Input.trigger?(Input::A) ||
Input.trigger?(Input::C)
itemwindow.sorting = false
pbPlayDecisionSE
pbRefresh
elsif Input.trigger?(Input::B)
curindex = itemwindow.index
thispocket.insert(swapinitialpos,thispocket.delete_at(itemwindow.index))
itemwindow.index = swapinitialpos
itemwindow.sorting = false
pbPlayCancelSE
pbRefresh
end
else
# Change pockets
if Input.trigger?(Input::LEFT)
newpocket = itemwindow.pocket
loop do
newpocket = (newpocket==1) ? PokemonBag.numPockets : newpocket-1
break if !@choosing || newpocket==itemwindow.pocket
if @filterlist; break if @filterlist[newpocket].length>0
else; break if @bag.pockets[newpocket].length>0
end
end
if itemwindow.pocket!=newpocket
itemwindow.pocket = newpocket
@bag.lastpocket = itemwindow.pocket
thispocket = @bag.pockets[itemwindow.pocket]
pbPlayCursorSE
pbRefresh
end
elsif Input.trigger?(Input::RIGHT)
newpocket = itemwindow.pocket
loop do
newpocket = (newpocket==PokemonBag.numPockets) ? 1 : newpocket+1
break if !@choosing || newpocket==itemwindow.pocket
if @filterlist; break if @filterlist[newpocket].length>0
else; break if @bag.pockets[newpocket].length>0
end
end
if itemwindow.pocket!=newpocket
itemwindow.pocket = newpocket
@bag.lastpocket = itemwindow.pocket
thispocket = @bag.pockets[itemwindow.pocket]
pbPlayCursorSE
pbRefresh
end
# elsif Input.trigger?(Input::F5) # Register/unregister selected item
# if !@choosing && itemwindow.index<thispocket.length
# if @bag.pbIsRegistered?(itemwindow.item)
# @bag.pbUnregisterItem(itemwindow.item)
# elsif pbCanRegisterItem?(itemwindow.item)
# @bag.pbRegisterItem(itemwindow.item)
# end
# pbPlayDecisionSE
# pbRefresh
# end
elsif Input.trigger?(Input::A) # Start switching the selected item
if !@choosing
if thispocket.length>1 && itemwindow.index<thispocket.length &&
!BAG_POCKET_AUTO_SORT[itemwindow.pocket]
itemwindow.sorting = true
swapinitialpos = itemwindow.index
pbPlayDecisionSE
pbRefresh
end
end
elsif Input.trigger?(Input::B) # Cancel the item screen
pbPlayCloseMenuSE
return 0
elsif Input.trigger?(Input::C) # Choose selected item
(itemwindow.item==0) ? pbPlayCloseMenuSE : pbPlayDecisionSE
return itemwindow.item
end
end
end
}
end
end
#===============================================================================
# Bag mechanics
#===============================================================================
class PokemonBagScreen
def initialize(scene,bag)
@bag = bag
@scene = scene
end
def pbStartScreen
@scene.pbStartScene(@bag)
item = 0
loop do
item = @scene.pbChooseItem
break if item==0
cmdRead = -1
cmdUse = -1
cmdRegister = -1
cmdGive = -1
cmdToss = -1
cmdDebug = -1
commands = []
# Generate command list
commands[cmdRead = commands.length] = _INTL("Read") if pbIsMail?(item)
if ItemHandlers.hasOutHandler(item) || (pbIsMachine?(item) && $Trainer.party.length>0)
if ItemHandlers.hasUseText(item)
commands[cmdUse = commands.length] = ItemHandlers.getUseText(item)
else
commands[cmdUse = commands.length] = _INTL("Use")
end
end
commands[cmdGive = commands.length] = _INTL("Give") if $Trainer.pokemonParty.length>0 && pbCanHoldItem?(item)
commands[cmdToss = commands.length] = _INTL("Toss") if !pbIsImportantItem?(item) || $DEBUG
if @bag.pbIsRegistered?(item)
commands[cmdRegister = commands.length] = _INTL("Deselect")
elsif pbCanRegisterItem?(item)
commands[cmdRegister = commands.length] = _INTL("Register")
end
commands[cmdDebug = commands.length] = _INTL("Debug") if $DEBUG
commands[commands.length] = _INTL("Cancel")
# Show commands generated above
itemname = PBItems.getName(item)
command = @scene.pbShowCommands(_INTL("{1} is selected.",itemname),commands)
if cmdRead>=0 && command==cmdRead # Read mail
pbFadeOutIn {
pbDisplayMail(PokemonMail.new(item,"",""))
}
elsif cmdUse>=0 && command==cmdUse # Use item
ret = pbUseItem(@bag,item,@scene)
# ret: 0=Item wasn't used; 1=Item used; 2=Close Bag to use in field
break if ret==2 # End screen
@scene.pbRefresh
next
elsif cmdGive>=0 && command==cmdGive # Give item to Pokémon
if $Trainer.pokemonCount==0
@scene.pbDisplay(_INTL("There is no Pokémon."))
elsif pbIsImportantItem?(item)
@scene.pbDisplay(_INTL("The {1} can't be held.",itemname))
else
pbFadeOutIn {
sscene = PokemonParty_Scene.new
sscreen = PokemonPartyScreen.new(sscene,$Trainer.party)
sscreen.pbPokemonGiveScreen(item)
@scene.pbRefresh
}
end
elsif cmdToss>=0 && command==cmdToss # Toss item
qty = @bag.pbQuantity(item)
if qty>1
helptext = _INTL("Toss out how many {1}?",PBItems.getNamePlural(item))
qty = @scene.pbChooseNumber(helptext,qty)
end
if qty>0
itemname = PBItems.getNamePlural(item) if qty>1
if pbConfirm(_INTL("Is it OK to throw away {1} {2}?",qty,itemname))
pbDisplay(_INTL("Threw away {1} {2}.",qty,itemname))
qty.times { @bag.pbDeleteItem(item) }
@scene.pbRefresh
end
end
elsif cmdRegister>=0 && command==cmdRegister # Register item
if @bag.pbIsRegistered?(item)
@bag.pbUnregisterItem(item)
else
@bag.pbRegisterItem(item)
end
@scene.pbRefresh
elsif cmdDebug>=0 && command==cmdDebug # Debug
command = 0
loop do
command = @scene.pbShowCommands(_INTL("Do what with {1}?",itemname),[
_INTL("Change quantity"),
_INTL("Make Mystery Gift"),
_INTL("Cancel")
],command)
case command
### Cancel ###
when -1, 2
break
### Change quantity ###
when 0
qty = @bag.pbQuantity(item)
itemplural = PBItems.getNamePlural(item)
params = ChooseNumberParams.new
params.setRange(0,BAG_MAX_PER_SLOT)
params.setDefaultValue(qty)
newqty = pbMessageChooseNumber(
_INTL("Choose new quantity of {1} (max. #{BAG_MAX_PER_SLOT}).",itemplural),params) { @scene.pbUpdate }
if newqty>qty
@bag.pbStoreItem(item,newqty-qty)
elsif newqty<qty
@bag.pbDeleteItem(item,qty-newqty)
end
@scene.pbRefresh
break if newqty==0
### Make Mystery Gift ###
when 1
pbCreateMysteryGift(1,item)
end
end
end
end
@scene.pbEndScene
return item
end
def pbDisplay(text)
@scene.pbDisplay(text)
end
def pbConfirm(text)
return @scene.pbConfirm(text)
end
# UI logic for the item screen for choosing an item.
def pbChooseItemScreen(proc=nil)
oldlastpocket = @bag.lastpocket
oldchoices = @bag.getAllChoices
@scene.pbStartScene(@bag,true,proc)
item = @scene.pbChooseItem
@scene.pbEndScene
@bag.lastpocket = oldlastpocket
@bag.setAllChoices(oldchoices)
return item
end
# UI logic for withdrawing an item in the item storage screen.
def pbWithdrawItemScreen
if !$PokemonGlobal.pcItemStorage
$PokemonGlobal.pcItemStorage = PCItemStorage.new
end
storage = $PokemonGlobal.pcItemStorage
@scene.pbStartScene(storage)
loop do
item = @scene.pbChooseItem
break if item==0
commands = [_INTL("Withdraw"),_INTL("Give"),_INTL("Cancel")]
itemname = PBItems.getName(item)
command = @scene.pbShowCommands(_INTL("{1} is selected.",itemname),commands)
if command==0 # Withdraw
qty = storage.pbQuantity(item)
if qty>1 && !pbIsImportantItem?(item)
qty = @scene.pbChooseNumber(_INTL("How many do you want to withdraw?"),qty)
end
if qty>0
if !@bag.pbCanStore?(item,qty)
pbDisplay(_INTL("There's no more room in the Bag."))
else
if !storage.pbDeleteItem(item,qty)
raise "Can't delete items from storage"
end
if !@bag.pbStoreItem(item,qty)
raise "Can't withdraw items from storage"
end
@scene.pbRefresh
dispqty = (pbIsImportantItem?(item)) ? 1 : qty
itemname = PBItems.getNamePlural(item) if dispqty>1
pbDisplay(_INTL("Withdrew {1} {2}.",dispqty,itemname))
end
end
elsif command==1 # Give
if $Trainer.pokemonCount==0
@scene.pbDisplay(_INTL("There is no Pokémon."))
return 0
elsif pbIsImportantItem?(item)
@scene.pbDisplay(_INTL("The {1} can't be held.",itemname))
else
pbFadeOutIn {
sscene = PokemonParty_Scene.new
sscreen = PokemonPartyScreen.new(sscene,$Trainer.party)
if sscreen.pbPokemonGiveScreen(item)
# If the item was held, delete the item from storage
if !storage.pbDeleteItem(item,1)
raise "Can't delete item from storage"
end
end
@scene.pbRefresh
}
end
end
end
@scene.pbEndScene
end
# UI logic for depositing an item in the item storage screen.
def pbDepositItemScreen
@scene.pbStartScene(@bag)
if !$PokemonGlobal.pcItemStorage
$PokemonGlobal.pcItemStorage = PCItemStorage.new
end
storage = $PokemonGlobal.pcItemStorage
item = 0
loop do
item = @scene.pbChooseItem
break if item==0
qty = @bag.pbQuantity(item)
if qty>1 && !pbIsImportantItem?(item)
qty = @scene.pbChooseNumber(_INTL("How many do you want to deposit?"),qty)
end
if qty>0
if !storage.pbCanStore?(item,qty)
pbDisplay(_INTL("There's no room to store items."))
else
if !@bag.pbDeleteItem(item,qty)
raise "Can't delete items from Bag"
end
if !storage.pbStoreItem(item,qty)
raise "Can't deposit items to storage"
end
@scene.pbRefresh
dispqty = (pbIsImportantItem?(item)) ? 1 : qty
itemname = (dispqty>1) ? PBItems.getNamePlural(item) : PBItems.getName(item)
pbDisplay(_INTL("Deposited {1} {2}.",dispqty,itemname))
end
end
end
@scene.pbEndScene
end
# UI logic for tossing an item in the item storage screen.
def pbTossItemScreen
if !$PokemonGlobal.pcItemStorage
$PokemonGlobal.pcItemStorage = PCItemStorage.new
end
storage = $PokemonGlobal.pcItemStorage
@scene.pbStartScene(storage)
loop do
item = @scene.pbChooseItem
break if item==0
if pbIsImportantItem?(item)
@scene.pbDisplay(_INTL("That's too important to toss out!"))
next
end
qty = storage.pbQuantity(item)
itemname = PBItems.getName(item)
itemnameplural = PBItems.getNamePlural(item)
if qty>1
qty=@scene.pbChooseNumber(_INTL("Toss out how many {1}?",itemnameplural),qty)
end
if qty>0
itemname = itemnameplural if qty>1
if pbConfirm(_INTL("Is it OK to throw away {1} {2}?",qty,itemname))
if !storage.pbDeleteItem(item,qty)
raise "Can't delete items from storage"
end
@scene.pbRefresh
pbDisplay(_INTL("Threw away {1} {2}.",qty,itemname))
end
end
end
@scene.pbEndScene
end
end

View File

@@ -0,0 +1,152 @@
class PokegearButton < SpriteWrapper
attr_reader :index
attr_reader :name
attr_reader :selected
def initialize(command,x,y,viewport=nil)
super(viewport)
@image = command[0]
@name = command[1]
@selected = false
if $Trainer.female? && pbResolveBitmap(sprintf("Graphics/Pictures/Pokegear/icon_button_f"))
@button = AnimatedBitmap.new("Graphics/Pictures/Pokegear/icon_button_f")
else
@button = AnimatedBitmap.new("Graphics/Pictures/Pokegear/icon_button")
end
@contents = BitmapWrapper.new(@button.width,@button.height)
self.bitmap = @contents
self.x = x
self.y = y
pbSetSystemFont(self.bitmap)
refresh
end
def dispose
@button.dispose
@contents.dispose
super
end
def selected=(val)
oldsel = @selected
@selected = val
refresh if oldsel!=val
end
def refresh
self.bitmap.clear
rect = Rect.new(0,0,@button.width,@button.height/2)
rect.y = @button.height/2 if @selected
self.bitmap.blt(0,0,@button.bitmap,rect)
textpos = [
[@name,self.bitmap.width/2,10,2,Color.new(248,248,248),Color.new(40,40,40)],
]
pbDrawTextPositions(self.bitmap,textpos)
imagepos = [
[sprintf("Graphics/Pictures/Pokegear/icon_"+@image),18,10]
]
pbDrawImagePositions(self.bitmap,imagepos)
end
end
class PokemonPokegear_Scene
def pbUpdate
for i in 0...@commands.length
@sprites["button#{i}"].selected = (i==@index)
end
pbUpdateSpriteHash(@sprites)
end
def pbStartScene(commands)
@commands = commands
@index = 0
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99999
@sprites = {}
@sprites["background"] = IconSprite.new(0,0,@viewport)
if $Trainer.female? && pbResolveBitmap(sprintf("Graphics/Pictures/Pokegear/bg_f"))
@sprites["background"].setBitmap("Graphics/Pictures/Pokegear/bg_f")
else
@sprites["background"].setBitmap("Graphics/Pictures/Pokegear/bg")
end
for i in 0...@commands.length
y = 196 - (@commands.length*24) + (i*48)
@sprites["button#{i}"] = PokegearButton.new(@commands[i],118,y,@viewport)
end
pbFadeInAndShow(@sprites) { pbUpdate }
end
def pbScene
ret = -1
loop do
Graphics.update
Input.update
pbUpdate
if Input.trigger?(Input::B)
pbPlayCloseMenuSE
break
elsif Input.trigger?(Input::C)
pbPlayDecisionSE
ret = @index
break
elsif Input.trigger?(Input::UP)
pbPlayCursorSE if @commands.length>1
@index -= 1
@index = @commands.length-1 if @index<0
elsif Input.trigger?(Input::DOWN)
pbPlayCursorSE if @commands.length>1
@index += 1
@index = 0 if @index>=@commands.length
end
end
return ret
end
def pbEndScene
pbFadeOutAndHide(@sprites) { pbUpdate }
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
end
class PokemonPokegearScreen
def initialize(scene)
@scene = scene
end
def pbStartScreen
commands = []
cmdMap = -1
cmdPhone = -1
cmdJukebox = -1
commands[cmdMap = commands.length] = ["map",_INTL("Map")]
if $PokemonGlobal.phoneNumbers && $PokemonGlobal.phoneNumbers.length>0
commands[cmdPhone = commands.length] = ["phone",_INTL("Phone")]
end
commands[cmdJukebox = commands.length] = ["jukebox",_INTL("Jukebox")]
@scene.pbStartScene(commands)
loop do
cmd = @scene.pbScene
if cmd<0
break
elsif cmdMap>=0 && cmd==cmdMap
pbShowMap(-1,false)
elsif cmdPhone>=0 && cmd==cmdPhone
pbFadeOutIn {
PokemonPhoneScene.new.start
}
elsif cmdJukebox>=0 && cmd==cmdJukebox
pbFadeOutIn {
scene = PokemonJukebox_Scene.new
screen = PokemonJukeboxScreen.new(scene)
screen.pbStartScreen
}
end
end
@scene.pbEndScene
end
end

View File

@@ -0,0 +1,365 @@
class MapBottomSprite < SpriteWrapper
attr_reader :mapname
attr_reader :maplocation
def initialize(viewport=nil)
super(viewport)
@mapname = ""
@maplocation = ""
@mapdetails = ""
@thisbitmap = BitmapWrapper.new(Graphics.width,Graphics.height)
pbSetSystemFont(@thisbitmap)
self.x = 0
self.y = 0
self.bitmap = @thisbitmap
refresh
end
def dispose
@thisbitmap.dispose
super
end
def mapname=(value)
if @mapname!=value
@mapname = value
refresh
end
end
def maplocation=(value)
if @maplocation!=value
@maplocation = value
refresh
end
end
def mapdetails=(value) # From Wichu
if @mapdetails!=value
@mapdetails = value
refresh
end
end
def refresh
self.bitmap.clear
textpos = [
[@mapname,18,-2,0,Color.new(248,248,248),Color.new(0,0,0)],
[@maplocation,18,354,0,Color.new(248,248,248),Color.new(0,0,0)],
[@mapdetails,Graphics.width-16,354,1,Color.new(248,248,248),Color.new(0,0,0)]
]
pbDrawTextPositions(self.bitmap,textpos)
end
end
class PokemonRegionMap_Scene
LEFT = 0
TOP = 0
RIGHT = 29
BOTTOM = 19
SQUAREWIDTH = 16
SQUAREHEIGHT = 16
def initialize(region=-1,wallmap=true)
@region = region
@wallmap = wallmap
end
def pbUpdate
pbUpdateSpriteHash(@sprites)
end
def pbStartScene(aseditor=false,mode=0)
@editor = aseditor
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99999
@sprites = {}
@mapdata = pbLoadTownMapData
playerpos = (!$game_map) ? nil : pbGetMetadata($game_map.map_id,MetadataMapPosition)
if !playerpos
mapindex = 0
@map = @mapdata[0]
@mapX = LEFT
@mapY = TOP
elsif @region>=0 && @region!=playerpos[0] && @mapdata[@region]
mapindex = @region
@map = @mapdata[@region]
@mapX = LEFT
@mapY = TOP
else
mapindex = playerpos[0]
@map = @mapdata[playerpos[0]]
@mapX = playerpos[1]
@mapY = playerpos[2]
mapsize = (!$game_map) ? nil : pbGetMetadata($game_map.map_id,MetadataMapSize)
if mapsize && mapsize[0] && mapsize[0]>0
sqwidth = mapsize[0]
sqheight = (mapsize[1].length*1.0/mapsize[0]).ceil
if sqwidth>1
@mapX += ($game_player.x*sqwidth/$game_map.width).floor
end
if sqheight>1
@mapY += ($game_player.y*sqheight/$game_map.height).floor
end
end
end
if !@map
pbMessage(_INTL("The map data cannot be found."))
return false
end
addBackgroundOrColoredPlane(@sprites,"background","mapbg",Color.new(0,0,0),@viewport)
@sprites["map"] = IconSprite.new(0,0,@viewport)
@sprites["map"].setBitmap("Graphics/Pictures/#{@map[1]}")
@sprites["map"].x += (Graphics.width-@sprites["map"].bitmap.width)/2
@sprites["map"].y += (Graphics.height-@sprites["map"].bitmap.height)/2
for hidden in REGION_MAP_EXTRAS
if hidden[0]==mapindex && ((@wallmap && hidden[5]) ||
(!@wallmap && hidden[1]>0 && $game_switches[hidden[1]]))
if !@sprites["map2"]
@sprites["map2"] = BitmapSprite.new(480,320,@viewport)
@sprites["map2"].x = @sprites["map"].x
@sprites["map2"].y = @sprites["map"].y
end
pbDrawImagePositions(@sprites["map2"].bitmap,[
["Graphics/Pictures/#{hidden[4]}",hidden[2]*SQUAREWIDTH,hidden[3]*SQUAREHEIGHT]
])
end
end
@sprites["mapbottom"] = MapBottomSprite.new(@viewport)
@sprites["mapbottom"].mapname = pbGetMessage(MessageTypes::RegionNames,mapindex)
@sprites["mapbottom"].maplocation = pbGetMapLocation(@mapX,@mapY)
@sprites["mapbottom"].mapdetails = pbGetMapDetails(@mapX,@mapY)
if playerpos && mapindex==playerpos[0]
@sprites["player"] = IconSprite.new(0,0,@viewport)
@sprites["player"].setBitmap(pbPlayerHeadFile($Trainer.trainertype))
@sprites["player"].x = -SQUAREWIDTH/2+(@mapX*SQUAREWIDTH)+(Graphics.width-@sprites["map"].bitmap.width)/2
@sprites["player"].y = -SQUAREHEIGHT/2+(@mapY*SQUAREHEIGHT)+(Graphics.height-@sprites["map"].bitmap.height)/2
end
if mode>0
k = 0
for i in LEFT..RIGHT
for j in TOP..BOTTOM
healspot = pbGetHealingSpot(i,j)
if healspot && $PokemonGlobal.visitedMaps[healspot[0]]
@sprites["point#{k}"] = AnimatedSprite.create("Graphics/Pictures/mapFly",2,16)
@sprites["point#{k}"].viewport = @viewport
@sprites["point#{k}"].x = -SQUAREWIDTH/2+(i*SQUAREWIDTH)+(Graphics.width-@sprites["map"].bitmap.width)/2
@sprites["point#{k}"].y = -SQUAREHEIGHT/2+(j*SQUAREHEIGHT)+(Graphics.height-@sprites["map"].bitmap.height)/2
@sprites["point#{k}"].play
k += 1
end
end
end
end
@sprites["cursor"] = AnimatedSprite.create("Graphics/Pictures/mapCursor",2,5)
@sprites["cursor"].viewport = @viewport
@sprites["cursor"].x = -SQUAREWIDTH/2+(@mapX*SQUAREWIDTH)+(Graphics.width-@sprites["map"].bitmap.width)/2
@sprites["cursor"].y = -SQUAREHEIGHT/2+(@mapY*SQUAREHEIGHT)+(Graphics.height-@sprites["map"].bitmap.height)/2
@sprites["cursor"].play
@changed = false
pbFadeInAndShow(@sprites) { pbUpdate }
return true
end
def pbSaveMapData
File.open("PBS/townmap.txt","wb") { |f|
for i in 0...@mapdata.length
map = @mapdata[i]
return if !map
f.write(sprintf("[%d]\r\n",i))
f.write(sprintf("Name=%s\r\nFilename=%s\r\n",csvQuote(map[0]),csvQuote(map[1])))
for loc in map[2]
f.write("Point=")
pbWriteCsvRecord(loc,f,[nil,"uussUUUU"])
f.write("\r\n")
end
end
}
end
def pbEndScene
pbFadeOutAndHide(@sprites)
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
def pbGetMapLocation(x,y)
return "" if !@map[2]
for loc in @map[2]
if loc[0]==x && loc[1]==y
if !loc[7] || (!@wallmap && $game_switches[loc[7]])
maploc = pbGetMessageFromHash(MessageTypes::PlaceNames,loc[2])
return @editor ? loc[2] : maploc
else
return ""
end
end
end
return ""
end
def pbChangeMapLocation(x,y)
return if !@editor
return "" if !@map[2]
currentname = ""
currentobj = nil
for loc in @map[2]
if loc[0]==x && loc[1]==y
currentobj = loc
currentname = loc[2]
break
end
end
currentname = pbMessageFreeText(_INTL("Set the name for this point."),currentname,false,256) { pbUpdate }
if currentname
if currentobj
currentobj[2] = currentname
else
newobj = [x,y,currentname,""]
@map[2].push(newobj)
end
@changed = true
end
end
def pbGetMapDetails(x,y) # From Wichu, with my help
return "" if !@map[2]
for loc in @map[2]
if loc[0]==x && loc[1]==y
if !loc[7] || (!@wallmap && $game_switches[loc[7]])
mapdesc = pbGetMessageFromHash(MessageTypes::PlaceDescriptions,loc[3])
return (@editor) ? loc[3] : mapdesc
else
return ""
end
end
end
return ""
end
def pbGetHealingSpot(x,y)
return nil if !@map[2]
for loc in @map[2]
if loc[0]==x && loc[1]==y
if !loc[4] || !loc[5] || !loc[6]
return nil
else
return [loc[4],loc[5],loc[6]]
end
end
end
return nil
end
def pbMapScene(mode=0)
xOffset = 0
yOffset = 0
newX = 0
newY = 0
@sprites["cursor"].x = -SQUAREWIDTH/2+(@mapX*SQUAREWIDTH)+(Graphics.width-@sprites["map"].bitmap.width)/2
@sprites["cursor"].y = -SQUAREHEIGHT/2+(@mapY*SQUAREHEIGHT)+(Graphics.height-@sprites["map"].bitmap.height)/2
loop do
Graphics.update
Input.update
pbUpdate
if xOffset!=0 || yOffset!=0
distancePerFrame = 8*20/Graphics.frame_rate
xOffset += (xOffset>0) ? -distancePerFrame : (xOffset<0) ? distancePerFrame : 0
yOffset += (yOffset>0) ? -distancePerFrame : (yOffset<0) ? distancePerFrame : 0
@sprites["cursor"].x = newX-xOffset
@sprites["cursor"].y = newY-yOffset
next
end
@sprites["mapbottom"].maplocation = pbGetMapLocation(@mapX,@mapY)
@sprites["mapbottom"].mapdetails = pbGetMapDetails(@mapX,@mapY)
ox = 0
oy = 0
case Input.dir8
when 1 # lower left
oy = 1 if @mapY<BOTTOM
ox = -1 if @mapX>LEFT
when 2 # down
oy = 1 if @mapY<BOTTOM
when 3 # lower right
oy = 1 if @mapY<BOTTOM
ox = 1 if @mapX<RIGHT
when 4 # left
ox = -1 if @mapX>LEFT
when 6 # right
ox = 1 if @mapX<RIGHT
when 7 # upper left
oy = -1 if @mapY>TOP
ox = -1 if @mapX>LEFT
when 8 # up
oy = -1 if @mapY>TOP
when 9 # upper right
oy = -1 if @mapY>TOP
ox = 1 if @mapX<RIGHT
end
if ox!=0 || oy!=0
@mapX += ox
@mapY += oy
xOffset = ox*SQUAREWIDTH
yOffset = oy*SQUAREHEIGHT
newX = @sprites["cursor"].x+xOffset
newY = @sprites["cursor"].y+yOffset
end
if Input.trigger?(Input::B)
if @editor && @changed
if pbConfirmMessage(_INTL("Save changes?")) { pbUpdate }
pbSaveMapData
end
if pbConfirmMessage(_INTL("Exit from the map?")) { pbUpdate }
break
end
else
break
end
elsif Input.trigger?(Input::C) && mode==1 # Choosing an area to fly to
healspot = pbGetHealingSpot(@mapX,@mapY)
if healspot
if $PokemonGlobal.visitedMaps[healspot[0]] || ($DEBUG && Input.press?(Input::CTRL))
return healspot
end
end
elsif Input.trigger?(Input::C) && @editor # Intentionally after other C input check
pbChangeMapLocation(@mapX,@mapY)
end
end
pbPlayCloseMenuSE
return nil
end
end
class PokemonRegionMapScreen
def initialize(scene)
@scene = scene
end
def pbStartFlyScreen
@scene.pbStartScene(false,1)
ret = @scene.pbMapScene(1)
@scene.pbEndScene
return ret
end
def pbStartScreen
@scene.pbStartScene($DEBUG)
@scene.pbMapScene
@scene.pbEndScene
end
end
def pbShowMap(region=-1,wallmap=true)
pbFadeOutIn {
scene = PokemonRegionMap_Scene.new(region,wallmap)
screen = PokemonRegionMapScreen.new(scene)
screen.pbStartScreen
}
end

View File

@@ -0,0 +1,148 @@
#===============================================================================
# Phone screen
#===============================================================================
class Window_PhoneList < Window_CommandPokemon
def drawCursor(index,rect)
selarrow = AnimatedBitmap.new("Graphics/Pictures/phoneSel")
if self.index==index
pbCopyBitmap(self.contents,selarrow.bitmap,rect.x,rect.y)
end
return Rect.new(rect.x+28,rect.y+8,rect.width-16,rect.height)
end
def drawItem(index,count,rect)
return if index>=self.top_row+self.page_item_max
super
overlapCursor = drawCursor(index-1,itemRect(index-1))
end
end
class PokemonPhoneScene
def start
commands = []
@trainers = []
if $PokemonGlobal.phoneNumbers
for num in $PokemonGlobal.phoneNumbers
if num[0] # if visible
if num.length==8 # if trainer
@trainers.push([num[1],num[2],num[6],(num[4]>=2)])
else # if NPC
@trainers.push([num[1],num[2],num[3]])
end
end
end
end
if @trainers.length==0
pbMessage(_INTL("There are no phone numbers stored."))
return
end
@sprites = {}
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99999
@sprites["list"] = Window_PhoneList.newEmpty(152,32,Graphics.width-142,Graphics.height-80,@viewport)
@sprites["header"] = Window_UnformattedTextPokemon.newWithSize(_INTL("Phone"),
2,-18,128,64,@viewport)
@sprites["header"].baseColor = Color.new(248,248,248)
@sprites["header"].shadowColor = Color.new(0,0,0)
mapname = (@trainers[0][2]) ? pbGetMessage(MessageTypes::MapNames,@trainers[0][2]) : ""
@sprites["bottom"] = Window_AdvancedTextPokemon.newWithSize("",
162,Graphics.height-64,Graphics.width-158,64,@viewport)
@sprites["bottom"].text = "<ac>"+mapname
@sprites["info"] = Window_AdvancedTextPokemon.newWithSize("",-8,224,180,160,@viewport)
addBackgroundPlane(@sprites,"bg","phonebg",@viewport)
@sprites["icon"] = IconSprite.new(70,102,@viewport)
if @trainers[0].length==4
filename = pbTrainerCharFile(@trainers[0][0])
else
filename = sprintf("Graphics/Characters/phone%03d",@trainers[0][0])
end
@sprites["icon"].setBitmap(filename)
charwidth = @sprites["icon"].bitmap.width
charheight = @sprites["icon"].bitmap.height
@sprites["icon"].x = 86-charwidth/8
@sprites["icon"].y = 134-charheight/8
@sprites["icon"].src_rect = Rect.new(0,0,charwidth/4,charheight/4)
for trainer in @trainers
if trainer.length==4
displayname = _INTL("{1} {2}",PBTrainers.getName(trainer[0]),
pbGetMessageFromHash(MessageTypes::TrainerNames,trainer[1])
)
commands.push(displayname) # trainer's display name
else
commands.push(trainer[1]) # NPC's display name
end
end
@sprites["list"].commands = commands
for i in 0...@sprites["list"].page_item_max
@sprites["rematch[#{i}]"] = IconSprite.new(468,62+i*32,@viewport)
j = i+@sprites["list"].top_item
next if j>=commands.length
trainer = @trainers[j]
if trainer.length==4
if trainer[3]
@sprites["rematch[#{i}]"].setBitmap("Graphics/Pictures/phoneRematch")
end
end
end
rematchcount = 0
for trainer in @trainers
if trainer.length==4
rematchcount += 1 if trainer[3]
end
end
infotext = _INTL("Registered<br>")
infotext += _INTL(" <r>{1}<br>",@sprites["list"].commands.length)
infotext += _INTL("Waiting for a rematch<r>{1}",rematchcount)
@sprites["info"].text = infotext
pbFadeInAndShow(@sprites)
pbActivateWindow(@sprites,"list") {
oldindex = -1
loop do
Graphics.update
Input.update
pbUpdateSpriteHash(@sprites)
if @sprites["list"].index!=oldindex
trainer = @trainers[@sprites["list"].index]
if trainer.length==4
filename = pbTrainerCharFile(trainer[0])
else
filename = sprintf("Graphics/Characters/phone%03d",trainer[0])
end
@sprites["icon"].setBitmap(filename)
charwidth = @sprites["icon"].bitmap.width
charheight = @sprites["icon"].bitmap.height
@sprites["icon"].x = 86-charwidth/8
@sprites["icon"].y = 134-charheight/8
@sprites["icon"].src_rect = Rect.new(0,0,charwidth/4,charheight/4)
mapname=(trainer[2]) ? pbGetMessage(MessageTypes::MapNames,trainer[2]) : ""
@sprites["bottom"].text = "<ac>"+mapname
for i in 0...@sprites["list"].page_item_max
@sprites["rematch[#{i}]"].clearBitmaps
j = i+@sprites["list"].top_item
next if j>=commands.length
trainer = @trainers[j]
if trainer.length==4
if trainer[3]
@sprites["rematch[#{i}]"].setBitmap("Graphics/Pictures/phoneRematch")
end
end
end
end
if Input.trigger?(Input::B)
pbPlayCloseMenuSE
break
elsif Input.trigger?(Input::C)
index = @sprites["list"].index
if index>=0
pbCallTrainer(@trainers[index][0],@trainers[index][1])
end
end
end
}
pbFadeOutAndHide(@sprites)
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
end

View File

@@ -0,0 +1,132 @@
class PokemonJukebox_Scene
def pbUpdate
pbUpdateSpriteHash(@sprites)
end
def pbStartScene(commands)
@commands = commands
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99999
@sprites = {}
@sprites["background"] = IconSprite.new(0,0,@viewport)
@sprites["background"].setBitmap("Graphics/Pictures/jukeboxbg")
@sprites["header"] = Window_UnformattedTextPokemon.newWithSize(
_INTL("Jukebox"),2,-18,128,64,@viewport)
@sprites["header"].baseColor = Color.new(248,248,248)
@sprites["header"].shadowColor = Color.new(0,0,0)
@sprites["header"].windowskin = nil
@sprites["commands"] = Window_CommandPokemon.newWithSize(@commands,
94,92,324,224,@viewport)
@sprites["commands"].windowskin = nil
pbFadeInAndShow(@sprites) { pbUpdate }
end
def pbScene
ret = -1
loop do
Graphics.update
Input.update
pbUpdate
if Input.trigger?(Input::B)
break
elsif Input.trigger?(Input::C)
ret = @sprites["commands"].index
break
end
end
return ret
end
def pbSetCommands(newcommands,newindex)
@sprites["commands"].commands = (!newcommands) ? @commands : newcommands
@sprites["commands"].index = newindex
end
def pbEndScene
pbFadeOutAndHide(@sprites) { pbUpdate }
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
end
class PokemonJukeboxScreen
def initialize(scene)
@scene = scene
end
def pbStartScreen
commands = []
cmdMarch = -1
cmdLullaby = -1
cmdOak = -1
cmdCustom = -1
commands[cmdMarch = commands.length] = _INTL("March")
commands[cmdLullaby = commands.length] = _INTL("Lullaby")
commands[cmdOak = commands.length] = _INTL("Oak")
commands[cmdCustom = commands.length] = _INTL("Custom")
commands[commands.length] = _INTL("Exit")
@scene.pbStartScene(commands)
loop do
cmd = @scene.pbScene
if cmd<0
pbPlayCloseMenuSE
break
elsif cmdMarch>=0 && cmd==cmdMarch
pbPlayDecisionSE
pbBGMPlay("Radio - March", 100, 100)
$PokemonMap.whiteFluteUsed = true if $PokemonMap
$PokemonMap.blackFluteUsed = false if $PokemonMap
elsif cmdLullaby>=0 && cmd==cmdLullaby
pbPlayDecisionSE
pbBGMPlay("Radio - Lullaby", 100, 100)
$PokemonMap.blackFluteUsed = true if $PokemonMap
$PokemonMap.whiteFluteUsed = false if $PokemonMap
elsif cmdOak>=0 && cmd==cmdOak
pbPlayDecisionSE
pbBGMPlay("Radio - Oak", 100, 100)
$PokemonMap.whiteFluteUsed = false if $PokemonMap
$PokemonMap.blackFluteUsed = false if $PokemonMap
elsif cmdCustom>=0 && cmd==cmdCustom
pbPlayDecisionSE
files = [_INTL("(Default)")]
Dir.chdir("Audio/BGM/") {
Dir.glob("*.mp3") { |f| files.push(f) }
Dir.glob("*.MP3") { |f| files.push(f) }
Dir.glob("*.ogg") { |f| files.push(f) }
Dir.glob("*.OGG") { |f| files.push(f) }
Dir.glob("*.wav") { |f| files.push(f) }
Dir.glob("*.WAV") { |f| files.push(f) }
Dir.glob("*.mid") { |f| files.push(f) }
Dir.glob("*.MID") { |f| files.push(f) }
Dir.glob("*.midi") { |f| files.push(f) }
Dir.glob("*.MIDI") { |f| files.push(f) }
}
@scene.pbSetCommands(files,0)
loop do
cmd2 = @scene.pbScene
if cmd2<0
pbPlayCancelSE
break
elsif cmd2==0
pbPlayDecisionSE
$game_system.setDefaultBGM(nil)
$PokemonMap.whiteFluteUsed = false if $PokemonMap
$PokemonMap.blackFluteUsed = false if $PokemonMap
else
pbPlayDecisionSE
$game_system.setDefaultBGM(files[cmd2])
$PokemonMap.whiteFluteUsed = false if $PokemonMap
$PokemonMap.blackFluteUsed = false if $PokemonMap
end
end
@scene.pbSetCommands(nil,cmdCustom)
else # Exit
pbPlayCloseMenuSE
break
end
end
@scene.pbEndScene
end
end

View File

@@ -0,0 +1,110 @@
class PokemonTrainerCard_Scene
def pbUpdate
pbUpdateSpriteHash(@sprites)
end
def pbStartScene
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99999
@sprites = {}
background = pbResolveBitmap(sprintf("Graphics/Pictures/Trainer Card/bg_f"))
if $Trainer.female? && background
addBackgroundPlane(@sprites,"bg","Trainer Card/bg_f",@viewport)
else
addBackgroundPlane(@sprites,"bg","Trainer Card/bg",@viewport)
end
cardexists = pbResolveBitmap(sprintf("Graphics/Pictures/Trainer Card/card_f"))
@sprites["card"] = IconSprite.new(0,0,@viewport)
if $Trainer.female? && cardexists
@sprites["card"].setBitmap("Graphics/Pictures/Trainer Card/card_f")
else
@sprites["card"].setBitmap("Graphics/Pictures/Trainer Card/card")
end
@sprites["overlay"] = BitmapSprite.new(Graphics.width,Graphics.height,@viewport)
pbSetSystemFont(@sprites["overlay"].bitmap)
@sprites["trainer"] = IconSprite.new(336,112,@viewport)
@sprites["trainer"].setBitmap(pbPlayerSpriteFile($Trainer.trainertype))
@sprites["trainer"].x -= (@sprites["trainer"].bitmap.width-128)/2
@sprites["trainer"].y -= (@sprites["trainer"].bitmap.height-128)
@sprites["trainer"].z = 2
pbDrawTrainerCardFront
if $PokemonGlobal.trainerRecording
$PokemonGlobal.trainerRecording.play
end
pbFadeInAndShow(@sprites) { pbUpdate }
end
def pbDrawTrainerCardFront
overlay = @sprites["overlay"].bitmap
overlay.clear
baseColor = Color.new(72,72,72)
shadowColor = Color.new(160,160,160)
totalsec = Graphics.frame_count / Graphics.frame_rate
hour = totalsec / 60 / 60
min = totalsec / 60 % 60
time = (hour>0) ? _INTL("{1}h {2}m",hour,min) : _INTL("{1}m",min)
$PokemonGlobal.startTime = pbGetTimeNow if !$PokemonGlobal.startTime
starttime = _INTL("{1} {2}, {3}",
pbGetAbbrevMonthName($PokemonGlobal.startTime.mon),
$PokemonGlobal.startTime.day,
$PokemonGlobal.startTime.year)
textPositions = [
[_INTL("Name"),34,64,0,baseColor,shadowColor],
[$Trainer.name,302,64,1,baseColor,shadowColor],
[_INTL("ID No."),332,64,0,baseColor,shadowColor],
[sprintf("%05d",$Trainer.publicID($Trainer.id)),468,64,1,baseColor,shadowColor],
[_INTL("Money"),34,112,0,baseColor,shadowColor],
[_INTL("${1}",$Trainer.money.to_s_formatted),302,112,1,baseColor,shadowColor],
[_INTL("Pokédex"),34,160,0,baseColor,shadowColor],
[sprintf("%d/%d",$Trainer.pokedexOwned,$Trainer.pokedexSeen),302,160,1,baseColor,shadowColor],
[_INTL("Time"),34,208,0,baseColor,shadowColor],
[time,302,208,1,baseColor,shadowColor],
[_INTL("Started"),34,256,0,baseColor,shadowColor],
[starttime,302,256,1,baseColor,shadowColor]
]
pbDrawTextPositions(overlay,textPositions)
x = 72
region = pbGetCurrentRegion(0) # Get the current region
imagePositions = []
for i in 0...8
if $Trainer.badges[i+region*8]
imagePositions.push(["Graphics/Pictures/Trainer Card/icon_badges",x,310,i*32,region*32,32,32])
end
x += 48
end
pbDrawImagePositions(overlay,imagePositions)
end
def pbTrainerCard
pbSEPlay("GUI trainer card open")
loop do
Graphics.update
Input.update
pbUpdate
if Input.trigger?(Input::B)
pbPlayCloseMenuSE
break
end
end
end
def pbEndScene
pbFadeOutAndHide(@sprites) { pbUpdate }
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
end
class PokemonTrainerCardScreen
def initialize(scene)
@scene = scene
end
def pbStartScreen
@scene.pbStartScene
@scene.pbTrainerCard
@scene.pbEndScene
end
end

View File

@@ -0,0 +1,631 @@
class PokemonLoadPanel < SpriteWrapper
attr_reader :selected
TEXTCOLOR = Color.new(232,232,232)
TEXTSHADOWCOLOR = Color.new(136,136,136)
MALETEXTCOLOR = Color.new(56,160,248)
MALETEXTSHADOWCOLOR = Color.new(56,104,168)
FEMALETEXTCOLOR = Color.new(240,72,88)
FEMALETEXTSHADOWCOLOR = Color.new(160,64,64)
def initialize(index,title,isContinue,trainer,framecount,mapid,viewport=nil)
super(viewport)
@index = index
@title = title
@isContinue = isContinue
@trainer = trainer
@totalsec = (framecount || 0) / Graphics.frame_rate
@mapid = mapid
@selected = (index==0)
@bgbitmap = AnimatedBitmap.new("Graphics/Pictures/loadPanels")
@refreshBitmap = true
@refreshing = false
refresh
end
def dispose
@bgbitmap.dispose
self.bitmap.dispose
super
end
def selected=(value)
return if @selected==value
@selected = value
@refreshBitmap = true
refresh
end
def pbRefresh
@refreshBitmap = true
refresh
end
def refresh
return if @refreshing
return if disposed?
@refreshing = true
if !self.bitmap || self.bitmap.disposed?
self.bitmap = BitmapWrapper.new(@bgbitmap.width,111*2)
pbSetSystemFont(self.bitmap)
end
if @refreshBitmap
@refreshBitmap = false
self.bitmap.clear if self.bitmap
if @isContinue
self.bitmap.blt(0,0,@bgbitmap.bitmap,Rect.new(0,(@selected) ? 111*2 : 0,@bgbitmap.width,111*2))
else
self.bitmap.blt(0,0,@bgbitmap.bitmap,Rect.new(0,111*2*2+((@selected) ? 23*2 : 0),@bgbitmap.width,23*2))
end
textpos = []
if @isContinue
textpos.push([@title,16*2,5*2,0,TEXTCOLOR,TEXTSHADOWCOLOR])
textpos.push([_INTL("Badges:"),16*2,56*2,0,TEXTCOLOR,TEXTSHADOWCOLOR])
textpos.push([@trainer.numbadges.to_s,103*2,56*2,1,TEXTCOLOR,TEXTSHADOWCOLOR])
textpos.push([_INTL("Pokédex:"),16*2,72*2,0,TEXTCOLOR,TEXTSHADOWCOLOR])
textpos.push([@trainer.pokedexSeen.to_s,103*2,72*2,1,TEXTCOLOR,TEXTSHADOWCOLOR])
textpos.push([_INTL("Time:"),16*2,88*2,0,TEXTCOLOR,TEXTSHADOWCOLOR])
hour = @totalsec / 60 / 60
min = @totalsec / 60 % 60
if hour>0
textpos.push([_INTL("{1}h {2}m",hour,min),103*2,88*2,1,TEXTCOLOR,TEXTSHADOWCOLOR])
else
textpos.push([_INTL("{1}m",min),103*2,88*2,1,TEXTCOLOR,TEXTSHADOWCOLOR])
end
if @trainer.male?
textpos.push([@trainer.name,56*2,32*2,0,MALETEXTCOLOR,MALETEXTSHADOWCOLOR])
elsif @trainer.female?
textpos.push([@trainer.name,56*2,32*2,0,FEMALETEXTCOLOR,FEMALETEXTSHADOWCOLOR])
else
textpos.push([@trainer.name,56*2,32*2,0,TEXTCOLOR,TEXTSHADOWCOLOR])
end
mapname = pbGetMapNameFromId(@mapid)
mapname.gsub!(/\\PN/,@trainer.name)
textpos.push([mapname,193*2,5*2,1,TEXTCOLOR,TEXTSHADOWCOLOR])
else
textpos.push([@title,16*2,4*2,0,TEXTCOLOR,TEXTSHADOWCOLOR])
end
pbDrawTextPositions(self.bitmap,textpos)
end
@refreshing = false
end
end
class PokemonLoad_Scene
def pbStartScene(commands,showContinue,trainer,framecount,mapid)
@commands = commands
@sprites = {}
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99998
addBackgroundOrColoredPlane(@sprites,"background","loadbg",Color.new(248,248,248),@viewport)
y = 16*2
for i in 0...commands.length
@sprites["panel#{i}"] = PokemonLoadPanel.new(i,commands[i],
(showContinue) ? (i==0) : false,trainer,framecount,mapid,@viewport)
@sprites["panel#{i}"].x = 24*2
@sprites["panel#{i}"].y = y
@sprites["panel#{i}"].pbRefresh
y += (showContinue && i==0) ? 112*2 : 24*2
end
@sprites["cmdwindow"] = Window_CommandPokemon.new([])
@sprites["cmdwindow"].viewport = @viewport
@sprites["cmdwindow"].visible = false
end
def pbStartScene2
pbFadeInAndShow(@sprites) { pbUpdate }
end
def pbStartDeleteScene
@sprites = {}
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99998
addBackgroundOrColoredPlane(@sprites,"background","loadbg",Color.new(248,248,248),@viewport)
end
def pbUpdate
oldi = @sprites["cmdwindow"].index rescue 0
pbUpdateSpriteHash(@sprites)
newi = @sprites["cmdwindow"].index rescue 0
if oldi!=newi
@sprites["panel#{oldi}"].selected = false
@sprites["panel#{oldi}"].pbRefresh
@sprites["panel#{newi}"].selected = true
@sprites["panel#{newi}"].pbRefresh
while @sprites["panel#{newi}"].y>Graphics.height-40*2
for i in 0...@commands.length
@sprites["panel#{i}"].y -= 24*2
end
for i in 0...6
break if !@sprites["party#{i}"]
@sprites["party#{i}"].y -= 24*2
end
@sprites["player"].y -= 24*2 if @sprites["player"]
end
while @sprites["panel#{newi}"].y<16*2
for i in 0...@commands.length
@sprites["panel#{i}"].y += 24*2
end
for i in 0...6
break if !@sprites["party#{i}"]
@sprites["party#{i}"].y += 24*2
end
@sprites["player"].y += 24*2 if @sprites["player"]
end
end
end
def pbSetParty(trainer)
return if !trainer || !trainer.party
meta = pbGetMetadata(0,MetadataPlayerA+trainer.metaID)
if meta
filename = pbGetPlayerCharset(meta,1,trainer,true)
@sprites["player"] = TrainerWalkingCharSprite.new(filename,@viewport)
charwidth = @sprites["player"].bitmap.width
charheight = @sprites["player"].bitmap.height
@sprites["player"].x = 56*2-charwidth/8
@sprites["player"].y = 56*2-charheight/8
@sprites["player"].src_rect = Rect.new(0,0,charwidth/4,charheight/4)
end
for i in 0...trainer.party.length
@sprites["party#{i}"] = PokemonIconSprite.new(trainer.party[i],@viewport)
@sprites["party#{i}"].setOffset(PictureOrigin::Center)
@sprites["party#{i}"].x = (167+33*(i%2))*2
@sprites["party#{i}"].y = (56+25*(i/2))*2
@sprites["party#{i}"].z = 99999
end
end
def pbChoose(commands)
@sprites["cmdwindow"].commands = commands
loop do
Graphics.update
Input.update
pbUpdate
if Input.trigger?(Input::C)
return @sprites["cmdwindow"].index
end
end
end
def pbEndScene
pbFadeOutAndHide(@sprites) { pbUpdate }
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
def pbCloseScene
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
end
class PokemonLoadScreen
def initialize(scene)
@scene = scene
end
def pbTryLoadFile(savefile)
trainer = nil
framecount = nil
game_system = nil
pokemonSystem = nil
mapid = nil
File.open(savefile) { |f|
trainer = Marshal.load(f)
framecount = Marshal.load(f)
game_system = Marshal.load(f)
pokemonSystem = Marshal.load(f)
mapid = Marshal.load(f)
}
raise "Corrupted file" if !trainer.is_a?(PokeBattle_Trainer)
raise "Corrupted file" if !framecount.is_a?(Numeric)
raise "Corrupted file" if !game_system.is_a?(Game_System)
raise "Corrupted file" if !pokemonSystem.is_a?(PokemonSystem)
raise "Corrupted file" if !mapid.is_a?(Numeric)
return [trainer,framecount,game_system,pokemonSystem,mapid]
end
def pbStartDeleteScreen
savefile = RTP.getSaveFileName("Game.rxdata")
@scene.pbStartDeleteScene
@scene.pbStartScene2
if safeExists?(savefile)
if pbConfirmMessageSerious(_INTL("Delete all saved data?"))
pbMessage(_INTL("Once data has been deleted, there is no way to recover it.\1"))
if pbConfirmMessageSerious(_INTL("Delete the saved data anyway?"))
pbMessage(_INTL("Deleting all data. Don't turn off the power.\\wtnp[0]"))
begin; File.delete(savefile); rescue; end
begin; File.delete(savefile+".bak"); rescue; end
pbMessage(_INTL("The save file was deleted."))
end
end
else
pbMessage(_INTL("No save file was found."))
end
@scene.pbEndScene
$scene = pbCallTitle
end
def pbStartLoadScreen
$PokemonTemp = PokemonTemp.new
$game_temp = Game_Temp.new
$game_system = Game_System.new
$PokemonSystem = PokemonSystem.new if !$PokemonSystem
savefile = RTP.getSaveFileName("Game.rxdata")
FontInstaller.install
data_system = pbLoadRxData("Data/System")
mapfile = ($RPGVX) ? sprintf("Data/Map%03d.rvdata",data_system.start_map_id) :
sprintf("Data/Map%03d.rxdata",data_system.start_map_id)
if data_system.start_map_id==0 || !pbRgssExists?(mapfile)
pbMessage(_INTL("No starting position was set in the map editor.\1"))
pbMessage(_INTL("The game cannot continue."))
@scene.pbEndScene
$scene = nil
return
end
commands = []
cmdContinue = -1
cmdNewGame = -1
cmdOption = -1
cmdLanguage = -1
cmdMysteryGift = -1
cmdDebug = -1
cmdQuit = -1
if safeExists?(savefile)
trainer = nil
framecount = 0
mapid = 0
haveBackup = false
showContinue = false
begin
trainer, framecount, $game_system, $PokemonSystem, mapid = pbTryLoadFile(savefile)
showContinue = true
rescue
if safeExists?(savefile+".bak")
begin
trainer, framecount, $game_system, $PokemonSystem, mapid = pbTryLoadFile(savefile+".bak")
haveBackup = true
showContinue = true
rescue
end
end
if haveBackup
pbMessage(_INTL("The save file is corrupt. The previous save file will be loaded."))
else
pbMessage(_INTL("The save file is corrupt, or is incompatible with this game."))
if !pbConfirmMessageSerious(_INTL("Do you want to delete the save file and start anew?"))
$scene = nil
return
end
begin; File.delete(savefile); rescue; end
begin; File.delete(savefile+".bak"); rescue; end
$game_system = Game_System.new
$PokemonSystem = PokemonSystem.new if !$PokemonSystem
pbMessage(_INTL("The save file was deleted."))
end
end
if showContinue
if !haveBackup
begin; File.delete(savefile+".bak"); rescue; end
end
end
commands[cmdContinue = commands.length] = _INTL("Continue") if showContinue
commands[cmdNewGame = commands.length] = _INTL("New Game")
commands[cmdMysteryGift = commands.length] = _INTL("Mystery Gift") if (trainer.mysterygiftaccess rescue false)
else
commands[cmdNewGame = commands.length] = _INTL("New Game")
end
commands[cmdOption = commands.length] = _INTL("Options")
commands[cmdLanguage = commands.length] = _INTL("Language") if LANGUAGES.length>=2
commands[cmdDebug = commands.length] = _INTL("Debug") if $DEBUG
commands[cmdQuit = commands.length] = _INTL("Quit Game")
@scene.pbStartScene(commands,showContinue,trainer,framecount,mapid)
@scene.pbSetParty(trainer) if showContinue
@scene.pbStartScene2
pbLoadBattleAnimations
loop do
command = @scene.pbChoose(commands)
if cmdContinue>=0 && command==cmdContinue
unless safeExists?(savefile)
pbPlayBuzzerSE
next
end
pbPlayDecisionSE
@scene.pbEndScene
metadata = nil
File.open(savefile) { |f|
Marshal.load(f) # Trainer already loaded
$Trainer = trainer
Graphics.frame_count = Marshal.load(f)
$game_system = Marshal.load(f)
Marshal.load(f) # PokemonSystem already loaded
Marshal.load(f) # Current map id no longer needed
$game_switches = Marshal.load(f)
$game_variables = Marshal.load(f)
$game_self_switches = Marshal.load(f)
$game_screen = Marshal.load(f)
$MapFactory = Marshal.load(f)
$game_map = $MapFactory.map
$game_player = Marshal.load(f)
$PokemonGlobal = Marshal.load(f)
metadata = Marshal.load(f)
$PokemonBag = Marshal.load(f)
$PokemonStorage = Marshal.load(f)
pbRefreshResizeFactor # To fix Game_Screen pictures
magicNumberMatches = false
if $data_system.respond_to?("magic_number")
magicNumberMatches = ($game_system.magic_number==$data_system.magic_number)
else
magicNumberMatches = ($game_system.magic_number==$data_system.version_id)
end
if !magicNumberMatches || $PokemonGlobal.safesave
if pbMapInterpreterRunning?
pbMapInterpreter.setup(nil,0)
end
begin
$MapFactory.setup($game_map.map_id) # calls setMapChanged
rescue Errno::ENOENT
if $DEBUG
pbMessage(_INTL("Map {1} was not found.",$game_map.map_id))
map = pbWarpToMap
if map
$MapFactory.setup(map[0])
$game_player.moveto(map[1],map[2])
else
$game_map = nil
$scene = nil
return
end
else
$game_map = nil
$scene = nil
pbMessage(_INTL("The map was not found. The game cannot continue."))
end
end
$game_player.center($game_player.x, $game_player.y)
else
$MapFactory.setMapChanged($game_map.map_id)
end
}
if !$game_map.events # Map wasn't set up
$game_map = nil
$scene = nil
pbMessage(_INTL("The map is corrupt. The game cannot continue."))
return
end
$PokemonMap = metadata
$PokemonEncounters = PokemonEncounters.new
$PokemonEncounters.setup($game_map.map_id)
pbAutoplayOnSave
$game_map.update
$PokemonMap.updateMap
$scene = Scene_Map.new
return
elsif cmdNewGame>=0 && command==cmdNewGame
pbPlayDecisionSE
@scene.pbEndScene
if $game_map && $game_map.events
for event in $game_map.events.values
event.clear_starting
end
end
$game_temp.common_event_id = 0 if $game_temp
$scene = Scene_Map.new
Graphics.frame_count = 0
$game_system = Game_System.new
$game_switches = Game_Switches.new
$game_variables = Game_Variables.new
$game_self_switches = Game_SelfSwitches.new
$game_screen = Game_Screen.new
$game_player = Game_Player.new
$PokemonMap = PokemonMapMetadata.new
$PokemonGlobal = PokemonGlobalMetadata.new
$PokemonStorage = PokemonStorage.new
$PokemonEncounters = PokemonEncounters.new
$PokemonTemp.begunNewGame = true
pbRefreshResizeFactor # To fix Game_Screen pictures
$data_system = pbLoadRxData("Data/System")
$MapFactory = PokemonMapFactory.new($data_system.start_map_id) # calls setMapChanged
$game_player.moveto($data_system.start_x, $data_system.start_y)
$game_player.refresh
$game_map.autoplay
$game_map.update
return
elsif cmdMysteryGift>=0 && command==cmdMysteryGift
pbPlayDecisionSE
pbFadeOutIn {
trainer = pbDownloadMysteryGift(trainer)
}
elsif cmdOption>=0 && command==cmdOption
pbPlayDecisionSE
pbFadeOutIn {
scene = PokemonOption_Scene.new
screen = PokemonOptionScreen.new(scene)
screen.pbStartScreen(true)
}
elsif cmdLanguage>=0 && command==cmdLanguage
pbPlayDecisionSE
@scene.pbEndScene
$PokemonSystem.language = pbChooseLanguage
pbLoadMessages("Data/"+LANGUAGES[$PokemonSystem.language][1])
savedata = []
if safeExists?(savefile)
File.open(savefile,"rb") { |f|
15.times { savedata.push(Marshal.load(f)) }
}
savedata[3]=$PokemonSystem
begin
File.open(RTP.getSaveFileName("Game.rxdata"),"wb") { |f|
15.times { |i| Marshal.dump(savedata[i],f) }
}
rescue
end
end
$scene = pbCallTitle
return
elsif cmdDebug>=0 && command==cmdDebug
pbPlayDecisionSE
pbFadeOutIn { pbDebugMenu(false) }
elsif cmdQuit>=0 && command==cmdQuit
pbPlayCloseMenuSE
@scene.pbEndScene
$scene = nil
return
end
end
end
end
################################################################################
# Font installer
################################################################################
module FontInstaller
# filenames of fonts to be installed
Filenames = [
'pkmnem.ttf',
'pkmnemn.ttf',
'pkmnems.ttf',
'pkmnrs.ttf',
'pkmndp.ttf',
'pkmnfl.ttf'
]
# names (not filenames) of fonts to be installed
Names = [
'Power Green',
'Power Green Narrow',
'Power Green Small',
'Power Red and Blue',
'Power Clear',
'Power Red and Green'
]
# whether to notify player (via pop-up message) that fonts were installed
Notify = true
# location of fonts (relative to game folder)
Source = 'Fonts/'
def self.getFontFolder
fontfolder = MiniRegistry.get(MiniRegistry::HKEY_CURRENT_USER,
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Shell Folders","Fonts")
return fontfolder+"\\" if fontfolder
if ENV['SystemRoot']
return ENV['SystemRoot'] + '\\Fonts\\'
elsif ENV['windir']
return ENV['windir'] + '\\Fonts\\'
else
return '\\Windows\\Fonts\\'
end
end
AFR = Win32API.new('gdi32', 'AddFontResource', ['P'], 'L')
WPS = Win32API.new('kernel32', 'WriteProfileString', ['P'] * 3, 'L')
SM = Win32API.new('user32', 'PostMessage', ['L'] * 4, 'L')
WM_FONTCHANGE = 0x001D
HWND_BROADCAST = 0xffff
def self.copy_file(src,dest)
File.open(src,'rb') { |r|
File.open(dest,'wb') { |w|
while s = r.read(4096)
w.write s
end
}
}
end
def self.pbResolveFont(name)
RTP.eachPathFor(Source+name) { |file|
return file if safeExists?(file)
}
return Source+name
end
def self.install
success = []
# Check if all fonts already exist
filesExist = true
fontsExist = true
dest = self.getFontFolder
for i in 0...Names.size
if !safeExists?(dest + Filenames[i])
filesExist = false
end
if !Font.exist?(Names[i])
fontsExist = false
end
end
return if filesExist
# Check if all source fonts exist
exist = true
for i in 0...Names.size
if !RTP.exists?(Source + Filenames[i])
exist = false
break
end
end
return if !exist # Exit if not all source fonts exist
pbMessage(_INTL("One or more fonts used in this game do not exist on the system.\1"))
pbMessage(_INTL("The game can be played, but the look of the game's text will not be optimal."))
failed = false
for i in 0...Filenames.size
f = Filenames[i]
if safeExists?(dest + f) && !Font.exist?(Names[i])
File.delete(dest + f) rescue nil
end
# check if already installed...
if not safeExists?(dest + f)
# check to ensure font is in specified location...
if RTP.exists?(Source + f)
# copy file to fonts folder
succeeded = false
begin
copy_file(pbResolveFont(f), dest + f)
# add font resource
AFR.call(dest + f)
# add entry to win.ini/registry
WPS.call('Fonts', Names[i] + ' (TrueType)', f)
succeeded = safeExists?(dest + f)
rescue SystemCallError
# failed
succeeded = false
end
if succeeded
success.push(Names[i])
else
failed = true
end
end
else
success.push(Names[i]) # assume success
end
end
if success.length>0 # one or more fonts successfully installed
SM.call(HWND_BROADCAST,WM_FONTCHANGE,0,0)
if Notify
fonts = ''
success.each do |f|
fonts << f << ', '
end
if failed
pbMessage(_INTL("Some of the fonts were successfully installed.\1"))
pbMessage(_INTL("To install the other fonts, copy the files in this game's Fonts folder to the Fonts folder in Control Panel.\1"))
else
pbMessage(_INTL("The fonts were successfully installed.\1"))
end
if pbConfirmMessage(_INTL("Would you like to restart the game and apply the changes?"))
a = Thread.new { system('Game') }
exit
end
end
else
# No fonts were installed.
pbMessage(_INTL("To install the necessary fonts, copy the files in this game's Fonts folder to the Fonts folder in Control Panel."))
end
end
end

View File

@@ -0,0 +1,156 @@
def pbSave(safesave=false)
$Trainer.metaID=$PokemonGlobal.playerID
begin
File.open(RTP.getSaveFileName("Game.rxdata"),"wb") { |f|
Marshal.dump($Trainer,f)
Marshal.dump(Graphics.frame_count,f)
if $data_system.respond_to?("magic_number")
$game_system.magic_number = $data_system.magic_number
else
$game_system.magic_number = $data_system.version_id
end
$game_system.save_count+=1
Marshal.dump($game_system,f)
Marshal.dump($PokemonSystem,f)
Marshal.dump($game_map.map_id,f)
Marshal.dump($game_switches,f)
Marshal.dump($game_variables,f)
Marshal.dump($game_self_switches,f)
Marshal.dump($game_screen,f)
Marshal.dump($MapFactory,f)
Marshal.dump($game_player,f)
$PokemonGlobal.safesave=safesave
Marshal.dump($PokemonGlobal,f)
Marshal.dump($PokemonMap,f)
Marshal.dump($PokemonBag,f)
Marshal.dump($PokemonStorage,f)
}
Graphics.frame_reset
rescue
return false
end
return true
end
def pbEmergencySave
oldscene=$scene
$scene=nil
pbMessage(_INTL("The script is taking too long. The game will restart."))
return if !$Trainer
if safeExists?(RTP.getSaveFileName("Game.rxdata"))
File.open(RTP.getSaveFileName("Game.rxdata"), 'rb') { |r|
File.open(RTP.getSaveFileName("Game.rxdata.bak"), 'wb') { |w|
while s = r.read(4096)
w.write s
end
}
}
end
if pbSave
pbMessage(_INTL("\\se[]The game was saved.\\me[GUI save game] The previous save file has been backed up.\\wtnp[30]"))
else
pbMessage(_INTL("\\se[]Save failed.\\wtnp[30]"))
end
$scene=oldscene
end
class PokemonSave_Scene
def pbStartScreen
@viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z=99999
@sprites={}
totalsec = Graphics.frame_count / Graphics.frame_rate
hour = totalsec / 60 / 60
min = totalsec / 60 % 60
mapname=$game_map.name
textColor = ["0070F8,78B8E8","E82010,F8A8B8","0070F8,78B8E8"][$Trainer.gender]
locationColor = "209808,90F090" # green
loctext=_INTL("<ac><c3={1}>{2}</c3></ac>",locationColor,mapname)
loctext+=_INTL("Player<r><c3={1}>{2}</c3><br>",textColor,$Trainer.name)
if hour>0
loctext+=_INTL("Time<r><c3={1}>{2}h {3}m</c3><br>",textColor,hour,min)
else
loctext+=_INTL("Time<r><c3={1}>{2}m</c3><br>",textColor,min)
end
loctext+=_INTL("Badges<r><c3={1}>{2}</c3><br>",textColor,$Trainer.numbadges)
if $Trainer.pokedex
loctext+=_INTL("Pokédex<r><c3={1}>{2}/{3}</c3>",textColor,$Trainer.pokedexOwned,$Trainer.pokedexSeen)
end
@sprites["locwindow"]=Window_AdvancedTextPokemon.new(loctext)
@sprites["locwindow"].viewport=@viewport
@sprites["locwindow"].x=0
@sprites["locwindow"].y=0
@sprites["locwindow"].width=228 if @sprites["locwindow"].width<228
@sprites["locwindow"].visible=true
end
def pbEndScreen
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
end
class PokemonSaveScreen
def initialize(scene)
@scene=scene
end
def pbDisplay(text,brief=false)
@scene.pbDisplay(text,brief)
end
def pbDisplayPaused(text)
@scene.pbDisplayPaused(text)
end
def pbConfirm(text)
return @scene.pbConfirm(text)
end
def pbSaveScreen
ret=false
@scene.pbStartScreen
if pbConfirmMessage(_INTL("Would you like to save the game?"))
if safeExists?(RTP.getSaveFileName("Game.rxdata"))
confirm=""
if $PokemonTemp.begunNewGame
pbMessage(_INTL("WARNING!"))
pbMessage(_INTL("There is a different game file that is already saved."))
pbMessage(_INTL("If you save now, the other file's adventure, including items and Pokémon, will be entirely lost."))
if !pbConfirmMessageSerious(
_INTL("Are you sure you want to save now and overwrite the other save file?"))
pbSEPlay("GUI save choice")
@scene.pbEndScreen
return false
end
end
end
$PokemonTemp.begunNewGame=false
pbSEPlay("GUI save choice")
if pbSave
pbMessage(_INTL("\\se[]{1} saved the game.\\me[GUI save game]\\wtnp[30]",$Trainer.name))
ret=true
else
pbMessage(_INTL("\\se[]Save failed.\\wtnp[30]"))
ret=false
end
else
pbSEPlay("GUI save choice")
end
@scene.pbEndScreen
return ret
end
end
def pbSaveScreen
scene = PokemonSave_Scene.new
screen = PokemonSaveScreen.new(scene)
ret = screen.pbSaveScreen
return ret
end

View File

@@ -0,0 +1,624 @@
class PokemonSystem
attr_accessor :textspeed
attr_accessor :battlescene
attr_accessor :battlestyle
attr_accessor :frame
attr_accessor :textskin
attr_accessor :font
attr_accessor :screensize
attr_accessor :border
attr_accessor :language
attr_accessor :runstyle
attr_accessor :bgmvolume
attr_accessor :sevolume
attr_accessor :textinput
def initialize
@textspeed = 1 # Text speed (0=slow, 1=normal, 2=fast)
@battlescene = 0 # Battle effects (animations) (0=on, 1=off)
@battlestyle = 0 # Battle style (0=switch, 1=set)
@frame = 0 # Default window frame (see also $TextFrames)
@textskin = 0 # Speech frame
@font = 0 # Font (see also $VersionStyles)
@screensize = (SCREEN_ZOOM.floor).to_i # 0=half size, 1=full size, 2=double size
@border = 0 # Screen border (0=off, 1=on)
@language = 0 # Language (see also LANGUAGES in script PokemonSystem)
@runstyle = 0 # Run key functionality (0=hold to run, 1=toggle auto-run)
@bgmvolume = 100 # Volume of background music and ME
@sevolume = 100 # Volume of sound effects
@textinput = 0 # Text input mode (0=cursor, 1=keyboard)
end
def textskin; return @textskin || 0; end
def border; return @border || 0; end
def language; return @language || 0; end
def runstyle; return @runstyle || 0; end
def bgmvolume; return @bgmvolume || 100; end
def sevolume; return @sevolume || 100; end
def textinput; return @textinput || 0; end
def tilemap; return MAP_VIEW_MODE; end
end
#===============================================================================
# Stores game options
# Default options are at the top of script section SpriteWindow.
#===============================================================================
$SpeechFrames = [
MessageConfig::TextSkinName, # Default: speech hgss 1
"speech hgss 2",
"speech hgss 3",
"speech hgss 4",
"speech hgss 5",
"speech hgss 6",
"speech hgss 7",
"speech hgss 8",
"speech hgss 9",
"speech hgss 10",
"speech hgss 11",
"speech hgss 12",
"speech hgss 13",
"speech hgss 14",
"speech hgss 15",
"speech hgss 16",
"speech hgss 17",
"speech hgss 18",
"speech hgss 19",
"speech hgss 20",
"speech pl 18"
]
$TextFrames = [
"Graphics/Windowskins/"+MessageConfig::ChoiceSkinName, # Default: choice 1
"Graphics/Windowskins/choice 2",
"Graphics/Windowskins/choice 3",
"Graphics/Windowskins/choice 4",
"Graphics/Windowskins/choice 5",
"Graphics/Windowskins/choice 6",
"Graphics/Windowskins/choice 7",
"Graphics/Windowskins/choice 8",
"Graphics/Windowskins/choice 9",
"Graphics/Windowskins/choice 10",
"Graphics/Windowskins/choice 11",
"Graphics/Windowskins/choice 12",
"Graphics/Windowskins/choice 13",
"Graphics/Windowskins/choice 14",
"Graphics/Windowskins/choice 15",
"Graphics/Windowskins/choice 16",
"Graphics/Windowskins/choice 17",
"Graphics/Windowskins/choice 18",
"Graphics/Windowskins/choice 19",
"Graphics/Windowskins/choice 20",
"Graphics/Windowskins/choice 21",
"Graphics/Windowskins/choice 22",
"Graphics/Windowskins/choice 23",
"Graphics/Windowskins/choice 24",
"Graphics/Windowskins/choice 25",
"Graphics/Windowskins/choice 26",
"Graphics/Windowskins/choice 27",
"Graphics/Windowskins/choice 28"
]
$VersionStyles = [
[MessageConfig::FontName], # Default font style - Power Green/"Pokemon Emerald"
["Power Red and Blue"],
["Power Red and Green"],
["Power Clear"]
]
def pbSettingToTextSpeed(speed)
case speed
when 0; return 2
when 1; return 1
when 2; return -2
end
return MessageConfig::TextSpeed || 1
end
module MessageConfig
def self.pbDefaultSystemFrame
begin
return pbResolveBitmap($TextFrames[$PokemonSystem.frame]) || ""
rescue
return pbResolveBitmap("Graphics/Windowskins/"+MessageConfig::ChoiceSkinName) || ""
end
end
def self.pbDefaultSpeechFrame
begin
return pbResolveBitmap("Graphics/Windowskins/"+$SpeechFrames[$PokemonSystem.textskin]) || ""
rescue
return pbResolveBitmap("Graphics/Windowskins/"+MessageConfig::TextSkinName) || ""
end
end
def self.pbDefaultSystemFontName
begin
return MessageConfig.pbTryFonts($VersionStyles[$PokemonSystem.font][0],"Arial Narrow","Arial")
rescue
return MessageConfig.pbTryFonts(MessageConfig::FontName,"Arial Narrow","Arial")
end
end
def self.pbDefaultTextSpeed
return pbSettingToTextSpeed(($PokemonSystem.textspeed rescue nil))
end
def pbGetSystemTextSpeed
begin
return $PokemonSystem.textspeed
rescue
return (Graphics.frame_rate>40) ? 2 : 3
end
end
end
#===============================================================================
#
#===============================================================================
module PropertyMixin
def get
(@getProc) ? @getProc.call : nil
end
def set(value)
@setProc.call(value) if @setProc
end
end
class EnumOption
include PropertyMixin
attr_reader :values
attr_reader :name
def initialize(name,options,getProc,setProc)
@name = name
@values = options
@getProc = getProc
@setProc = setProc
end
def next(current)
index = current+1
index = @values.length-1 if index>@values.length-1
return index
end
def prev(current)
index = current-1
index = 0 if index<0
return index
end
end
class EnumOption2
include PropertyMixin
attr_reader :values
attr_reader :name
def initialize(name,options,getProc,setProc)
@name = name
@values = options
@getProc = getProc
@setProc = setProc
end
def next(current)
index = current+1
index = @values.length-1 if index>@values.length-1
return index
end
def prev(current)
index = current-1
index = 0 if index<0
return index
end
end
class NumberOption
include PropertyMixin
attr_reader :name
attr_reader :optstart
attr_reader :optend
def initialize(name,optstart,optend,getProc,setProc)
@name = name
@optstart = optstart
@optend = optend
@getProc = getProc
@setProc = setProc
end
def next(current)
index = current+@optstart
index += 1
index = @optstart if index>@optend
return index-@optstart
end
def prev(current)
index = current+@optstart
index -= 1
index = @optend if index<@optstart
return index-@optstart
end
end
class SliderOption
include PropertyMixin
attr_reader :name
attr_reader :optstart
attr_reader :optend
def initialize(name,optstart,optend,optinterval,getProc,setProc)
@name = name
@optstart = optstart
@optend = optend
@optinterval = optinterval
@getProc = getProc
@setProc = setProc
end
def next(current)
index = current+@optstart
index += @optinterval
index = @optend if index>@optend
return index-@optstart
end
def prev(current)
index = current+@optstart
index -= @optinterval
index = @optstart if index<@optstart
return index-@optstart
end
end
#===============================================================================
# Main options list
#===============================================================================
class Window_PokemonOption < Window_DrawableCommand
attr_reader :mustUpdateOptions
def initialize(options,x,y,width,height)
@options = options
@nameBaseColor = Color.new(24*8,15*8,0)
@nameShadowColor = Color.new(31*8,22*8,10*8)
@selBaseColor = Color.new(31*8,6*8,3*8)
@selShadowColor = Color.new(31*8,17*8,16*8)
@optvalues = []
@mustUpdateOptions = false
for i in 0...@options.length
@optvalues[i] = 0
end
super(x,y,width,height)
end
def [](i)
return @optvalues[i]
end
def []=(i,value)
@optvalues[i] = value
refresh
end
def setValueNoRefresh(i,value)
@optvalues[i] = value
end
def itemCount
return @options.length+1
end
def drawItem(index,count,rect)
rect = drawCursor(index,rect)
optionname = (index==@options.length) ? _INTL("Cancel") : @options[index].name
optionwidth = rect.width*9/20
pbDrawShadowText(self.contents,rect.x,rect.y,optionwidth,rect.height,optionname,
@nameBaseColor,@nameShadowColor)
self.contents.draw_text(rect.x,rect.y,optionwidth,rect.height,optionname)
return if index==@options.length
if @options[index].is_a?(EnumOption)
if @options[index].values.length>1
totalwidth = 0
for value in @options[index].values
totalwidth += self.contents.text_size(value).width
end
spacing = (optionwidth-totalwidth)/(@options[index].values.length-1)
spacing = 0 if spacing<0
xpos = optionwidth+rect.x
ivalue = 0
for value in @options[index].values
pbDrawShadowText(self.contents,xpos,rect.y,optionwidth,rect.height,value,
(ivalue==self[index]) ? @selBaseColor : self.baseColor,
(ivalue==self[index]) ? @selShadowColor : self.shadowColor
)
self.contents.draw_text(xpos,rect.y,optionwidth,rect.height,value)
xpos += self.contents.text_size(value).width
xpos += spacing
ivalue += 1
end
else
pbDrawShadowText(self.contents,rect.x+optionwidth,rect.y,optionwidth,rect.height,
optionname,self.baseColor,self.shadowColor)
end
elsif @options[index].is_a?(NumberOption)
value = _INTL("Type {1}/{2}",@options[index].optstart+self[index],
@options[index].optend-@options[index].optstart+1)
xpos = optionwidth+rect.x
pbDrawShadowText(self.contents,xpos,rect.y,optionwidth,rect.height,value,
@selBaseColor,@selShadowColor)
elsif @options[index].is_a?(SliderOption)
value = sprintf(" %d",@options[index].optend)
sliderlength = optionwidth-self.contents.text_size(value).width
xpos = optionwidth+rect.x
self.contents.fill_rect(xpos,rect.y-2+rect.height/2,
optionwidth-self.contents.text_size(value).width,4,self.baseColor)
self.contents.fill_rect(
xpos+(sliderlength-8)*(@options[index].optstart+self[index])/@options[index].optend,
rect.y-8+rect.height/2,
8,16,@selBaseColor)
value = sprintf("%d",@options[index].optstart+self[index])
xpos += optionwidth-self.contents.text_size(value).width
pbDrawShadowText(self.contents,xpos,rect.y,optionwidth,rect.height,value,
@selBaseColor,@selShadowColor)
else
value = @options[index].values[self[index]]
xpos = optionwidth+rect.x
pbDrawShadowText(self.contents,xpos,rect.y,optionwidth,rect.height,value,
@selBaseColor,@selShadowColor)
self.contents.draw_text(xpos,rect.y,optionwidth,rect.height,value)
end
end
def update
dorefresh = false
oldindex = self.index
@mustUpdateOptions = false
super
dorefresh = (self.index!=oldindex)
if self.active && self.index<@options.length
if Input.repeat?(Input::LEFT)
self[self.index] = @options[self.index].prev(self[self.index])
dorefresh = true
@mustUpdateOptions = true
elsif Input.repeat?(Input::RIGHT)
self[self.index] = @options[self.index].next(self[self.index])
dorefresh = true
@mustUpdateOptions = true
end
end
refresh if dorefresh
end
end
#===============================================================================
# Options main screen
#===============================================================================
class PokemonOption_Scene
def pbUpdate
pbUpdateSpriteHash(@sprites)
end
def pbStartScene(inloadscreen=false)
@sprites = {}
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99999
@sprites["title"] = Window_UnformattedTextPokemon.newWithSize(
_INTL("Options"),0,0,Graphics.width,64,@viewport)
@sprites["textbox"] = pbCreateMessageWindow
@sprites["textbox"].text = _INTL("Speech frame {1}.",1+$PokemonSystem.textskin)
@sprites["textbox"].letterbyletter = false
pbSetSystemFont(@sprites["textbox"].contents)
# These are the different options in the game. To add an option, define a
# setter and a getter for that option. To delete an option, comment it out
# or delete it. The game's options may be placed in any order.
@PokemonOptions = [
SliderOption.new(_INTL("Music Volume"),0,100,5,
proc { $PokemonSystem.bgmvolume },
proc { |value|
if $PokemonSystem.bgmvolume!=value
$PokemonSystem.bgmvolume = value
if $game_system.playing_bgm!=nil && !inloadscreen
$game_system.playing_bgm.volume = value
playingBGM = $game_system.getPlayingBGM
$game_system.bgm_pause
$game_system.bgm_resume(playingBGM)
end
end
}
),
SliderOption.new(_INTL("SE Volume"),0,100,5,
proc { $PokemonSystem.sevolume },
proc { |value|
if $PokemonSystem.sevolume!=value
$PokemonSystem.sevolume = value
if $game_system.playing_bgs!=nil
$game_system.playing_bgs.volume = value
playingBGS = $game_system.getPlayingBGS
$game_system.bgs_pause
$game_system.bgs_resume(playingBGS)
end
pbPlayCursorSE
end
}
),
EnumOption.new(_INTL("Text Speed"),[_INTL("Slow"),_INTL("Normal"),_INTL("Fast")],
proc { $PokemonSystem.textspeed },
proc { |value|
$PokemonSystem.textspeed = value
MessageConfig.pbSetTextSpeed(pbSettingToTextSpeed(value))
}
),
EnumOption.new(_INTL("Battle Effects"),[_INTL("On"),_INTL("Off")],
proc { $PokemonSystem.battlescene },
proc { |value| $PokemonSystem.battlescene = value }
),
EnumOption.new(_INTL("Battle Style"),[_INTL("Switch"),_INTL("Set")],
proc { $PokemonSystem.battlestyle },
proc { |value| $PokemonSystem.battlestyle = value }
),
EnumOption.new(_INTL("Running Key"),[_INTL("Hold"),_INTL("Toggle")],
proc { $PokemonSystem.runstyle },
proc { |value|
if $PokemonSystem.runstyle!=value
$PokemonSystem.runstyle = value
$PokemonGlobal.runtoggle = false if $PokemonGlobal
end
}
),
NumberOption.new(_INTL("Speech Frame"),1,$SpeechFrames.length,
proc { $PokemonSystem.textskin },
proc { |value|
$PokemonSystem.textskin = value
MessageConfig.pbSetSpeechFrame("Graphics/Windowskins/"+$SpeechFrames[value])
}
),
NumberOption.new(_INTL("Menu Frame"),1,$TextFrames.length,
proc { $PokemonSystem.frame },
proc { |value|
$PokemonSystem.frame = value
MessageConfig.pbSetSystemFrame($TextFrames[value])
}
),
EnumOption.new(_INTL("Font Style"),[_INTL("Em"),_INTL("R/S"),_INTL("FRLG"),_INTL("DP")],
proc { $PokemonSystem.font },
proc { |value|
$PokemonSystem.font = value
MessageConfig.pbSetSystemFontName($VersionStyles[value])
}
),
EnumOption.new(_INTL("Text Entry"),[_INTL("Cursor"),_INTL("Keyboard")],
proc { $PokemonSystem.textinput },
proc { |value| $PokemonSystem.textinput = value }
),
EnumOption.new(_INTL("Screen Size"),[_INTL("S"),_INTL("M"),_INTL("L"),_INTL("Full")],
proc { [$PokemonSystem.screensize,3].min },
proc { |value|
oldvalue = $PokemonSystem.screensize
$PokemonSystem.screensize = value
if value!=oldvalue
pbSetResizeFactor($PokemonSystem.screensize)
ObjectSpace.each_object(TilemapLoader) { |o| o.updateClass if !o.disposed? }
end
}
),
EnumOption.new(_INTL("Screen Border"),[_INTL("Off"),_INTL("On")],
proc { $PokemonSystem.border },
proc { |value|
oldvalue = $PokemonSystem.border
$PokemonSystem.border = value
if value!=oldvalue
pbSetResizeFactor($PokemonSystem.screensize)
ObjectSpace.each_object(TilemapLoader) { |o| o.updateClass if !o.disposed? }
end
}
)
]
@PokemonOptions = pbAddOnOptions(@PokemonOptions)
@sprites["option"] = Window_PokemonOption.new(@PokemonOptions,0,
@sprites["title"].height,Graphics.width,
Graphics.height-@sprites["title"].height-@sprites["textbox"].height)
@sprites["option"].viewport = @viewport
@sprites["option"].visible = true
# Get the values of each option
for i in 0...@PokemonOptions.length
@sprites["option"].setValueNoRefresh(i,(@PokemonOptions[i].get || 0))
end
@sprites["option"].refresh
pbDeactivateWindows(@sprites)
pbFadeInAndShow(@sprites) { pbUpdate }
end
def pbAddOnOptions(options)
return options
end
def pbOptions
oldSystemSkin = $PokemonSystem.frame # Menu
oldTextSkin = $PokemonSystem.textskin # Speech
oldFont = $PokemonSystem.font
pbActivateWindow(@sprites,"option") {
loop do
Graphics.update
Input.update
pbUpdate
if @sprites["option"].mustUpdateOptions
# Set the values of each option
for i in 0...@PokemonOptions.length
@PokemonOptions[i].set(@sprites["option"][i])
end
if $PokemonSystem.textskin!=oldTextSkin
@sprites["textbox"].setSkin(MessageConfig.pbGetSpeechFrame())
@sprites["textbox"].text = _INTL("Speech frame {1}.",1+$PokemonSystem.textskin)
oldTextSkin = $PokemonSystem.textskin
end
if $PokemonSystem.frame!=oldSystemSkin
@sprites["title"].setSkin(MessageConfig.pbGetSystemFrame())
@sprites["option"].setSkin(MessageConfig.pbGetSystemFrame())
oldSystemSkin = $PokemonSystem.frame
end
if $PokemonSystem.font!=oldFont
pbSetSystemFont(@sprites["textbox"].contents)
@sprites["textbox"].text = _INTL("Speech frame {1}.",1+$PokemonSystem.textskin)
oldFont = $PokemonSystem.font
end
end
if Input.trigger?(Input::B)
break
elsif Input.trigger?(Input::C)
break if @sprites["option"].index==@PokemonOptions.length
end
end
}
end
def pbEndScene
pbPlayCloseMenuSE
pbFadeOutAndHide(@sprites) { pbUpdate }
# Set the values of each option
for i in 0...@PokemonOptions.length
@PokemonOptions[i].set(@sprites["option"][i])
end
pbDisposeMessageWindow(@sprites["textbox"])
pbDisposeSpriteHash(@sprites)
pbRefreshSceneMap
@viewport.dispose
end
end
#===============================================================================
#
#===============================================================================
class PokemonOptionScreen
def initialize(scene)
@scene = scene
end
def pbStartScreen(inloadscreen=false)
@scene.pbStartScene(inloadscreen)
@scene.pbOptions
@scene.pbEndScene
end
end

View File

@@ -0,0 +1,327 @@
class ReadyMenuButton < SpriteWrapper
attr_reader :index # ID of button
attr_reader :selected
attr_reader :side
def initialize(index,command,selected,side,viewport=nil)
super(viewport)
@index = index
@command = command # Item/move ID, name, mode (T move/F item), pkmnIndex
@selected = selected
@side = side
if @command[2]
@button = AnimatedBitmap.new("Graphics/Pictures/Ready Menu/icon_movebutton")
else
@button = AnimatedBitmap.new("Graphics/Pictures/Ready Menu/icon_itembutton")
end
@contents = BitmapWrapper.new(@button.width,@button.height/2)
self.bitmap = @contents
pbSetSystemFont(self.bitmap)
if @command[2]
@icon = PokemonIconSprite.new($Trainer.party[@command[3]],viewport)
@icon.setOffset(PictureOrigin::Center)
else
@icon = ItemIconSprite.new(0,0,@command[0],viewport)
end
@icon.z = self.z+1
refresh
end
def dispose
@button.dispose
@contents.dispose
@icon.dispose
super
end
def visible=(val)
@icon.visible = val
super(val)
end
def selected=(val)
oldsel = @selected
@selected = val
refresh if oldsel!=val
end
def side=(val)
oldsel = @side
@side = val
refresh if oldsel!=val
end
def refresh
sel = (@selected==@index && (@side==0)==@command[2])
self.y = (Graphics.height-@button.height/2)/2 - (@selected-@index)*(@button.height/2+4)
if @command[2] # Pokémon
self.x = (sel) ? 0 : -16
@icon.x = self.x+52
@icon.y = self.y+32
else # Item
self.x = (sel) ? Graphics.width-@button.width : Graphics.width+16-@button.width
@icon.x = self.x+32
@icon.y = self.y+@button.height/4
end
self.bitmap.clear
rect = Rect.new(0,(sel) ? @button.height/2 : 0,@button.width,@button.height/2)
self.bitmap.blt(0,0,@button.bitmap,rect)
textx = (@command[2]) ? 164 : (pbIsImportantItem?(@command[0])) ? 146 : 124
textpos = [
[@command[1],textx,18,2,Color.new(248,248,248),Color.new(40,40,40),1],
]
if !@command[2]
if !pbIsImportantItem?(@command[0])
qty = $PokemonBag.pbQuantity(@command[0])
if qty>99
textpos.push([_INTL(">99"),230,18,1,
Color.new(248,248,248),Color.new(40,40,40),1])
else
textpos.push([_INTL("x{1}",qty),230,18,1,
Color.new(248,248,248),Color.new(40,40,40),1])
end
end
end
pbDrawTextPositions(self.bitmap,textpos)
end
def update
@icon.update if @icon
super
end
end
class PokemonReadyMenu_Scene
attr_reader :sprites
def pbStartScene(commands)
@commands = commands
@movecommands = []
@itemcommands = []
for i in 0...@commands[0].length
@movecommands.push(@commands[0][i][1])
end
for i in 0...@commands[1].length
@itemcommands.push(@commands[1][i][1])
end
@index = $PokemonBag.registeredIndex
if @index[0]>=@movecommands.length && @movecommands.length>0
@index[0] = @movecommands.length-1
end
if @index[1]>=@itemcommands.length && @itemcommands.length>0
@index[1] = @itemcommands.length-1
end
if @index[2]==0 && @movecommands.length==0; @index[2] = 1
elsif @index[2]==1 && @itemcommands.length==0; @index[2] = 0
end
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99999
@sprites = {}
@sprites["cmdwindow"] = Window_CommandPokemon.new((@index[2]==0) ? @movecommands : @itemcommands)
@sprites["cmdwindow"].height = 6*32
@sprites["cmdwindow"].visible = false
@sprites["cmdwindow"].viewport = @viewport
for i in 0...@commands[0].length
@sprites["movebutton#{i}"] = ReadyMenuButton.new(i,@commands[0][i],@index[0],@index[2],@viewport)
end
for i in 0...@commands[1].length
@sprites["itembutton#{i}"] = ReadyMenuButton.new(i,@commands[1][i],@index[1],@index[2],@viewport)
end
pbSEPlay("GUI menu open")
end
def pbShowMenu
@sprites["cmdwindow"].visible = false
for i in 0...@commands[0].length
@sprites["movebutton#{i}"].visible = true
end
for i in 0...@commands[1].length
@sprites["itembutton#{i}"].visible = true
end
end
def pbHideMenu
@sprites["cmdwindow"].visible = false
for i in 0...@commands[0].length
@sprites["movebutton#{i}"].visible = false
end
for i in 0...@commands[1].length
@sprites["itembutton#{i}"].visible = false
end
end
def pbShowCommands
ret = -1
cmdwindow = @sprites["cmdwindow"]
cmdwindow.commands = (@index[2]==0) ? @movecommands : @itemcommands
cmdwindow.index = @index[@index[2]]
cmdwindow.visible = false
loop do
pbUpdate
if Input.trigger?(Input::LEFT) && @index[2]==1 && @movecommands.length>0
@index[2] = 0
pbChangeSide
elsif Input.trigger?(Input::RIGHT) && @index[2]==0 && @itemcommands.length>0
@index[2] = 1
pbChangeSide
elsif Input.trigger?(Input::B)
pbPlayCloseMenuSE
ret = -1
break
elsif Input.trigger?(Input::C)
ret = [@index[2],cmdwindow.index]
break
end
end
return ret
end
def pbEndScene
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
def pbChangeSide
for i in 0...@commands[0].length
@sprites["movebutton#{i}"].side = @index[2]
end
for i in 0...@commands[1].length
@sprites["itembutton#{i}"].side = @index[2]
end
@sprites["cmdwindow"].commands = (@index[2]==0) ? @movecommands : @itemcommands
@sprites["cmdwindow"].index = @index[@index[2]]
end
def pbRefresh; end
def pbUpdate
oldindex = @index[@index[2]]
@index[@index[2]] = @sprites["cmdwindow"].index
if @index[@index[2]]!=oldindex
if @index[2]==0
for i in 0...@commands[0].length
@sprites["movebutton#{i}"].selected = @index[@index[2]]
end
elsif @index[2]==1
for i in 0...@commands[1].length
@sprites["itembutton#{i}"].selected = @index[@index[2]]
end
end
end
pbUpdateSpriteHash(@sprites)
Graphics.update
Input.update
pbUpdateSceneMap
end
end
class PokemonReadyMenu
def initialize(scene)
@scene = scene
end
def pbHideMenu
@scene.pbHideMenu
end
def pbShowMenu
@scene.pbRefresh
@scene.pbShowMenu
end
def pbStartReadyMenu(moves,items)
commands = [[],[]] # Moves, items
for i in moves
commands[0].push([i[0],PBMoves.getName(i[0]),true,i[1]])
end
commands[0].sort! { |a,b| a[1]<=>b[1] }
for i in items
commands[1].push([i,PBItems.getName(i),false])
end
commands[1].sort! { |a,b| a[1]<=>b[1] }
@scene.pbStartScene(commands)
loop do
command = @scene.pbShowCommands
break if command==-1
if command[0]==0 # Use a move
move = commands[0][command[1]][0]
user = $Trainer.party[commands[0][command[1]][3]]
if isConst?(move,PBMoves,:FLY)
ret = nil
pbFadeOutInWithUpdate(99999,@scene.sprites) {
pbHideMenu
scene = PokemonRegionMap_Scene.new(-1,false)
screen = PokemonRegionMapScreen.new(scene)
ret = screen.pbStartFlyScreen
pbShowMenu if !ret
}
if ret
$PokemonTemp.flydata = ret
$game_temp.in_menu = false
pbUseHiddenMove(user,move)
break
end
else
pbHideMenu
if pbConfirmUseHiddenMove(user,move)
$game_temp.in_menu = false
pbUseHiddenMove(user,move)
break
else
pbShowMenu
end
end
else # Use an item
item = commands[1][command[1]][0]
pbHideMenu
if ItemHandlers.triggerConfirmUseInField(item)
$game_temp.in_menu = false
break if pbUseKeyItemInField(item)
$game_temp.in_menu = true
end
end
pbShowMenu
end
@scene.pbEndScene
end
end
#===============================================================================
# Using a registered item
#===============================================================================
def pbUseKeyItem
moves = [:CUT,:DEFOG,:DIG,:DIVE,:FLASH,:FLY,:HEADBUTT,:ROCKCLIMB,:ROCKSMASH,
:SECRETPOWER,:STRENGTH,:SURF,:SWEETSCENT,:TELEPORT,:WATERFALL,
:WHIRLPOOL]
realmoves = []
for i in moves
move = getID(PBMoves,i)
next if move==0
for j in 0...$Trainer.party.length
next if $Trainer.party[j].egg?
next if !$Trainer.party[j].hasMove?(move)
realmoves.push([move,j]) if pbCanUseHiddenMove?($Trainer.party[j],move,false)
break
end
end
realitems = []
for i in $PokemonBag.registeredItems
realitems.push(i) if $PokemonBag.pbHasItem?(i)
end
if realitems.length==0 && realmoves.length==0
pbMessage(_INTL("An item in the Bag can be registered to this key for instant use."))
else
$game_temp.in_menu = true
$game_map.update
sscene = PokemonReadyMenu_Scene.new
sscreen = PokemonReadyMenu.new(sscene)
sscreen.pbStartReadyMenu(realmoves,realitems)
$game_temp.in_menu = false
end
end

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,365 @@
class Window_PokemonItemStorage < Window_DrawableCommand
attr_reader :bag
attr_reader :pocket
attr_reader :sortIndex
def sortIndex=(value)
@sortIndex = value
refresh
end
def initialize(bag,x,y,width,height)
@bag = bag
@sortIndex = -1
@adapter = PokemonMartAdapter.new
super(x,y,width,height)
self.windowskin = nil
end
def item
item = @bag[self.index]
return item ? item[0] : 0
end
def itemCount
return @bag.length+1
end
def drawItem(index,count,rect)
rect = drawCursor(index,rect)
ypos = rect.y
textpos = []
if index==@bag.length
textpos.push([_INTL("CANCEL"),rect.x,ypos,false,self.baseColor,self.shadowColor])
else
item = @bag[index][0]
itemname = @adapter.getDisplayName(item)
qty = _ISPRINTF("x{1: 2d}",@bag[index][1])
sizeQty = self.contents.text_size(qty).width
xQty = rect.x+rect.width-sizeQty-2
baseColor = (index==@sortIndex) ? Color.new(248,24,24) : self.baseColor
textpos.push([itemname,rect.x,ypos,false,self.baseColor,self.shadowColor])
if !pbIsImportantItem?(item) # Not a Key item or HM (or infinite TM)
textpos.push([qty,xQty,ypos,false,baseColor,self.shadowColor])
end
end
pbDrawTextPositions(self.contents,textpos)
end
end
class ItemStorage_Scene
ITEMLISTBASECOLOR = Color.new(88,88,80)
ITEMLISTSHADOWCOLOR = Color.new(168,184,184)
ITEMTEXTBASECOLOR = Color.new(248,248,248)
ITEMTEXTSHADOWCOLOR = Color.new(0,0,0)
TITLEBASECOLOR = Color.new(248,248,248)
TITLESHADOWCOLOR = Color.new(0,0,0)
ITEMSVISIBLE = 7
def initialize(title)
@title = title
end
def update
pbUpdateSpriteHash(@sprites)
end
def pbStartScene(bag)
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99999
@bag = bag
@sprites = {}
@sprites["background"] = IconSprite.new(0,0,@viewport)
@sprites["background"].setBitmap("Graphics/Pictures/pcItembg")
@sprites["icon"] = ItemIconSprite.new(50,334,-1,@viewport)
# Item list
@sprites["itemwindow"] = Window_PokemonItemStorage.new(@bag,98,14,334,32+ITEMSVISIBLE*32)
@sprites["itemwindow"].viewport = @viewport
@sprites["itemwindow"].index = 0
@sprites["itemwindow"].baseColor = ITEMLISTBASECOLOR
@sprites["itemwindow"].shadowColor = ITEMLISTSHADOWCOLOR
@sprites["itemwindow"].refresh
# Title
@sprites["pocketwindow"] = BitmapSprite.new(88,64,@viewport)
@sprites["pocketwindow"].x = 14
@sprites["pocketwindow"].y = 16
pbSetNarrowFont(@sprites["pocketwindow"].bitmap)
# Item description
@sprites["itemtextwindow"] = Window_UnformattedTextPokemon.newWithSize("",84,270,Graphics.width-84,128,@viewport)
@sprites["itemtextwindow"].baseColor = ITEMTEXTBASECOLOR
@sprites["itemtextwindow"].shadowColor = ITEMTEXTSHADOWCOLOR
@sprites["itemtextwindow"].windowskin = nil
@sprites["helpwindow"] = Window_UnformattedTextPokemon.new("")
@sprites["helpwindow"].visible = false
@sprites["helpwindow"].viewport = @viewport
# Letter-by-letter message window
@sprites["msgwindow"] = Window_AdvancedTextPokemon.new("")
@sprites["msgwindow"].visible = false
@sprites["msgwindow"].viewport = @viewport
pbBottomLeftLines(@sprites["helpwindow"],1)
pbDeactivateWindows(@sprites)
pbRefresh
pbFadeInAndShow(@sprites)
end
def pbEndScene
pbFadeOutAndHide(@sprites)
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
def pbChooseNumber(helptext,maximum)
return UIHelper.pbChooseNumber(@sprites["helpwindow"],helptext,maximum) { update }
end
def pbDisplay(msg,brief=false)
UIHelper.pbDisplay(@sprites["msgwindow"],msg,brief) { update }
end
def pbConfirm(msg)
UIHelper.pbConfirm(@sprites["msgwindow"],msg) { update }
end
def pbShowCommands(helptext,commands)
return UIHelper.pbShowCommands(@sprites["helpwindow"],helptext,commands) { update }
end
def pbRefresh
bm = @sprites["pocketwindow"].bitmap
# Draw title at upper left corner ("Toss Item/Withdraw Item")
drawTextEx(bm,0,0,bm.width,2,@title,TITLEBASECOLOR,TITLESHADOWCOLOR)
itemwindow = @sprites["itemwindow"]
# Draw item icon
@sprites["icon"].item = itemwindow.item
# Get item description
if itemwindow.item==0
@sprites["itemtextwindow"].text = _INTL("Close storage.")
else
@sprites["itemtextwindow"].text = pbGetMessage(MessageTypes::ItemDescriptions,itemwindow.item)
end
itemwindow.refresh
end
def pbChooseItem
pbRefresh
@sprites["helpwindow"].visible = false
itemwindow = @sprites["itemwindow"]
itemwindow.refresh
pbActivateWindow(@sprites,"itemwindow") {
loop do
Graphics.update
Input.update
olditem = itemwindow.item
self.update
pbRefresh if itemwindow.item!=olditem
if Input.trigger?(Input::B)
return 0
elsif Input.trigger?(Input::C)
if itemwindow.index<@bag.length
pbRefresh
return @bag[itemwindow.index][0]
else
return 0
end
end
end
}
end
end
class WithdrawItemScene < ItemStorage_Scene
def initialize
super(_INTL("Withdraw\nItem"))
end
end
class TossItemScene < ItemStorage_Scene
def initialize
super(_INTL("Toss\nItem"))
end
end
#===============================================================================
# Common UI functions used in both the Bag and item storage screens.
# Displays messages and allows the user to choose a number/command.
# The window _helpwindow_ will display the _helptext_.
#===============================================================================
module UIHelper
# Letter by letter display of the message _msg_ by the window _helpwindow_.
def self.pbDisplay(helpwindow,msg,brief)
cw = helpwindow
oldvisible = cw.visible
cw.letterbyletter = true
cw.text = msg+"\1"
cw.visible = true
pbBottomLeftLines(cw,2)
loop do
Graphics.update
Input.update
(block_given?) ? yield : cw.update
if !cw.busy?
if brief || (Input.trigger?(Input::C) && cw.resume)
break
end
end
end
cw.visible = oldvisible
end
def self.pbDisplayStatic(msgwindow,message)
oldvisible = msgwindow.visible
msgwindow.visible = true
msgwindow.letterbyletter = false
msgwindow.width = Graphics.width
msgwindow.resizeHeightToFit(message,Graphics.width)
msgwindow.text = message
pbBottomRight(msgwindow)
loop do
Graphics.update
Input.update
(block_given?) ? yield : msgwindow.update
if Input.trigger?(Input::B) || Input.trigger?(Input::C)
break
end
end
msgwindow.visible = oldvisible
Input.update
end
# Letter by letter display of the message _msg_ by the window _helpwindow_,
# used to ask questions. Returns true if the user chose yes, false if no.
def self.pbConfirm(helpwindow,msg)
dw = helpwindow
oldvisible = dw.visible
dw.letterbyletter = true
dw.text = msg
dw.visible = true
pbBottomLeftLines(dw,2)
commands = [_INTL("Yes"),_INTL("No")]
cw = Window_CommandPokemon.new(commands)
cw.index = 0
cw.viewport = helpwindow.viewport
pbBottomRight(cw)
cw.y -= dw.height
ret = false
loop do
cw.visible = (!dw.busy?)
Graphics.update
Input.update
cw.update
(block_given?) ? yield : dw.update
if !dw.busy? && dw.resume
if Input.trigger?(Input::B)
pbPlayCancelSE()
break
elsif Input.trigger?(Input::C)
pbPlayDecisionSE()
ret = (cw.index==0)
break
end
end
end
cw.dispose
dw.visible = oldvisible
return ret
end
def self.pbChooseNumber(helpwindow,helptext,maximum,initnum=1)
oldvisible = helpwindow.visible
helpwindow.visible = true
helpwindow.text = helptext
helpwindow.letterbyletter = false
curnumber = initnum
ret = 0
using(numwindow = Window_UnformattedTextPokemon.new("x000")) {
numwindow.viewport = helpwindow.viewport
numwindow.letterbyletter = false
numwindow.text = _ISPRINTF("x{1:03d}",curnumber)
numwindow.resizeToFit(numwindow.text,Graphics.width)
pbBottomRight(numwindow)
helpwindow.resizeHeightToFit(helpwindow.text,Graphics.width-numwindow.width)
pbBottomLeft(helpwindow)
loop do
Graphics.update
Input.update
numwindow.update
(block_given?) ? yield : helpwindow.update
if Input.trigger?(Input::B)
ret = 0
pbPlayCancelSE()
break
elsif Input.trigger?(Input::C)
ret = curnumber
pbPlayDecisionSE()
break
elsif Input.repeat?(Input::UP)
curnumber += 1
curnumber = 1 if curnumber>maximum
numwindow.text = _ISPRINTF("x{1:03d}",curnumber)
pbPlayCursorSE()
elsif Input.repeat?(Input::DOWN)
curnumber -= 1
curnumber = maximum if curnumber<1
numwindow.text = _ISPRINTF("x{1:03d}",curnumber)
pbPlayCursorSE()
elsif Input.repeat?(Input::LEFT)
curnumber -= 10
curnumber = 1 if curnumber<1
numwindow.text = _ISPRINTF("x{1:03d}",curnumber)
pbPlayCursorSE()
elsif Input.repeat?(Input::RIGHT)
curnumber += 10
curnumber = maximum if curnumber>maximum
numwindow.text = _ISPRINTF("x{1:03d}",curnumber)
pbPlayCursorSE()
end
end
}
helpwindow.visible = oldvisible
return ret
end
def self.pbShowCommands(helpwindow,helptext,commands,initcmd=0)
ret = -1
oldvisible = helpwindow.visible
helpwindow.visible = helptext ? true : false
helpwindow.letterbyletter = false
helpwindow.text = helptext ? helptext : ""
cmdwindow = Window_CommandPokemon.new(commands)
cmdwindow.index = initcmd
begin
cmdwindow.viewport = helpwindow.viewport
pbBottomRight(cmdwindow)
helpwindow.resizeHeightToFit(helpwindow.text,Graphics.width-cmdwindow.width)
pbBottomLeft(helpwindow)
loop do
Graphics.update
Input.update
yield
cmdwindow.update
if Input.trigger?(Input::B)
ret = -1
pbPlayCancelSE()
break
end
if Input.trigger?(Input::C)
ret = cmdwindow.index
pbPlayDecisionSE()
break
end
end
ensure
cmdwindow.dispose if cmdwindow
end
helpwindow.visible = oldvisible
return ret
end
end

View File

@@ -0,0 +1,259 @@
#===============================================================================
# PC menus
#===============================================================================
def pbPCItemStorage
command = 0
loop do
command = pbShowCommandsWithHelp(nil,
[_INTL("Withdraw Item"),
_INTL("Deposit Item"),
_INTL("Toss Item"),
_INTL("Exit")],
[_INTL("Take out items from the PC."),
_INTL("Store items in the PC."),
_INTL("Throw away items stored in the PC."),
_INTL("Go back to the previous menu.")],-1,command
)
case command
when 0 # Withdraw Item
if !$PokemonGlobal.pcItemStorage
$PokemonGlobal.pcItemStorage = PCItemStorage.new
end
if $PokemonGlobal.pcItemStorage.empty?
pbMessage(_INTL("There are no items."))
else
pbFadeOutIn {
scene = WithdrawItemScene.new
screen = PokemonBagScreen.new(scene,$PokemonBag)
ret = screen.pbWithdrawItemScreen
}
end
when 1 # Deposit Item
pbFadeOutIn {
scene = PokemonBag_Scene.new
screen = PokemonBagScreen.new(scene,$PokemonBag)
ret = screen.pbDepositItemScreen
}
when 2 # Toss Item
if !$PokemonGlobal.pcItemStorage
$PokemonGlobal.pcItemStorage = PCItemStorage.new
end
if $PokemonGlobal.pcItemStorage.empty?
pbMessage(_INTL("There are no items."))
else
pbFadeOutIn {
scene = TossItemScene.new
screen = PokemonBagScreen.new(scene,$PokemonBag)
ret = screen.pbTossItemScreen
}
end
else
break
end
end
end
def pbPCMailbox
if !$PokemonGlobal.mailbox || $PokemonGlobal.mailbox.length==0
pbMessage(_INTL("There's no Mail here."))
else
loop do
command = 0
commands=[]
for mail in $PokemonGlobal.mailbox
commands.push(mail.sender)
end
commands.push(_INTL("Cancel"))
command = pbShowCommands(nil,commands,-1,command)
if command>=0 && command<$PokemonGlobal.mailbox.length
mailIndex = command
commandMail = pbMessage(_INTL("What do you want to do with {1}'s Mail?",
$PokemonGlobal.mailbox[mailIndex].sender),[
_INTL("Read"),
_INTL("Move to Bag"),
_INTL("Give"),
_INTL("Cancel")
],-1)
case commandMail
when 0 # Read
pbFadeOutIn {
pbDisplayMail($PokemonGlobal.mailbox[mailIndex])
}
when 1 # Move to Bag
if pbConfirmMessage(_INTL("The message will be lost. Is that OK?"))
if $PokemonBag.pbStoreItem($PokemonGlobal.mailbox[mailIndex].item)
pbMessage(_INTL("The Mail was returned to the Bag with its message erased."))
$PokemonGlobal.mailbox.delete_at(mailIndex)
else
pbMessage(_INTL("The Bag is full."))
end
end
when 2 # Give
pbFadeOutIn {
sscene = PokemonParty_Scene.new
sscreen = PokemonPartyScreen.new(sscene,$Trainer.party)
sscreen.pbPokemonGiveMailScreen(mailIndex)
}
end
else
break
end
end
end
end
def pbTrainerPCMenu
command = 0
loop do
command = pbMessage(_INTL("What do you want to do?"),[
_INTL("Item Storage"),
_INTL("Mailbox"),
_INTL("Turn Off")
],-1,nil,command)
case command
when 0; pbPCItemStorage
when 1; pbPCMailbox
else; break
end
end
end
class TrainerPC
def shouldShow?
return true
end
def name
return _INTL("{1}'s PC",$Trainer.name)
end
def access
pbMessage(_INTL("\\se[PC access]Accessed {1}'s PC.",$Trainer.name))
pbTrainerPCMenu
end
end
def pbGetStorageCreator
creator = pbStorageCreator
creator = _INTL("Bill") if !creator || creator==""
return creator
end
class StorageSystemPC
def shouldShow?
return true
end
def name
if $PokemonGlobal.seenStorageCreator
return _INTL("{1}'s PC",pbGetStorageCreator)
else
return _INTL("Someone's PC")
end
end
def access
pbMessage(_INTL("\\se[PC access]The Pokémon Storage System was opened."))
command = 0
loop do
command = pbShowCommandsWithHelp(nil,
[_INTL("Organize Boxes"),
_INTL("Withdraw Pokémon"),
_INTL("Deposit Pokémon"),
_INTL("See ya!")],
[_INTL("Organize the Pokémon in Boxes and in your party."),
_INTL("Move Pokémon stored in Boxes to your party."),
_INTL("Store Pokémon in your party in Boxes."),
_INTL("Return to the previous menu.")],-1,command
)
if command>=0 && command<3
if command==1 # Withdraw
if $PokemonStorage.party.length>=6
pbMessage(_INTL("Your party is full!"))
next
end
elsif command==2 # Deposit
count=0
for p in $PokemonStorage.party
count += 1 if p && !p.egg? && p.hp>0
end
if count<=1
pbMessage(_INTL("Can't deposit the last Pokémon!"))
next
end
end
pbFadeOutIn {
scene = PokemonStorageScene.new
screen = PokemonStorageScreen.new(scene,$PokemonStorage)
screen.pbStartScreen(command)
}
else
break
end
end
end
end
def pbTrainerPC
pbMessage(_INTL("\\se[PC open]{1} booted up the PC.",$Trainer.name))
pbTrainerPCMenu
pbSEPlay("PC close")
end
def pbPokeCenterPC
pbMessage(_INTL("\\se[PC open]{1} booted up the PC.",$Trainer.name))
command = 0
loop do
commands = PokemonPCList.getCommandList
command = pbMessage(_INTL("Which PC should be accessed?"),commands,
commands.length,nil,command)
break if !PokemonPCList.callCommand(command)
end
pbSEPlay("PC close")
end
module PokemonPCList
@@pclist = []
def self.registerPC(pc)
@@pclist.push(pc)
end
def self.getCommandList
commands = []
for pc in @@pclist
commands.push(pc.name) if pc.shouldShow?
end
commands.push(_INTL("Log Off"))
return commands
end
def self.callCommand(cmd)
return false if cmd<0 || cmd>=@@pclist.length
i = 0
for pc in @@pclist
next if !pc.shouldShow?
if i==cmd
pc.access
return true
end
i += 1
end
return false
end
end
PokemonPCList.registerPC(StorageSystemPC.new)
PokemonPCList.registerPC(TrainerPC.new)

View File

@@ -0,0 +1,234 @@
#===============================================================================
# * Egg Hatch Animation - by FL (Credits will be apreciated)
# Tweaked by Maruno
#===============================================================================
# This script is for Pokémon Essentials. It's an egg hatch animation that
# works even with special eggs like Manaphy egg.
#===============================================================================
# To this script works, put it above Main and put a picture (a 5 frames
# sprite sheet) with egg sprite height and 5 times the egg sprite width at
# Graphics/Battlers/eggCracks.
#===============================================================================
class PokemonEggHatch_Scene
def pbStartScene(pokemon)
@sprites={}
@pokemon=pokemon
@nicknamed=false
@viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z=99999
# Create background image
addBackgroundOrColoredPlane(@sprites,"background","hatchbg",
Color.new(248,248,248),@viewport)
# Create egg sprite/Pokémon sprite
@sprites["pokemon"]=PokemonSprite.new(@viewport)
@sprites["pokemon"].setOffset(PictureOrigin::Bottom)
@sprites["pokemon"].x = Graphics.width/2
@sprites["pokemon"].y = 264+56 # 56 to offset the egg sprite
@sprites["pokemon"].setSpeciesBitmap(@pokemon.species,@pokemon.female?,
(@pokemon.form rescue 0),@pokemon.shiny?,
false,false,true) # Egg sprite
# Load egg cracks bitmap
crackfilename=sprintf("Graphics/Battlers/%seggCracks",
getConstantName(PBSpecies,@pokemon.species)) rescue nil
if !pbResolveBitmap(crackfilename)
crackfilename=sprintf("Graphics/Battlers/%03deggCracks",@pokemon.species)
crackfilename=sprintf("Graphics/Battlers/eggCracks") if !pbResolveBitmap(crackfilename)
end
crackfilename=pbResolveBitmap(crackfilename)
@hatchSheet=AnimatedBitmap.new(crackfilename)
# Create egg cracks sprite
@sprites["hatch"]=SpriteWrapper.new(@viewport)
@sprites["hatch"].x = @sprites["pokemon"].x
@sprites["hatch"].y = @sprites["pokemon"].y
@sprites["hatch"].ox = @sprites["pokemon"].ox
@sprites["hatch"].oy = @sprites["pokemon"].oy
@sprites["hatch"].bitmap = @hatchSheet.bitmap
@sprites["hatch"].src_rect = Rect.new(0,0,@hatchSheet.width/5,@hatchSheet.height)
@sprites["hatch"].visible = false
# Create flash overlay
@sprites["overlay"]=BitmapSprite.new(Graphics.width,Graphics.height,@viewport)
@sprites["overlay"].z=200
@sprites["overlay"].bitmap=Bitmap.new(Graphics.width,Graphics.height)
@sprites["overlay"].bitmap.fill_rect(0,0,Graphics.width,Graphics.height,
Color.new(255,255,255))
@sprites["overlay"].opacity=0
# Start up scene
pbFadeInAndShow(@sprites)
end
def pbMain
pbBGMPlay("Evolution")
# Egg animation
updateScene(Graphics.frame_rate*15/10)
pbPositionHatchMask(0)
pbSEPlay("Battle ball shake")
swingEgg(4)
updateScene(Graphics.frame_rate*2/10)
pbPositionHatchMask(1)
pbSEPlay("Battle ball shake")
swingEgg(4)
updateScene(Graphics.frame_rate*4/10)
pbPositionHatchMask(2)
pbSEPlay("Battle ball shake")
swingEgg(8,2)
updateScene(Graphics.frame_rate*4/10)
pbPositionHatchMask(3)
pbSEPlay("Battle ball shake")
swingEgg(16,4)
updateScene(Graphics.frame_rate*2/10)
pbPositionHatchMask(4)
pbSEPlay("Battle recall")
# Fade and change the sprite
fadeTime = Graphics.frame_rate*4/10
toneDiff = (255.0/fadeTime).ceil
for i in 1..fadeTime
@sprites["pokemon"].tone=Tone.new(i*toneDiff,i*toneDiff,i*toneDiff)
@sprites["overlay"].opacity=i*toneDiff
updateScene
end
updateScene(Graphics.frame_rate*3/4)
@sprites["pokemon"].setPokemonBitmap(@pokemon) # Pokémon sprite
@sprites["pokemon"].x = Graphics.width/2
@sprites["pokemon"].y = 264
pbApplyBattlerMetricsToSprite(@sprites["pokemon"],1,@pokemon.fSpecies)
@sprites["hatch"].visible=false
for i in 1..fadeTime
@sprites["pokemon"].tone=Tone.new(255-i*toneDiff,255-i*toneDiff,255-i*toneDiff)
@sprites["overlay"].opacity=255-i*toneDiff
updateScene
end
@sprites["pokemon"].tone=Tone.new(0,0,0)
@sprites["overlay"].opacity=0
# Finish scene
frames=pbCryFrameLength(@pokemon)
pbPlayCry(@pokemon)
updateScene(frames)
pbBGMStop()
pbMEPlay("Evolution success")
pbMessage(_INTL("\\se[]{1} hatched from the Egg!\\wt[80]",@pokemon.name)) { update }
if pbConfirmMessage(
_INTL("Would you like to nickname the newly hatched {1}?",@pokemon.name)) { update }
nickname=pbEnterPokemonName(_INTL("{1}'s nickname?",@pokemon.name),
0,PokeBattle_Pokemon::MAX_POKEMON_NAME_SIZE,"",@pokemon,true)
@pokemon.name=nickname if nickname!=""
@nicknamed=true
end
end
def pbEndScene
pbFadeOutAndHide(@sprites) { update } if !@nicknamed
pbDisposeSpriteHash(@sprites)
@hatchSheet.dispose
@viewport.dispose
end
def pbPositionHatchMask(index)
@sprites["hatch"].src_rect.x = index*@sprites["hatch"].src_rect.width
end
def swingEgg(speed,swingTimes=1)
@sprites["hatch"].visible = true
speed = speed.to_f*20/Graphics.frame_rate
amplitude = 8
targets = []
swingTimes.times do
targets.push(@sprites["pokemon"].x+amplitude)
targets.push(@sprites["pokemon"].x-amplitude)
end
targets.push(@sprites["pokemon"].x)
targets.each_with_index do |target,i|
loop do
break if i%2==0 && @sprites["pokemon"].x>=target
break if i%2==1 && @sprites["pokemon"].x<=target
@sprites["pokemon"].x += speed
@sprites["hatch"].x = @sprites["pokemon"].x
updateScene
end
speed *= -1
end
@sprites["pokemon"].x = targets[targets.length-1]
@sprites["hatch"].x = @sprites["pokemon"].x
end
def updateScene(frames=1) # Can be used for "wait" effect
frames.times do
Graphics.update
Input.update
self.update
end
end
def update
pbUpdateSpriteHash(@sprites)
end
end
class PokemonEggHatchScreen
def initialize(scene)
@scene=scene
end
def pbStartScreen(pokemon)
@scene.pbStartScene(pokemon)
@scene.pbMain
@scene.pbEndScene
end
end
def pbHatchAnimation(pokemon)
pbMessage(_INTL("Huh?\1"))
pbFadeOutInWithMusic {
scene=PokemonEggHatch_Scene.new
screen=PokemonEggHatchScreen.new(scene)
screen.pbStartScreen(pokemon)
}
return true
end
def pbHatch(pokemon)
speciesname = PBSpecies.getName(pokemon.species)
pokemon.name = speciesname
pokemon.trainerID = $Trainer.id
pokemon.ot = $Trainer.name
pokemon.happiness = 120
pokemon.timeEggHatched = pbGetTimeNow
pokemon.obtainMode = 1 # hatched from egg
pokemon.hatchedMap = $game_map.map_id
$Trainer.seen[pokemon.species] = true
$Trainer.owned[pokemon.species] = true
pbSeenForm(pokemon)
pokemon.pbRecordFirstMoves
if !pbHatchAnimation(pokemon)
pbMessage(_INTL("Huh?\1"))
pbMessage(_INTL("...\1"))
pbMessage(_INTL("... .... .....\1"))
pbMessage(_INTL("{1} hatched from the Egg!",speciesname))
if pbConfirmMessage(_INTL("Would you like to nickname the newly hatched {1}?",speciesname))
species = PBSpecies.getName(pokemon.species)
nickname = pbEnterPokemonName(_INTL("{1}'s nickname?",speciesname),
0,PokeBattle_Pokemon::MAX_POKEMON_NAME_SIZE,"",pokemon)
pokemon.name = nickname if nickname!=""
end
end
end
Events.onStepTaken += proc { |sender,e|
for egg in $Trainer.party
next if egg.eggsteps<=0
egg.eggsteps -= 1
for i in $Trainer.pokemonParty
next if !isConst?(i.ability,PBAbilities,:FLAMEBODY) &&
!isConst?(i.ability,PBAbilities,:MAGMAARMOR)
egg.eggsteps -= 1
break
end
if egg.eggsteps<=0
egg.eggsteps = 0
pbHatch(egg)
end
end
}

View File

@@ -0,0 +1,645 @@
#===============================================================================
# Evolution animation metafiles and related methods
#===============================================================================
class SpriteMetafile
VIEWPORT = 0
TONE = 1
SRC_RECT = 2
VISIBLE = 3
X = 4
Y = 5
Z = 6
OX = 7
OY = 8
ZOOM_X = 9
ZOOM_Y = 10
ANGLE = 11
MIRROR = 12
BUSH_DEPTH = 13
OPACITY = 14
BLEND_TYPE = 15
COLOR = 16
FLASHCOLOR = 17
FLASHDURATION = 18
BITMAP = 19
def length
return @metafile.length
end
def [](i)
return @metafile[i]
end
def initialize(viewport=nil)
@metafile=[]
@values=[
viewport,
Tone.new(0,0,0,0),Rect.new(0,0,0,0),
true,
0,0,0,0,0,100,100,
0,false,0,255,0,
Color.new(0,0,0,0),Color.new(0,0,0,0),
0
]
end
def disposed?
return false
end
def dispose
end
def flash(color,duration)
if duration>0
@values[FLASHCOLOR]=color.clone
@values[FLASHDURATION]=duration
@metafile.push([FLASHCOLOR,color])
@metafile.push([FLASHDURATION,duration])
end
end
def x
return @values[X]
end
def x=(value)
@values[X]=value
@metafile.push([X,value])
end
def y
return @values[Y]
end
def y=(value)
@values[Y]=value
@metafile.push([Y,value])
end
def bitmap
return nil
end
def bitmap=(value)
if value && !value.disposed?
@values[SRC_RECT].set(0,0,value.width,value.height)
@metafile.push([SRC_RECT,@values[SRC_RECT].clone])
end
end
def src_rect
return @values[SRC_RECT]
end
def src_rect=(value)
@values[SRC_RECT]=value
@metafile.push([SRC_RECT,value])
end
def visible
return @values[VISIBLE]
end
def visible=(value)
@values[VISIBLE]=value
@metafile.push([VISIBLE,value])
end
def z
return @values[Z]
end
def z=(value)
@values[Z]=value
@metafile.push([Z,value])
end
def ox
return @values[OX]
end
def ox=(value)
@values[OX]=value
@metafile.push([OX,value])
end
def oy
return @values[OY]
end
def oy=(value)
@values[OY]=value
@metafile.push([OY,value])
end
def zoom_x
return @values[ZOOM_X]
end
def zoom_x=(value)
@values[ZOOM_X]=value
@metafile.push([ZOOM_X,value])
end
def zoom_y
return @values[ZOOM_Y]
end
def zoom_y=(value)
@values[ZOOM_Y]=value
@metafile.push([ZOOM_Y,value])
end
def zoom=(value)
@values[ZOOM_X]=value
@metafile.push([ZOOM_X,value])
@values[ZOOM_Y]=value
@metafile.push([ZOOM_Y,value])
end
def angle
return @values[ANGLE]
end
def angle=(value)
@values[ANGLE]=value
@metafile.push([ANGLE,value])
end
def mirror
return @values[MIRROR]
end
def mirror=(value)
@values[MIRROR]=value
@metafile.push([MIRROR,value])
end
def bush_depth
return @values[BUSH_DEPTH]
end
def bush_depth=(value)
@values[BUSH_DEPTH]=value
@metafile.push([BUSH_DEPTH,value])
end
def opacity
return @values[OPACITY]
end
def opacity=(value)
@values[OPACITY]=value
@metafile.push([OPACITY,value])
end
def blend_type
return @values[BLEND_TYPE]
end
def blend_type=(value)
@values[BLEND_TYPE]=value
@metafile.push([BLEND_TYPE,value])
end
def color
return @values[COLOR]
end
def color=(value)
@values[COLOR]=value.clone
@metafile.push([COLOR,@values[COLOR]])
end
def tone
return @values[TONE]
end
def tone=(value)
@values[TONE]=value.clone
@metafile.push([TONE,@values[TONE]])
end
def update
@metafile.push([-1,nil])
end
end
class SpriteMetafilePlayer
def initialize(metafile,sprite=nil)
@metafile=metafile
@sprites=[]
@playing=false
@index=0
@sprites.push(sprite) if sprite
end
def add(sprite)
@sprites.push(sprite)
end
def playing?
return @playing
end
def play
@playing=true
@index=0
end
def update
if @playing
for j in @index...@metafile.length
@index=j+1
break if @metafile[j][0]<0
code=@metafile[j][0]
value=@metafile[j][1]
for sprite in @sprites
case code
when SpriteMetafile::X; sprite.x=value
when SpriteMetafile::Y; sprite.y=value
when SpriteMetafile::OX; sprite.ox=value
when SpriteMetafile::OY; sprite.oy=value
when SpriteMetafile::ZOOM_X; sprite.zoom_x=value
when SpriteMetafile::ZOOM_Y; sprite.zoom_y=value
when SpriteMetafile::SRC_RECT; sprite.src_rect=value
when SpriteMetafile::VISIBLE; sprite.visible=value
when SpriteMetafile::Z; sprite.z=value # prevent crashes
when SpriteMetafile::ANGLE; sprite.angle=(value==180) ? 179.9 : value
when SpriteMetafile::MIRROR; sprite.mirror=value
when SpriteMetafile::BUSH_DEPTH; sprite.bush_depth=value
when SpriteMetafile::OPACITY; sprite.opacity=value
when SpriteMetafile::BLEND_TYPE; sprite.blend_type=value
when SpriteMetafile::COLOR; sprite.color=value
when SpriteMetafile::TONE; sprite.tone=value
end
end
end
@playing=false if @index==@metafile.length
end
end
end
def pbSaveSpriteState(sprite)
state=[]
return state if !sprite || sprite.disposed?
state[SpriteMetafile::BITMAP] = sprite.x
state[SpriteMetafile::X] = sprite.x
state[SpriteMetafile::Y] = sprite.y
state[SpriteMetafile::SRC_RECT] = sprite.src_rect.clone
state[SpriteMetafile::VISIBLE] = sprite.visible
state[SpriteMetafile::Z] = sprite.z
state[SpriteMetafile::OX] = sprite.ox
state[SpriteMetafile::OY] = sprite.oy
state[SpriteMetafile::ZOOM_X] = sprite.zoom_x
state[SpriteMetafile::ZOOM_Y] = sprite.zoom_y
state[SpriteMetafile::ANGLE] = sprite.angle
state[SpriteMetafile::MIRROR] = sprite.mirror
state[SpriteMetafile::BUSH_DEPTH] = sprite.bush_depth
state[SpriteMetafile::OPACITY] = sprite.opacity
state[SpriteMetafile::BLEND_TYPE] = sprite.blend_type
state[SpriteMetafile::COLOR] = sprite.color.clone
state[SpriteMetafile::TONE] = sprite.tone.clone
return state
end
def pbRestoreSpriteState(sprite,state)
return if !state || !sprite || sprite.disposed?
sprite.x = state[SpriteMetafile::X]
sprite.y = state[SpriteMetafile::Y]
sprite.src_rect = state[SpriteMetafile::SRC_RECT]
sprite.visible = state[SpriteMetafile::VISIBLE]
sprite.z = state[SpriteMetafile::Z]
sprite.ox = state[SpriteMetafile::OX]
sprite.oy = state[SpriteMetafile::OY]
sprite.zoom_x = state[SpriteMetafile::ZOOM_X]
sprite.zoom_y = state[SpriteMetafile::ZOOM_Y]
sprite.angle = state[SpriteMetafile::ANGLE]
sprite.mirror = state[SpriteMetafile::MIRROR]
sprite.bush_depth = state[SpriteMetafile::BUSH_DEPTH]
sprite.opacity = state[SpriteMetafile::OPACITY]
sprite.blend_type = state[SpriteMetafile::BLEND_TYPE]
sprite.color = state[SpriteMetafile::COLOR]
sprite.tone = state[SpriteMetafile::TONE]
end
def pbSaveSpriteStateAndBitmap(sprite)
return [] if !sprite || sprite.disposed?
state=pbSaveSpriteState(sprite)
state[SpriteMetafile::BITMAP]=sprite.bitmap
return state
end
def pbRestoreSpriteStateAndBitmap(sprite,state)
return if !state || !sprite || sprite.disposed?
sprite.bitmap=state[SpriteMetafile::BITMAP]
pbRestoreSpriteState(sprite,state)
return state
end
#===============================================================================
# Evolution screen
#===============================================================================
class PokemonEvolutionScene
private
def pbGenerateMetafiles(s1x,s1y,s2x,s2y)
sprite = SpriteMetafile.new
sprite.ox = s1x
sprite.oy = s1y
sprite.opacity = 255
sprite2 = SpriteMetafile.new
sprite2.ox = s2x
sprite2.oy = s2y
sprite2.zoom = 0.0
sprite2.opacity = 255
alpha = 0
alphaDiff = 10*20/Graphics.frame_rate
loop do
sprite.color.red = 255
sprite.color.green = 255
sprite.color.blue = 255
sprite.color.alpha = alpha
sprite.color = sprite.color
sprite2.color = sprite.color
sprite2.color.alpha = 255
sprite.update
sprite2.update
break if alpha>=255
alpha += alphaDiff
end
totaltempo = 0
currenttempo = 25
maxtempo = 7*Graphics.frame_rate
while totaltempo<maxtempo
for j in 0...currenttempo
if alpha<255
sprite.color.red = 255
sprite.color.green = 255
sprite.color.blue = 255
sprite.color.alpha = alpha
sprite.color = sprite.color
alpha += 10
end
sprite.zoom = [1.1*(currenttempo-j-1)/currenttempo,1.0].min
sprite2.zoom = [1.1*(j+1)/currenttempo,1.0].min
sprite.update
sprite2.update
end
totaltempo += currenttempo
if totaltempo+currenttempo<maxtempo
for j in 0...currenttempo
sprite.zoom = [1.1*(j+1)/currenttempo,1.0].min
sprite2.zoom = [1.1*(currenttempo-j-1)/currenttempo,1.0].min
sprite.update
sprite2.update
end
end
totaltempo += currenttempo
currenttempo = [(currenttempo/1.5).floor,5].max
end
@metafile1 = sprite
@metafile2 = sprite2
end
public
def pbUpdate(animating=false)
if animating # Pokémon shouldn't animate during the evolution animation
@sprites["background"].update
else
pbUpdateSpriteHash(@sprites)
end
end
def pbUpdateNarrowScreen
halfResizeDiff = 8*20/Graphics.frame_rate
if @bgviewport.rect.y<80
@bgviewport.rect.height -= halfResizeDiff*2
if @bgviewport.rect.height<Graphics.height-64
@bgviewport.rect.y += halfResizeDiff
@sprites["background"].oy = @bgviewport.rect.y
end
end
end
def pbUpdateExpandScreen
halfResizeDiff = 8*20/Graphics.frame_rate
if @bgviewport.rect.y>0
@bgviewport.rect.y -= halfResizeDiff
@sprites["background"].oy = @bgviewport.rect.y
end
if @bgviewport.rect.height<Graphics.height
@bgviewport.rect.height += halfResizeDiff*2
end
end
def pbFlashInOut(canceled,oldstate,oldstate2)
tone = 0
toneDiff = 20*20/Graphics.frame_rate
loop do
Graphics.update
pbUpdate(true)
pbUpdateExpandScreen
tone += toneDiff
@viewport.tone.set(tone,tone,tone,0)
break if tone>=255
end
@bgviewport.rect.y = 0
@bgviewport.rect.height = Graphics.height
@sprites["background"].oy = 0
if canceled
pbRestoreSpriteState(@sprites["rsprite1"],oldstate)
pbRestoreSpriteState(@sprites["rsprite2"],oldstate2)
@sprites["rsprite1"].zoom_x = 1.0
@sprites["rsprite1"].zoom_y = 1.0
@sprites["rsprite1"].color.alpha = 0
@sprites["rsprite1"].visible = true
@sprites["rsprite2"].visible = false
else
@sprites["rsprite1"].visible = false
@sprites["rsprite2"].visible = true
@sprites["rsprite2"].zoom_x = 1.0
@sprites["rsprite2"].zoom_y = 1.0
@sprites["rsprite2"].color.alpha = 0
end
(Graphics.frame_rate/4).times do
Graphics.update
pbUpdate(true)
end
tone = 255
toneDiff = 40*20/Graphics.frame_rate
loop do
Graphics.update
pbUpdate
tone -= toneDiff
@viewport.tone.set(tone,tone,tone,0)
break if tone<=0
end
end
def pbStartScreen(pokemon,newspecies)
@pokemon = pokemon
@newspecies = newspecies
@sprites = {}
@bgviewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@bgviewport.z = 99999
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99999
@msgviewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@msgviewport.z = 99999
addBackgroundOrColoredPlane(@sprites,"background","evolutionbg",
Color.new(248,248,248),@bgviewport)
rsprite1 = PokemonSprite.new(@viewport)
rsprite1.setOffset(PictureOrigin::Center)
rsprite1.setPokemonBitmap(@pokemon,false)
rsprite1.x = Graphics.width/2
rsprite1.y = (Graphics.height-64)/2
rsprite2 = PokemonSprite.new(@viewport)
rsprite2.setOffset(PictureOrigin::Center)
rsprite2.setPokemonBitmapSpecies(@pokemon,@newspecies,false)
rsprite2.x = rsprite1.x
rsprite2.y = rsprite1.y
rsprite2.opacity = 0
@sprites["rsprite1"] = rsprite1
@sprites["rsprite2"] = rsprite2
pbGenerateMetafiles(rsprite1.ox,rsprite1.oy,rsprite2.ox,rsprite2.oy)
@sprites["msgwindow"] = pbCreateMessageWindow(@msgviewport)
pbFadeInAndShow(@sprites) { pbUpdate }
end
# Closes the evolution screen.
def pbEndScreen
pbDisposeMessageWindow(@sprites["msgwindow"])
pbFadeOutAndHide(@sprites) { pbUpdate }
pbDisposeSpriteHash(@sprites)
@viewport.dispose
@bgviewport.dispose
@msgviewport.dispose
end
# Opens the evolution screen
def pbEvolution(cancancel=true)
metaplayer1 = SpriteMetafilePlayer.new(@metafile1,@sprites["rsprite1"])
metaplayer2 = SpriteMetafilePlayer.new(@metafile2,@sprites["rsprite2"])
metaplayer1.play
metaplayer2.play
pbBGMStop
pbPlayCry(@pokemon)
pbMessageDisplay(@sprites["msgwindow"],
_INTL("\\se[]What? {1} is evolving!\\^",@pokemon.name)) { pbUpdate }
pbMessageWaitForInput(@sprites["msgwindow"],50,true) { pbUpdate }
pbPlayDecisionSE
oldstate = pbSaveSpriteState(@sprites["rsprite1"])
oldstate2 = pbSaveSpriteState(@sprites["rsprite2"])
pbMEPlay("Evolution start")
pbBGMPlay("Evolution")
canceled = false
begin
pbUpdateNarrowScreen
metaplayer1.update
metaplayer2.update
Graphics.update
Input.update
pbUpdate(true)
if Input.trigger?(Input::B) && cancancel
pbBGMStop
pbPlayCancelSE
canceled = true
break
end
end while metaplayer1.playing? && metaplayer2.playing?
pbFlashInOut(canceled,oldstate,oldstate2)
if canceled
pbMessageDisplay(@sprites["msgwindow"],
_INTL("Huh? {1} stopped evolving!",@pokemon.name)) { pbUpdate }
else
pbEvolutionSuccess
end
end
def pbEvolutionSuccess
# Play cry of evolved species
frames = pbCryFrameLength(@newspecies,@pokemon.form)
pbBGMStop
pbPlayCrySpecies(@newspecies,@pokemon.form)
frames.times do
Graphics.update
pbUpdate
end
# Success jingle/message
pbMEPlay("Evolution success")
newspeciesname = PBSpecies.getName(@newspecies)
oldspeciesname = PBSpecies.getName(@pokemon.species)
pbMessageDisplay(@sprites["msgwindow"],
_INTL("\\se[]Congratulations! Your {1} evolved into {2}!\\wt[80]",
@pokemon.name,newspeciesname)) { pbUpdate }
@sprites["msgwindow"].text = ""
# Check for consumed item and check if Pokémon should be duplicated
createSpecies = pbRemoveItemAfterEvolution
# Modify Pokémon to make it evolved
@pokemon.species = @newspecies
@pokemon.name = newspeciesname if @pokemon.name==oldspeciesname
@pokemon.form = 0 if isConst?(@pokemon.species,PBSpecies,:MOTHIM)
@pokemon.calcStats
# See and own evolved species
$Trainer.seen[@newspecies] = true
$Trainer.owned[@newspecies] = true
pbSeenForm(@pokemon)
# Learn moves upon evolution for evolved species
movelist = @pokemon.getMoveList
for i in movelist
next if i[0]!=0 && i[0]!=@pokemon.level # 0 is "learn upon evolution"
pbLearnMove(@pokemon,i[1],true) { pbUpdate }
end
# Duplicate Pokémon (i.e. Shedinja)
if createSpecies>0 && $Trainer.party.length<6
pbDuplicatePokemon(createSpecies)
# Consume Poké Ball
$PokemonBag.pbDeleteItem(getConst(PBItems,:POKEBALL))
end
end
def pbRemoveItemAfterEvolution
removeItem = false
createSpecies = pbCheckEvolutionEx(@pokemon) { |pokemon,evonib,level,pkmn|
case evonib
when PBEvolution::Shedinja
next pkmn if $PokemonBag.pbHasItem?(getConst(PBItems,:POKEBALL))
when PBEvolution::TradeItem,PBEvolution::DayHoldItem,PBEvolution::NightHoldItem
removeItem = true if pkmn==@newspecies # Item is now consumed
end
next -1
}
@pokemon.setItem(0) if removeItem
return createSpecies
end
def pbDuplicatePokemon(createSpecies)
newpokemon = @pokemon.clone
newpokemon.species = createSpecies
newpokemon.name = PBSpecies.getName(createSpecies)
newpokemon.iv = @pokemon.iv.clone
newpokemon.ev = @pokemon.ev.clone
newpokemon.markings = 0
newpokemon.ballused = 0
newpokemon.setItem(0)
newpokemon.clearAllRibbons
newpokemon.calcStats
newpokemon.heal
# Add duplicate Pokémon to party
$Trainer.party.push(newpokemon)
# See and own duplicate Pokémon
$Trainer.seen[createSpecies] = true
$Trainer.owned[createSpecies] = true
pbSeenForm(newpokemon)
end
end

View File

@@ -0,0 +1,248 @@
class PokemonTrade_Scene
def pbUpdate
pbUpdateSpriteHash(@sprites)
end
def pbRunPictures(pictures,sprites)
loop do
for i in 0...pictures.length
pictures[i].update
end
for i in 0...sprites.length
if sprites[i].is_a?(IconSprite)
setPictureIconSprite(sprites[i],pictures[i])
else
setPictureSprite(sprites[i],pictures[i])
end
end
Graphics.update
Input.update
running = false
for i in 0...pictures.length
running = true if pictures[i].running?
end
break if !running
end
end
def pbStartScreen(pokemon,pokemon2,trader1,trader2)
@sprites = {}
@viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z = 99999
@pokemon = pokemon
@pokemon2 = pokemon2
@trader1 = trader1
@trader2 = trader2
addBackgroundOrColoredPlane(@sprites,"background","tradebg",
Color.new(248,248,248),@viewport)
@sprites["rsprite1"] = PokemonSprite.new(@viewport)
@sprites["rsprite1"].setPokemonBitmap(@pokemon,false)
@sprites["rsprite1"].setOffset(PictureOrigin::Bottom)
@sprites["rsprite1"].x = Graphics.width/2
@sprites["rsprite1"].y = 264
@sprites["rsprite1"].z = 10
pbApplyBattlerMetricsToSprite(@sprites["rsprite1"],1,@pokemon.fSpecies)
@sprites["rsprite2"] = PokemonSprite.new(@viewport)
@sprites["rsprite2"].setPokemonBitmap(@pokemon2,false)
@sprites["rsprite2"].setOffset(PictureOrigin::Bottom)
@sprites["rsprite2"].x = Graphics.width/2
@sprites["rsprite2"].y = 264
@sprites["rsprite2"].z = 10
pbApplyBattlerMetricsToSprite(@sprites["rsprite2"],1,@pokemon2.fSpecies)
@sprites["rsprite2"].visible = false
@sprites["msgwindow"] = pbCreateMessageWindow(@viewport)
pbFadeInAndShow(@sprites)
end
def pbScene1
spriteBall = IconSprite.new(0,0,@viewport)
pictureBall = PictureEx.new(0)
picturePoke = PictureEx.new(0)
# Starting position of ball
pictureBall.setXY(0,Graphics.width/2,48)
pictureBall.setName(0,sprintf("Graphics/Battle animations/ball_%02d",@pokemon.ballused))
pictureBall.setSrcSize(0,32,64)
pictureBall.setOrigin(0,PictureOrigin::Center)
pictureBall.setVisible(0,true)
# Starting position of sprite
picturePoke.setXY(0,@sprites["rsprite1"].x,@sprites["rsprite1"].y)
picturePoke.setOrigin(0,PictureOrigin::Bottom)
picturePoke.setVisible(0,true)
# Change Pokémon color
picturePoke.moveColor(2,5,Color.new(31*8,22*8,30*8,255))
# Recall
delay = picturePoke.totalDuration
picturePoke.setSE(delay,"Battle recall")
pictureBall.setName(delay,sprintf("Graphics/Battle animations/ball_%02d_open",@pokemon.ballused))
pictureBall.setSrcSize(delay,32,64)
# Move sprite to ball
picturePoke.moveZoom(delay,8,0)
picturePoke.moveXY(delay,8,Graphics.width/2,48)
picturePoke.setSE(delay+5,"Battle jump to ball")
picturePoke.setVisible(delay+8,false)
delay = picturePoke.totalDuration+1
pictureBall.setName(delay,sprintf("Graphics/Battle animations/ball_%02d",@pokemon.ballused))
pictureBall.setSrcSize(delay,32,64)
# Make Poké Ball go off the top of the screen
delay = picturePoke.totalDuration+10
pictureBall.moveXY(delay,6,Graphics.width/2,-32)
# Play animation
pbRunPictures(
[picturePoke,pictureBall],
[@sprites["rsprite1"],spriteBall]
)
spriteBall.dispose
end
def pbScene2
spriteBall = IconSprite.new(0,0,@viewport)
pictureBall = PictureEx.new(0)
picturePoke = PictureEx.new(0)
# Starting position of ball
pictureBall.setXY(0,Graphics.width/2,-32)
pictureBall.setName(0,sprintf("Graphics/Battle animations/ball_%02d",@pokemon2.ballused))
pictureBall.setSrcSize(0,32,64)
pictureBall.setOrigin(0,PictureOrigin::Center)
pictureBall.setVisible(0,true)
# Starting position of sprite
picturePoke.setOrigin(0,PictureOrigin::Bottom)
picturePoke.setZoom(0,0)
picturePoke.setColor(0,Color.new(31*8,22*8,30*8,255))
picturePoke.setVisible(0,false)
# Dropping ball
y = Graphics.height-96-16-16 # end point of Poké Ball
delay = picturePoke.totalDuration+2
for i in 0...4
t = [4,4,3,2][i] # Time taken to rise or fall for each bounce
d = [1,2,4,8][i] # Fraction of the starting height each bounce rises to
delay -= t if i==0
if i>0
pictureBall.setZoomXY(delay,100+5*(5-i),100-5*(5-i)) # Squish
pictureBall.moveZoom(delay,2,100) # Unsquish
pictureBall.moveXY(delay,t,Graphics.width/2,y-100/d)
end
pictureBall.moveXY(delay+t,t,Graphics.width/2,y)
pictureBall.setSE(delay+2*t,"Battle ball drop")
delay = pictureBall.totalDuration
end
picturePoke.setXY(delay,Graphics.width/2,y)
# Open Poké Ball
delay = pictureBall.totalDuration+15
pictureBall.setSE(delay,"Battle recall")
pictureBall.setName(delay,sprintf("Graphics/Battle animations/ball_%02d_open",@pokemon2.ballused))
pictureBall.setSrcSize(delay,32,64)
pictureBall.setVisible(delay+5,false)
# Pokémon appears and enlarges
picturePoke.setVisible(delay,true)
picturePoke.moveZoom(delay,8,100)
picturePoke.moveXY(delay,8,Graphics.width/2,@sprites["rsprite2"].y)
# Return Pokémon's color to normal and play cry
delay = picturePoke.totalDuration
picturePoke.moveColor(delay,5,Color.new(31*8,22*8,30*8,0))
cry = pbCryFile(@pokemon2)
picturePoke.setSE(delay,cry) if pbResolveAudioSE(cry)
# Play animation
pbRunPictures(
[picturePoke,pictureBall],
[@sprites["rsprite2"],spriteBall]
)
spriteBall.dispose
end
def pbEndScreen
pbDisposeMessageWindow(@sprites["msgwindow"])
pbFadeOutAndHide(@sprites)
pbDisposeSpriteHash(@sprites)
@viewport.dispose
newspecies = pbTradeCheckEvolution(@pokemon2,@pokemon)
if newspecies>0
evo = PokemonEvolutionScene.new
evo.pbStartScreen(@pokemon2,newspecies)
evo.pbEvolution(false)
evo.pbEndScreen
end
end
def pbTrade
pbBGMStop
pbPlayCry(@pokemon)
speciesname1=PBSpecies.getName(@pokemon.species)
speciesname2=PBSpecies.getName(@pokemon2.species)
pbMessageDisplay(@sprites["msgwindow"],
_ISPRINTF("{1:s}\r\nID: {2:05d} OT: {3:s}\\wtnp[0]",
@pokemon.name,@pokemon.publicID,@pokemon.ot)) { pbUpdate }
pbMessageWaitForInput(@sprites["msgwindow"],50,true) { pbUpdate }
pbPlayDecisionSE
pbScene1
pbMessageDisplay(@sprites["msgwindow"],
_INTL("For {1}'s {2},\r\n{3} sends {4}.\1",@trader1,speciesname1,@trader2,speciesname2)) { pbUpdate }
pbMessageDisplay(@sprites["msgwindow"],
_INTL("{1} bids farewell to {2}.",@trader2,speciesname2)) { pbUpdate }
pbScene2
pbMessageDisplay(@sprites["msgwindow"],
_ISPRINTF("{1:s}\r\nID: {2:05d} OT: {3:s}\1",
@pokemon2.name,@pokemon2.publicID,@pokemon2.ot)) { pbUpdate }
pbMessageDisplay(@sprites["msgwindow"],
_INTL("Take good care of {1}.",speciesname2)) { pbUpdate }
end
end
def pbStartTrade(pokemonIndex,newpoke,nickname,trainerName,trainerGender=0)
myPokemon = $Trainer.party[pokemonIndex]
opponent = PokeBattle_Trainer.new(trainerName,trainerGender)
opponent.setForeignID($Trainer)
yourPokemon = nil; resetmoves = true
if newpoke.is_a?(PokeBattle_Pokemon)
newpoke.trainerID = opponent.id
newpoke.ot = opponent.name
newpoke.otgender = opponent.gender
newpoke.language = opponent.language
yourPokemon = newpoke
resetmoves = false
else
if newpoke.is_a?(String) || newpoke.is_a?(Symbol)
raise _INTL("Species does not exist ({1}).",newpoke) if !hasConst?(PBSpecies,newpoke)
newpoke = getID(PBSpecies,newpoke)
end
yourPokemon = pbNewPkmn(newpoke,myPokemon.level,opponent)
end
yourPokemon.name = nickname
yourPokemon.obtainMode = 2 # traded
yourPokemon.resetMoves if resetmoves
yourPokemon.pbRecordFirstMoves
$Trainer.seen[yourPokemon.species] = true
$Trainer.owned[yourPokemon.species] = true
pbSeenForm(yourPokemon)
pbFadeOutInWithMusic {
evo = PokemonTrade_Scene.new
evo.pbStartScreen(myPokemon,yourPokemon,$Trainer.name,opponent.name)
evo.pbTrade
evo.pbEndScreen
}
$Trainer.party[pokemonIndex] = yourPokemon
end
#===============================================================================
# Evolution methods
#===============================================================================
def pbTradeCheckEvolution(pokemon,pokemon2)
ret = pbCheckEvolutionEx(pokemon) { |pokemon,evonib,level,poke|
case evonib
when PBEvolution::Trade
next poke
when PBEvolution::TradeItem
if pokemon.item==level
pokemon.setItem(0)
next poke
end
when PBEvolution::TradeSpecies
if !isConst?(pokemon2.item,PBItems,:EVERSTONE)
next poke if pokemon2.species==level
end
end
next -1
}
return ret
end

View File

@@ -0,0 +1,225 @@
def pbEachNaturalMove(pokemon)
movelist=pokemon.getMoveList
for i in movelist
yield i[1],i[0]
end
end
def pbHasRelearnableMove?(pokemon)
return pbGetRelearnableMoves(pokemon).length>0
end
def pbGetRelearnableMoves(pokemon)
return [] if !pokemon || pokemon.egg? || pokemon.shadowPokemon?
moves=[]
pbEachNaturalMove(pokemon) { |move,level|
if level<=pokemon.level && !pokemon.hasMove?(move)
moves.push(move) if !moves.include?(move)
end
}
tmoves=[]
if pokemon.firstmoves
for i in pokemon.firstmoves
tmoves.push(i) if !pokemon.hasMove?(i) && !moves.include?(i)
end
end
moves=tmoves+moves
return moves|[] # remove duplicates
end
################################################################################
# Scene class for handling appearance of the screen
################################################################################
class MoveRelearner_Scene
VISIBLEMOVES = 4
def pbDisplay(msg,brief=false)
UIHelper.pbDisplay(@sprites["msgwindow"],msg,brief) { pbUpdate }
end
def pbConfirm(msg)
UIHelper.pbConfirm(@sprites["msgwindow"],msg) { pbUpdate }
end
def pbUpdate
pbUpdateSpriteHash(@sprites)
end
def pbStartScene(pokemon,moves)
@pokemon=pokemon
@moves=moves
moveCommands=[]
moves.each { |m| moveCommands.push(PBMoves.getName(m)) }
# Create sprite hash
@viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z=99999
@sprites={}
addBackgroundPlane(@sprites,"bg","reminderbg",@viewport)
@sprites["pokeicon"]=PokemonIconSprite.new(@pokemon,@viewport)
@sprites["pokeicon"].setOffset(PictureOrigin::Center)
@sprites["pokeicon"].x=320
@sprites["pokeicon"].y=84
@sprites["background"]=IconSprite.new(0,0,@viewport)
@sprites["background"].setBitmap("Graphics/Pictures/reminderSel")
@sprites["background"].y=78
@sprites["background"].src_rect=Rect.new(0,72,258,72)
@sprites["overlay"]=BitmapSprite.new(Graphics.width,Graphics.height,@viewport)
pbSetSystemFont(@sprites["overlay"].bitmap)
@sprites["commands"]=Window_CommandPokemon.new(moveCommands,32)
@sprites["commands"].height=32*(VISIBLEMOVES+1)
@sprites["commands"].visible=false
@sprites["msgwindow"]=Window_AdvancedTextPokemon.new("")
@sprites["msgwindow"].visible=false
@sprites["msgwindow"].viewport=@viewport
@typebitmap=AnimatedBitmap.new(_INTL("Graphics/Pictures/types"))
pbDrawMoveList
pbDeactivateWindows(@sprites)
# Fade in all sprites
pbFadeInAndShow(@sprites) { pbUpdate }
end
def pbDrawMoveList
movesData = pbLoadMovesData
overlay=@sprites["overlay"].bitmap
overlay.clear
textpos=[]
imagepos=[]
type1rect=Rect.new(0,@pokemon.type1*28,64,28)
type2rect=Rect.new(0,@pokemon.type2*28,64,28)
if @pokemon.type1==@pokemon.type2
overlay.blt(400,70,@typebitmap.bitmap,type1rect)
else
overlay.blt(366,70,@typebitmap.bitmap,type1rect)
overlay.blt(436,70,@typebitmap.bitmap,type2rect)
end
textpos=[
[_INTL("Teach which move?"),16,8,0,Color.new(88,88,80),Color.new(168,184,184)]
]
yPos=82
for i in 0...VISIBLEMOVES
moveobject=@moves[@sprites["commands"].top_item+i]
if moveobject
moveData=movesData[moveobject]
if moveData
imagepos.push(["Graphics/Pictures/types",12,yPos+2,0,
moveData[MOVE_TYPE]*28,64,28])
textpos.push([PBMoves.getName(moveobject),80,yPos,0,
Color.new(248,248,248),Color.new(0,0,0)])
if moveData[MOVE_TOTAL_PP]>0
textpos.push([_INTL("PP"),112,yPos+32,0,
Color.new(64,64,64),Color.new(176,176,176)])
textpos.push([_INTL("{1}/{2}",
moveData[MOVE_TOTAL_PP],moveData[MOVE_TOTAL_PP]),230,yPos+32,1,
Color.new(64,64,64),Color.new(176,176,176)])
end
else
textpos.push(["-",80,yPos,0,Color.new(64,64,64),Color.new(176,176,176)])
textpos.push(["--",228,yPos+32,1,Color.new(64,64,64),Color.new(176,176,176)])
end
end
yPos+=64
end
imagepos.push(["Graphics/Pictures/reminderSel",
0,78+(@sprites["commands"].index-@sprites["commands"].top_item)*64,
0,0,258,72])
selMoveData=movesData[@moves[@sprites["commands"].index]]
basedamage=selMoveData[MOVE_BASE_DAMAGE]
category=selMoveData[MOVE_CATEGORY]
accuracy=selMoveData[MOVE_ACCURACY]
textpos.push([_INTL("CATEGORY"),272,114,0,Color.new(248,248,248),Color.new(0,0,0)])
textpos.push([_INTL("POWER"),272,146,0,Color.new(248,248,248),Color.new(0,0,0)])
textpos.push([basedamage<=1 ? basedamage==1 ? "???" : "---" : sprintf("%d",basedamage),
468,146,2,Color.new(64,64,64),Color.new(176,176,176)])
textpos.push([_INTL("ACCURACY"),272,178,0,Color.new(248,248,248),Color.new(0,0,0)])
textpos.push([accuracy==0 ? "---" : sprintf("%d%",accuracy),
468,178,2,Color.new(64,64,64),Color.new(176,176,176)])
pbDrawTextPositions(overlay,textpos)
imagepos.push(["Graphics/Pictures/category",436,116,0,category*28,64,28])
if @sprites["commands"].index<@moves.length-1
imagepos.push(["Graphics/Pictures/reminderButtons",48,350,0,0,76,32])
end
if @sprites["commands"].index>0
imagepos.push(["Graphics/Pictures/reminderButtons",134,350,76,0,76,32])
end
pbDrawImagePositions(overlay,imagepos)
drawTextEx(overlay,272,210,230,5,
pbGetMessage(MessageTypes::MoveDescriptions,@moves[@sprites["commands"].index]),
Color.new(64,64,64),Color.new(176,176,176))
end
# Processes the scene
def pbChooseMove
oldcmd=-1
pbActivateWindow(@sprites,"commands") {
loop do
oldcmd=@sprites["commands"].index
Graphics.update
Input.update
pbUpdate
if @sprites["commands"].index!=oldcmd
@sprites["background"].x=0
@sprites["background"].y=78+(@sprites["commands"].index-@sprites["commands"].top_item)*64
pbDrawMoveList
end
if Input.trigger?(Input::B)
return 0
elsif Input.trigger?(Input::C)
return @moves[@sprites["commands"].index]
end
end
}
end
# End the scene here
def pbEndScene
pbFadeOutAndHide(@sprites) { pbUpdate }
pbDisposeSpriteHash(@sprites)
@typebitmap.dispose
@viewport.dispose
end
end
# Screen class for handling game logic
class MoveRelearnerScreen
def initialize(scene)
@scene = scene
end
def pbStartScreen(pokemon)
moves=pbGetRelearnableMoves(pokemon)
@scene.pbStartScene(pokemon,moves)
loop do
move=@scene.pbChooseMove
if move<=0
if @scene.pbConfirm(
_INTL("Give up trying to teach a new move to {1}?",pokemon.name))
@scene.pbEndScene
return false
end
else
if @scene.pbConfirm(_INTL("Teach {1}?",PBMoves.getName(move)))
if pbLearnMove(pokemon,move)
@scene.pbEndScene
return true
end
end
end
end
end
end
def pbRelearnMoveScreen(pokemon)
retval = true
pbFadeOutIn {
scene = MoveRelearner_Scene.new
screen = MoveRelearnerScreen.new(scene)
retval = screen.pbStartScreen(pokemon)
}
return retval
end

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,932 @@
#===============================================================================
# Abstraction layer for Pokemon Essentials
#===============================================================================
class PokemonMartAdapter
def getMoney
return $Trainer.money
end
def getMoneyString
return pbGetGoldString
end
def setMoney(value)
$Trainer.money=value
end
def getInventory
return $PokemonBag
end
def getDisplayName(item)
itemname = PBItems.getName(item)
if pbIsMachine?(item)
machine = pbGetMachine(item)
itemname = _INTL("{1} {2}",itemname,PBMoves.getName(machine))
end
return itemname
end
def getName(item)
return PBItems.getName(item)
end
def getDescription(item)
return pbGetMessage(MessageTypes::ItemDescriptions,item)
end
def getItemIcon(item)
return nil if !item
return pbItemIconFile(item)
end
def getItemIconRect(item)
return Rect.new(0,0,48,48)
end
def getQuantity(item)
return $PokemonBag.pbQuantity(item)
end
def showQuantity?(item)
return !pbIsImportantItem?(item)
end
def getPrice(item,selling=false)
if $game_temp.mart_prices && $game_temp.mart_prices[item]
if selling
return $game_temp.mart_prices[item][1] if $game_temp.mart_prices[item][1]>=0
else
return $game_temp.mart_prices[item][0] if $game_temp.mart_prices[item][0]>0
end
end
return pbGetPrice(item)
end
def getDisplayPrice(item,selling=false)
price = getPrice(item,selling).to_s_formatted
return _INTL("$ {1}",price)
end
def canSell?(item)
return (getPrice(item,true)>0 && !pbIsImportantItem?(item))
end
def addItem(item)
return $PokemonBag.pbStoreItem(item)
end
def removeItem(item)
return $PokemonBag.pbDeleteItem(item)
end
end
#===============================================================================
# Abstraction layer for RPG Maker XP/VX
# Won't be used if $PokemonBag exists
#===============================================================================
class RpgxpMartAdapter
def getMoney
return $game_party.gold
end
def getMoneyString
return pbGetGoldString
end
def setMoney(value)
$game_party.gain_gold(-$game_party.gold)
$game_party.gain_gold(value)
end
def getPrice(item,selling=false)
return item.price
end
def getItemIcon(item)
return nil if !item
if item==0
return sprintf("Graphics/Icons/itemBack")
elsif item.respond_to?("icon_index")
return "Graphics/System/IconSet"
else
return sprintf("Graphics/Icons/%s",item.icon_name)
end
end
def getItemIconRect(item)
if item && item.respond_to?("icon_index")
ix=item.icon_index % 16 * 24
iy=item.icon_index / 16 * 24
return Rect.new(ix,iy,24,24)
else
return Rect.new(0,0,32,32)
end
end
def getInventory()
data = []
for i in 1...$data_items.size
if getQuantity($data_items[i]) > 0
data.push($data_items[i])
end
end
for i in 1...$data_weapons.size
if getQuantity($data_weapons[i]) > 0
data.push($data_weapons[i])
end
end
for i in 1...$data_armors.size
if getQuantity($data_armors[i]) > 0
data.push($data_armors[i])
end
end
return data
end
def canSell?(item)
return item ? item.price>0 : false
end
def getName(item)
return item ? item.name : ""
end
def getDisplayName(item)
return item ? item.name : ""
end
def getDisplayPrice(item,selling=false)
price=item.price
return price.to_s
end
def getDescription(item)
return item ? item.description : ""
end
def addItem(item)
ret=(getQuantity(item)<99)
if $game_party.respond_to?("gain_weapon")
case item
when RPG::Item
$game_party.gain_item(item.id, 1) if ret
when RPG::Weapon
$game_party.gain_weapon(item.id, 1) if ret
when RPG::Armor
$game_party.gain_armor(item.id, 1) if ret
end
else
$game_party.gain_item(item,1) if ret
end
return ret
end
def getQuantity(item)
ret=0
if $game_party.respond_to?("weapon_number")
case item
when RPG::Item
ret=$game_party.item_number(item.id)
when RPG::Weapon
ret=($game_party.weapon_number(item.id))
when RPG::Armor
ret=($game_party.armor_number(item.id))
end
else
return $game_party.item_number(item)
end
return ret
end
def showQuantity?(item)
return true
end
def removeItem(item)
ret=(getQuantity(item)>0)
if $game_party.respond_to?("lose_weapon")
case item
when RPG::Item
$game_party.lose_item(item.id, 1) if ret
when RPG::Weapon
$game_party.lose_weapon(item.id, 1) if ret
when RPG::Armor
$game_party.lose_armor(item.id, 1) if ret
end
else
$game_party.lose_item(item,1) if ret
end
return ret
end
end
#===============================================================================
# Buy and Sell adapters
#===============================================================================
class BuyAdapter
def initialize(adapter)
@adapter=adapter
end
def getDisplayName(item)
@adapter.getDisplayName(item)
end
def getDisplayPrice(item)
@adapter.getDisplayPrice(item,false)
end
def isSelling?
return false
end
end
class SellAdapter
def initialize(adapter)
@adapter=adapter
end
def getDisplayName(item)
@adapter.getDisplayName(item)
end
def getDisplayPrice(item)
if @adapter.showQuantity?(item)
return sprintf("x%d",@adapter.getQuantity(item))
else
return ""
end
end
def isSelling?
return true
end
end
#===============================================================================
# Pokémon Mart
#===============================================================================
class Window_PokemonMart < Window_DrawableCommand
def initialize(stock,adapter,x,y,width,height,viewport=nil)
@stock=stock
@adapter=adapter
super(x,y,width,height,viewport)
@selarrow=AnimatedBitmap.new("Graphics/Pictures/martSel")
@baseColor=Color.new(88,88,80)
@shadowColor=Color.new(168,184,184)
self.windowskin=nil
end
def itemCount
return @stock.length+1
end
def item
return self.index>=@stock.length ? 0 : @stock[self.index]
end
def drawItem(index,count,rect)
textpos=[]
rect=drawCursor(index,rect)
ypos=rect.y
if index==count-1
textpos.push([_INTL("CANCEL"),rect.x,ypos+2,false,
self.baseColor,self.shadowColor])
else
item=@stock[index]
itemname=@adapter.getDisplayName(item)
qty=@adapter.getDisplayPrice(item)
sizeQty=self.contents.text_size(qty).width
xQty=rect.x+rect.width-sizeQty-2-16
textpos.push([itemname,rect.x,ypos+2,false,self.baseColor,self.shadowColor])
textpos.push([qty,xQty,ypos+2,false,self.baseColor,self.shadowColor])
end
pbDrawTextPositions(self.contents,textpos)
end
end
class PokemonMart_Scene
def update
pbUpdateSpriteHash(@sprites)
@subscene.pbUpdate if @subscene
end
def pbRefresh
if @subscene
@subscene.pbRefresh
else
itemwindow=@sprites["itemwindow"]
@sprites["icon"].item=itemwindow.item
@sprites["itemtextwindow"].text=(itemwindow.item==0) ? _INTL("Quit shopping.") :
@adapter.getDescription(itemwindow.item)
itemwindow.refresh
end
@sprites["moneywindow"].text=_INTL("Money:\r\n<r>{1}",@adapter.getMoneyString)
end
def pbStartBuyOrSellScene(buying,stock,adapter)
# Scroll right before showing screen
pbScrollMap(6,5,5)
@viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z=99999
@stock=stock
@adapter=adapter
@sprites={}
@sprites["background"]=IconSprite.new(0,0,@viewport)
@sprites["background"].setBitmap("Graphics/Pictures/martScreen")
@sprites["icon"]=ItemIconSprite.new(36,Graphics.height-50,-1,@viewport)
winAdapter=buying ? BuyAdapter.new(adapter) : SellAdapter.new(adapter)
@sprites["itemwindow"]=Window_PokemonMart.new(stock,winAdapter,
Graphics.width-316-16,12,330+16,Graphics.height-126)
@sprites["itemwindow"].viewport=@viewport
@sprites["itemwindow"].index=0
@sprites["itemwindow"].refresh
@sprites["itemtextwindow"]=Window_UnformattedTextPokemon.new("")
pbPrepareWindow(@sprites["itemtextwindow"])
@sprites["itemtextwindow"].x=64
@sprites["itemtextwindow"].y=Graphics.height-96-16
@sprites["itemtextwindow"].width=Graphics.width-64
@sprites["itemtextwindow"].height=128
@sprites["itemtextwindow"].baseColor=Color.new(248,248,248)
@sprites["itemtextwindow"].shadowColor=Color.new(0,0,0)
@sprites["itemtextwindow"].visible=true
@sprites["itemtextwindow"].viewport=@viewport
@sprites["itemtextwindow"].windowskin=nil
@sprites["helpwindow"]=Window_AdvancedTextPokemon.new("")
pbPrepareWindow(@sprites["helpwindow"])
@sprites["helpwindow"].visible=false
@sprites["helpwindow"].viewport=@viewport
pbBottomLeftLines(@sprites["helpwindow"],1)
@sprites["moneywindow"]=Window_AdvancedTextPokemon.new("")
pbPrepareWindow(@sprites["moneywindow"])
@sprites["moneywindow"].setSkin("Graphics/Windowskins/goldskin")
@sprites["moneywindow"].visible=true
@sprites["moneywindow"].viewport=@viewport
@sprites["moneywindow"].x=0
@sprites["moneywindow"].y=0
@sprites["moneywindow"].width=190
@sprites["moneywindow"].height=96
@sprites["moneywindow"].baseColor=Color.new(88,88,80)
@sprites["moneywindow"].shadowColor=Color.new(168,184,184)
pbDeactivateWindows(@sprites)
@buying=buying
pbRefresh
Graphics.frame_reset
end
def pbStartBuyScene(stock,adapter)
pbStartBuyOrSellScene(true,stock,adapter)
end
def pbStartSellScene(bag,adapter)
if $PokemonBag
pbStartSellScene2(bag,adapter)
else
pbStartBuyOrSellScene(false,bag,adapter)
end
end
def pbStartSellScene2(bag,adapter)
@subscene=PokemonBag_Scene.new
@adapter=adapter
@viewport2=Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport2.z=99999
numFrames = Graphics.frame_rate*4/10
alphaDiff = (255.0/numFrames).ceil
for j in 0..numFrames
col=Color.new(0,0,0,j*alphaDiff)
@viewport2.color=col
Graphics.update
Input.update
end
@subscene.pbStartScene(bag)
@viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
@viewport.z=99999
@sprites={}
@sprites["helpwindow"]=Window_AdvancedTextPokemon.new("")
pbPrepareWindow(@sprites["helpwindow"])
@sprites["helpwindow"].visible=false
@sprites["helpwindow"].viewport=@viewport
pbBottomLeftLines(@sprites["helpwindow"],1)
@sprites["moneywindow"]=Window_AdvancedTextPokemon.new("")
pbPrepareWindow(@sprites["moneywindow"])
@sprites["moneywindow"].setSkin("Graphics/Windowskins/goldskin")
@sprites["moneywindow"].visible=false
@sprites["moneywindow"].viewport=@viewport
@sprites["moneywindow"].x=0
@sprites["moneywindow"].y=0
@sprites["moneywindow"].width=186
@sprites["moneywindow"].height=96
@sprites["moneywindow"].baseColor=Color.new(88,88,80)
@sprites["moneywindow"].shadowColor=Color.new(168,184,184)
pbDeactivateWindows(@sprites)
@buying=false
pbRefresh
end
def pbEndBuyScene
pbDisposeSpriteHash(@sprites)
@viewport.dispose
# Scroll left after showing screen
pbScrollMap(4,5,5)
end
def pbEndSellScene
if @subscene
@subscene.pbEndScene
end
pbDisposeSpriteHash(@sprites)
if @viewport2
numFrames = Graphics.frame_rate*4/10
alphaDiff = (255.0/numFrames).ceil
for j in 0..numFrames
col=Color.new(0,0,0,(numFrames-j)*alphaDiff)
@viewport2.color=col
Graphics.update
Input.update
end
@viewport2.dispose
end
@viewport.dispose
if !@subscene
pbScrollMap(4,5,5)
end
end
def pbPrepareWindow(window)
window.visible=true
window.letterbyletter=false
end
def pbShowMoney
pbRefresh
@sprites["moneywindow"].visible=true
end
def pbHideMoney
pbRefresh
@sprites["moneywindow"].visible=false
end
def pbDisplay(msg,brief=false)
cw=@sprites["helpwindow"]
cw.letterbyletter=true
cw.text=msg
pbBottomLeftLines(cw,2)
cw.visible=true
i=0
pbPlayDecisionSE()
loop do
Graphics.update
Input.update
self.update
if !cw.busy?
return if brief
pbRefresh if i==0
end
if Input.trigger?(Input::C) && cw.busy?
cw.resume
end
return if i>=Graphics.frame_rate*3/2
i+=1 if !cw.busy?
end
end
def pbDisplayPaused(msg)
cw=@sprites["helpwindow"]
cw.letterbyletter=true
cw.text=msg
pbBottomLeftLines(cw,2)
cw.visible=true
yielded = false
pbPlayDecisionSE()
loop do
Graphics.update
Input.update
wasbusy=cw.busy?
self.update
if !cw.busy? && !yielded
yield if block_given? # For playing SE as soon as the message is all shown
yielded = true
end
pbRefresh if !cw.busy? && wasbusy
if Input.trigger?(Input::C) && cw.resume && !cw.busy?
@sprites["helpwindow"].visible=false
return
end
end
end
def pbConfirm(msg)
dw=@sprites["helpwindow"]
dw.letterbyletter=true
dw.text=msg
dw.visible=true
pbBottomLeftLines(dw,2)
commands=[_INTL("Yes"),_INTL("No")]
cw = Window_CommandPokemon.new(commands)
cw.viewport=@viewport
pbBottomRight(cw)
cw.y-=dw.height
cw.index=0
pbPlayDecisionSE()
loop do
cw.visible=!dw.busy?
Graphics.update
Input.update
cw.update
self.update
if Input.trigger?(Input::B) && dw.resume && !dw.busy?
cw.dispose
@sprites["helpwindow"].visible=false
return false
end
if Input.trigger?(Input::C) && dw.resume && !dw.busy?
cw.dispose
@sprites["helpwindow"].visible=false
return (cw.index==0)?true:false
end
end
end
def pbChooseNumber(helptext,item,maximum)
curnumber=1
ret=0
helpwindow=@sprites["helpwindow"]
itemprice=@adapter.getPrice(item,!@buying)
itemprice/=2 if !@buying
pbDisplay(helptext,true)
using(numwindow=Window_AdvancedTextPokemon.new("")) { # Showing number of items
qty=@adapter.getQuantity(item)
using(inbagwindow=Window_AdvancedTextPokemon.new("")) { # Showing quantity in bag
pbPrepareWindow(numwindow)
pbPrepareWindow(inbagwindow)
numwindow.viewport=@viewport
numwindow.width=224
numwindow.height=64
numwindow.baseColor=Color.new(88,88,80)
numwindow.shadowColor=Color.new(168,184,184)
inbagwindow.visible=@buying
inbagwindow.viewport=@viewport
inbagwindow.width=190
inbagwindow.height=64
inbagwindow.baseColor=Color.new(88,88,80)
inbagwindow.shadowColor=Color.new(168,184,184)
inbagwindow.text=_INTL("In Bag:<r>{1} ",qty)
numwindow.text=_INTL("x{1}<r>$ {2}",curnumber,(curnumber*itemprice).to_s_formatted)
pbBottomRight(numwindow)
numwindow.y-=helpwindow.height
pbBottomLeft(inbagwindow)
inbagwindow.y-=helpwindow.height
loop do
Graphics.update
Input.update
numwindow.update
inbagwindow.update
self.update
if Input.repeat?(Input::LEFT)
pbPlayCursorSE()
curnumber-=10
curnumber=1 if curnumber<1
numwindow.text=_INTL("x{1}<r>$ {2}",curnumber,(curnumber*itemprice).to_s_formatted)
elsif Input.repeat?(Input::RIGHT)
pbPlayCursorSE()
curnumber+=10
curnumber=maximum if curnumber>maximum
numwindow.text=_INTL("x{1}<r>$ {2}",curnumber,(curnumber*itemprice).to_s_formatted)
elsif Input.repeat?(Input::UP)
pbPlayCursorSE()
curnumber+=1
curnumber=1 if curnumber>maximum
numwindow.text=_INTL("x{1}<r>$ {2}",curnumber,(curnumber*itemprice).to_s_formatted)
elsif Input.repeat?(Input::DOWN)
pbPlayCursorSE()
curnumber-=1
curnumber=maximum if curnumber<1
numwindow.text=_INTL("x{1}<r>$ {2}",curnumber,(curnumber*itemprice).to_s_formatted)
elsif Input.trigger?(Input::C)
pbPlayDecisionSE()
ret=curnumber
break
elsif Input.trigger?(Input::B)
pbPlayCancelSE()
ret=0
break
end
end
}
}
helpwindow.visible=false
return ret
end
def pbChooseBuyItem
itemwindow=@sprites["itemwindow"]
@sprites["helpwindow"].visible=false
pbActivateWindow(@sprites,"itemwindow") {
pbRefresh
loop do
Graphics.update
Input.update
olditem=itemwindow.item
self.update
if itemwindow.item!=olditem
@sprites["icon"].item=itemwindow.item
@sprites["itemtextwindow"].text=(itemwindow.item==0) ? _INTL("Quit shopping.") :
@adapter.getDescription(itemwindow.item)
end
if Input.trigger?(Input::B)
pbPlayCloseMenuSE
return 0
elsif Input.trigger?(Input::C)
if itemwindow.index<@stock.length
pbRefresh
return @stock[itemwindow.index]
else
return 0
end
end
end
}
end
def pbChooseSellItem
if @subscene
return @subscene.pbChooseItem
else
return pbChooseBuyItem
end
end
end
#######################################################
class PokemonMartScreen
def initialize(scene,stock)
@scene=scene
@stock=stock
@adapter=$PokemonBag ? PokemonMartAdapter.new : RpgxpMartAdapter.new
end
def pbConfirm(msg)
return @scene.pbConfirm(msg)
end
def pbDisplay(msg)
return @scene.pbDisplay(msg)
end
def pbDisplayPaused(msg,&block)
return @scene.pbDisplayPaused(msg,&block)
end
def pbBuyScreen
@scene.pbStartBuyScene(@stock,@adapter)
item=0
loop do
item=@scene.pbChooseBuyItem
quantity=0
break if item==0
itemname=@adapter.getDisplayName(item)
price=@adapter.getPrice(item)
if @adapter.getMoney<price
pbDisplayPaused(_INTL("You don't have enough money."))
next
end
if pbIsImportantItem?(item)
if !pbConfirm(_INTL("Certainly. You want {1}. That will be ${2}. OK?",
itemname,price.to_s_formatted))
next
end
quantity=1
else
maxafford=(price<=0) ? BAG_MAX_PER_SLOT : @adapter.getMoney/price
maxafford=BAG_MAX_PER_SLOT if maxafford>BAG_MAX_PER_SLOT
quantity=@scene.pbChooseNumber(
_INTL("{1}? Certainly. How many would you like?",itemname),item,maxafford)
next if quantity==0
price*=quantity
if !pbConfirm(_INTL("{1}, and you want {2}. That will be ${3}. OK?",
itemname,quantity,price.to_s_formatted))
next
end
end
if @adapter.getMoney<price
pbDisplayPaused(_INTL("You don't have enough money."))
next
end
added=0
quantity.times do
if !@adapter.addItem(item)
break
end
added+=1
end
if added!=quantity
added.times do
if !@adapter.removeItem(item)
raise _INTL("Failed to delete stored items")
end
end
pbDisplayPaused(_INTL("You have no more room in the Bag."))
else
@adapter.setMoney(@adapter.getMoney-price)
for i in 0...@stock.length
if pbIsImportantItem?(@stock[i]) && $PokemonBag.pbHasItem?(@stock[i])
@stock[i]=nil
end
end
@stock.compact!
pbDisplayPaused(_INTL("Here you are! Thank you!")) { pbSEPlay("Mart buy item") }
if $PokemonBag
if quantity>=10 && pbIsPokeBall?(item) && hasConst?(PBItems,:PREMIERBALL)
if @adapter.addItem(getConst(PBItems,:PREMIERBALL))
pbDisplayPaused(_INTL("I'll throw in a Premier Ball, too."))
end
end
end
end
end
@scene.pbEndBuyScene
end
def pbSellScreen
item=@scene.pbStartSellScene(@adapter.getInventory,@adapter)
loop do
item=@scene.pbChooseSellItem
break if item==0
itemname=@adapter.getDisplayName(item)
price=@adapter.getPrice(item,true)
if !@adapter.canSell?(item)
pbDisplayPaused(_INTL("{1}? Oh, no. I can't buy that.",itemname))
next
end
qty=@adapter.getQuantity(item)
next if qty==0
@scene.pbShowMoney
if qty>1
qty=@scene.pbChooseNumber(
_INTL("{1}? How many would you like to sell?",itemname),item,qty)
end
if qty==0
@scene.pbHideMoney
next
end
price/=2
price*=qty
if pbConfirm(_INTL("I can pay ${1}. Would that be OK?",price.to_s_formatted))
@adapter.setMoney(@adapter.getMoney+price)
for i in 0...qty
@adapter.removeItem(item)
end
pbDisplayPaused(_INTL("Turned over the {1} and received ${2}.",itemname,price.to_s_formatted)) { pbSEPlay("Mart buy item") }
@scene.pbRefresh
end
@scene.pbHideMoney
end
@scene.pbEndSellScene
end
end
def pbPokemonMart(stock,speech=nil,cantsell=false)
for i in 0...stock.length
stock[i] = getID(PBItems,stock[i])
if !stock[i] || stock[i]==0 ||
(pbIsImportantItem?(stock[i]) && $PokemonBag.pbHasItem?(stock[i]))
stock[i] = nil
end
end
stock.compact!
commands = []
cmdBuy = -1
cmdSell = -1
cmdQuit = -1
commands[cmdBuy = commands.length] = _INTL("Buy")
commands[cmdSell = commands.length] = _INTL("Sell") if !cantsell
commands[cmdQuit = commands.length] = _INTL("Quit")
cmd = pbMessage(
speech ? speech : _INTL("Welcome! How may I serve you?"),
commands,cmdQuit+1)
loop do
if cmdBuy>=0 && cmd==cmdBuy
scene = PokemonMart_Scene.new
screen = PokemonMartScreen.new(scene,stock)
screen.pbBuyScreen
elsif cmdSell>=0 && cmd==cmdSell
scene = PokemonMart_Scene.new
screen = PokemonMartScreen.new(scene,stock)
screen.pbSellScreen
else
pbMessage(_INTL("Please come again!"))
break
end
cmd = pbMessage(_INTL("Is there anything else I can help you with?"),
commands,cmdQuit+1)
end
$game_temp.clear_mart_prices
end
class Game_Temp
attr_writer :mart_prices
def mart_prices
@mart_prices = [] if !@mart_prices
return @mart_prices
end
def clear_mart_prices
@mart_prices = []
end
end
class Interpreter
def getItem(p)
if p[0]==0; return $data_items[p[1]]
elsif p[0]==1; return $data_weapons[p[1]]
elsif p[0]==2; return $data_armors[p[1]]
end
return nil
end
def command_302
$game_temp.battle_abort = true
shop_goods = [getItem(@parameters)]
# Loop
loop do
# Advance index
@index += 1
# If next event command has shop on second line or after
if @list[@index].code == 605
# Add goods list to new item
shop_goods.push(getItem(@list[@index].parameters))
else
# End
pbPokemonMart(shop_goods.compact)
return true
end
end
end
def setPrice(item,buyprice=-1,sellprice=-1)
item = getID(PBItems,item)
$game_temp.mart_prices[item] = [-1,-1] if !$game_temp.mart_prices[item]
$game_temp.mart_prices[item][0] = buyprice if buyprice>0
if sellprice>=0 # 0=can't sell
$game_temp.mart_prices[item][1] = sellprice*2
else
$game_temp.mart_prices[item][1] = buyprice if buyprice>0
end
end
def setSellPrice(item,sellprice)
setPrice(item,-1,sellprice)
end
end
class Game_Interpreter
def getItem(p)
if p[0]==0; return $data_items[p[1]]
elsif p[0]==1; return $data_weapons[p[1]]
elsif p[0]==2; return $data_armors[p[1]]
end
return nil
end
def command_302
shop_goods = [getItem(@params)]
# Loop
loop do
# Advance index
@index += 1
# If next event command has shop on second line or after
if @list[@index].code == 605
# Add goods list to new item
shop_goods.push(getItem(@list[@index].parameters))
else
# End
pbPokemonMart(shop_goods.compact,nil,@params[2])
return true
end
end
end
end

View File

@@ -0,0 +1,427 @@
#===============================================================================
# Mystery Gift system
# By Maruno
#===============================================================================
# This url is the location of an example Mystery Gift file.
# You should change it to your file's url once you upload it.
# NOTE: Essentials cannot handle https addresses. You must use a http address.
#===============================================================================
MYSTERY_GIFT_URL = "http://images1.wikia.nocookie.net/pokemonessentials/images/e/e7/MysteryGift.txt"
# MYSTERY_GIFT_URL = "http://pastebin.com/raw/w6BqqUsm"
class PokeBattle_Trainer
attr_accessor(:mysterygiftaccess) # Whether MG can be used from load screen
attr_accessor(:mysterygift) # Variable that stores downloaded MG data
def mysterygiftaccess
@mysterygiftaccess = false if !@mysterygiftaccess
return @mysterygiftaccess
end
def mysterygift
@mysterygift = [] if !@mysterygift
return @mysterygift
end
end
#===============================================================================
# Creating a new Mystery Gift for the Master file, and editing an existing one.
#===============================================================================
# type: 0=Pokémon; 1 or higher=item (is the item's quantity).
# item: The thing being turned into a Mystery Gift (Pokémon object or item ID).
def pbEditMysteryGift(type,item,id=0,giftname="")
begin
if type==0 # Pokémon
commands=[_INTL("Mystery Gift"),
_INTL("Faraway place")]
commands.push(item.obtainText) if item.obtainText && item.obtainText!=""
commands.push(_INTL("[Custom]"))
loop do
command=pbMessage(
_INTL("Choose a phrase to be where the gift Pokémon was obtained from."),commands,-1)
if command<0
return nil if pbConfirmMessage(_INTL("Stop editing this gift?"))
elsif command<commands.length-1
item.obtainText=commands[command]
break
elsif command==commands.length-1
obtainname=pbMessageFreeText(_INTL("Enter a phrase."),"",false,32)
if obtainname!=""
item.obtainText=obtainname
break
end
return nil if pbConfirmMessage(_INTL("Stop editing this gift?"))
end
end
elsif type>0 # Item
params=ChooseNumberParams.new
params.setRange(1,99999)
params.setDefaultValue(type)
params.setCancelValue(0)
loop do
newtype=pbMessageChooseNumber(_INTL("Choose a quantity."),params)
if newtype==0
return nil if pbConfirmMessage(_INTL("Stop editing this gift?"))
else
type=newtype
break
end
end
end
if id==0
master=[]; idlist=[]
if safeExists?("MysteryGiftMaster.txt")
master=IO.read("MysteryGiftMaster.txt")
master=pbMysteryGiftDecrypt(master)
end
for i in master; idlist.push(i[0]); end
params=ChooseNumberParams.new
params.setRange(0,99999)
params.setDefaultValue(id)
params.setCancelValue(0)
loop do
newid=pbMessageChooseNumber(_INTL("Choose a unique ID for this gift."),params)
if newid==0
return nil if pbConfirmMessage(_INTL("Stop editing this gift?"))
else
if idlist.include?(newid)
pbMessage(_INTL("That ID is already used by a Mystery Gift."))
else
id=newid
break
end
end
end
end
loop do
newgiftname=pbMessageFreeText(_INTL("Enter a name for the gift."),giftname,false,32)
if newgiftname!=""
giftname=newgiftname
break
end
return nil if pbConfirmMessage(_INTL("Stop editing this gift?"))
end
return [id,type,item,giftname]
rescue
pbMessage(_INTL("Couldn't edit the gift."))
return nil
end
end
def pbCreateMysteryGift(type,item)
gift=pbEditMysteryGift(type,item)
if !gift
pbMessage(_INTL("Didn't create a gift."))
else
begin
if safeExists?("MysteryGiftMaster.txt")
master=IO.read("MysteryGiftMaster.txt")
master=pbMysteryGiftDecrypt(master)
master.push(gift)
else
master=[gift]
end
string=pbMysteryGiftEncrypt(master)
File.open("MysteryGiftMaster.txt","wb") { |f| f.write(string) }
pbMessage(_INTL("The gift was saved to MysteryGiftMaster.txt."))
rescue
pbMessage(_INTL("Couldn't save the gift to MysteryGiftMaster.txt."))
end
end
end
#===============================================================================
# Debug option for managing gifts in the Master file and exporting them to a
# file to be uploaded.
#===============================================================================
def pbManageMysteryGifts
if !safeExists?("MysteryGiftMaster.txt")
pbMessage(_INTL("There are no Mystery Gifts defined."))
return
end
# Load all gifts from the Master file.
master=IO.read("MysteryGiftMaster.txt")
master=pbMysteryGiftDecrypt(master)
if !master || !master.is_a?(Array) || master.length==0
pbMessage(_INTL("There are no Mystery Gifts defined."))
return
end
# Download all gifts from online
msgwindow=pbCreateMessageWindow
pbMessageDisplay(msgwindow,_INTL("Searching for online gifts...\\wtnp[0]"))
online=pbDownloadToString(MYSTERY_GIFT_URL)
pbDisposeMessageWindow(msgwindow)
if online==""
pbMessage(_INTL("No online Mystery Gifts found.\\wtnp[20]"))
online=[]
else
pbMessage(_INTL("Online Mystery Gifts found.\\wtnp[20]"))
online=pbMysteryGiftDecrypt(online)
t=[]
for gift in online; t.push(gift[0]); end
online=t
end
# Show list of all gifts.
command=0
loop do
commands=pbRefreshMGCommands(master,online)
command=pbMessage(_INTL("\\ts[]Manage Mystery Gifts (X=online)."),commands,-1,nil,command)
# Gift chosen
if command==-1 || command==commands.length-1
break
elsif command==commands.length-2
begin
newfile=[]
for gift in master
newfile.push(gift) if online.include?(gift[0])
end
string=pbMysteryGiftEncrypt(newfile)
File.open("MysteryGift.txt","wb") { |f| f.write(string) }
pbMessage(_INTL("The gifts were saved to MysteryGift.txt."))
pbMessage(_INTL("Upload MysteryGift.txt to the Internet."))
rescue
pbMessage(_INTL("Couldn't save the gifts to MysteryGift.txt."))
end
elsif command>=0 && command<commands.length-2
cmd=0
loop do
commands=pbRefreshMGCommands(master,online)
gift=master[command]
cmds=[_INTL("Toggle on/offline"),
_INTL("Edit"),
_INTL("Receive"),
_INTL("Delete"),
_INTL("Cancel")]
cmd=pbMessage("\\ts[]"+commands[command],cmds,-1,nil,cmd)
if cmd==-1 || cmd==cmds.length-1
break
elsif cmd==0 # Toggle on/offline
if online.include?(gift[0])
for i in 0...online.length
online[i]=nil if online[i]==gift[0]
end
online.compact!
else
online.push(gift[0])
end
elsif cmd==1 # Edit
newgift=pbEditMysteryGift(gift[1],gift[2],gift[0],gift[3])
master[command]=newgift if newgift
elsif cmd==2 # Receive
replaced=false
for i in 0...$Trainer.mysterygift.length
if $Trainer.mysterygift[i][0]==gift[0]
$Trainer.mysterygift[i]=gift; replaced=true
end
end
$Trainer.mysterygift.push(gift) if !replaced
pbReceiveMysteryGift(gift[0])
elsif cmd==3 # Delete
if pbConfirmMessage(_INTL("Are you sure you want to delete this gift?"))
master[command]=nil
master.compact!
end
break
end
end
end
end
end
def pbRefreshMGCommands(master,online)
commands=[]
for gift in master
itemname="BLANK"
if gift[1]==0
itemname=PBSpecies.getName(gift[2].species)
elsif gift[1]>0
itemname=PBItems.getName(gift[2])+sprintf(" x%d",gift[1])
end
ontext=["[ ]","[X]"][(online.include?(gift[0])) ? 1 : 0]
commands.push(_INTL("{1} {2}: {3} ({4})",ontext,gift[0],gift[3],itemname))
end
commands.push(_INTL("Export selected to file"))
commands.push(_INTL("Cancel"))
return commands
end
#===============================================================================
# Downloads all available Mystery Gifts that haven't been downloaded yet.
#===============================================================================
# Called from the Continue/New Game screen.
def pbDownloadMysteryGift(trainer)
sprites={}
viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
viewport.z=99999
addBackgroundPlane(sprites,"background","mysteryGiftbg",viewport)
pbFadeInAndShow(sprites)
sprites["msgwindow"]=pbCreateMessageWindow
pbMessageDisplay(sprites["msgwindow"],_INTL("Searching for a gift.\nPlease wait...\\wtnp[0]"))
string=pbDownloadToString(MYSTERY_GIFT_URL)
if string==""
pbMessageDisplay(sprites["msgwindow"],_INTL("No new gifts are available."))
else
online=pbMysteryGiftDecrypt(string)
pending=[]
for gift in online
notgot=true
for j in trainer.mysterygift
notgot=false if j[0]==gift[0]
end
pending.push(gift) if notgot
end
if pending.length==0
pbMessageDisplay(sprites["msgwindow"],_INTL("No new gifts are available."))
else
loop do
commands=[]
for gift in pending; commands.push(gift[3]); end
commands.push(_INTL("Cancel"))
pbMessageDisplay(sprites["msgwindow"],_INTL("Choose the gift you want to receive.\\wtnp[0]"))
command=pbShowCommands(sprites["msgwindow"],commands,-1)
if command==-1 || command==commands.length-1
break
else
gift=pending[command]
sprites["msgwindow"].visible=false
isitem=false
if gift[1]==0
sprite=PokemonSprite.new(viewport)
sprite.setOffset(PictureOrigin::Center)
sprite.setPokemonBitmap(gift[2])
sprite.x=Graphics.width/2
sprite.y=-sprite.bitmap.height/2
else
sprite=ItemIconSprite.new(0,0,gift[2],viewport)
sprite.x=Graphics.width/2
sprite.y=-sprite.height/2
isitem=true
end
distanceDiff = 8*20/Graphics.frame_rate
begin
Graphics.update
Input.update
sprite.update
sprite.y+=distanceDiff
end while sprite.y<Graphics.height/2
pbMEPlay("Battle capture success")
(Graphics.frame_rate*3).times do
Graphics.update
Input.update
sprite.update
pbUpdateSceneMap
end
sprites["msgwindow"].visible=true
pbMessageDisplay(sprites["msgwindow"],_INTL("The gift has been received!")) { sprite.update }
pbMessageDisplay(sprites["msgwindow"],_INTL("Please pick up your gift from the deliveryman in any Poké Mart.")) { sprite.update }
trainer.mysterygift.push(gift)
pending[command]=nil; pending.compact!
opacityDiff = 16*20/Graphics.frame_rate
begin
Graphics.update
Input.update
sprite.update
sprite.opacity-=opacityDiff
end while sprite.opacity>0
sprite.dispose
end
if pending.length==0
pbMessageDisplay(sprites["msgwindow"],_INTL("No new gifts are available."))
break
end
end
end
end
pbFadeOutAndHide(sprites)
pbDisposeMessageWindow(sprites["msgwindow"])
pbDisposeSpriteHash(sprites)
viewport.dispose
return trainer
end
#===============================================================================
# Converts an array of gifts into a string and back.
#===============================================================================
def pbMysteryGiftEncrypt(gift)
ret=[Zlib::Deflate.deflate(Marshal.dump(gift))].pack("m")
return ret
end
def pbMysteryGiftDecrypt(gift)
return [] if gift==""
ret=Marshal.restore(Zlib::Inflate.inflate(gift.unpack("m")[0]))
return ret
end
#===============================================================================
# Collecting a Mystery Gift from the deliveryman.
#===============================================================================
def pbNextMysteryGiftID
for i in $Trainer.mysterygift
return i[0] if i.length>1
end
return 0
end
def pbReceiveMysteryGift(id)
index=-1
for i in 0...$Trainer.mysterygift.length
if $Trainer.mysterygift[i][0]==id && $Trainer.mysterygift[i].length>1
index=i
break
end
end
if index==-1
pbMessage(_INTL("Couldn't find an unclaimed Mystery Gift with ID {1}.",id))
return false
end
gift=$Trainer.mysterygift[index]
if gift[1]==0
pID=rand(256)
pID|=rand(256)<<8
pID|=rand(256)<<16
pID|=rand(256)<<24
gift[2].personalID=pID
gift[2].calcStats
time=pbGetTimeNow
gift[2].timeReceived=time.getgm.to_i
gift[2].obtainMode=4 # Fateful encounter
gift[2].pbRecordFirstMoves
if $game_map
gift[2].obtainMap=$game_map.map_id
gift[2].obtainLevel=gift[2].level
else
gift[2].obtainMap=0
gift[2].obtainLevel=gift[2].level
end
if pbAddPokemonSilent(gift[2])
pbMessage(_INTL("\\me[Pkmn get]{1} received {2}!",$Trainer.name,gift[2].name))
$Trainer.mysterygift[index]=[id]
return true
end
elsif gift[1]>0
if $PokemonBag.pbCanStore?(gift[2],gift[1])
$PokemonBag.pbStoreItem(gift[2],gift[1])
item=gift[2]; qty=gift[1]
itemname=(qty>1) ? PBItems.getNamePlural(item) : PBItems.getName(item)
if isConst?(item,PBItems,:LEFTOVERS)
pbMessage(_INTL("\\me[Item get]You obtained some \\c[1]{1}\\c[0]!\\wtnp[30]",itemname))
elsif pbIsMachine?(item) # TM or HM
pbMessage(_INTL("\\me[Item get]You obtained \\c[1]{1} {2}\\c[0]!\\wtnp[30]",itemname,PBMoves.getName(pbGetMachine(item))))
elsif qty>1
pbMessage(_INTL("\\me[Item get]You obtained {1} \\c[1]{2}\\c[0]!\\wtnp[30]",qty,itemname))
elsif itemname.starts_with_vowel?
pbMessage(_INTL("\\me[Item get]You obtained an \\c[1]{1}\\c[0]!\\wtnp[30]",itemname))
else
pbMessage(_INTL("\\me[Item get]You obtained a \\c[1]{1}\\c[0]!\\wtnp[30]",itemname))
end
$Trainer.mysterygift[index]=[id]
return true
end
end
return false
end

View File

@@ -0,0 +1,511 @@
#===============================================================================
# * Hall of Fame - by FL (Credits will be apreciated)
#===============================================================================
#
# This script is for Pokémon Essentials. It makes a recordable Hall of Fame
# like the Gen 3 games.
#
#===============================================================================
#
# To this scripts works, put it above main, put a 512x384 picture in
# hallfamebars and a 8x24 background picture in hallfamebg. To call this script,
# use 'pbHallOfFameEntry'. After you recorder the first entry, you can access
# the hall teams using a PC. You can also check the player Hall of Fame last
# number using '$PokemonGlobal.hallOfFameLastNumber'.
#
#===============================================================================
class HallOfFame_Scene
# When true, all pokémon will be in one line
# When false, all pokémon will be in two lines
SINGLEROW = false
# Make the pokémon movement ON in hall entry
ANIMATION = true
# Speed in pokémon movement in hall entry. Don't use less than 2!
ANIMATIONSPEED = 32
# Entry wait time (in 1/20 seconds) between showing each Pokémon (and trainer)
ENTRYWAITTIME = 64
# Maximum number limit of simultaneous hall entries saved.
# 0 = Doesn't save any hall. -1 = no limit
# Prefer to use larger numbers (like 500 and 1000) than don't put a limit
# If a player exceed this limit, the first one will be removed
HALLLIMIT = 50
# The entry music name. Put "" to doesn't play anything
ENTRYMUSIC = "Hall of Fame"
# Allow eggs to be show and saved in hall
ALLOWEGGS = true
# Remove the hallbars when the trainer sprite appears
REMOVEBARS = true
# The final fade speed on entry
FINALFADESPEED = 16
# Sprites opacity value when them aren't selected
OPACITY = 64
BASECOLOR = Color.new(248,248,248)
SHADOWCOLOR = Color.new(0,0,0)
# Placement for pokemon icons
def pbStartScene
@sprites={}
@viewport=Viewport.new(0,0,Graphics.width, Graphics.height)
@viewport.z=99999
# Comment the below line to doesn't use a background
addBackgroundPlane(@sprites,"bg","hallfamebg",@viewport)
@sprites["hallbars"]=IconSprite.new(@viewport)
@sprites["hallbars"].setBitmap("Graphics/Pictures/hallfamebars")
@sprites["overlay"]=BitmapSprite.new(Graphics.width,Graphics.height,@viewport)
@sprites["overlay"].z=10
pbSetSystemFont(@sprites["overlay"].bitmap)
@alreadyFadedInEnd=false
@useMusic=false
@battlerIndex=0
@hallEntry=[]
end
def pbStartSceneEntry
pbStartScene
@useMusic=(ENTRYMUSIC && ENTRYMUSIC!="")
pbBGMPlay(ENTRYMUSIC) if @useMusic
saveHallEntry
@xmovement=[]
@ymovement=[]
createBattlers
pbFadeInAndShow(@sprites) { pbUpdate }
end
def pbStartScenePC
pbStartScene
@hallIndex=$PokemonGlobal.hallOfFame.size-1
@hallEntry=$PokemonGlobal.hallOfFame[-1]
createBattlers(false)
pbFadeInAndShow(@sprites) { pbUpdate }
pbUpdatePC
end
def pbEndScene
$game_map.autoplay if @useMusic
pbDisposeMessageWindow(@sprites["msgwindow"]) if @sprites.include?("msgwindow")
pbFadeOutAndHide(@sprites) { pbUpdate } if !@alreadyFadedInEnd
pbDisposeSpriteHash(@sprites)
@viewport.dispose
end
def slowFadeOut(sprites,exponent) # 2 exponent
# To handle values above 8
extraWaitExponent=exponent-9
exponent=8 if 8<exponent
max=2**exponent
speed=(2**8)/max
for j in 0..max
if extraWaitExponent>-1
(2**extraWaitExponent).times do
Graphics.update
Input.update
pbUpdate
end
end
pbSetSpritesToColor(sprites,Color.new(0,0,0,j*speed))
block_given? ? yield : pbUpdateSpriteHash(sprites)
end
end
# Dispose the sprite if the sprite exists and make it null
def restartSpritePosition(sprites,spritename)
sprites[spritename].dispose if sprites.include?(spritename) && sprites[spritename]
sprites[spritename]=nil
end
# Change the pokémon sprites opacity except the index one
def setPokemonSpritesOpacity(index,opacity=255)
for n in 0...@hallEntry.size
@sprites["pokemon#{n}"].opacity=(n==index) ? 255 : opacity if @sprites["pokemon#{n}"]
end
end
def saveHallEntry
for i in 0...$Trainer.party.length
# Clones every pokémon object
@hallEntry.push($Trainer.party[i].clone) if !$Trainer.party[i].egg? || ALLOWEGGS
end
# Update the global variables
$PokemonGlobal.hallOfFame.push(@hallEntry)
$PokemonGlobal.hallOfFameLastNumber+=1
$PokemonGlobal.hallOfFame.delete_at(0) if HALLLIMIT>-1 &&
$PokemonGlobal.hallOfFame.size>HALLLIMIT
end
# Return the x/y point position in screen for battler index number
# Don't use odd numbers!
def xpointformula(battlernumber)
ret=0
if !SINGLEROW
ret=32+160*xpositionformula(battlernumber)
else
ret=(60*(battlernumber/2)+48)*(xpositionformula(battlernumber)-1)
ret+=Graphics.width/2-56
end
return ret
end
def ypointformula(battlernumber)
ret=0
if !SINGLEROW
ret=32+128*ypositionformula(battlernumber)/2
else
ret=96-8*(battlernumber/2)
end
return ret
end
# Returns 0, 1 or 2 as the x/y column value
def xpositionformula(battlernumber)
ret=0
if !SINGLEROW
ret=(battlernumber/3%2==0) ? (19-battlernumber)%3 : (19+battlernumber)%3
else
ret=battlernumber%2*2
end
return ret
end
def ypositionformula(battlernumber)
ret=0
if !SINGLEROW
ret=(battlernumber/3)%2*2
else
ret=1
end
return ret
end
def moveSprite(i)
spritename=(i>-1) ? "pokemon#{i}" : "trainer"
speed = (i>-1) ? ANIMATIONSPEED : 2
if(!ANIMATION) # Skips animation
@sprites[spritename].x-=speed*@xmovement[i]
@xmovement[i]=0
@sprites[spritename].y-=speed*@ymovement[i]
@ymovement[i]=0
end
if(@xmovement[i]!=0)
direction = (@xmovement[i]>0) ? -1 : 1
@sprites[spritename].x+=speed*direction
@xmovement[i]+=direction
end
if(@ymovement[i]!=0)
direction = (@ymovement[i]>0) ? -1 : 1
@sprites[spritename].y+=speed*direction
@ymovement[i]+=direction
end
end
def createBattlers(hide=true)
# Movement in animation
for i in 0...6
# Clear all 6 pokémon sprites and dispose the ones that exists every time
# that this method is call
restartSpritePosition(@sprites,"pokemon#{i}")
next if i>=@hallEntry.size
xpoint=xpointformula(i)
ypoint=ypointformula(i)
pok=@hallEntry[i]
@sprites["pokemon#{i}"]=PokemonSprite.new(@viewport)
@sprites["pokemon#{i}"].setOffset(PictureOrigin::TopLeft)
@sprites["pokemon#{i}"].setPokemonBitmap(pok)
# This method doesn't put the exact coordinates
@sprites["pokemon#{i}"].x = xpoint
@sprites["pokemon#{i}"].y = ypoint
if @sprites["pokemon#{i}"].bitmap && !@sprites["pokemon#{i}"].disposed?
@sprites["pokemon#{i}"].x += (128-@sprites["pokemon#{i}"].bitmap.width)/2
@sprites["pokemon#{i}"].y += (128-@sprites["pokemon#{i}"].bitmap.height)/2
end
@sprites["pokemon#{i}"].z=7-i if SINGLEROW
next if !hide
# Animation distance calculation
horizontal=1-xpositionformula(i)
vertical=1-ypositionformula(i)
xdistance=(horizontal==-1) ? -@sprites["pokemon#{i}"].bitmap.width : Graphics.width
ydistance=(vertical==-1) ? -@sprites["pokemon#{i}"].bitmap.height : Graphics.height
xdistance=((xdistance-@sprites["pokemon#{i}"].x)/ANIMATIONSPEED).abs+1
ydistance=((ydistance-@sprites["pokemon#{i}"].y)/ANIMATIONSPEED).abs+1
biggerdistance=(xdistance>ydistance) ? xdistance : ydistance
@xmovement[i]=biggerdistance
@xmovement[i]*=-1 if horizontal==-1
@xmovement[i]=0 if horizontal== 0
@ymovement[i]=biggerdistance
@ymovement[i]*=-1 if vertical==-1
@ymovement[i]=0 if vertical== 0
# Hide the battlers
@sprites["pokemon#{i}"].x+=@xmovement[i]*ANIMATIONSPEED
@sprites["pokemon#{i}"].y+=@ymovement[i]*ANIMATIONSPEED
end
end
def createTrainerBattler
@sprites["trainer"]=IconSprite.new(@viewport)
@sprites["trainer"].setBitmap(pbTrainerSpriteFile($Trainer.trainertype))
if !SINGLEROW
@sprites["trainer"].x=Graphics.width-96
@sprites["trainer"].y=160
else
@sprites["trainer"].x=Graphics.width/2
@sprites["trainer"].y=178
end
@sprites["trainer"].z=9
@sprites["trainer"].ox=@sprites["trainer"].bitmap.width/2
@sprites["trainer"].oy=@sprites["trainer"].bitmap.height/2
if REMOVEBARS
@sprites["overlay"].bitmap.clear
@sprites["hallbars"].visible=false
end
@xmovement[@battlerIndex]=0
@ymovement[@battlerIndex]=0
if(ANIMATION && !SINGLEROW) # Trainer Animation
startpoint=Graphics.width/2
# 2 is the trainer speed
@xmovement[@battlerIndex]=(startpoint-@sprites["trainer"].x)/2
@sprites["trainer"].x=startpoint
else
ENTRYWAITTIME.times do
Graphics.update
Input.update
pbUpdate
end
end
end
def writeTrainerData
totalsec = Graphics.frame_count / Graphics.frame_rate
hour = totalsec / 60 / 60
min = totalsec / 60 % 60
pubid=sprintf("%05d",$Trainer.publicID($Trainer.id))
lefttext= _INTL("Name<r>{1}<br>",$Trainer.name)
lefttext+=_INTL("IDNo.<r>{1}<br>",pubid)
lefttext+=_ISPRINTF("Time<r>{1:02d}:{2:02d}<br>",hour,min)
lefttext+=_INTL("Pokédex<r>{1}/{2}<br>",
$Trainer.pokedexOwned,$Trainer.pokedexSeen)
@sprites["messagebox"]=Window_AdvancedTextPokemon.new(lefttext)
@sprites["messagebox"].viewport=@viewport
@sprites["messagebox"].width=192 if @sprites["messagebox"].width<192
@sprites["msgwindow"]=pbCreateMessageWindow(@viewport)
pbMessageDisplay(@sprites["msgwindow"],
_INTL("League champion!\nCongratulations!\\^"))
end
def writePokemonData(pokemon,hallNumber=-1)
overlay=@sprites["overlay"].bitmap
overlay.clear
pokename=pokemon.name
speciesname=PBSpecies.getName(pokemon.species)
if pokemon.male?
speciesname+=""
elsif pokemon.female?
speciesname+=""
end
pokename+="/"+speciesname
pokename=_INTL("Egg")+"/"+_INTL("Egg") if pokemon.egg?
idno=(pokemon.ot=="" || pokemon.egg?) ? "?????" : sprintf("%05d",pokemon.publicID)
dexnumber=pokemon.egg? ? _INTL("No. ???") : _ISPRINTF("No. {1:03d}",pokemon.species)
textPositions=[
[dexnumber,32,Graphics.height-80,0,BASECOLOR,SHADOWCOLOR],
[pokename,Graphics.width-192,Graphics.height-80,2,BASECOLOR,SHADOWCOLOR],
[_INTL("Lv. {1}",pokemon.egg? ? "?" : pokemon.level),
64,Graphics.height-48,0,BASECOLOR,SHADOWCOLOR],
[_INTL("IDNo.{1}",pokemon.egg? ? "?????" : idno),
Graphics.width-192,Graphics.height-48,2,BASECOLOR,SHADOWCOLOR]
]
if (hallNumber>-1)
textPositions.push([_INTL("Hall of Fame No."),Graphics.width/2-104,0,0,BASECOLOR,SHADOWCOLOR])
textPositions.push([hallNumber.to_s,Graphics.width/2+104,0,1,BASECOLOR,SHADOWCOLOR])
end
pbDrawTextPositions(overlay,textPositions)
end
def writeWelcome
overlay=@sprites["overlay"].bitmap
overlay.clear
pbDrawTextPositions(overlay,[[_INTL("Welcome to the Hall of Fame!"),
Graphics.width/2,Graphics.height-80,2,BASECOLOR,SHADOWCOLOR]])
end
def pbAnimationLoop
loop do
Graphics.update
Input.update
pbUpdate
pbUpdateAnimation
break if @battlerIndex==@hallEntry.size+2
end
end
def pbPCSelection
loop do
Graphics.update
Input.update
pbUpdate
continueScene=true
break if Input.trigger?(Input::B) # Exits
if Input.trigger?(Input::C) # Moves the selection one entry backward
@battlerIndex+=10
continueScene=pbUpdatePC
end
if Input.trigger?(Input::LEFT) # Moves the selection one pokémon forward
@battlerIndex-=1
continueScene=pbUpdatePC
end
if Input.trigger?(Input::RIGHT) # Moves the selection one pokémon backward
@battlerIndex+=1
continueScene=pbUpdatePC
end
break if !continueScene
end
end
def pbUpdate
pbUpdateSpriteHash(@sprites)
end
def pbUpdateAnimation
if @battlerIndex<=@hallEntry.size
if @xmovement[@battlerIndex]!=0 || @ymovement[@battlerIndex]!=0
spriteIndex=(@battlerIndex<@hallEntry.size) ? @battlerIndex : -1
moveSprite(spriteIndex)
else
@battlerIndex+=1
if @battlerIndex<=@hallEntry.size
# If it is a pokémon, write the pokémon text, wait the
# ENTRYWAITTIME and goes to the next battler
pbPlayCry(@hallEntry[@battlerIndex-1])
writePokemonData(@hallEntry[@battlerIndex-1])
(ENTRYWAITTIME*Graphics.frame_rate/20).times do
Graphics.update
Input.update
pbUpdate
end
if @battlerIndex<@hallEntry.size # Preparates the next battler
setPokemonSpritesOpacity(@battlerIndex,OPACITY)
@sprites["overlay"].bitmap.clear
else # Show the welcome message and preparates the trainer
setPokemonSpritesOpacity(-1)
writeWelcome
(ENTRYWAITTIME*2*Graphics.frame_rate/20).times do
Graphics.update
Input.update
pbUpdate
end
setPokemonSpritesOpacity(-1,OPACITY) if !SINGLEROW
createTrainerBattler
end
end
end
elsif @battlerIndex>@hallEntry.size
# Write the trainer data and fade
writeTrainerData
(ENTRYWAITTIME*Graphics.frame_rate/20).times do
Graphics.update
Input.update
pbUpdate
end
fadeSpeed=((Math.log(2**12)-Math.log(FINALFADESPEED))/Math.log(2)).floor
pbBGMFade((2**fadeSpeed).to_f/20) if @useMusic
slowFadeOut(@sprites,fadeSpeed) { pbUpdate }
@alreadyFadedInEnd=true
@battlerIndex+=1
end
end
def pbUpdatePC
# Change the team
if @battlerIndex>=@hallEntry.size
@hallIndex-=1
return false if @hallIndex==-1
@hallEntry=$PokemonGlobal.hallOfFame[@hallIndex]
@battlerIndex=0
createBattlers(false)
elsif @battlerIndex<0
@hallIndex+=1
return false if @hallIndex>=$PokemonGlobal.hallOfFame.size
@hallEntry=$PokemonGlobal.hallOfFame[@hallIndex]
@battlerIndex=@hallEntry.size-1
createBattlers(false)
end
# Change the pokemon
pbPlayCry(@hallEntry[@battlerIndex])
setPokemonSpritesOpacity(@battlerIndex,OPACITY)
hallNumber=$PokemonGlobal.hallOfFameLastNumber + @hallIndex -
$PokemonGlobal.hallOfFame.size + 1
writePokemonData(@hallEntry[@battlerIndex],hallNumber)
return true
end
end
class HallOfFameScreen
def initialize(scene)
@scene = scene
end
def pbStartScreenEntry
@scene.pbStartSceneEntry
@scene.pbAnimationLoop
@scene.pbEndScene
end
def pbStartScreenPC
@scene.pbStartScenePC
@scene.pbPCSelection
@scene.pbEndScene
end
end
class HallOfFamePC
def shouldShow?
return $PokemonGlobal.hallOfFameLastNumber>0
end
def name
return _INTL("Hall of Fame")
end
def access
pbMessage(_INTL("\\se[PC access]Accessed the Hall of Fame."))
pbHallOfFamePC
end
end
PokemonPCList.registerPC(HallOfFamePC.new)
class PokemonGlobalMetadata
attr_accessor :hallOfFame
# Number necessary if hallOfFame array reach in its size limit
attr_accessor :hallOfFameLastNumber
def hallOfFame
@hallOfFame=[] if !@hallOfFame
return @hallOfFame
end
def hallOfFameLastNumber
@hallOfFameLastNumber=0 if !@hallOfFameLastNumber
return @hallOfFameLastNumber
end
end
def pbHallOfFameEntry
scene=HallOfFame_Scene.new
screen=HallOfFameScreen.new(scene)
screen.pbStartScreenEntry
end
def pbHallOfFamePC
scene=HallOfFame_Scene.new
screen=HallOfFameScreen.new(scene)
screen.pbStartScreenPC
end