Advertisement
Guest User

PokemonField

a guest
Dec 26th, 2013
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 81.65 KB | None | 0 0
  1. ################################################################################
  2. # Interpolators
  3. ################################################################################
  4. class RectInterpolator
  5.   def initialize(oldrect,newrect,frames)
  6.     restart(oldrect,newrect,frames)
  7.   end
  8.  
  9.   def restart(oldrect,newrect,frames)
  10.     @oldrect=oldrect
  11.     @newrect=newrect
  12.     @frames=[frames,1].max
  13.     @curframe=0
  14.     @rect=oldrect.clone
  15.   end
  16.  
  17.   def set(rect)
  18.     rect.set(@rect.x,@rect.y,@rect.width,@rect.height)
  19.   end
  20.  
  21.   def done?
  22.     @curframe>@frames
  23.   end
  24.  
  25.   def update
  26.     return if done?
  27.     t=(@curframe*1.0/@frames)
  28.     x1=@oldrect.x
  29.     x2=@newrect.x
  30.     x=x1+t*(x2-x1)
  31.     y1=@oldrect.y
  32.     y2=@newrect.y
  33.     y=y1+t*(y2-y1)
  34.     rx1=@oldrect.x+@oldrect.width
  35.     rx2=@newrect.x+@newrect.width
  36.     rx=rx1+t*(rx2-rx1)
  37.     ry1=@oldrect.y+@oldrect.height
  38.     ry2=@newrect.y+@newrect.height
  39.     ry=ry1+t*(ry2-ry1)
  40.     minx=x<rx ? x : rx
  41.     maxx=x>rx ? x : rx
  42.     miny=y<ry ? y : ry
  43.     maxy=y>ry ? y : ry
  44.     @rect.set(minx,miny,maxx-minx,maxy-miny)
  45.     @curframe+=1
  46.   end
  47. end
  48.  
  49.  
  50.  
  51. class PointInterpolator
  52.   def initialize(oldx,oldy,newx,newy,frames)
  53.     restart(oldx,oldy,newx,newy,frames)
  54.   end
  55.  
  56.   def restart(oldx,oldy,newx,newy,frames)
  57.     @oldx=oldx
  58.     @oldy=oldy
  59.     @newx=newx
  60.     @newy=newy
  61.     @frames=frames
  62.     @curframe=0
  63.     @x=oldx
  64.     @y=oldy
  65.   end
  66.  
  67.   def x; @x;end
  68.   def y; @y;end
  69.  
  70.   def done?
  71.     @curframe>@frames
  72.   end
  73.  
  74.   def update
  75.     return if done?
  76.     t=(@curframe*1.0/@frames)
  77.     rx1=@oldx
  78.     rx2=@newx
  79.     @x=rx1+t*(rx2-rx1)
  80.     ry1=@oldy
  81.     ry2=@newy
  82.     @y=ry1+t*(ry2-ry1)
  83.     @curframe+=1
  84.   end
  85. end
  86.  
  87.  
  88.  
  89. ################################################################################
  90. # Visibility circle in dark maps
  91. ################################################################################
  92. class DarknessSprite < SpriteWrapper
  93.   attr_reader :radius
  94.  
  95.   def initialize(viewport=nil)
  96.     super(viewport)
  97.     @darkness=BitmapWrapper.new(Graphics.width,Graphics.height)
  98.     @radius=64
  99.     self.bitmap=@darkness
  100.     self.z=99998
  101.     refresh
  102.   end
  103.  
  104.   def dispose
  105.     @darkness.dispose
  106.     super
  107.   end
  108.  
  109.   def radius=(value)
  110.     @radius=value
  111.     refresh
  112.   end
  113.  
  114.   def refresh
  115.     @darkness.fill_rect(0,0,Graphics.width,Graphics.height,Color.new(0,0,0,255))
  116.     cx=Graphics.width/2
  117.     cy=Graphics.height/2
  118.     cradius=@radius
  119.     numfades=5
  120.     for i in 1..numfades
  121.       for j in cx-cradius..cx+cradius
  122.         diff2 = (cradius * cradius) - ((j - cx) * (j - cx))
  123.         diff = Math.sqrt(diff2)
  124.         @darkness.fill_rect(j,cy-diff,1,diff*2,
  125.            Color.new(0, 0, 0, 255.0*(numfades-i)/numfades ))
  126.       end
  127.      cradius=(cradius*0.9).floor
  128.     end
  129.   end
  130. end
  131.  
  132.  
  133.  
  134. ################################################################################
  135. # Location signpost
  136. ################################################################################
  137. class LocationWindow
  138.   def initialize(name)
  139.     @window=Window_AdvancedTextPokemon.new(name)
  140.     @window.resizeToFit(name,Graphics.width)
  141.     @window.x=0
  142.     @window.y=-@window.height
  143.     @window.z=99999
  144.     @currentmap=$game_map.map_id
  145.     @frames=0
  146.   end
  147.  
  148.   def disposed?
  149.     @window.disposed?
  150.   end
  151.  
  152.   def dispose
  153.     @window.dispose
  154.   end
  155.  
  156.   def update
  157.     return if @window.disposed?
  158.     @window.update
  159.     if $game_temp.message_window_showing ||
  160.        @currentmap!=$game_map.map_id
  161.       @window.dispose
  162.       return
  163.     end
  164.     if @frames>80
  165.       @window.y-=4
  166.       @window.dispose if @window.y+@window.height<0
  167.     else
  168.       @window.y+=4 if @window.y<0
  169.       @frames+=1
  170.     end
  171.   end
  172. end
  173.  
  174.  
  175.  
  176. ################################################################################
  177. # Lights
  178. ################################################################################
  179. class LightEffect
  180.   def initialize(event,map=nil,filename=nil)
  181.     @light = IconSprite.new(0,0)
  182.     if filename!=nil && filename!="" && pbResolveBitmap("Graphics/Pictures/"+filename)
  183.       @light.setBitmap("Graphics/Pictures/"+filename)
  184.     else
  185.       @light.setBitmap("Graphics/Pictures/LE")
  186.     end
  187.     @light.z = 1000
  188.     @event = event
  189.     @map=map ? map : $game_map
  190.     @disposed=false
  191.   end
  192.  
  193.   def disposed?
  194.     return @disposed
  195.   end
  196.  
  197.   def dispose
  198.     @light.dispose
  199.     @map=nil
  200.     @event=nil
  201.     @disposed=true
  202.   end
  203.  
  204.   def update
  205.     @light.update
  206.   end
  207. end
  208.  
  209.  
  210.  
  211. class LightEffect_Lamp < LightEffect
  212.   def initialize(event,map=nil)
  213.     @light = Sprite.new
  214.     lamp = AnimatedBitmap.new("Graphics/Pictures/LE")
  215.     @light.bitmap = Bitmap.new(128,64)
  216.     src_rect = Rect.new(0, 0, 64, 64)
  217.     @light.bitmap.blt(0, 0, lamp.bitmap, src_rect)
  218.     @light.bitmap.blt(20, 0, lamp.bitmap, src_rect)
  219.     lamp.dispose
  220.     @light.visible = true
  221.     @light.z = 1000
  222.     @map=map ? map : $game_map
  223.     @event = event
  224.   end
  225. end
  226.  
  227.  
  228.  
  229. class LightEffect_Basic < LightEffect
  230.   def initialize(event,map=nil,filename=nil)
  231.     super
  232.   end
  233.  
  234.   def update
  235.     return if !@light || !@event
  236.     super
  237.     @light.opacity = 100
  238.     @light.ox=32
  239.     @light.oy=48
  240.     if (Object.const_defined?(:ScreenPosHelper) rescue false)
  241.       @light.x = ScreenPosHelper.pbScreenX(@event)
  242.       @light.y = ScreenPosHelper.pbScreenY(@event)
  243.       @light.zoom_x = ScreenPosHelper.pbScreenZoomX(@event)
  244.     else
  245.       @light.x = @event.screen_x
  246.       @light.y = @event.screen_y
  247.       @light.zoom_x = 1.0
  248.     end
  249.     @light.zoom_y = @light.zoom_x
  250.     @light.tone=$game_screen.tone
  251.   end  
  252. end
  253.  
  254.  
  255.  
  256. class LightEffect_DayNight < LightEffect
  257.   def initialize(event,map=nil,filename=nil)
  258.     super
  259.   end
  260.  
  261.   def update
  262.     return if !@light || !@event
  263.     super
  264.     shade=PBDayNight.getShade
  265.     if shade>=144   # If light enough, call it fully day.
  266.       shade=255
  267.     elsif shade<=64   # If dark enough, call it fully night.
  268.       shade=0
  269.     else
  270.       shade=255-(255*(144-shade)/(144-64))
  271.     end
  272.     @light.opacity = 255-shade
  273.     if @light.opacity>0
  274.       @light.ox=32
  275.       @light.oy=48
  276.       if (Object.const_defined?(:ScreenPosHelper) rescue false)
  277.         @light.x = ScreenPosHelper.pbScreenX(@event)
  278.         @light.y = ScreenPosHelper.pbScreenY(@event)
  279.         @light.zoom_x = ScreenPosHelper.pbScreenZoomX(@event)
  280.         @light.zoom_y = ScreenPosHelper.pbScreenZoomY(@event)
  281.       else
  282.         @light.x = @event.screen_x
  283.         @light.y = @event.screen_y
  284.         @light.zoom_x = 1.0
  285.         @light.zoom_y = 1.0
  286.       end
  287.       @light.tone.set($game_screen.tone.red,
  288.                       $game_screen.tone.green,
  289.                       $game_screen.tone.blue,
  290.                       $game_screen.tone.gray)
  291.     end
  292.   end  
  293. end
  294.  
  295.  
  296.  
  297. ################################################################################
  298. # This module stores encounter-modifying events that can happen during the game.
  299. # A procedure can subscribe to an event by adding itself to the event.  It will
  300. # then be called whenever the event occurs.
  301. ################################################################################
  302. module EncounterModifier
  303.   @@procs=[]
  304.   @@procsEnd=[]
  305.  
  306.   def self.register(p)
  307.     @@procs.push(p)
  308.   end
  309.  
  310.   def self.registerEncounterEnd(p)
  311.     @@procsEnd.push(p)
  312.   end
  313.  
  314.   def self.trigger(encounter)
  315.     for prc in @@procs
  316.       encounter=prc.call(encounter)
  317.     end
  318.     return encounter
  319.   end
  320.  
  321.   def self.triggerEncounterEnd()
  322.     for prc in @@procsEnd
  323.       prc.call()
  324.     end
  325.   end
  326. end
  327.  
  328.  
  329.  
  330. ################################################################################
  331. # This module stores events that can happen during the game.  A procedure can
  332. # subscribe to an event by adding itself to the event.  It will then be called
  333. # whenever the event occurs.
  334. ################################################################################
  335. module Events
  336.   @@OnMapChange=Event.new
  337.   @@OnMapSceneChange=Event.new
  338.   @@OnMapUpdate=Event.new
  339.   @@OnMapChanging=Event.new
  340.   @@OnLeaveTile=Event.new
  341.   @@OnStepTaken=Event.new
  342.   @@OnStepTakenTransferPossible=Event.new
  343.   @@OnStepTakenFieldMovement=Event.new
  344.   @@OnWildBattleOverride=Event.new
  345.   @@OnWildBattleEnd=Event.new
  346.   @@OnWildPokemonCreate=Event.new
  347.   @@OnSpritesetCreate=Event.new
  348.   @@OnStartBattle=Event.new
  349.   @@OnEndBattle=Event.new
  350.   @@OnMapCreate=Event.new
  351.   @@OnAction=Event.new
  352.  
  353. # Triggers when the player presses the Action button on the map.
  354.   def self.onAction=(v)
  355.     @@OnAction=v
  356.   end
  357.  
  358.   def self.onAction
  359.     @@OnAction
  360.   end
  361.  
  362.   def self.onStartBattle=(v)
  363.     @@OnStartBattle=v
  364.   end
  365.  
  366.   def self.onStartBattle
  367.     @@OnStartBattle
  368.   end
  369.  
  370.   def self.onEndBattle=(v)
  371.     @@OnEndBattle=v
  372.   end
  373.  
  374.   def self.onEndBattle
  375.     @@OnEndBattle
  376.   end
  377.  
  378. # Fires whenever a map is created. Event handler receives two parameters: the
  379. # map (RPG::Map) and the tileset (RPG::Tileset)
  380.   def self.onMapCreate=(v)
  381.     @@OnMapCreate=v
  382.   end
  383.  
  384.   def self.onMapCreate
  385.     @@OnMapCreate
  386.   end
  387.  
  388. # Fires whenever the player moves to a new map. Event handler receives the old
  389. # map ID or 0 if none.  Also fires when the first map of the game is loaded
  390.   def self.onMapChange=(v)
  391.     @@OnMapChange=v
  392.   end
  393.  
  394.   def self.onMapChange
  395.     @@OnMapChange
  396.   end
  397.  
  398. # Fires whenever one map is about to change to a different one. Event handler
  399. # receives the new map ID and the Game_Map object representing the new map.
  400. # When the event handler is called, $game_map still refers to the old map.
  401.   def self.onMapChanging=(v)
  402.     @@OnMapChanging=v
  403.   end
  404.  
  405.   def self.onMapChanging
  406.     @@OnMapChanging
  407.   end
  408.  
  409. # Fires whenever the player takes a step.
  410.   def self.onStepTaken=(v)
  411.     @@OnStepTaken=v
  412.   end
  413.  
  414.   def self.onStepTaken
  415.     @@OnStepTaken
  416.   end
  417.  
  418. # Fires whenever the player or another event leaves a tile.
  419. # Parameters:
  420. # e[0] - Event that just left the tile.
  421. # e[1] - Map ID where the tile is located (not necessarily
  422. #  the current map). Use "$MapFactory.getMap(e[1])" to
  423. #  get the Game_Map object corresponding to that map.
  424. # e[2] - X-coordinate of the tile
  425. # e[3] - Y-coordinate of the tile
  426.   def self.onLeaveTile=(v)
  427.     @@OnLeaveTile=v
  428.   end
  429.  
  430.   def self.onLeaveTile
  431.     @@OnLeaveTile
  432.   end
  433.  
  434. # Fires whenever the player or another event enters a tile.
  435. # Parameters:
  436. # e[0] - Event that just entered a tile.
  437.   def self.onStepTakenFieldMovement=(v)
  438.     @@OnStepTakenFieldMovement=v
  439.   end
  440.  
  441.   def self.onStepTakenFieldMovement
  442.     @@OnStepTakenFieldMovement
  443.   end
  444.  
  445. # Fires whenever the player takes a step. The event handler may possibly move
  446. # the player elsewhere.
  447. # Parameters:
  448. # e[0] = Array that contains a single boolean value.
  449. #  If an event handler moves the player to a new map, it should set this value
  450. # to true. Other event handlers should check this parameter's value.
  451.   def self.onStepTakenTransferPossible=(v)
  452.     @@OnStepTakenTransferPossible=v
  453.   end
  454.  
  455.   def self.onStepTakenTransferPossible
  456.     @@OnStepTakenTransferPossible
  457.   end
  458.  
  459. # Fires each frame during a map update.
  460.   def self.onMapUpdate=(v)
  461.     @@OnMapUpdate=v
  462.   end
  463.  
  464.   def self.onMapUpdate
  465.     @@OnMapUpdate
  466.   end
  467.  
  468. # Triggers at the start of a wild battle.  Event handlers can provide their own
  469. # wild battle routines to override the default behavior.
  470.   def self.onWildBattleOverride=(v)
  471.     @@OnWildBattleOverride=v
  472.   end
  473.  
  474.   def self.onWildBattleOverride
  475.     @@OnWildBattleOverride
  476.   end
  477.  
  478. # Triggers whenever a wild Pokémon battle ends
  479. # Parameters:
  480. # e[0] - Pokémon species
  481. # e[1] - Pokémon level
  482. # e[2] - Battle result (1-win, 2-loss, 3-escaped, 4-caught, 5-draw)
  483.   def self.onWildBattleEnd=(v)
  484.     @@OnWildBattleEnd=v
  485.   end
  486.  
  487.   def self.onWildBattleEnd
  488.     @@OnWildBattleEnd
  489.   end
  490.  
  491. # Triggers whenever a wild Pokémon is created
  492. # Parameters:
  493. # e[0] - Pokémon being created
  494.   def self.onWildPokemonCreate=(v)
  495.     @@OnWildPokemonCreate=v
  496.   end
  497.  
  498.   def self.onWildPokemonCreate
  499.     @@OnWildPokemonCreate
  500.   end
  501.  
  502. # Fires whenever the map scene is regenerated and soon after the player moves
  503. # to a new map.
  504. # Parameters:
  505. # e[0] = Scene_Map object.
  506. # e[1] = Whether the player just moved to a new map (either true or false).  If
  507. #   false, some other code had called $scene.createSpritesets to regenerate the
  508. #   map scene without transferring the player elsewhere
  509.   def self.onMapSceneChange=(v)
  510.     @@OnMapSceneChange=v
  511.   end
  512.  
  513.   def self.onMapSceneChange
  514.     @@OnMapSceneChange
  515.   end
  516.  
  517. # Fires whenever a spriteset is created.
  518. # Parameters:
  519. # e[0] = Spriteset being created
  520. # e[1] = Viewport used for tilemap and characters
  521. # e[0].map = Map associated with the spriteset (not necessarily the current map).
  522.   def self.onSpritesetCreate=(v)
  523.     @@OnSpritesetCreate=v
  524.   end
  525.  
  526.   def self.onSpritesetCreate
  527.     @@OnSpritesetCreate
  528.   end
  529. end
  530.  
  531.  
  532.  
  533. ################################################################################
  534. # Terrain tags
  535. ################################################################################
  536. class PBTerrain
  537.   Ledge           = 1
  538.   Grass           = 2
  539.   Sand            = 3
  540.   Rock            = 4
  541.   DeepWater       = 5
  542.   StillWater      = 6
  543.   Water           = 7
  544.   Waterfall       = 8
  545.   WaterfallCrest  = 9
  546.   TallGrass       = 10
  547.   UnderwaterGrass = 11
  548.   Ice             = 12
  549.   Neutral         = 13
  550.   SootGrass       = 14
  551.   Bridge          = 15
  552.   Flowers         = 16
  553. end
  554.  
  555.  
  556.  
  557. def pbIsSurfableTag?(tag)
  558.   return pbIsWaterTag?(tag)
  559. end
  560.  
  561. def pbIsWaterTag?(tag)
  562.   return tag==PBTerrain::DeepWater ||
  563.          tag==PBTerrain::Water ||
  564.          tag==PBTerrain::StillWater ||
  565.          tag==PBTerrain::WaterfallCrest ||
  566.          tag==PBTerrain::Waterfall
  567. end
  568.  
  569. def pbIsPassableWaterTag?(tag)
  570.   return tag==PBTerrain::DeepWater ||
  571.          tag==PBTerrain::Water ||
  572.          tag==PBTerrain::StillWater ||
  573.          tag==PBTerrain::WaterfallCrest
  574. end
  575.  
  576. def pbIsJustWaterTag?(tag)
  577.   return tag==PBTerrain::DeepWater ||
  578.          tag==PBTerrain::Water ||
  579.          tag==PBTerrain::StillWater
  580. end
  581.  
  582. def pbIsGrassTag?(tag)
  583.   return tag==PBTerrain::Grass ||
  584.          tag==PBTerrain::Flowers ||
  585.          tag==PBTerrain::TallGrass ||
  586.          tag==PBTerrain::UnderwaterGrass
  587. end
  588.  
  589.  
  590.  
  591. ################################################################################
  592. # Battles
  593. ################################################################################
  594. class Game_Temp
  595.   attr_accessor :background_bitmap
  596. end
  597.  
  598.  
  599.  
  600. def pbNewBattleScene
  601.   return PokeBattle_Scene.new
  602. end
  603.  
  604. def pbSceneStandby
  605.   if $scene && $scene.is_a?(Scene_Map)
  606.     $scene.disposeSpritesets
  607.   end
  608.   GC.start
  609.   Graphics.frame_reset
  610.   yield
  611.   if $scene && $scene.is_a?(Scene_Map)
  612.     $scene.createSpritesets
  613.   end
  614. end
  615.  
  616. def pbBattleAnimation(bgm=nil,trainerid=-1,trainername="")
  617.   handled=false
  618.   playingBGS=nil
  619.   playingBGM=nil
  620.   if $game_system && $game_system.is_a?(Game_System)
  621.     playingBGS=$game_system.getPlayingBGS
  622.     playingBGM=$game_system.getPlayingBGM
  623.     $game_system.bgm_pause
  624.     $game_system.bgs_pause
  625.   end
  626.   pbMEFade(0.25)
  627.   pbWait(10)
  628.   pbMEStop
  629.   if bgm
  630.     pbBGMPlay(bgm)
  631.   else
  632.     pbBGMPlay(pbGetWildBattleBGM(0))
  633.   end
  634.   viewport=Viewport.new(0,0,Graphics.width,Graphics.height)
  635.   viewport.z=99999
  636. # Fade to gray a few times.
  637.   viewport.color=Color.new(17*8,17*8,17*8)
  638.   3.times do
  639.     viewport.color.alpha=0
  640.     6.times do
  641.       viewport.color.alpha+=30
  642.       Graphics.update
  643.       Input.update
  644.       pbUpdateSceneMap
  645.     end
  646.     6.times do
  647.       viewport.color.alpha-=30
  648.       Graphics.update
  649.       Input.update
  650.       pbUpdateSceneMap
  651.     end
  652.   end
  653.   if $game_temp.background_bitmap
  654.     $game_temp.background_bitmap.dispose
  655.   end
  656.   $game_temp.background_bitmap=Graphics.snap_to_bitmap
  657. # Animate the screen ($game_temp.background_bitmap contains
  658. # the current game screen).
  659. #
  660. # The following example runs a common event that does a custom animation if some
  661. # condition is true. The screen should fade to black when the common event is
  662. # finished:
  663. #
  664. # if $game_map && $game_map.map_id==20  # If on map 20
  665. #   pbCommonEvent(20)
  666. #   handled=true                        # Note that the battle animation is done
  667. # end
  668. #
  669. ################################################################################
  670. # VS animation, by Luka S.J.
  671. # Tweaked by Maruno.
  672. ################################################################################
  673.   if trainerid>=0 &&
  674.      (FileTest.image_exist?(sprintf("Graphics/Transitions/vsBar#{getConstantName(PBTrainers,trainerid)}")) ||
  675.       FileTest.image_exist?(sprintf("Graphics/Transitions/vsBar#{trainerid}")) ) &&
  676.      (FileTest.image_exist?(sprintf("Graphics/Transitions/vsTrainer#{getConstantName(PBTrainers,trainerid)}")) ||
  677.       FileTest.image_exist?(sprintf("Graphics/Transitions/vsTrainer#{trainerid}")) )
  678.     # Set up
  679.     viewplayer=Viewport.new(0,Graphics.height/3,Graphics.width/2,128)
  680.     viewplayer.z=viewport.z
  681.     viewopp=Viewport.new(Graphics.width/2,Graphics.height/3,Graphics.width/2,128)
  682.     viewopp.z=viewport.z
  683.     viewvs=Viewport.new(0,0,Graphics.width,Graphics.height)
  684.     viewvs.z=viewport.z
  685.     xoffset=(Graphics.width/2)/10
  686.     xoffset=xoffset.round
  687.     xoffset=xoffset*10
  688.     fade=Sprite.new(viewport)
  689.     fade.bitmap=BitmapCache.load_bitmap("Graphics/Transitions/vsFlash")
  690.     fade.tone=Tone.new(-255,-255,-255)
  691.     fade.opacity=100
  692.     overlay=Sprite.new(viewport)
  693.     overlay.bitmap=Bitmap.new(Graphics.width,Graphics.height)
  694.     pbSetSystemFont(overlay.bitmap)
  695.     bar1=Sprite.new(viewplayer)
  696.     if FileTest.image_exist?(sprintf("Graphics/Transitions/vsBar#{getConstantName(PBTrainers,$Trainer.trainertype)}"))
  697.       bar1.bitmap=BitmapCache.load_bitmap("Graphics/Transitions/vsBar#{getConstantName(PBTrainers,$Trainer.trainertype)}")
  698.     else
  699.       bar1.bitmap=BitmapCache.load_bitmap("Graphics/Transitions/vsBar#{$Trainer.trainertype}")
  700.     end
  701.     bar1.x=-xoffset
  702.     bar2=Sprite.new(viewopp)
  703.     if FileTest.image_exist?(sprintf("Graphics/Transitions/vsBar#{getConstantName(PBTrainers,trainerid)}"))
  704.       bar2.bitmap=BitmapCache.load_bitmap("Graphics/Transitions/vsBar#{getConstantName(PBTrainers,trainerid)}")
  705.     else
  706.       bar2.bitmap=BitmapCache.load_bitmap("Graphics/Transitions/vsBar#{trainerid}")
  707.     end
  708.     bar2.x=xoffset
  709.     vs=Sprite.new(viewvs)
  710.     vs.bitmap=BitmapCache.load_bitmap("Graphics/Transitions/vs")
  711.     vs.ox=vs.bitmap.width/2
  712.     vs.oy=vs.bitmap.height/2
  713.     vs.x=Graphics.width/2
  714.     vs.y=Graphics.height/1.5
  715.     vs.visible=false
  716.     flash=Sprite.new(viewvs)
  717.     flash.bitmap=BitmapCache.load_bitmap("Graphics/Transitions/vsFlash")
  718.     flash.opacity=0
  719.     # Animation
  720.     10.times do
  721.       bar1.x+=xoffset/10
  722.       bar2.x-=xoffset/10
  723.       pbWait(1)
  724.     end
  725.     pbSEPlay("Flash2")
  726.     pbSEPlay("Sword2")
  727.     flash.opacity=255
  728.     bar1=AnimatedPlane.new(viewplayer)
  729.     if FileTest.image_exist?(sprintf("Graphics/Transitions/vsBar#{getConstantName(PBTrainers,$Trainer.trainertype)}"))
  730.       bar1.bitmap=BitmapCache.load_bitmap("Graphics/Transitions/vsBar#{getConstantName(PBTrainers,$Trainer.trainertype)}")
  731.     else
  732.       bar1.bitmap=BitmapCache.load_bitmap("Graphics/Transitions/vsBar#{$Trainer.trainertype}")
  733.     end
  734.     player=Sprite.new(viewplayer)
  735.     if FileTest.image_exist?(sprintf("Graphics/Transitions/vsTrainer#{getConstantName(PBTrainers,$Trainer.trainertype)}"))
  736.       player.bitmap=BitmapCache.load_bitmap("Graphics/Transitions/vsTrainer#{getConstantName(PBTrainers,$Trainer.trainertype)}")
  737.     else
  738.       player.bitmap=BitmapCache.load_bitmap("Graphics/Transitions/vsTrainer#{$Trainer.trainertype}")
  739.     end
  740.     player.x=-xoffset
  741.     bar2=AnimatedPlane.new(viewopp)
  742.     if FileTest.image_exist?(sprintf("Graphics/Transitions/vsBar#{getConstantName(PBTrainers,trainerid)}"))
  743.       bar2.bitmap=BitmapCache.load_bitmap("Graphics/Transitions/vsBar#{getConstantName(PBTrainers,trainerid)}")
  744.     else
  745.       bar2.bitmap=BitmapCache.load_bitmap("Graphics/Transitions/vsBar#{trainerid}")
  746.     end
  747.     trainer=Sprite.new(viewopp)
  748.     if FileTest.image_exist?(sprintf("Graphics/Transitions/vsTrainer#{getConstantName(PBTrainers,trainerid)}"))
  749.       trainer.bitmap=BitmapCache.load_bitmap("Graphics/Transitions/vsTrainer#{getConstantName(PBTrainers,trainerid)}")
  750.     else
  751.       trainer.bitmap=BitmapCache.load_bitmap("Graphics/Transitions/vsTrainer#{trainerid}")
  752.     end
  753.     trainer.x=xoffset
  754.     trainer.tone=Tone.new(-255,-255,-255)
  755.     25.times do
  756.       flash.opacity-=51 if flash.opacity>0
  757.       bar1.ox-=16
  758.       bar2.ox+=16
  759.       pbWait(1)
  760.     end
  761.     11.times do
  762.       bar1.ox-=16
  763.       bar2.ox+=16
  764.       player.x+=xoffset/10
  765.       trainer.x-=xoffset/10
  766.       pbWait(1)
  767.     end
  768.     2.times do
  769.       bar1.ox-=16
  770.       bar2.ox+=16
  771.       player.x-=xoffset/20
  772.       trainer.x+=xoffset/20
  773.       pbWait(1)
  774.     end
  775.     10.times do
  776.       bar1.ox-=16
  777.       bar2.ox+=16
  778.       pbWait(1)
  779.     end
  780.     val=2
  781.     flash.opacity=255
  782.     vs.visible=true
  783.     trainer.tone=Tone.new(0,0,0)
  784.     textpos=[
  785.        [_INTL("{1}",$Trainer.name),Graphics.width/4,(Graphics.height/1.5)+10,2,
  786.           Color.new(248,248,248),Color.new(12*6,12*6,12*6)],
  787.        [_INTL("{1}",trainername),(Graphics.width/4)+(Graphics.width/2),(Graphics.height/1.5)+10,2,
  788.           Color.new(248,248,248),Color.new(12*6,12*6,12*6)]
  789.     ]
  790.     pbDrawTextPositions(overlay.bitmap,textpos)
  791.     pbSEPlay("Sword2")
  792.     70.times do
  793.       bar1.ox-=16
  794.       bar2.ox+=16
  795.       flash.opacity-=25.5 if flash.opacity>0
  796.       vs.x+=val
  797.       vs.y-=val
  798.       val=2 if vs.x<=(Graphics.width/2)-2
  799.       val=-2 if vs.x>=(Graphics.width/2)+2
  800.       pbWait(1)
  801.     end
  802.     30.times do
  803.       bar1.ox-=16
  804.       bar2.ox+=16
  805.       vs.zoom_x+=0.2
  806.       vs.zoom_y+=0.2
  807.       pbWait(1)
  808.     end
  809.     flash.tone=Tone.new(-255,-255,-255)
  810.     10.times do
  811.       bar1.ox-=16
  812.       bar2.ox+=16
  813.       flash.opacity+=25.5
  814.       pbWait(1)
  815.     end
  816.     # End
  817.     fade.dispose
  818.     overlay.dispose
  819.     bar1.dispose
  820.     bar2.dispose
  821.     player.dispose
  822.     trainer.dispose
  823.     vs.dispose
  824.     flash.dispose
  825.     viewplayer.dispose
  826.     viewopp.dispose
  827.     viewvs.dispose
  828.     handled=true
  829.   end
  830.   if !handled
  831.     if Sprite.method_defined?(:wave_amp) && rand(15)==0
  832.       viewport.color=Color.new(0,0,0,255)
  833.       sprite = Sprite.new
  834.       bitmap=Graphics.snap_to_bitmap
  835.       bm=bitmap.clone
  836.       sprite.z=99999
  837.       sprite.bitmap = bm
  838.       sprite.wave_speed=500
  839.       for i in 0..25
  840.         sprite.opacity-=10
  841.         sprite.wave_amp+=60
  842.         sprite.update
  843.         sprite.wave_speed+=30
  844.         2.times do
  845.           Graphics.update
  846.         end
  847.       end
  848.       bitmap.dispose
  849.       bm.dispose
  850.       sprite.dispose
  851.     elsif Bitmap.method_defined?(:radial_blur) && rand(15)==0
  852.       viewport.color=Color.new(0,0,0,255)
  853.       sprite = Sprite.new
  854.       bitmap=Graphics.snap_to_bitmap
  855.       bm=bitmap.clone
  856.       sprite.z=99999
  857.       sprite.bitmap = bm
  858.       for i in 0..15
  859.         bm.radial_blur(i,2)
  860.         sprite.opacity-=15
  861.         2.times do
  862.           Graphics.update
  863.         end
  864.       end
  865.       bitmap.dispose
  866.       bm.dispose
  867.       sprite.dispose
  868.     elsif rand(15)==0
  869.       scroll=["ScrollDown","ScrollLeft","ScrollRight","ScrollUp"]
  870.       Graphics.freeze
  871.       viewport.color=Color.new(0,0,0,255)
  872.       Graphics.transition(50,sprintf("Graphics/Transitions/%s",scroll[rand(4)]))
  873.     elsif rand(15)==0
  874.       scroll=["ScrollDownRight","ScrollDownLeft","ScrollUpRight","ScrollUpLeft"]
  875.       Graphics.freeze
  876.       viewport.color=Color.new(0,0,0,255)
  877.       Graphics.transition(50,sprintf("Graphics/Transitions/%s",scroll[rand(4)]))
  878.     else
  879.       transitions=["Splash","Image1","Image2",
  880.          "Image3","Image4","Random_stripe_h",
  881.          "Random_stripe_v","BreakingGlass",
  882.          "RotatingPieces","022-Normal02",
  883.          "021-Normal01","Battle","Mosaic","ShrinkingPieces","zoomin",
  884.          "computertrclose","hexatr","hexatzr",
  885.          "battle1","battle2","battle3","battle4",
  886.          "computertr","hexatrc"
  887.       ]
  888.       rnd=rand(transitions.length)
  889.       Graphics.freeze
  890.       viewport.color=Color.new(0,0,0,255)
  891.       Graphics.transition(40,sprintf("Graphics/Transitions/%s",transitions[rnd]))
  892.     end
  893.     5.times do
  894.       Graphics.update
  895.       Input.update
  896.       pbUpdateSceneMap
  897.     end
  898.   end
  899.   pbPushFade
  900.   yield if block_given?
  901.   pbPopFade
  902.   if $game_system && $game_system.is_a?(Game_System)
  903.     $game_system.bgm_resume(playingBGM)
  904.     $game_system.bgs_resume(playingBGS)
  905.   end
  906.   $PokemonGlobal.nextBattleBGM=nil
  907.   $PokemonGlobal.nextBattleME=nil
  908.   $PokemonGlobal.nextBattleBack=nil
  909.   $PokemonEncounters.clearStepCount
  910.   for j in 0..17
  911.     viewport.color=Color.new(0,0,0,(17-j)*15)
  912.     Graphics.update
  913.     Input.update
  914.     pbUpdateSceneMap
  915.   end
  916.   viewport.dispose
  917. end
  918.  
  919. def pbPrepareBattle(battle)
  920.   if $game_screen.weather_type==1 || $game_screen.weather_type==2
  921.     battle.weather=PBWeather::RAINDANCE
  922.     battle.weatherduration=-1
  923.   elsif $game_screen.weather_type==3
  924.     battle.weather=PBWeather::HAIL
  925.     battle.weatherduration=-1
  926.   elsif $game_screen.weather_type==4
  927.     battle.weather=PBWeather::SANDSTORM
  928.     battle.weatherduration=-1
  929.   elsif $game_screen.weather_type==5
  930.     battle.weather=PBWeather::SUNNYDAY
  931.     battle.weatherduration=-1
  932.   end
  933.   battle.shiftStyle=($PokemonSystem.battlestyle==0)
  934.   battle.battlescene=($PokemonSystem.battlescene==0)
  935.   battle.environment=pbGetEnvironment
  936. end
  937.  
  938. def pbGetEnvironment
  939.   return PBEnvironment::None if !$game_map
  940.   if $PokemonGlobal && $PokemonGlobal.diving
  941.     return PBEnvironment::Underwater
  942.   elsif $PokemonEncounters && $PokemonEncounters.isCave?
  943.     return PBEnvironment::Cave
  944.   elsif !pbGetMetadata($game_map.map_id,MetadataOutdoor)
  945.     return PBEnvironment::None
  946.   else
  947.     terrain=$game_player.terrain_tag
  948.     if terrain==PBTerrain::Grass # Normal grass
  949.       return PBEnvironment::Grass
  950.     elsif terrain==PBTerrain::TallGrass # Tall grass
  951.       return PBEnvironment::TallGrass
  952.     elsif terrain==PBTerrain::DeepWater || terrain==PBTerrain::Water
  953.       return PBEnvironment::MovingWater
  954.     elsif terrain==PBTerrain::StillWater
  955.       return PBEnvironment::StillWater
  956.     elsif terrain==PBTerrain::Rock
  957.       return PBEnvironment::Rock
  958.     elsif terrain==PBTerrain::Sand
  959.       return PBEnvironment::Sand
  960.     end
  961.     return PBEnvironment::None
  962.   end
  963. end
  964.  
  965. def pbGenerateWildPokemon(species,level)
  966.   genwildpoke=PokeBattle_Pokemon.new(species,level,$Trainer)
  967.   items=genwildpoke.wildHoldItems
  968.   chances=[50,5,1]
  969.   chances=[60,20,5] if !$Trainer.party[0].egg? &&
  970.      isConst?($Trainer.party[0].ability,PBAbilities,:COMPOUNDEYES)
  971.   itemrnd=rand(100)
  972.   if itemrnd<chances[0] || (items[0]==items[1] && items[1]==items[2])
  973.     genwildpoke.item=items[0]
  974.   elsif itemrnd<(chances[0]+chances[1])
  975.     genwildpoke.item=items[1]
  976.   elsif itemrnd<(chances[0]+chances[1]+chances[2])
  977.     genwildpoke.item=items[2]
  978.   end
  979.   if getConst(PBItems,:SHINYCHARM) && $PokemonBag.pbQuantity(PBItems::SHINYCHARM)>0
  980.     for i in 0...2   # 3 times as likely
  981.       genwildpoke.personalID=rand(65536)|(rand(65536)<<16) if !genwildpoke.isShiny?
  982.     end
  983.   end
  984.   if rand(65536)<POKERUSCHANCE
  985.     genwildpoke.givePokerus
  986.   end
  987.   Events.onWildPokemonCreate.trigger(nil,genwildpoke)
  988.   return genwildpoke
  989. end
  990.  
  991. def pbWildBattle(species,level,variable=nil,canescape=true,canlose=false)
  992.   if (Input.press?(Input::CTRL) && $DEBUG) || $Trainer.pokemonCount==0
  993.     if $Trainer.pokemonCount>0
  994.       Kernel.pbMessage(_INTL("SKIPPING BATTLE..."))
  995.     end
  996.     pbSet(variable,1)
  997.     $PokemonGlobal.nextBattleBGM=nil
  998.     $PokemonGlobal.nextBattleME=nil
  999.     $PokemonGlobal.nextBattleBack=nil
  1000.     return true
  1001.   end
  1002.   handled=[nil]
  1003.   Events.onWildBattleOverride.trigger(nil,species,level,handled)
  1004.   if handled[0]!=nil
  1005.     return handled[0]
  1006.   end
  1007.   currentlevels=[]
  1008.   for i in $Trainer.party
  1009.     currentlevels.push(i.level)
  1010.   end
  1011.   genwildpoke=pbGenerateWildPokemon(species,level)
  1012.   Events.onStartBattle.trigger(nil,genwildpoke)
  1013.   scene=pbNewBattleScene
  1014.   battle=PokeBattle_Battle.new(scene,$Trainer.party,[genwildpoke],$Trainer,nil)
  1015.   battle.internalbattle=true
  1016.   battle.cantescape=!canescape
  1017.   pbPrepareBattle(battle)
  1018.   decision=0
  1019.   pbBattleAnimation(pbGetWildBattleBGM(species)) {
  1020.      pbSceneStandby {
  1021.         decision=battle.pbStartBattle(canlose)
  1022.      }
  1023.      for i in $Trainer.party; (i.makeUnmega rescue nil); end
  1024.      if $PokemonGlobal.partner
  1025.        pbHealAll
  1026.        for i in $PokemonGlobal.partner[3]
  1027.          i.heal
  1028.          i.makeUnmega rescue nil
  1029.        end
  1030.      end
  1031.      if decision==2 || decision==5 # if loss or draw
  1032.        if canlose
  1033.          for i in $Trainer.party; i.heal; end
  1034.          for i in 0...10
  1035.            Graphics.update
  1036.          end
  1037.        else
  1038.          $game_system.bgm_unpause
  1039.          $game_system.bgs_unpause
  1040.          Kernel.pbStartOver
  1041.        end
  1042.      end
  1043.      Events.onEndBattle.trigger(nil,decision)
  1044.   }
  1045.   Input.update
  1046.   pbSet(variable,decision)
  1047.   Events.onWildBattleEnd.trigger(nil,species,level,decision)
  1048.   return (decision!=2)
  1049. end
  1050.  
  1051. def pbDoubleWildBattle(species1,level1,species2,level2,variable=nil,canescape=true,canlose=false)
  1052.   if (Input.press?(Input::CTRL) && $DEBUG) || $Trainer.pokemonCount==0
  1053.     if $Trainer.pokemonCount>0
  1054.       Kernel.pbMessage(_INTL("SKIPPING BATTLE..."))
  1055.     end
  1056.     pbSet(variable,1)
  1057.     $PokemonGlobal.nextBattleBGM=nil
  1058.     $PokemonGlobal.nextBattleME=nil
  1059.     $PokemonGlobal.nextBattleBack=nil
  1060.     return true
  1061.   end
  1062.   currentlevels=[]
  1063.   for i in $Trainer.party
  1064.     currentlevels.push(i.level)
  1065.   end
  1066.   genwildpoke=pbGenerateWildPokemon(species1,level1)
  1067.   genwildpoke2=pbGenerateWildPokemon(species2,level2)
  1068.   Events.onStartBattle.trigger(nil,genwildpoke)
  1069.   scene=pbNewBattleScene
  1070.   if $PokemonGlobal.partner
  1071.     othertrainer=PokeBattle_Trainer.new(
  1072.        $PokemonGlobal.partner[1],$PokemonGlobal.partner[0])
  1073.     othertrainer.id=$PokemonGlobal.partner[2]
  1074.     othertrainer.party=$PokemonGlobal.partner[3]
  1075.     combinedParty=[]
  1076.     for i in 0...$Trainer.party.length
  1077.       combinedParty[i]=$Trainer.party[i]
  1078.     end
  1079.     for i in 0...othertrainer.party.length
  1080.       combinedParty[6+i]=othertrainer.party[i]
  1081.     end
  1082.     battle=PokeBattle_Battle.new(scene,combinedParty,[genwildpoke,genwildpoke2],
  1083.        [$Trainer,othertrainer],nil)
  1084.     battle.fullparty1=true
  1085.   else
  1086.     battle=PokeBattle_Battle.new(scene,$Trainer.party,[genwildpoke,genwildpoke2],
  1087.        $Trainer,nil)
  1088.   end
  1089.   battle.internalbattle=true
  1090.   battle.doublebattle=battle.pbDoubleBattleAllowed?()
  1091.   battle.cantescape=!canescape
  1092.   pbPrepareBattle(battle)
  1093.   decision=0
  1094.   pbBattleAnimation(pbGetWildBattleBGM(species1)) {
  1095.      pbSceneStandby {
  1096.         decision=battle.pbStartBattle(canlose)
  1097.      }
  1098.      for i in $Trainer.party; (i.makeUnmega rescue nil); end
  1099.      if $PokemonGlobal.partner
  1100.        pbHealAll
  1101.        for i in $PokemonGlobal.partner[3]
  1102.          i.heal
  1103.          i.makeUnmega rescue nil
  1104.        end
  1105.      end
  1106.      if decision==2 || decision==5
  1107.        if canlose
  1108.          for i in $Trainer.party; i.heal; end
  1109.          for i in 0...10
  1110.            Graphics.update
  1111.          end
  1112.        else
  1113.          $game_system.bgm_unpause
  1114.          $game_system.bgs_unpause
  1115.          Kernel.pbStartOver
  1116.        end
  1117.      end
  1118.      Events.onEndBattle.trigger(nil,decision)
  1119.   }
  1120.   Input.update
  1121.   pbSet(variable,decision)
  1122.   return (decision!=2 && decision!=5)
  1123. end
  1124.  
  1125. def pbCheckAllFainted()
  1126.   if pbAllFainted
  1127.     Kernel.pbMessage(_INTL("{1} has no usable Pokémon!\1",$Trainer.name))
  1128.     Kernel.pbMessage(_INTL("{1} blacked out!",$Trainer.name))
  1129.     pbBGMFade(1.0)
  1130.     pbBGSFade(1.0)
  1131.     pbFadeOutIn(99999){
  1132.        Kernel.pbStartOver
  1133.     }
  1134.   end
  1135. end
  1136.  
  1137. def pbEvolutionCheck(currentlevels)
  1138.   # Check conditions for evolution
  1139.   for i in 0...currentlevels.length
  1140.     pokemon=$Trainer.party[i]
  1141.     if pokemon && (!currentlevels[i] || pokemon.level!=currentlevels[i])
  1142.       newspecies=Kernel.pbCheckEvolution(pokemon)
  1143.       if newspecies>0
  1144.         # Start evolution scene
  1145.         evo=PokemonEvolutionScene.new
  1146.         evo.pbStartScreen(pokemon,newspecies)
  1147.         evo.pbEvolution
  1148.         evo.pbEndScreen
  1149.       end
  1150.     end
  1151.   end
  1152. end
  1153.  
  1154. def pbDynamicItemList(*args)
  1155.   ret=[]
  1156.   for i in 0...args.length
  1157.     if hasConst?(PBItems,args[i])
  1158.       ret.push(getConst(PBItems,args[i].to_sym))
  1159.     end
  1160.   end
  1161.   return ret
  1162. end
  1163.  
  1164. # Runs the Pickup event after a battle if a Pokemon has the ability Pickup.
  1165. def Kernel.pbPickup(pokemon)
  1166.   return if !isConst?(pokemon.ability,PBAbilities,:PICKUP) || pokemon.egg?
  1167.   return if pokemon.item!=0
  1168.   return if rand(10)!=0
  1169.   pickupList=pbDynamicItemList(
  1170.      :POTION,
  1171.      :ANTIDOTE,
  1172.      :SUPERPOTION,
  1173.      :GREATBALL,
  1174.      :REPEL,
  1175.      :ESCAPEROPE,
  1176.      :FULLHEAL,
  1177.      :HYPERPOTION,
  1178.      :ULTRABALL,
  1179.      :REVIVE,
  1180.      :RARECANDY,
  1181.      :SUNSTONE,
  1182.      :MOONSTONE,
  1183.      :HEARTSCALE,
  1184.      :FULLRESTORE,
  1185.      :MAXREVIVE,
  1186.      :PPUP,
  1187.      :MAXELIXIR
  1188.   )
  1189.   pickupListRare=pbDynamicItemList(
  1190.      :MAXREPEL,
  1191.      :NUGGET,
  1192.      :KINGSROCK,
  1193.      :FULLRESTORE,
  1194.      :IRONBALL,
  1195.      :LUCKYEGG,
  1196.      :PRISMSCALE,
  1197.      :ELIXIR,
  1198.      :PRISMSCALE,
  1199.      :LEFTOVERS,
  1200.      :PRISMSCALE
  1201.   )
  1202.   return if pickupList.length!=18
  1203.   return if pickupListRare.length!=11
  1204.   randlist=[30,10,10,10,10,10,10,4,4,1,1]
  1205.   items=[]
  1206.   plevel=[100,pokemon.level].min
  1207.   rnd=rand(100)
  1208.   itemstart=(plevel-1)/10
  1209.   itemstart=0 if itemstart<0
  1210.   for i in 0...9
  1211.     items.push(pickupList[i+itemstart])
  1212.   end
  1213.   items.push(pickupListRare[itemstart])
  1214.   items.push(pickupListRare[itemstart+1])
  1215.   cumnumber=0
  1216.   for i in 0...11
  1217.     cumnumber+=randlist[i]
  1218.     if rnd<cumnumber
  1219.       pokemon.item=items[i]
  1220.       break
  1221.     end
  1222.   end
  1223. end
  1224.  
  1225.  
  1226.  
  1227. class PokemonTemp
  1228.   attr_accessor :encounterType
  1229.   attr_accessor :evolutionLevels
  1230. end
  1231.  
  1232.  
  1233.  
  1234. def pbEncounter(enctype)
  1235.   if $PokemonGlobal.partner
  1236.     encounter1=$PokemonEncounters.pbEncounteredPokemon(enctype)
  1237.     return false if !encounter1
  1238.     encounter2=$PokemonEncounters.pbEncounteredPokemon(enctype)
  1239.     return false if !encounter2
  1240.     $PokemonTemp.encounterType=enctype
  1241.     pbDoubleWildBattle(encounter1[0],encounter1[1],encounter2[0],encounter2[1])
  1242.     $PokemonTemp.encounterType=-1
  1243.     return true
  1244.   else
  1245.     encounter=$PokemonEncounters.pbEncounteredPokemon(enctype)
  1246.     return false if !encounter
  1247.     $PokemonTemp.encounterType=enctype
  1248.     pbWildBattle(encounter[0],encounter[1])
  1249.       $PokemonTemp.encounterType=-1
  1250.     return true
  1251.   end
  1252. end
  1253.  
  1254. Events.onStartBattle+=proc {|sender,e|
  1255.   $PokemonTemp.evolutionLevels=[]
  1256.   for i in 0...$Trainer.party.length
  1257.     $PokemonTemp.evolutionLevels[i]=$Trainer.party[i].level
  1258.   end
  1259. }
  1260.  
  1261. Events.onEndBattle+=proc {|sender,e|
  1262.   decision=e[0]
  1263.   if decision!=2 && decision!=5 # not a loss or a draw
  1264.     if $PokemonTemp.evolutionLevels
  1265.       pbEvolutionCheck($PokemonTemp.evolutionLevels)
  1266.       $PokemonTemp.evolutionLevels=nil
  1267.     end
  1268.   end
  1269.   if decision==1
  1270.     for pkmn in $Trainer.party
  1271.       Kernel.pbPickup(pkmn)
  1272.       if isConst?(pkmn.ability,PBAbilities,:HONEYGATHER) && !pkmn.egg? && pkmn.item==0
  1273.         if hasConst?(PBItems,:HONEY)
  1274.           chance = 5 + ((pkmn.level-1)/10)*5
  1275.           pkmn.item=getConst(PBItems,:HONEY) if rand(100)<chance
  1276.         end
  1277.       end
  1278.     end
  1279.   end
  1280. }
  1281.  
  1282.  
  1283.  
  1284. ################################################################################
  1285. # Scene_Map and Spriteset_Map
  1286. ################################################################################
  1287. class Scene_Map
  1288.   def createSingleSpriteset(map)
  1289.     temp=$scene.spriteset.getAnimations
  1290.     @spritesets[map]=Spriteset_Map.new($MapFactory.maps[map])
  1291.     $scene.spriteset.restoreAnimations(temp)
  1292.     $MapFactory.setSceneStarted(self)
  1293.     updateSpritesets
  1294.   end
  1295. end
  1296.  
  1297.  
  1298.  
  1299. class Spriteset_Map
  1300.   def getAnimations
  1301.     return @usersprites
  1302.   end
  1303.  
  1304.   def restoreAnimations(anims)
  1305.     @usersprites=anims
  1306.   end
  1307. end
  1308.  
  1309.  
  1310.  
  1311. Events.onSpritesetCreate+=proc{|sender,e|
  1312.   spriteset=e[0] # Spriteset being created
  1313.   viewport=e[1] # Viewport used for tilemap and characters
  1314.   map=spriteset.map # Map associated with the spriteset (not necessarily the current map).
  1315.   for i in map.events.keys
  1316.     if map.events[i].name[/^OutdoorLight\((\w+)\)$/]
  1317.       filename=$~[1].to_s
  1318.       spriteset.addUserSprite(LightEffect_DayNight.new(map.events[i],map,filename))
  1319.     elsif map.events[i].name=="OutdoorLight"
  1320.       spriteset.addUserSprite(LightEffect_DayNight.new(map.events[i],map))
  1321.     elsif map.events[i].name[/^Light\((\w+)\)$/]
  1322.       filename=$~[1].to_s
  1323.       spriteset.addUserSprite(LightEffect_Basic.new(map.events[i],map,filename))
  1324.     elsif map.events[i].name=="Light"
  1325.       spriteset.addUserSprite(LightEffect_Basic.new(map.events[i],map))
  1326.     end
  1327.   end
  1328.   spriteset.addUserSprite(Particle_Engine.new(viewport,map))
  1329. }
  1330.  
  1331. def Kernel.pbOnSpritesetCreate(spriteset,viewport)
  1332.   Events.onSpritesetCreate.trigger(nil,spriteset,viewport)
  1333. end
  1334.  
  1335.  
  1336.  
  1337. ################################################################################
  1338. # Field movement
  1339. ################################################################################
  1340. def pbLedge(xOffset,yOffset)
  1341.   if Kernel.pbFacingTerrainTag==PBTerrain::Ledge
  1342.     if Kernel.pbJumpToward(2,true)
  1343.       $game_player.increase_steps
  1344.       $game_player.check_event_trigger_here([1,2])
  1345.     end
  1346.     return true
  1347.   end
  1348.   return false
  1349. end
  1350.  
  1351. def Kernel.pbSlideOnIce(event=nil)
  1352.   event=$game_player if !event
  1353.   return if !event
  1354.   return if pbGetTerrainTag(event)!=PBTerrain::Ice
  1355.   $PokemonGlobal.sliding=true
  1356.   direction=event.direction
  1357.   oldwalkanime=event.walk_anime
  1358.   event.straighten
  1359.   event.pattern=1
  1360.   event.walk_anime=false
  1361.   loop do
  1362.     break if !event.passable?(event.x,event.y,direction)
  1363.     break if pbGetTerrainTag(event)!=PBTerrain::Ice
  1364.     event.move_forward
  1365.     while event.moving?
  1366.       Graphics.update
  1367.       Input.update
  1368.       pbUpdateSceneMap
  1369.     end
  1370.   end
  1371.   event.center(event.x,event.y)
  1372.   event.straighten
  1373.   event.walk_anime=oldwalkanime
  1374.   $PokemonGlobal.sliding=false
  1375. end
  1376.  
  1377. # Poison event on each step taken
  1378. Events.onStepTakenTransferPossible+=proc {|sender,e|
  1379.   handled=e[0]
  1380.   next if handled[0]
  1381.   if $PokemonGlobal.stepcount % 4 == 0 && POISONINFIELD
  1382.     flashed=false
  1383.     for i in $Trainer.party
  1384.       if i.status==PBStatuses::POISON && i.hp>0 && !i.egg? &&
  1385.          !isConst?(i.ability,PBAbilities,:POISONHEAL)
  1386.         if !flashed
  1387.           $game_screen.start_flash(Color.new(255,0,0,128), 4)
  1388.           flashed=true
  1389.         end
  1390.         if i.hp==1 && !POISONFAINTINFIELD
  1391.           i.status=0
  1392.           Kernel.pbMessage(_INTL("{1} survived the poisoning.\\nThe poison faded away!\\1",i.name))
  1393.           next
  1394.         end
  1395.         i.hp-=1
  1396.         if i.hp==1 && !POISONFAINTINFIELD
  1397.           i.status=0
  1398.           Kernel.pbMessage(_INTL("{1} survived the poisoning.\\nThe poison faded away!\\1",i.name))
  1399.         end
  1400.         if i.hp==0
  1401.           i.changeHappiness("faint")
  1402.           i.status=0
  1403.           Kernel.pbMessage(_INTL("{1} fainted...\\1",i.name))
  1404.         end
  1405.         handled[0]=true if pbAllFainted
  1406.         pbCheckAllFainted()
  1407.       end
  1408.     end
  1409.   end
  1410. }
  1411.  
  1412. Events.onStepTaken+=proc{
  1413.   $PokemonGlobal.happinessSteps=0 if !$PokemonGlobal.happinessSteps
  1414.   $PokemonGlobal.happinessSteps+=1
  1415.   if $PokemonGlobal.happinessSteps==256
  1416.     for pkmn in $Trainer.party
  1417.       if pkmn.hp>0 && !pkmn.egg?
  1418.         pkmn.changeHappiness("walking")
  1419.       end
  1420.     end
  1421.     $PokemonGlobal.happinessSteps=0
  1422.   end
  1423. }
  1424.  
  1425. Events.onStepTakenFieldMovement+=proc{|sender,e|
  1426.   event=e[0] # Get the event affected by field movement
  1427.   thistile=$MapFactory.getRealTilePos($game_map.map_id,event.x,event.y)
  1428.   map=$MapFactory.getMap(thistile[0])
  1429.   sootlevel=nil
  1430.   for i in [2, 1, 0]
  1431.     tile_id = map.data[thistile[1],thistile[2],i]
  1432.     next if tile_id == nil
  1433.     if map.terrain_tags[tile_id] &&
  1434.        map.terrain_tags[tile_id]==PBTerrain::SootGrass
  1435.       sootlevel=i
  1436.       break
  1437.     end
  1438.   end
  1439.   if sootlevel
  1440.     $PokemonGlobal.sootsack=0 if !$PokemonGlobal.sootsack
  1441.     map.data[thistile[1],thistile[2],sootlevel]=0
  1442.     if event==$game_player && $PokemonBag.pbQuantity(getConst(PBItems,:SOOTSACK))>0
  1443.       $PokemonGlobal.sootsack+=1
  1444.     end
  1445.     $scene.createSingleSpriteset(map.map_id)
  1446.   end
  1447. }
  1448.  
  1449. Events.onStepTakenFieldMovement+=proc{|sender,e|
  1450.   event=e[0] # Get the event affected by field movement
  1451.   currentTag=pbGetTerrainTag(event)
  1452.   if pbGetTerrainTag(event,true)==PBTerrain::Grass  # Won't show if under bridge
  1453.     $scene.spriteset.addUserAnimation(GRASS_ANIMATION_ID,event.x,event.y)
  1454.   elsif event==$game_player && currentTag==PBTerrain::WaterfallCrest
  1455.     # Descend waterfall, but only if this event is the player
  1456.     Kernel.pbDescendWaterfall(event)
  1457.   elsif event==$game_player && currentTag==PBTerrain::Ice && !$PokemonGlobal.sliding
  1458.     Kernel.pbSlideOnIce(event)
  1459.   end
  1460. }
  1461.  
  1462. def pbBattleOnStepTaken
  1463.   if $Trainer.party.length > 0
  1464.     encounterType=$PokemonEncounters.pbEncounterType
  1465.     if encounterType>=0
  1466.       encounter=$PokemonEncounters.pbGenerateEncounter(encounterType)
  1467.       if $PokemonEncounters.isEncounterPossibleHere?()
  1468.         encounter=EncounterModifier.trigger(encounter)
  1469.         if $PokemonEncounters.pbCanEncounter?(encounter)
  1470.           if $PokemonGlobal.partner
  1471.             encounter2=$PokemonEncounters.pbEncounteredPokemon(encounterType)
  1472.             pbDoubleWildBattle(encounter[0],encounter[1],encounter2[0],encounter2[1])
  1473.           else
  1474.             pbWildBattle(encounter[0],encounter[1])
  1475.           end
  1476.         end
  1477.         EncounterModifier.triggerEncounterEnd()
  1478.       end
  1479.     end
  1480.   end
  1481. end
  1482.  
  1483. def Kernel.pbOnStepTaken(eventTriggered)
  1484.   if $game_player.move_route_forcing || pbMapInterpreterRunning? || !$Trainer
  1485.     # if forced movement or if no trainer was created yet
  1486.     Events.onStepTakenFieldMovement.trigger(nil,$game_player)
  1487.     return
  1488.   end
  1489.   $PokemonGlobal.stepcount=0 if !$PokemonGlobal.stepcount
  1490.   $PokemonGlobal.stepcount+=1
  1491.   $PokemonGlobal.stepcount&=0x7FFFFFFF
  1492.   Events.onStepTaken.trigger(nil)
  1493.   Events.onStepTakenFieldMovement.trigger(nil,$game_player)
  1494.   handled=[nil]
  1495.   Events.onStepTakenTransferPossible.trigger(nil,handled)
  1496.   return if handled[0]
  1497.   if !eventTriggered
  1498.     pbBattleOnStepTaken()
  1499.   end
  1500. end
  1501.  
  1502. def pbGetPlayerCharset(meta,charset,trainer=nil)
  1503.   trainer=$Trainer if !trainer
  1504.   outfit=trainer ? trainer.outfit : 0
  1505.   if meta[charset] && meta[charset]!=""
  1506.     ret=meta[charset]
  1507.     if FileTest.image_exist?("Graphics/Characters/"+ret+"_"+outfit.to_s)
  1508.       return ret+"_"+outfit.to_s
  1509.     end
  1510.     return ret
  1511.   else
  1512.     ret=meta[1]
  1513.     if FileTest.image_exist?("Graphics/Characters/"+ret+"_"+outfit.to_s)
  1514.       return ret+"_"+outfit.to_s
  1515.     end
  1516.     return ret
  1517.   end
  1518. end
  1519.  
  1520. def Kernel.pbUpdateVehicle
  1521.   meta=pbGetMetadata(0,MetadataPlayerA+$PokemonGlobal.playerID)
  1522.   if meta
  1523.     if $PokemonGlobal.diving
  1524.       $game_player.character_name=pbGetPlayerCharset(meta,5) # Diving graphic
  1525.     elsif $PokemonGlobal.surfing
  1526.       $game_player.character_name=pbGetPlayerCharset(meta,3) # Surfing graphic
  1527.     elsif $PokemonGlobal.bicycle
  1528.       $game_player.character_name=pbGetPlayerCharset(meta,2) # Bicycle graphic
  1529.     else
  1530.       $game_player.character_name=pbGetPlayerCharset(meta,1) # Regular graphic
  1531.     end
  1532.   end
  1533. end
  1534.  
  1535. def Kernel.pbCancelVehicles(destination=nil)
  1536.   $PokemonGlobal.surfing=false
  1537.   $PokemonGlobal.diving=false
  1538.   if !destination || !pbCanUseBike?(destination)
  1539.     $PokemonGlobal.bicycle=false
  1540.   end
  1541.   Kernel.pbUpdateVehicle
  1542. end
  1543.  
  1544. def pbCanUseBike?(mapid)
  1545.   return true if pbGetMetadata(mapid,MetadataBicycleAlways)
  1546.   val=pbGetMetadata(mapid,MetadataBicycle)
  1547.   val=pbGetMetadata(mapid,MetadataOutdoor) if val==nil
  1548.   return val ? true : false
  1549. end
  1550.  
  1551. def Kernel.pbMountBike
  1552.   return if $PokemonGlobal.bicycle
  1553.   $PokemonGlobal.bicycle=true
  1554.   Kernel.pbUpdateVehicle
  1555.   bikebgm=pbGetMetadata(0,MetadataBicycleBGM)
  1556.   if bikebgm
  1557.     pbCueBGM(bikebgm,0.5)
  1558.   end
  1559. end
  1560.  
  1561. def Kernel.pbDismountBike
  1562.   return if !$PokemonGlobal.bicycle
  1563.   $PokemonGlobal.bicycle=false
  1564.   Kernel.pbUpdateVehicle
  1565.   $game_map.autoplayAsCue
  1566. end
  1567.  
  1568. def Kernel.pbSetPokemonCenter
  1569.   $PokemonGlobal.pokecenterMapId=$game_map.map_id
  1570.   $PokemonGlobal.pokecenterX=$game_player.x
  1571.   $PokemonGlobal.pokecenterY=$game_player.y
  1572.   $PokemonGlobal.pokecenterDirection=$game_player.direction
  1573. end
  1574.  
  1575.  
  1576.  
  1577. ################################################################################
  1578. # Fishing
  1579. ################################################################################
  1580. def pbFishingBegin
  1581.   $PokemonGlobal.fishing=true
  1582.   if !pbCommonEvent(FISHINGBEGINCOMMONEVENT)
  1583.     patternb = 2*$game_player.direction - 1
  1584.     playertrainer=pbGetPlayerTrainerType
  1585.     meta=pbGetMetadata(0,MetadataPlayerA+$PokemonGlobal.playerID)
  1586.     num=($PokemonGlobal.surfing) ? 7 : 6
  1587.     if meta && meta[num] && meta[num]!=""
  1588.       charset=pbGetPlayerCharset(meta,num)
  1589.       4.times do |pattern|
  1590.         $game_player.setDefaultCharName(charset,patternb-pattern)
  1591.         2.times do
  1592.           Graphics.update
  1593.           Input.update
  1594.           pbUpdateSceneMap
  1595.         end
  1596.       end
  1597.     end
  1598.   end
  1599. end
  1600.  
  1601. def pbFishingEnd
  1602.   if !pbCommonEvent(FISHINGENDCOMMONEVENT)
  1603.     patternb = 2*($game_player.direction - 2)
  1604.     playertrainer=pbGetPlayerTrainerType
  1605.     meta=pbGetMetadata(0,MetadataPlayerA+$PokemonGlobal.playerID)
  1606.     num=($PokemonGlobal.surfing) ? 7 : 6
  1607.     if meta && meta[num] && meta[num]!=""
  1608.       charset=pbGetPlayerCharset(meta,num)
  1609.       4.times do |pattern|
  1610.         $game_player.setDefaultCharName(charset,patternb+pattern)
  1611.         2.times do
  1612.           Graphics.update
  1613.           Input.update
  1614.           pbUpdateSceneMap
  1615.         end
  1616.       end
  1617.     end
  1618.   end
  1619.   $PokemonGlobal.fishing=false
  1620. end
  1621.  
  1622. def pbFishing(hasencounter)
  1623.   bitechance=65
  1624.   hookchance=65
  1625.   oldpattern=$game_player.fullPattern
  1626.   pbFishingBegin
  1627.   msgwindow=Kernel.pbCreateMessageWindow
  1628.   loop do
  1629.     time=2+rand(10)
  1630.     message=""
  1631.     time.times do
  1632.       message+=".  "
  1633.     end
  1634.     if pbWaitMessage(msgwindow,time)
  1635.       pbFishingEnd
  1636.       $game_player.setDefaultCharName(nil,oldpattern)
  1637.       Kernel.pbMessageDisplay(msgwindow,_INTL("Not even a nibble..."))
  1638.       Kernel.pbDisposeMessageWindow(msgwindow)
  1639.       return false
  1640.     end
  1641.     rnd=rand(100)
  1642.     if rnd<bitechance && hasencounter
  1643.       frames=rand(6)+15
  1644.       if !pbWaitForInput(msgwindow,message+_INTL("\r\nOh!  A bite!"),frames)
  1645.         pbFishingEnd
  1646.         $game_player.setDefaultCharName(nil,oldpattern)
  1647.         Kernel.pbMessageDisplay(msgwindow,_INTL("It got away..."))
  1648.         Kernel.pbDisposeMessageWindow(msgwindow)
  1649.         return false
  1650.       end
  1651.       rnd=rand(100)
  1652.       if rnd<hookchance || FISHINGAUTOHOOK
  1653.         Kernel.pbMessageDisplay(msgwindow,_INTL("A Pokémon's on the hook!"))
  1654.         Kernel.pbDisposeMessageWindow(msgwindow)
  1655.         pbFishingEnd
  1656.         $game_player.setDefaultCharName(nil,oldpattern)
  1657.         return true
  1658.       end
  1659.       hookchance+=15
  1660.       bitechance+=15
  1661.     else
  1662.       pbFishingEnd
  1663.       $game_player.setDefaultCharName(nil,oldpattern)
  1664.       Kernel.pbMessageDisplay(msgwindow,_INTL("Not even a nibble..."))
  1665.       Kernel.pbDisposeMessageWindow(msgwindow)
  1666.       return false
  1667.     end
  1668.   end
  1669.   Kernel.pbDisposeMessageWindow(msgwindow)
  1670.   return false
  1671. end
  1672.  
  1673. def pbWaitForInput(msgwindow,message,frames)
  1674.   return true if FISHINGAUTOHOOK
  1675.   Kernel.pbMessageDisplay(msgwindow,message,false)
  1676.   frames.times do
  1677.     Graphics.update
  1678.     Input.update
  1679.     pbUpdateSceneMap
  1680.     if Input.trigger?(Input::C) || Input.trigger?(Input::B)
  1681.       return true
  1682.     end
  1683.   end
  1684.   return false
  1685. end
  1686.  
  1687. def pbWaitMessage(msgwindow,time)
  1688.   message=""
  1689.   (time+1).times do |i|
  1690.     message+=".  " if i>0
  1691.     Kernel.pbMessageDisplay(msgwindow,message,false)
  1692.     20.times do
  1693.       Graphics.update
  1694.       Input.update
  1695.       pbUpdateSceneMap
  1696.       if Input.trigger?(Input::C)||Input.trigger?(Input::B)
  1697.         return true
  1698.       end
  1699.     end
  1700.   end
  1701.   return false
  1702. end
  1703.  
  1704.  
  1705.  
  1706. ################################################################################
  1707. # Moving between maps
  1708. ################################################################################
  1709. Events.onMapChange+=proc {|sender,e|
  1710.   oldid=e[0] # previous map ID, 0 if no map ID
  1711.   healing=pbGetMetadata($game_map.map_id,MetadataHealingSpot)
  1712.   $PokemonGlobal.healingSpot=healing if healing
  1713.   $PokemonMap.clear if $PokemonMap
  1714.   $PokemonEncounters.setup($game_map.map_id) if $PokemonEncounters
  1715.   $PokemonGlobal.visitedMaps[$game_map.map_id]=true
  1716.   if oldid!=0 && oldid!=$game_map.map_id
  1717.     mapinfos=$RPGVX ? load_data("Data/MapInfos.rvdata") : load_data("Data/MapInfos.rxdata")
  1718.     if $game_map.name!=mapinfos[oldid].name
  1719.       weather=pbGetMetadata($game_map.map_id,MetadataWeather)
  1720.       $game_screen.weather(weather[0],8,20) if weather && rand(100)<weather[1]
  1721.     end
  1722.   end
  1723. }
  1724.  
  1725. Events.onMapChanging+=proc {|sender,e|
  1726.   newmapID=e[0]
  1727.   newmap=e[1]
  1728.   # Undo the weather ($game_map still refers to the old map)
  1729.   mapinfos=$RPGVX ? load_data("Data/MapInfos.rvdata") : load_data("Data/MapInfos.rxdata")
  1730.   if newmapID>0 && $game_map.name!=mapinfos[newmapID].name
  1731.     weather=pbGetMetadata($game_map.map_id,MetadataWeather)
  1732.     $game_screen.weather(0,0,0) if weather
  1733.   end
  1734. }
  1735.  
  1736. Events.onMapSceneChange+=proc{|sender,e|
  1737.   scene=e[0]
  1738.   mapChanged=e[1]
  1739.   return if !scene || !scene.spriteset
  1740.   if $game_map
  1741.     lastmapdetails=$PokemonGlobal.mapTrail[0] ?
  1742.        pbGetMetadata($PokemonGlobal.mapTrail[0],MetadataMapPosition) : [-1,0,0]
  1743.     lastmapdetails=[-1,0,0] if !lastmapdetails
  1744.     newmapdetails=$game_map.map_id ?
  1745.        pbGetMetadata($game_map.map_id,MetadataMapPosition) : [-1,0,0]
  1746.     newmapdetails=[-1,0,0] if !newmapdetails
  1747.     $PokemonGlobal.mapTrail=[] if !$PokemonGlobal.mapTrail
  1748.     if $PokemonGlobal.mapTrail[0]!=$game_map.map_id
  1749.       $PokemonGlobal.mapTrail[3]=$PokemonGlobal.mapTrail[2] if $PokemonGlobal.mapTrail[2]
  1750.       $PokemonGlobal.mapTrail[2]=$PokemonGlobal.mapTrail[1] if $PokemonGlobal.mapTrail[1]
  1751.       $PokemonGlobal.mapTrail[1]=$PokemonGlobal.mapTrail[0] if $PokemonGlobal.mapTrail[0]
  1752.     end
  1753.     $PokemonGlobal.mapTrail[0]=$game_map.map_id   # Update map trail
  1754.   end
  1755.   darkmap=pbGetMetadata($game_map.map_id,MetadataDarkMap)
  1756.   if darkmap
  1757.     if $PokemonGlobal.flashUsed
  1758.       $PokemonTemp.darknessSprite=DarknessSprite.new
  1759.       scene.spriteset.addUserSprite($PokemonTemp.darknessSprite)
  1760.       darkness=$PokemonTemp.darknessSprite
  1761.       darkness.radius=176
  1762.     else
  1763.       $PokemonTemp.darknessSprite=DarknessSprite.new
  1764.       scene.spriteset.addUserSprite($PokemonTemp.darknessSprite)
  1765.     end
  1766.   elsif !darkmap
  1767.     $PokemonGlobal.flashUsed=false
  1768.     if $PokemonTemp.darknessSprite
  1769.       $PokemonTemp.darknessSprite.dispose
  1770.       $PokemonTemp.darknessSprite=nil
  1771.     end
  1772.   end
  1773.   if mapChanged
  1774.     if pbGetMetadata($game_map.map_id,MetadataShowArea)
  1775.       nosignpost=false
  1776.       if $PokemonGlobal.mapTrail[1]
  1777.         for i in 0...NOSIGNPOSTS.length/2
  1778.           nosignpost=true if NOSIGNPOSTS[2*i]==$PokemonGlobal.mapTrail[1] && NOSIGNPOSTS[2*i+1]==$game_map.map_id
  1779.           nosignpost=true if NOSIGNPOSTS[2*i+1]==$PokemonGlobal.mapTrail[1] && NOSIGNPOSTS[2*i]==$game_map.map_id
  1780.           break if nosignpost
  1781.         end
  1782.         mapinfos=$RPGVX ? load_data("Data/MapInfos.rvdata") : load_data("Data/MapInfos.rxdata")
  1783.         oldmapname=mapinfos[$PokemonGlobal.mapTrail[1]].name
  1784.         nosignpost=true if $game_map.name==oldmapname
  1785.       end
  1786.       scene.spriteset.addUserSprite(LocationWindow.new($game_map.name)) if !nosignpost
  1787.     end
  1788.   end
  1789.   if pbGetMetadata($game_map.map_id,MetadataBicycleAlways)
  1790.     Kernel.pbMountBike
  1791.   else
  1792.     if !pbCanUseBike?($game_map.map_id)
  1793.       Kernel.pbDismountBike
  1794.     end
  1795.   end
  1796. }
  1797.  
  1798. def Kernel.pbStartOver(gameover=false)
  1799.   if pbInBugContest?
  1800.     Kernel.pbBugContestStartOver
  1801.     return
  1802.   end
  1803.   pbHealAll()
  1804.   if $PokemonGlobal.pokecenterMapId && $PokemonGlobal.pokecenterMapId>=0
  1805.     if gameover
  1806.       Kernel.pbMessage(_INTL("\\w[]\\wm\\c[8]\\l[3]After the unfortunate defeat, {1} scurried to a Pokémon Center.",$Trainer.name))
  1807.     else
  1808.       Kernel.pbMessage(_INTL("\\w[]\\wm\\c[8]\\l[3]{1} scurried to a Pokémon Center, protecting the exhausted and fainted Pokémon from further harm.",$Trainer.name))
  1809.     end
  1810.     Kernel.pbCancelVehicles
  1811.     pbRemoveDependencies()
  1812.     $game_switches[STARTING_OVER_SWITCH]=true
  1813.     $game_temp.player_new_map_id=$PokemonGlobal.pokecenterMapId
  1814.     $game_temp.player_new_x=$PokemonGlobal.pokecenterX
  1815.     $game_temp.player_new_y=$PokemonGlobal.pokecenterY
  1816.     $game_temp.player_new_direction=$PokemonGlobal.pokecenterDirection
  1817.     $scene.transfer_player
  1818.     $game_map.refresh
  1819.   else
  1820.     homedata=pbGetMetadata(0,MetadataHome)
  1821.     if (homedata && !pbRxdataExists?(sprintf("Data/Map%03d",homedata[0])) )
  1822.       if $DEBUG
  1823.         Kernel.pbMessage(_ISPRINTF("Can't find the map 'Map{1:03d}' in the Data folder.  The game will resume at the player's position.",homedata[0]))
  1824.       end
  1825.       pbHealAll()
  1826.       return
  1827.     end
  1828.     if gameover
  1829.       Kernel.pbMessage(_INTL("\\w[]\\wm\\c[8]\\l[3]After the unfortunate defeat, {1} scurried home.",$Trainer.name))
  1830.     else
  1831.       Kernel.pbMessage(_INTL("\\w[]\\wm\\c[8]\\l[3]{1} scurried home, protecting the exhausted and fainted Pokémon from further harm.",$Trainer.name))
  1832.     end
  1833.     if homedata
  1834.       Kernel.pbCancelVehicles
  1835.       pbRemoveDependencies()
  1836.       $game_switches[STARTING_OVER_SWITCH]=true
  1837.       $game_temp.player_new_map_id=homedata[0]
  1838.       $game_temp.player_new_x=homedata[1]
  1839.       $game_temp.player_new_y=homedata[2]
  1840.       $game_temp.player_new_direction=homedata[3]
  1841.       $scene.transfer_player
  1842.       $game_map.refresh
  1843.     else
  1844.       pbHealAll()
  1845.     end
  1846.   end
  1847.   pbEraseEscapePoint
  1848. end
  1849.  
  1850. def pbCaveEntranceEx(exiting)
  1851.   sprite=BitmapSprite.new(Graphics.width,Graphics.height)
  1852.   sprite.z=100000
  1853.   totalBands=15
  1854.   totalFrames=15
  1855.   bandheight=((Graphics.height/2)-10).to_f/totalBands
  1856.   bandwidth=((Graphics.width/2)-12).to_f/totalBands
  1857.   grays=[]
  1858.   tbm1=totalBands-1
  1859.   for i in 0...totalBands
  1860.     grays.push(exiting ? 0 : 255)
  1861.   end
  1862.   totalFrames.times do |j|
  1863.     x=0
  1864.     y=0
  1865.     rectwidth=Graphics.width
  1866.     rectheight=Graphics.height
  1867.     for k in 0...j
  1868.       t=(255.0)/totalFrames
  1869.       if exiting
  1870.         t=1.0-t
  1871.         t*=1.0+((k)/totalFrames.to_f)
  1872.       else
  1873.         t*=1.0+0.3*(((totalFrames-k)/totalFrames.to_f)**0.7)
  1874.       end
  1875.       grays[k]-=t
  1876.       grays[k]=0 if grays[k]<0
  1877.     end
  1878.     for i in 0...totalBands
  1879.       currentGray=grays[i]
  1880.       sprite.bitmap.fill_rect(Rect.new(x,y,rectwidth,rectheight),
  1881.          Color.new(currentGray,currentGray,currentGray))
  1882.       x+=bandwidth
  1883.       y+=bandheight
  1884.       rectwidth-=bandwidth*2
  1885.       rectheight-=bandheight*2
  1886.     end
  1887.     Graphics.update
  1888.     Input.update
  1889.   end
  1890.   if exiting
  1891.     pbToneChangeAll(Tone.new(255,255,255),0)
  1892.   else
  1893.     pbToneChangeAll(Tone.new(-255,-255,-255),0)
  1894.   end
  1895.   for j in 0..15
  1896.     if exiting
  1897.       sprite.color=Color.new(255,255,255,j*255/15)
  1898.     else
  1899.       sprite.color=Color.new(0,0,0,j*255/15)
  1900.     end
  1901.     Graphics.update
  1902.     Input.update
  1903.   end
  1904.   pbToneChangeAll(Tone.new(0,0,0),8)
  1905.   for j in 0..5
  1906.     Graphics.update
  1907.     Input.update
  1908.   end
  1909.   sprite.dispose
  1910. end
  1911.  
  1912. def pbCaveEntrance
  1913.   pbSetEscapePoint
  1914.   pbCaveEntranceEx(false)
  1915. end
  1916.  
  1917. def pbCaveExit
  1918.   pbEraseEscapePoint
  1919.   pbCaveEntranceEx(true)
  1920. end
  1921.  
  1922. def pbSetEscapePoint
  1923.   $PokemonGlobal.escapePoint=[] if !$PokemonGlobal.escapePoint
  1924.   xco=$game_player.x
  1925.   yco=$game_player.y
  1926.   case $game_player.direction
  1927.     when 2   # Down
  1928.       yco-=1; dir=8
  1929.     when 4   # Left
  1930.       xco+=1; dir=6
  1931.     when 6   # Right
  1932.       xco-=1; dir=4
  1933.     when 8   # Up
  1934.       yco+=1; dir=2
  1935.   end
  1936.   $PokemonGlobal.escapePoint=[$game_map.map_id,xco,yco,dir]
  1937. end
  1938.  
  1939. def pbEraseEscapePoint
  1940.   $PokemonGlobal.escapePoint=[]
  1941. end
  1942.  
  1943.  
  1944.  
  1945. ################################################################################
  1946. # Partner trainer
  1947. ################################################################################
  1948. def pbRegisterPartner(trainerid,trainername,partyid=0)
  1949.   Kernel.pbCancelVehicles
  1950.   trainer=pbLoadTrainer(trainerid,trainername,partyid)
  1951.   trainerobject=PokeBattle_Trainer.new(_INTL(trainer[0].name),trainerid)
  1952.   trainerobject.setForeignID($Trainer)
  1953.   for i in trainer[2]
  1954.     i.trainerID=trainerobject.id
  1955.     i.ot=trainerobject.name
  1956.     i.calcStats
  1957.   end
  1958.   $PokemonGlobal.partner=[trainerid,trainerobject.name,trainerobject.id,trainer[2]]
  1959. end
  1960.  
  1961. def pbDeregisterPartner
  1962.   $PokemonGlobal.partner=nil
  1963. end
  1964.  
  1965.  
  1966.  
  1967. ################################################################################
  1968. # Constant checks
  1969. ################################################################################
  1970. Events.onMapUpdate+=proc {|sender,e|   # Pokérus check
  1971.   last=$PokemonGlobal.pokerusTime
  1972.   now=pbGetTimeNow
  1973.   if !last || last.year!=now.year || last.month!=now.month || last.day!=now.day
  1974.     if $Trainer && $Trainer.party
  1975.       for i in $Trainer.pokemonParty
  1976.         i.lowerPokerusCount
  1977.       end
  1978.       $PokemonGlobal.pokerusTime=now
  1979.     end
  1980.   end
  1981. }
  1982.  
  1983. # Returns whether the Poké Center should explain Pokérus to the player, if a
  1984. # healed Pokémon has it.
  1985. def Kernel.pbPokerus?
  1986.   return false if $game_switches[SEEN_POKERUS_SWITCH]
  1987.   for i in $Trainer.party
  1988.     return true if i.pokerusStage==1
  1989.   end
  1990.   return false
  1991. end
  1992.  
  1993.  
  1994.  
  1995. class PokemonTemp
  1996.   attr_accessor :batterywarning
  1997.   attr_accessor :cueBGM
  1998.   attr_accessor :cueFrames
  1999. end
  2000.  
  2001.  
  2002.  
  2003. def pbBatteryLow?
  2004.   power="\0"*12
  2005.   begin
  2006.     sps=Win32API.new('kernel32.dll','GetSystemPowerStatus','p','l')
  2007.     rescue
  2008.     return false
  2009.   end
  2010.   if sps.call(power)==1
  2011.     status=power.unpack("CCCCVV")
  2012.     # Battery Flag
  2013.     if status[1]!=255 && (status[1]&6)!=0 # Low or Critical
  2014.       return true
  2015.     end
  2016.     # Battery Life Percent
  2017.     if status[2]<3 # Less than 3 percent
  2018.       return true
  2019.     end
  2020.     # Battery Life Time
  2021.     if status[4]<300 # Less than 5 minutes
  2022.       return true
  2023.     end
  2024.   end
  2025.   return false
  2026. end
  2027.  
  2028. Events.onMapUpdate+=proc {|sender,e|
  2029.   time=pbGetTimeNow
  2030.   if time.sec==0 && $Trainer && $PokemonGlobal && $game_player && $game_map &&
  2031.      !$PokemonTemp.batterywarning && !$game_player.move_route_forcing &&
  2032.      !pbMapInterpreterRunning? && !$game_temp.message_window_showing &&
  2033.      pbBatteryLow?
  2034.     $PokemonTemp.batterywarning=true
  2035.     Kernel.pbMessage(_INTL("The game has detected that the battery is low.  You should save soon to avoid losing your progress."))
  2036.   end
  2037.   if $PokemonTemp.cueFrames
  2038.     $PokemonTemp.cueFrames-=1
  2039.     if $PokemonTemp.cueFrames<=0
  2040.       $PokemonTemp.cueFrames=nil
  2041.       if $game_system.getPlayingBGM==nil
  2042.         pbBGMPlay($PokemonTemp.cueBGM)
  2043.       end
  2044.     end
  2045.   end
  2046. }
  2047.  
  2048.  
  2049.  
  2050. ################################################################################
  2051. # Audio playing
  2052. ################################################################################
  2053. def pbCueBGM(bgm,seconds,volume=nil,pitch=nil)
  2054.   return if !bgm
  2055.   bgm=pbResolveAudioFile(bgm,volume,pitch)
  2056.   playingBGM=$game_system.playing_bgm
  2057.   if !playingBGM || playingBGM.name!=bgm.name || playingBGM.pitch!=bgm.pitch
  2058.     pbBGMFade(seconds)
  2059.     if !$PokemonTemp.cueFrames
  2060.       $PokemonTemp.cueFrames=(seconds*Graphics.frame_rate)*3/5
  2061.     end
  2062.     $PokemonTemp.cueBGM=bgm
  2063.   elsif playingBGM
  2064.     pbBGMPlay(bgm)
  2065.   end
  2066. end
  2067.  
  2068. def pbAutoplayOnTransition
  2069.   surfbgm=pbGetMetadata(0,MetadataSurfBGM)
  2070.   bikebgm=pbGetMetadata(0,MetadataBicycleBGM)
  2071.   if $PokemonGlobal.surfing && surfbgm
  2072.     pbBGMPlay(surfbgm)
  2073.   elsif $PokemonGlobal.bicycle && bikebgm
  2074.     pbBGMPlay(bikebgm)
  2075.   else
  2076.     $game_map.autoplayAsCue
  2077.   end
  2078. end
  2079.  
  2080. def pbAutoplayOnSave
  2081.   surfbgm=pbGetMetadata(0,MetadataSurfBGM)
  2082.   bikebgm=pbGetMetadata(0,MetadataBicycleBGM)
  2083.   if $PokemonGlobal.surfing && surfbgm
  2084.     pbBGMPlay(surfbgm)
  2085.   elsif $PokemonGlobal.bicycle && bikebgm
  2086.     pbBGMPlay(bikebgm)
  2087.   else
  2088.     $game_map.autoplay
  2089.   end
  2090. end
  2091.  
  2092.  
  2093.  
  2094. ################################################################################
  2095. # Voice recorder
  2096. ################################################################################
  2097. def pbRecord(text,maxtime=30.0)
  2098.   text="" if !text
  2099.   textwindow=Window_UnformattedTextPokemon.newWithSize(text,
  2100.      0,0,Graphics.width,Graphics.height-96)
  2101.   textwindow.z=99999
  2102.   if text==""
  2103.     textwindow.visible=false
  2104.   end
  2105.   wave=nil
  2106.   msgwindow=Kernel.pbCreateMessageWindow
  2107.   oldvolume=Kernel.Audio_bgm_get_volume()
  2108.   Kernel.Audio_bgm_set_volume(0)
  2109.   delay=2
  2110.   delay.times do |i|
  2111.     Kernel.pbMessageDisplay(msgwindow,
  2112.       _ISPRINTF("Recording in {1:d} second(s)...\nPress ESC to cancel.",delay-i),false)
  2113.     Graphics.frame_rate.times do
  2114.       Graphics.update
  2115.       Input.update
  2116.       textwindow.update
  2117.       msgwindow.update
  2118.       if Input.trigger?(Input::B)
  2119.         Kernel.Audio_bgm_set_volume(oldvolume)
  2120.         Kernel.pbDisposeMessageWindow(msgwindow)
  2121.         textwindow.dispose
  2122.         return nil
  2123.       end
  2124.     end
  2125.   end
  2126.   Kernel.pbMessageDisplay(msgwindow,
  2127.      _INTL("NOW RECORDING\nPress ESC to stop recording."),false)
  2128.   if beginRecordUI
  2129.     frames=(maxtime*Graphics.frame_rate).to_i
  2130.     frames.times do
  2131.       Graphics.update
  2132.       Input.update
  2133.       textwindow.update
  2134.       msgwindow.update
  2135.       if Input.trigger?(Input::B)
  2136.         break
  2137.       end
  2138.     end
  2139.     tmpFile=ENV["TEMP"]+"\\record.wav"
  2140.     endRecord(tmpFile)
  2141.     wave=getWaveDataUI(tmpFile,true)
  2142.     if wave
  2143.       Kernel.pbMessageDisplay(msgwindow,_INTL("PLAYING BACK..."),false)
  2144.       textwindow.update
  2145.       msgwindow.update
  2146.       Graphics.update
  2147.       Input.update
  2148.       wave.play
  2149.       (Graphics.frame_rate*wave.time).to_i.times do
  2150.         Graphics.update
  2151.         Input.update
  2152.         textwindow.update
  2153.         msgwindow.update
  2154.       end
  2155.     end
  2156.   end
  2157.   Kernel.Audio_bgm_set_volume(oldvolume)
  2158.   Kernel.pbDisposeMessageWindow(msgwindow)
  2159.   textwindow.dispose
  2160.   return wave
  2161. end
  2162.  
  2163. def Kernel.pbRxdataExists?(file)
  2164.   if $RPGVX
  2165.     return pbRgssExists?(file+".rvdata")
  2166.   else
  2167.     return pbRgssExists?(file+".rxdata")
  2168.   end
  2169. end
  2170.  
  2171.  
  2172.  
  2173. ################################################################################
  2174. # Gaining items
  2175. ################################################################################
  2176. def Kernel.pbItemBall(item,quantity=1,plural=nil)
  2177.   itemname=PBItems.getName(item)
  2178.   pocket=pbGetPocket(item)
  2179.   if $PokemonBag.pbStoreItem(item,quantity)   # If item can be picked up
  2180.     if $ItemData[item][ITEMUSE]==3 || $ItemData[item][ITEMUSE]==4
  2181.       Kernel.pbMessage(_INTL("\\se[itemlevel]{1} found \\c[1]{2}\\c[0]!\\nIt contained \\c[1]{3}\\c[0].\\wtnp[30]",
  2182.          $Trainer.name,itemname,PBMoves.getName($ItemData[item][ITEMMACHINE])))
  2183.       Kernel.pbMessage(_INTL("{1} put the \\c[1]{2}\\c[0]\r\nin the <icon=bagPocket#{pocket}>\\c[1]{3}\\c[0] Pocket.",
  2184.          $Trainer.name,itemname,PokemonBag.pocketNames()[pocket]))
  2185.     elsif isConst?(item,PBItems,:LEFTOVERS)
  2186.       Kernel.pbMessage(_INTL("\\se[itemlevel]{1} found some \\c[1]{2}\\c[0]!\\wtnp[30]",
  2187.          $Trainer.name,itemname))
  2188.       Kernel.pbMessage(_INTL("{1} put the \\c[1]{2}\\c[0]\r\nin the <icon=bagPocket#{pocket}>\\c[1]{3}\\c[0] Pocket.",
  2189.          $Trainer.name,itemname,PokemonBag.pocketNames()[pocket]))
  2190.     else
  2191.       if quantity>1
  2192.         if plural
  2193.           Kernel.pbMessage(_INTL("\\se[itemlevel]{1} found {2} \\c[1]{3}\\c[0]!\\wtnp[30]",
  2194.              $Trainer.name,quantity,plural))
  2195.           Kernel.pbMessage(_INTL("{1} put the \\c[1]{2}\\c[0]\r\nin the <icon=bagPocket#{pocket}>\\c[1]{3}\\c[0] Pocket.",
  2196.              $Trainer.name,plural,PokemonBag.pocketNames()[pocket]))
  2197.         else
  2198.           Kernel.pbMessage(_INTL("\\se[itemlevel]{1} found {2} \\c[1]{3}s\\c[0]!\\wtnp[30]",
  2199.              $Trainer.name,quantity,itemname))
  2200.           Kernel.pbMessage(_INTL("{1} put the \\c[1]{2}s\\c[0]\r\nin the <icon=bagPocket#{pocket}>\\c[1]{3}\\c[0] Pocket.",
  2201.              $Trainer.name,itemname,PokemonBag.pocketNames()[pocket]))
  2202.         end
  2203.       else
  2204.         Kernel.pbMessage(_INTL("\\se[itemlevel]{1} found one \\c[1]{2}\\c[0]!\\wtnp[30]",
  2205.            $Trainer.name,itemname))
  2206.         Kernel.pbMessage(_INTL("{1} put the \\c[1]{2}\\c[0]\r\nin the <icon=bagPocket#{pocket}>\\c[1]{3}\\c[0] Pocket.",
  2207.            $Trainer.name,itemname,PokemonBag.pocketNames()[pocket]))
  2208.       end
  2209.     end
  2210.     return true
  2211.   else   # Can't add the item
  2212.     if $ItemData[item][ITEMUSE]==3 || $ItemData[item][ITEMUSE]==4
  2213.       Kernel.pbMessage(_INTL("{1} found \\c[1]{2}\\c[0]!\\wtnp[20]",
  2214.          $Trainer.name,itemname))
  2215.     elsif isConst?(item,PBItems,:LEFTOVERS)
  2216.       Kernel.pbMessage(_INTL("{1} found some \\c[1]{2}\\c[0]!\\wtnp[20]",
  2217.          $Trainer.name,itemname))
  2218.     else
  2219.       if quantity>1
  2220.         if plural
  2221.           Kernel.pbMessage(_INTL("{1} found {2} \\c[1]{3}\\c[0]!\\wtnp[20]",
  2222.              $Trainer.name,quantity,plural))
  2223.         else
  2224.           Kernel.pbMessage(_INTL("{1} found {2} \\c[1]{3}s\\c[0]!\\wtnp[20]",
  2225.              $Trainer.name,quantity,itemname))
  2226.         end
  2227.       else
  2228.         Kernel.pbMessage(_INTL("{1} found one \\c[1]{2}\\c[0]!\\wtnp[20]",
  2229.            $Trainer.name,itemname))
  2230.       end
  2231.     end
  2232.     Kernel.pbMessage(_INTL("Too bad... The Bag is full..."))
  2233.     return false
  2234.   end
  2235. end
  2236.  
  2237. def Kernel.pbReceiveItem(item,quantity=1,plural=nil)
  2238.   itemname=PBItems.getName(item)
  2239.   pocket=pbGetPocket(item)
  2240.   if $ItemData[item][ITEMUSE]==3 || $ItemData[item][ITEMUSE]==4
  2241.     Kernel.pbMessage(_INTL("\\se[itemlevel]Obtained \\c[1]{1}\\c[0]!\\nIt contained \\c[1]{2}\\c[0].\\wtnp[30]",
  2242.        itemname,PBMoves.getName($ItemData[item][ITEMMACHINE])))
  2243.   elsif isConst?(item,PBItems,:LEFTOVERS)
  2244.     Kernel.pbMessage(_INTL("\\se[itemlevel]Obtained some \\c[1]{1}\\c[0]!\\wtnp[30]",
  2245.        itemname))
  2246.   elsif quantity>1
  2247.     if plural
  2248.       Kernel.pbMessage(_INTL("\\se[itemlevel]Obtained \\c[1]{1}\\c[0]!\\wtnp[30]",
  2249.          plural))
  2250.     else
  2251.       Kernel.pbMessage(_INTL("\\se[itemlevel]Obtained \\c[1]{1}s\\c[0]!\\wtnp[30]",
  2252.          itemname))
  2253.     end
  2254.   else
  2255.     Kernel.pbMessage(_INTL("\\se[itemlevel]Obtained \\c[1]{1}\\c[0]!\\wtnp[30]",
  2256.        itemname))
  2257.   end
  2258.   if $PokemonBag.pbStoreItem(item,quantity)   # If item can be added
  2259.     if quantity>1
  2260.       if plural
  2261.         Kernel.pbMessage(_INTL("{1} put the \\c[1]{2}\\c[0]\r\nin the <icon=bagPocket#{pocket}>\\c[1]{3}\\c[0] Pocket.",
  2262.            $Trainer.name,plural,PokemonBag.pocketNames()[pocket]))
  2263.       else
  2264.         Kernel.pbMessage(_INTL("{1} put the \\c[1]{2}s\\c[0]\r\nin the <icon=bagPocket#{pocket}>\\c[1]{3}\\c[0] Pocket.",
  2265.            $Trainer.name,itemname,PokemonBag.pocketNames()[pocket]))
  2266.       end
  2267.     else
  2268.       Kernel.pbMessage(_INTL("{1} put the \\c[1]{2}\\c[0]\r\nin the <icon=bagPocket#{pocket}>\\c[1]{3}\\c[0] Pocket.",
  2269.          $Trainer.name,itemname,PokemonBag.pocketNames()[pocket]))
  2270.     end
  2271.     return true
  2272.   else   # Can't add the item
  2273.     return false
  2274.   end
  2275. end
  2276.  
  2277. def pbUseKeyItem
  2278.   if $PokemonBag.registeredItem==0
  2279.     Kernel.pbMessage(_INTL("A Key Item in the Bag can be registered to this key for instant use."))
  2280.   else
  2281.     Kernel.pbUseKeyItemInField($PokemonBag.registeredItem)
  2282.   end
  2283. end
  2284.  
  2285.  
  2286.  
  2287. ################################################################################
  2288. # Event locations, terrain tags
  2289. ################################################################################
  2290. def pbEventFacesPlayer?(event,player,distance)
  2291.   return false if distance<=0
  2292.   # Event can't reach player if no coordinates coincide
  2293.   return false if event.x!=player.x && event.y!=player.y
  2294.   deltaX = (event.direction == 6 ? 1 : event.direction == 4 ? -1 : 0)
  2295.   deltaY =  (event.direction == 2 ? 1 : event.direction == 8 ? -1 : 0)
  2296.   # Check for existence of player
  2297.   curx=event.x
  2298.   cury=event.y
  2299.   found=false
  2300.   for i in 0...distance
  2301.     curx+=deltaX
  2302.     cury+=deltaY
  2303.     if player.x==curx && player.y==cury
  2304.       found=true
  2305.       break
  2306.     end
  2307.   end
  2308.   return found
  2309. end
  2310.  
  2311. def pbEventCanReachPlayer?(event,player,distance)
  2312.   return false if distance<=0
  2313.   # Event can't reach player if no coordinates coincide
  2314.   return false if event.x!=player.x && event.y!=player.y
  2315.   deltaX = (event.direction == 6 ? 1 : event.direction == 4 ? -1 : 0)
  2316.   deltaY =  (event.direction == 2 ? 1 : event.direction == 8 ? -1 : 0)
  2317.   # Check for existence of player
  2318.   curx=event.x
  2319.   cury=event.y
  2320.   found=false
  2321.   realdist=0
  2322.   for i in 0...distance
  2323.     curx+=deltaX
  2324.     cury+=deltaY
  2325.     if player.x==curx && player.y==cury
  2326.       found=true
  2327.       break
  2328.     end
  2329.     realdist+=1
  2330.   end
  2331.   return false if !found
  2332.   # Check passibility
  2333.   curx=event.x
  2334.   cury=event.y
  2335.   for i in 0...realdist
  2336.     if !event.passable?(curx,cury,event.direction)
  2337.       return false
  2338.     end
  2339.     curx+=deltaX
  2340.     cury+=deltaY
  2341.   end
  2342.   return true
  2343. end
  2344.  
  2345. def pbFacingTileRegular(direction=nil,event=nil)
  2346.   event=$game_player if !event
  2347.   return [0,0,0] if !event
  2348.   x=event.x
  2349.   y=event.y
  2350.   direction=event.direction if !direction
  2351.   case direction
  2352.     when 1; y+=1; x-=1
  2353.     when 2; y+=1
  2354.     when 3; y+=1; x+=1
  2355.     when 4; x-=1
  2356.     when 6; x+=1
  2357.     when 7; y-=1; x-=1
  2358.     when 8; y-=1
  2359.     when 9; y-=1; x+=1
  2360.   end
  2361.   return [$game_map ? $game_map.map_id : 0,x,y]
  2362. end
  2363.  
  2364. def pbFacingTile(direction=nil,event=nil)
  2365.   if $MapFactory
  2366.     return $MapFactory.getFacingTile(direction,event)
  2367.   else
  2368.     return pbFacingTileRegular(direction,event)
  2369.   end
  2370. end
  2371.  
  2372. def pbFacingEachOther(event1,event2)
  2373.   return false if !event1 || !event2
  2374.   if $MapFactory
  2375.     tile1=$MapFactory.getFacingTile(nil,event1)
  2376.     tile2=$MapFactory.getFacingTile(nil,event2)
  2377.     return false if !tile1 || !tile2
  2378.     if tile1[0]==event2.map.map_id &&
  2379.        tile1[1]==event2.x && tile1[2]==event2.y &&
  2380.        tile2[0]==event1.map.map_id &&
  2381.        tile2[1]==event1.x && tile2[2]==event1.y
  2382.       return true
  2383.     else
  2384.       return false
  2385.     end
  2386.   else
  2387.     tile1=Kernel.pbFacingTile(nil,event1)
  2388.     tile2=Kernel.pbFacingTile(nil,event2)
  2389.     return false if !tile1 || !tile2
  2390.     if tile1[1]==event2.x && tile1[2]==event2.y &&
  2391.        tile2[1]==event1.x && tile2[2]==event1.y
  2392.       return true
  2393.     else
  2394.       return false
  2395.     end
  2396.   end
  2397. end
  2398.  
  2399. def pbGetTerrainTag(event=nil,countBridge=false)
  2400.   event=$game_player if !event
  2401.   return 0 if !event
  2402.   if $MapFactory
  2403.     return $MapFactory.getTerrainTag(event.map.map_id,event.x,event.y,countBridge)
  2404.   else
  2405.     $game_map.terrain_tag(event.x,event.y,countBridge)
  2406.   end
  2407. end
  2408.  
  2409. def Kernel.pbFacingTerrainTag(event=nil,dir=nil)
  2410.   if $MapFactory
  2411.     return $MapFactory.getFacingTerrainTag(dir,event)
  2412.   else
  2413.     event=$game_player if !event
  2414.     return 0 if !event
  2415.     facing=pbFacingTile(dir,event)
  2416.    return $game_map.terrain_tag(facing[1],facing[2])
  2417.   end
  2418. end
  2419.  
  2420.  
  2421.  
  2422. ################################################################################
  2423. # Event movement
  2424. ################################################################################
  2425. def pbTurnTowardEvent(event,otherEvent)
  2426.   sx=0
  2427.   sy=0
  2428.   if $MapFactory
  2429.     relativePos=$MapFactory.getThisAndOtherEventRelativePos(otherEvent,event)
  2430.     sx = relativePos[0]
  2431.     sy = relativePos[1]
  2432.   else
  2433.     sx = event.x - otherEvent.x
  2434.     sy = event.y - otherEvent.y
  2435.   end
  2436.   if sx == 0 and sy == 0
  2437.     return
  2438.   end
  2439.   if sx.abs > sy.abs
  2440.     sx > 0 ? event.turn_left : event.turn_right
  2441.   else
  2442.     sy > 0 ? event.turn_up : event.turn_down
  2443.   end
  2444. end
  2445.  
  2446. def Kernel.pbMoveTowardPlayer(event)
  2447.   maxsize=[$game_map.width,$game_map.height].max
  2448.   return if !pbEventCanReachPlayer?(event,$game_player,maxsize)
  2449.   loop do
  2450.     x=event.x
  2451.     y=event.y
  2452.     event.move_toward_player
  2453.     break if event.x==x && event.y==y
  2454.     while event.moving?
  2455.       Graphics.update
  2456.       Input.update
  2457.       pbUpdateSceneMap
  2458.     end
  2459.   end
  2460.   $PokemonMap.addMovedEvent(event.id) if $PokemonMap
  2461. end
  2462.  
  2463. def Kernel.pbJumpToward(dist=1,playSound=false,cancelSurf=false)
  2464.   x=$game_player.x
  2465.   y=$game_player.y
  2466.   case $game_player.direction
  2467.     when 2 # down
  2468.       $game_player.jump(0,dist)
  2469.     when 4 # left
  2470.       $game_player.jump(-dist,0)
  2471.     when 6 # right
  2472.       $game_player.jump(dist,0)
  2473.     when 8 # up
  2474.       $game_player.jump(0,-dist)
  2475.   end
  2476.   if $game_player.x!=x || $game_player.y!=y
  2477.     pbSEPlay("jump") if playSound
  2478.     Kernel.pbCancelVehicles if cancelSurf
  2479.     while $game_player.jumping?
  2480.       Graphics.update
  2481.       Input.update
  2482.       pbUpdateSceneMap
  2483.     end
  2484.     return true
  2485.   end
  2486.   return false
  2487. end
  2488.  
  2489. def pbWait(numframes)
  2490.   numframes.times do
  2491.     Graphics.update
  2492.     Input.update
  2493.     pbUpdateSceneMap
  2494.   end
  2495. end
  2496.  
  2497.  
  2498.  
  2499. module PBMoveRoute
  2500.   Down               = 1
  2501.   Left               = 2
  2502.   Right              = 3
  2503.   Up                 = 4
  2504.   LowerLeft          = 5
  2505.   LowerRight         = 6
  2506.   UpperLeft          = 7
  2507.   UpperRight         = 8
  2508.   Random             = 9
  2509.   TowardPlayer       = 10
  2510.   AwayFromPlayer     = 11
  2511.   Forward            = 12
  2512.   Backward           = 13
  2513.   Jump               = 14 # xoffset, yoffset
  2514.   Wait               = 15 # frames
  2515.   TurnDown           = 16
  2516.   TurnLeft           = 17
  2517.   TurnRight          = 18
  2518.   TurnUp             = 19
  2519.   TurnRight90        = 20
  2520.   TurnLeft90         = 21
  2521.   Turn180            = 22
  2522.   TurnRightOrLeft90  = 23
  2523.   TurnRandom         = 24
  2524.   TurnTowardPlayer   = 25
  2525.   TurnAwayFromPlayer = 26
  2526.   SwitchOn           = 27 # 1 param
  2527.   SwitchOff          = 28 # 1 param
  2528.   ChangeSpeed        = 29 # 1 param
  2529.   ChangeFreq         = 30 # 1 param
  2530.   WalkAnimeOn        = 31
  2531.   WalkAnimeOff       = 32
  2532.   StepAnimeOn        = 33
  2533.   StepAnimeOff       = 34
  2534.   DirectionFixOn     = 35
  2535.   DirectionFixOff    = 36
  2536.   ThroughOn          = 37
  2537.   ThroughOff         = 38
  2538.   AlwaysOnTopOn      = 39
  2539.   AlwaysOnTopOff     = 40
  2540.   Graphic            = 41 # Name, hue, direction, pattern
  2541.   Opacity            = 42 # 1 param
  2542.   Blending           = 43 # 1 param
  2543.   PlaySE             = 44 # 1 param
  2544.   Script             = 45 # 1 param
  2545.   ScriptAsync        = 101 # 1 param
  2546. end
  2547.  
  2548.  
  2549.  
  2550. class Game_Character
  2551.   def jumpForward
  2552.     case self.direction
  2553.       when 2 # down
  2554.         jump(0,1)
  2555.       when 4 # left
  2556.         jump(-1,0)
  2557.       when 6 # right
  2558.         jump(1,0)
  2559.       when 8 # up
  2560.         jump(0,-1)
  2561.     end
  2562.   end
  2563.  
  2564.   def jumpBackward
  2565.     case self.direction
  2566.       when 2 # down
  2567.         jump(0,-1)
  2568.       when 4 # left
  2569.         jump(1,0)
  2570.       when 6 # right
  2571.         jump(-1,0)
  2572.       when 8 # up
  2573.         jump(0,1)
  2574.     end
  2575.   end
  2576.  
  2577.   def moveLeft90
  2578.     case self.direction
  2579.       when 2 # down
  2580.         move_right
  2581.       when 4 # left
  2582.         move_down
  2583.       when 6 # right
  2584.         move_up
  2585.       when 8 # up
  2586.         move_left
  2587.     end
  2588.   end
  2589.  
  2590.   def moveRight90
  2591.     case self.direction
  2592.       when 2 # down
  2593.         move_left
  2594.       when 4 # left
  2595.         move_up
  2596.       when 6 # right
  2597.         move_down
  2598.       when 8 # up
  2599.         move_right
  2600.     end
  2601.   end
  2602.  
  2603.   def minilock
  2604.     @prelock_direction=@direction
  2605.     @locked=true
  2606.   end
  2607. end
  2608.  
  2609.  
  2610.  
  2611. def pbMoveRoute(event,commands,waitComplete=false)
  2612.   route=RPG::MoveRoute.new
  2613.   route.repeat=false
  2614.   route.skippable=true
  2615.   route.list.clear
  2616.   route.list.push(RPG::MoveCommand.new(PBMoveRoute::ThroughOn))
  2617.   i=0;while i<commands.length
  2618.     case commands[i]
  2619.       when PBMoveRoute::Wait, PBMoveRoute::SwitchOn,
  2620.          PBMoveRoute::SwitchOff, PBMoveRoute::ChangeSpeed,
  2621.          PBMoveRoute::ChangeFreq, PBMoveRoute::Opacity,
  2622.          PBMoveRoute::Blending, PBMoveRoute::PlaySE,
  2623.          PBMoveRoute::Script
  2624.         route.list.push(RPG::MoveCommand.new(commands[i],[commands[i+1]]))
  2625.         i+=1
  2626.       when PBMoveRoute::ScriptAsync
  2627.         route.list.push(RPG::MoveCommand.new(PBMoveRoute::Script,[commands[i+1]]))
  2628.         route.list.push(RPG::MoveCommand.new(PBMoveRoute::Wait,[0]))
  2629.         i+=1
  2630.       when PBMoveRoute::Jump
  2631.         route.list.push(RPG::MoveCommand.new(commands[i],[commands[i+1],commands[i+2]]))
  2632.         i+=2
  2633.       when PBMoveRoute::Graphic
  2634.         route.list.push(RPG::MoveCommand.new(commands[i],
  2635.            [commands[i+1],commands[i+2],commands[i+3],commands[i+4]]))
  2636.         i+=4
  2637.       else
  2638.         route.list.push(RPG::MoveCommand.new(commands[i]))
  2639.     end
  2640.     i+=1
  2641.   end
  2642.   route.list.push(RPG::MoveCommand.new(PBMoveRoute::ThroughOff))
  2643.   route.list.push(RPG::MoveCommand.new(0))
  2644.   if event
  2645.     event.force_move_route(route)
  2646.   end
  2647.   return route
  2648. end
  2649.  
  2650.  
  2651.  
  2652. ################################################################################
  2653. # Screen effects
  2654. ################################################################################
  2655. def pbToneChangeAll(tone, duration)
  2656.   $game_screen.start_tone_change(tone,duration * 2)
  2657.   for picture in $game_screen.pictures
  2658.     picture.start_tone_change(tone,duration * 2) if picture
  2659.   end
  2660. end
  2661.  
  2662. def pbShake(power,speed,frames)
  2663.   $game_screen.start_shake(power,speed,frames * 2)
  2664. end
  2665.  
  2666. def pbFlash(color,frames)
  2667.   $game_screen.start_flash(color,frames * 2)
  2668. end
  2669.  
  2670. def pbScrollMap(direction, distance, speed)
  2671.   return if !$game_map
  2672.   if speed==0
  2673.     case direction
  2674.       when 2
  2675.         $game_map.scroll_down(distance * 128)
  2676.       when 4
  2677.         $game_map.scroll_left(distance * 128)
  2678.       when 6
  2679.         $game_map.scroll_right(distance * 128)
  2680.       when 8
  2681.         $game_map.scroll_up(distance * 128)
  2682.     end
  2683.   else
  2684.     $game_map.start_scroll(direction, distance, speed);
  2685.     oldx=$game_map.display_x
  2686.     oldy=$game_map.display_y
  2687.     loop do
  2688.       Graphics.update
  2689.       Input.update
  2690.       if !$game_map.scrolling?
  2691.         break
  2692.       end
  2693.       pbUpdateSceneMap
  2694.       if $game_map.display_x==oldx && $game_map.display_y==oldy
  2695.         break
  2696.       end
  2697.       oldx=$game_map.display_x
  2698.       oldy=$game_map.display_y
  2699.     end
  2700.   end
  2701. end
  2702.  
  2703.  
  2704.  
  2705. ################################################################################
  2706. # Events
  2707. ################################################################################
  2708. class Game_Event
  2709.   def cooledDown?(seconds)
  2710.     if !(expired?(seconds) && tsOff?("A"))
  2711.       self.need_refresh=true
  2712.       return false
  2713.     else
  2714.       return true
  2715.     end
  2716.   end
  2717.  
  2718.   def cooledDownDays?(days)
  2719.     if !(expiredDays?(days) && tsOff?("A"))
  2720.       self.need_refresh=true
  2721.       return false
  2722.     else
  2723.       return true
  2724.     end
  2725.   end
  2726. end
  2727.  
  2728.  
  2729.  
  2730. module InterpreterFieldMixin
  2731.   # Used in boulder events.  Allows an event to be pushed.  To be used in
  2732.   # a script event command.
  2733.   def pbPushThisEvent
  2734.     event=get_character(0)
  2735.     oldx=event.x
  2736.     oldy=event.y
  2737.     # Apply strict version of passable, which makes impassable
  2738.     # tiles that are passable only from certain directions
  2739.     if !event.passableStrict?(event.x,event.y,$game_player.direction)
  2740.       return
  2741.     end
  2742.     case $game_player.direction
  2743.       when 2 # down
  2744.         event.move_down
  2745.       when 4 # left
  2746.         event.move_left
  2747.       when 6 # right
  2748.         event.move_right
  2749.       when 8 # up
  2750.         event.move_up
  2751.     end
  2752.     $PokemonMap.addMovedEvent(@event_id) if $PokemonMap
  2753.     if oldx!=event.x || oldy!=event.y
  2754.       $game_player.lock
  2755.       begin
  2756.         Graphics.update
  2757.         Input.update
  2758.         pbUpdateSceneMap
  2759.       end until !event.moving?
  2760.       $game_player.unlock
  2761.     end
  2762.   end
  2763.  
  2764.   def pbPushThisBoulder
  2765.     if $PokemonMap.strengthUsed
  2766.       pbPushThisEvent
  2767.     end
  2768.     return true
  2769.   end
  2770.  
  2771.   def pbHeadbutt
  2772.     Kernel.pbHeadbutt(get_character(0))
  2773.     return true
  2774.   end
  2775.  
  2776.   def pbTrainerIntro(symbol)
  2777.     if $DEBUG
  2778.       return if !Kernel.pbTrainerTypeCheck(symbol)
  2779.     end
  2780.     trtype=PBTrainers.const_get(symbol)
  2781.     pbGlobalLock
  2782.     Kernel.pbPlayTrainerIntroME(trtype)
  2783.     return true
  2784.   end
  2785.  
  2786.   def pbTrainerEnd
  2787.     pbGlobalUnlock
  2788.     e=get_character(0)
  2789.     e.erase_route if e
  2790.   end
  2791.  
  2792.   def pbParams
  2793.     @parameters ? @parameters : @params
  2794.   end
  2795.  
  2796.   def pbGetPokemon(id)
  2797.     return $Trainer.party[pbGet(id)]
  2798.   end
  2799.  
  2800.   def pbSetEventTime(*arg)
  2801.     $PokemonGlobal.eventvars={} if !$PokemonGlobal.eventvars
  2802.     time=pbGetTimeNow
  2803.     time=time.to_i
  2804.     pbSetSelfSwitch(@event_id,"A",true)
  2805.     $PokemonGlobal.eventvars[[@map_id,@event_id]]=time
  2806.     for otherevt in arg
  2807.       pbSetSelfSwitch(otherevt,"A",true)
  2808.       $PokemonGlobal.eventvars[[@map_id,otherevt]]=time
  2809.     end
  2810.   end
  2811.  
  2812.   def getVariable(*arg)
  2813.     if arg.length==0
  2814.       return nil if !$PokemonGlobal.eventvars
  2815.       return $PokemonGlobal.eventvars[[@map_id,@event_id]]
  2816.     else
  2817.       return $game_variables[arg[0]]
  2818.     end
  2819.   end
  2820.  
  2821.   def setVariable(*arg)
  2822.     if arg.length==1
  2823.       $PokemonGlobal.eventvars={} if !$PokemonGlobal.eventvars
  2824.       $PokemonGlobal.eventvars[[@map_id,@event_id]]=arg[0]
  2825.     else
  2826.       $game_variables[arg[0]]=arg[1]
  2827.       $game_map.need_refresh=true
  2828.     end
  2829.   end
  2830.  
  2831.   def tsOff?(c)
  2832.     get_character(0).tsOff?(c)
  2833.   end
  2834.  
  2835.   def tsOn?(c)
  2836.     get_character(0).tsOn?(c)
  2837.   end
  2838.  
  2839.   alias isTempSwitchOn? tsOn?
  2840.   alias isTempSwitchOff? tsOff?
  2841.  
  2842.   def setTempSwitchOn(c)
  2843.     get_character(0).setTempSwitchOn(c)
  2844.   end
  2845.  
  2846.   def setTempSwitchOff(c)
  2847.     get_character(0).setTempSwitchOff(c)
  2848.   end
  2849.  
  2850. # Must use this approach to share the methods because the methods already
  2851. # defined in a class override those defined in an included module
  2852.   CustomEventCommands=<<_END_
  2853.  
  2854.   def command_352
  2855.     scene=PokemonSaveScene.new
  2856.     screen=PokemonSave.new(scene)
  2857.     screen.pbSaveScreen
  2858.     return true
  2859.   end
  2860.  
  2861.   def command_125
  2862.     value = operate_value(pbParams[0], pbParams[1], pbParams[2])
  2863.     $Trainer.money+=value
  2864.     return true
  2865.   end
  2866.  
  2867.   def command_132
  2868.     $PokemonGlobal.nextBattleBGM=(pbParams[0]) ? pbParams[0].clone : nil
  2869.     return true
  2870.   end
  2871.  
  2872.   def command_133
  2873.     $PokemonGlobal.nextBattleME=(pbParams[0]) ? pbParams[0].clone : nil
  2874.     return true
  2875.   end
  2876.  
  2877.   def command_353
  2878.     pbBGMFade(1.0)
  2879.     pbBGSFade(1.0)
  2880.     pbFadeOutIn(99999){ Kernel.pbStartOver(true) }
  2881.   end
  2882.  
  2883.   def command_314
  2884.     if pbParams[0] == 0 && $Trainer && $Trainer.party
  2885.       pbHealAll()
  2886.     end
  2887.     return true
  2888.   end
  2889.  
  2890. _END_
  2891. end
  2892.  
  2893.  
  2894.  
  2895. class Interpreter
  2896.   include InterpreterFieldMixin
  2897.   eval(InterpreterFieldMixin::CustomEventCommands)
  2898. end
  2899.  
  2900.  
  2901.  
  2902. class Game_Interpreter
  2903.   include InterpreterFieldMixin
  2904.   eval(InterpreterFieldMixin::CustomEventCommands)
  2905. end
  2906.  
  2907.  
  2908.  
  2909. ################################################################################
  2910. #
  2911. ################################################################################
  2912. class Transient
  2913.   def initialize(value)
  2914.     @value=value
  2915.   end
  2916.  
  2917.   attr_accessor :value
  2918.  
  2919.   def self._load(str)
  2920.     return Transient.new(nil)
  2921.   end
  2922.  
  2923.   def _dump(*arg)
  2924.     return ""
  2925.   end
  2926. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement