mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
Initial commit
This commit is contained in:
277
Data/Scripts/016_UI/001_PScreen_PauseMenu.rb
Normal file
277
Data/Scripts/016_UI/001_PScreen_PauseMenu.rb
Normal 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
|
||||
126
Data/Scripts/016_UI/002_PScreen_PokedexMenu.rb
Normal file
126
Data/Scripts/016_UI/002_PScreen_PokedexMenu.rb
Normal 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
|
||||
1191
Data/Scripts/016_UI/003_PScreen_PokedexMain.rb
Normal file
1191
Data/Scripts/016_UI/003_PScreen_PokedexMain.rb
Normal file
File diff suppressed because it is too large
Load Diff
586
Data/Scripts/016_UI/004_PScreen_PokedexEntry.rb
Normal file
586
Data/Scripts/016_UI/004_PScreen_PokedexEntry.rb
Normal 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
|
||||
1337
Data/Scripts/016_UI/005_PScreen_Party.rb
Normal file
1337
Data/Scripts/016_UI/005_PScreen_Party.rb
Normal file
File diff suppressed because it is too large
Load Diff
1355
Data/Scripts/016_UI/006_PScreen_Summary.rb
Normal file
1355
Data/Scripts/016_UI/006_PScreen_Summary.rb
Normal file
File diff suppressed because it is too large
Load Diff
716
Data/Scripts/016_UI/007_PScreen_Bag.rb
Normal file
716
Data/Scripts/016_UI/007_PScreen_Bag.rb
Normal 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
|
||||
152
Data/Scripts/016_UI/008_PScreen_Pokegear.rb
Normal file
152
Data/Scripts/016_UI/008_PScreen_Pokegear.rb
Normal 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
|
||||
365
Data/Scripts/016_UI/009_PScreen_RegionMap.rb
Normal file
365
Data/Scripts/016_UI/009_PScreen_RegionMap.rb
Normal 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
|
||||
148
Data/Scripts/016_UI/010_PScreen_Phone.rb
Normal file
148
Data/Scripts/016_UI/010_PScreen_Phone.rb
Normal 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
|
||||
132
Data/Scripts/016_UI/011_PScreen_Jukebox.rb
Normal file
132
Data/Scripts/016_UI/011_PScreen_Jukebox.rb
Normal 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
|
||||
110
Data/Scripts/016_UI/012_PScreen_TrainerCard.rb
Normal file
110
Data/Scripts/016_UI/012_PScreen_TrainerCard.rb
Normal 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
|
||||
631
Data/Scripts/016_UI/013_PScreen_Load.rb
Normal file
631
Data/Scripts/016_UI/013_PScreen_Load.rb
Normal 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
|
||||
156
Data/Scripts/016_UI/014_PScreen_Save.rb
Normal file
156
Data/Scripts/016_UI/014_PScreen_Save.rb
Normal 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
|
||||
624
Data/Scripts/016_UI/015_PScreen_Options.rb
Normal file
624
Data/Scripts/016_UI/015_PScreen_Options.rb
Normal 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
|
||||
327
Data/Scripts/016_UI/016_PScreen_ReadyMenu.rb
Normal file
327
Data/Scripts/016_UI/016_PScreen_ReadyMenu.rb
Normal 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
|
||||
1977
Data/Scripts/016_UI/017_PScreen_PokemonStorage.rb
Normal file
1977
Data/Scripts/016_UI/017_PScreen_PokemonStorage.rb
Normal file
File diff suppressed because it is too large
Load Diff
365
Data/Scripts/016_UI/018_PScreen_ItemStorage.rb
Normal file
365
Data/Scripts/016_UI/018_PScreen_ItemStorage.rb
Normal 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
|
||||
259
Data/Scripts/016_UI/019_PScreen_PC.rb
Normal file
259
Data/Scripts/016_UI/019_PScreen_PC.rb
Normal 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)
|
||||
234
Data/Scripts/016_UI/020_PScreen_EggHatching.rb
Normal file
234
Data/Scripts/016_UI/020_PScreen_EggHatching.rb
Normal 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
|
||||
}
|
||||
645
Data/Scripts/016_UI/021_PScreen_Evolution.rb
Normal file
645
Data/Scripts/016_UI/021_PScreen_Evolution.rb
Normal 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
|
||||
248
Data/Scripts/016_UI/022_PScreen_Trading.rb
Normal file
248
Data/Scripts/016_UI/022_PScreen_Trading.rb
Normal 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
|
||||
225
Data/Scripts/016_UI/023_PScreen_MoveRelearner.rb
Normal file
225
Data/Scripts/016_UI/023_PScreen_MoveRelearner.rb
Normal 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
|
||||
1315
Data/Scripts/016_UI/024_PScreen_PurifyChamber.rb
Normal file
1315
Data/Scripts/016_UI/024_PScreen_PurifyChamber.rb
Normal file
File diff suppressed because it is too large
Load Diff
932
Data/Scripts/016_UI/025_PScreen_Mart.rb
Normal file
932
Data/Scripts/016_UI/025_PScreen_Mart.rb
Normal 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
|
||||
427
Data/Scripts/016_UI/026_PScreen_MysteryGift.rb
Normal file
427
Data/Scripts/016_UI/026_PScreen_MysteryGift.rb
Normal 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
|
||||
511
Data/Scripts/016_UI/027_PScreen_HallOfFame.rb
Normal file
511
Data/Scripts/016_UI/027_PScreen_HallOfFame.rb
Normal 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
|
||||
Reference in New Issue
Block a user