Advertisement
Guest User

Untitled

a guest
Jul 11th, 2016
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 113.42 KB | None | 0 0
  1. =begin
  2. - def pbChooseNewEnemy(index,party)
  3. Use this method to choose a new Pokémon for the enemy
  4. The enemy's party is guaranteed to have at least one
  5. choosable member.
  6. index - Index to the battler to be replaced (use e.g. @battle.battlers[index] to
  7. access the battler)
  8. party - Enemy's party
  9.  
  10. - def pbWildBattleSuccess
  11. This method is called when the player wins a wild Pokémon battle.
  12. This method can change the battle's music for example.
  13.  
  14. - def pbTrainerBattleSuccess
  15. This method is called when the player wins a Trainer battle.
  16. This method can change the battle's music for example.
  17.  
  18. - def pbFainted(pkmn)
  19. This method is called whenever a Pokémon faints.
  20. pkmn - PokeBattle_Battler object indicating the Pokémon that fainted
  21.  
  22. - def pbChooseEnemyCommand(index)
  23. Use this method to choose a command for the enemy.
  24. index - Index of enemy battler (use e.g. @battle.battlers[index] to
  25. access the battler)
  26.  
  27. - def pbCommandMenu(index)
  28. Use this method to display the list of commands and choose
  29. a command for the player.
  30. index - Index of battler (use e.g. @battle.battlers[index] to
  31. access the battler)
  32. Return values:
  33. 0 - Fight
  34. 1 - Pokémon
  35. 2 - Bag
  36. 3 - Run
  37. =end
  38.  
  39. #===============================================================================
  40. # Command menu (Fight/Pokémon/Bag/Run)
  41. #===============================================================================
  42. class CommandMenuDisplay
  43. attr_accessor :mode
  44.  
  45. def initialize(viewport=nil)
  46. @display=nil
  47. if PokeBattle_SceneConstants::USECOMMANDBOX
  48. @display=IconSprite.new(0,Graphics.height-96,viewport)
  49. if $PokemonSystem.textskin==0
  50. @display.setBitmap("Graphics/Pictures/battleCommand")
  51. elsif $PokemonSystem.textskin==1 # skin "speech hgss 2"
  52. @display.setBitmap("Graphics/Pictures/battleCommand2")
  53. elsif $PokemonSystem.textskin==2
  54. @display.setBitmap("Graphics/Pictures/battleCommand3")
  55. elsif $PokemonSystem.textskin==3
  56. @display.setBitmap("Graphics/Pictures/battleCommand4")
  57. elsif $PokemonSystem.textskin==4
  58. @display.setBitmap("Graphics/Pictures/battleCommand5")
  59. elsif $PokemonSystem.textskin==5
  60. @display.setBitmap("Graphics/Pictures/battleCommand6")
  61. end
  62. end
  63. @window=Window_CommandPokemon.newWithSize([],
  64. Graphics.width-240,Graphics.height-96,240,96,viewport)
  65. @window.columns=2
  66. @window.columnSpacing=4
  67. @window.ignore_input=true
  68. @msgbox=Window_UnformattedTextPokemon.newWithSize(
  69. "",16,Graphics.height-96+2,220,96,viewport)
  70. @msgbox.baseColor=PokeBattle_SceneConstants::MESSAGEBASECOLOR
  71. @msgbox.shadowColor=PokeBattle_SceneConstants::MESSAGESHADOWCOLOR
  72. @msgbox.windowskin=nil
  73. @title=""
  74. @buttons=nil
  75. if PokeBattle_SceneConstants::USECOMMANDBOX
  76. @window.opacity=0
  77. @window.x=Graphics.width
  78. @buttons=CommandMenuButtons.new(self.index,self.mode,viewport)
  79. end
  80. end
  81.  
  82. def x; @window.x; end
  83. def x=(value)
  84. @window.x=value
  85. @msgbox.x=value
  86. @display.x=value if @display
  87. @buttons.x=value if @buttons
  88. end
  89.  
  90. def y; @window.y; end
  91. def y=(value)
  92. @window.y=value
  93. @msgbox.y=value
  94. @display.y=value if @display
  95. @buttons.y=value if @buttons
  96. end
  97.  
  98. def z; @window.z; end
  99. def z=(value)
  100. @window.z=value
  101. @msgbox.z=value
  102. @display.z=value if @display
  103. @buttons.z=value+1 if @buttons
  104. end
  105.  
  106. def ox; @window.ox; end
  107. def ox=(value)
  108. @window.ox=value
  109. @msgbox.ox=value
  110. @display.ox=value if @display
  111. @buttons.ox=value if @buttons
  112. end
  113.  
  114. def oy; @window.oy; end
  115. def oy=(value)
  116. @window.oy=value
  117. @msgbox.oy=value
  118. @display.oy=value if @display
  119. @buttons.oy=value if @buttons
  120. end
  121.  
  122. def visible; @window.visible; end
  123. def visible=(value)
  124. @window.visible=value
  125. @msgbox.visible=value
  126. @display.visible=value if @display
  127. @buttons.visible=value if @buttons
  128. end
  129.  
  130. def color; @window.color; end
  131. def color=(value)
  132. @window.color=value
  133. @msgbox.color=value
  134. @display.color=value if @display
  135. @buttons.color=value if @buttons
  136. end
  137.  
  138. def disposed?
  139. return @msgbox.disposed? || @window.disposed?
  140. end
  141.  
  142. def dispose
  143. return if disposed?
  144. @msgbox.dispose
  145. @window.dispose
  146. @display.dispose if @display
  147. @buttons.dispose if @buttons
  148. end
  149.  
  150. def index; @window.index; end
  151. def index=(value); @window.index=value; end
  152.  
  153. def setTexts(value)
  154. @msgbox.text=value[0]
  155. commands=[]
  156. for i in 1..4
  157. commands.push(value[i]) if value[i] && value[i]!=nil
  158. end
  159. @window.commands=commands
  160. end
  161.  
  162. def refresh
  163. @msgbox.refresh
  164. @window.refresh
  165. @buttons.refresh(self.index,self.mode) if @buttons
  166. end
  167.  
  168. def update
  169. @msgbox.update
  170. @window.update
  171. @display.update if @display
  172. @buttons.update(self.index,self.mode) if @buttons
  173. end
  174. end
  175.  
  176.  
  177.  
  178. class CommandMenuButtons < BitmapSprite
  179. def initialize(index=0,mode=0,viewport=nil)
  180. super(260,96,viewport)
  181. self.x=Graphics.width-260
  182. self.y=Graphics.height-96
  183. @mode=mode
  184. @buttonbitmap=AnimatedBitmap.new(_INTL("Graphics/Pictures/battleCommandButtons"))
  185. refresh(index,mode)
  186. end
  187.  
  188. def dispose
  189. @buttonbitmap.dispose
  190. super
  191. end
  192.  
  193. def update(index=0,mode=0)
  194. refresh(index,mode)
  195. end
  196.  
  197. def refresh(index,mode=0)
  198. self.bitmap.clear
  199. @mode=mode
  200. cmdarray=[0,2,1,3]
  201. case @mode
  202. when 1
  203. cmdarray=[0,2,1,4] # Use "Call"
  204. when 2
  205. cmdarray=[5,7,6,3] # Safari Zone battle
  206. when 3
  207. cmdarray=[0,8,1,3] # Bug Catching Contest
  208. end
  209. for i in 0...4
  210. next if i==index
  211. x=((i%2)==0) ? 0 : 126
  212. y=((i/2)==0) ? 6 : 48
  213. self.bitmap.blt(x,y,@buttonbitmap.bitmap,Rect.new(0,cmdarray[i]*46,130,46))
  214. end
  215. for i in 0...4
  216. next if i!=index
  217. x=((i%2)==0) ? 0 : 126
  218. y=((i/2)==0) ? 6 : 48
  219. self.bitmap.blt(x,y,@buttonbitmap.bitmap,Rect.new(130,cmdarray[i]*46,130,46))
  220. end
  221. end
  222. end
  223.  
  224.  
  225.  
  226. #===============================================================================
  227. # Fight menu (choose a move)
  228. #===============================================================================
  229. class FightMenuDisplay
  230. attr_reader :battler
  231. attr_reader :index
  232. attr_accessor :megaButton
  233.  
  234. def initialize(battler,viewport=nil)
  235. @display=nil
  236. if PokeBattle_SceneConstants::USEFIGHTBOX
  237. @display=IconSprite.new(0,Graphics.height-96,viewport)
  238. @display.setBitmap("Graphics/Pictures/battleFight")
  239. end
  240. @window=Window_CommandPokemon.newWithSize([],0,Graphics.height-96,320,96,viewport)
  241. @window.columns=2
  242. @window.columnSpacing=4
  243. @window.ignore_input=true
  244. pbSetNarrowFont(@window.contents)
  245. @info=Window_AdvancedTextPokemon.newWithSize(
  246. "",320,Graphics.height-96,Graphics.width-320,96,viewport)
  247. pbSetNarrowFont(@info.contents)
  248. @ctag=shadowctag(PokeBattle_SceneConstants::MENUBASECOLOR,
  249. PokeBattle_SceneConstants::MENUSHADOWCOLOR)
  250. @buttons=nil
  251. @battler=battler
  252. @index=0
  253. @megaButton=0 # 0=don't show, 1=show, 2=pressed
  254. if PokeBattle_SceneConstants::USEFIGHTBOX
  255. @window.opacity=0
  256. @window.x=Graphics.width
  257. @info.opacity=0
  258. @info.x=Graphics.width+Graphics.width-96
  259. @buttons=FightMenuButtons.new(self.index,nil,viewport)
  260. end
  261. refresh
  262. end
  263.  
  264. def x; @window.x; end
  265. def x=(value)
  266. @window.x=value
  267. @info.x=value
  268. @display.x=value if @display
  269. @buttons.x=value if @buttons
  270. end
  271.  
  272. def y; @window.y; end
  273. def y=(value)
  274. @window.y=value
  275. @info.y=value
  276. @display.y=value if @display
  277. @buttons.y=value if @buttons
  278. end
  279.  
  280. def z; @window.z; end
  281. def z=(value)
  282. @window.z=value
  283. @info.z=value
  284. @display.z=value if @display
  285. @buttons.z=value+1 if @buttons
  286. end
  287.  
  288. def ox; @window.ox; end
  289. def ox=(value)
  290. @window.ox=value
  291. @info.ox=value
  292. @display.ox=value if @display
  293. @buttons.ox=value if @buttons
  294. end
  295.  
  296. def oy; @window.oy; end
  297. def oy=(value)
  298. @window.oy=value
  299. @info.oy=value
  300. @display.oy=value if @display
  301. @buttons.oy=value if @buttons
  302. end
  303.  
  304. def visible; @window.visible; end
  305. def visible=(value)
  306. @window.visible=value
  307. @info.visible=value
  308. @display.visible=value if @display
  309. @buttons.visible=value if @buttons
  310. end
  311.  
  312. def color; @window.color; end
  313. def color=(value)
  314. @window.color=value
  315. @info.color=value
  316. @display.color=value if @display
  317. @buttons.color=value if @buttons
  318. end
  319.  
  320. def disposed?
  321. return @info.disposed? || @window.disposed?
  322. end
  323.  
  324. def dispose
  325. return if disposed?
  326. @info.dispose
  327. @display.dispose if @display
  328. @buttons.dispose if @buttons
  329. @window.dispose
  330. end
  331.  
  332. def battler=(value)
  333. @battler=value
  334. refresh
  335. end
  336.  
  337. def setIndex(value)
  338. if @battler && @battler.moves[value].id!=0
  339. @index=value
  340. @window.index=value
  341. refresh
  342. return true
  343. end
  344. return false
  345. end
  346.  
  347. def refresh
  348. return if !@battler
  349. commands=[]
  350. for i in 0...4
  351. break if @battler.moves[i].id==0
  352. commands.push(@battler.moves[i].name)
  353. end
  354. @window.commands=commands
  355. selmove=@battler.moves[@index]
  356. movetype=PBTypes.getName(selmove.type)
  357. if selmove.totalpp==0
  358. @info.text=_ISPRINTF("{1:s}PP: ---<br>TYPE/{2:s}",@ctag,movetype)
  359. else
  360. @info.text=_ISPRINTF("{1:s}PP: {2: 2d}/{3: 2d}<br>TYPE/{4:s}",
  361. @ctag,selmove.pp,selmove.totalpp,movetype)
  362. end
  363. @buttons.refresh(self.index,@battler ? @battler.moves : nil,@megaButton) if @buttons
  364. end
  365.  
  366. def update
  367. @info.update
  368. @window.update
  369. @display.update if @display
  370. if @buttons
  371. moves=@battler ? @battler.moves : nil
  372. @buttons.update(self.index,moves,@megaButton)
  373. end
  374. end
  375. end
  376.  
  377.  
  378.  
  379. class FightMenuButtons < BitmapSprite
  380. UPPERGAP=46
  381.  
  382. def initialize(index=0,moves=nil,viewport=nil)
  383. super(Graphics.width,96+UPPERGAP,viewport)
  384. self.x=0
  385. self.y=Graphics.height-96-UPPERGAP
  386. pbSetNarrowFont(self.bitmap)
  387. @buttonbitmap=AnimatedBitmap.new("Graphics/Pictures/battleFightButtons")
  388. @typebitmap=AnimatedBitmap.new(_INTL("Graphics/Pictures/types"))
  389. @megaevobitmap=AnimatedBitmap.new(_INTL("Graphics/Pictures/battleMegaEvo"))
  390. refresh(index,moves,0)
  391. end
  392.  
  393. def dispose
  394. @buttonbitmap.dispose
  395. @typebitmap.dispose
  396. @megaevobitmap.dispose
  397. super
  398. end
  399.  
  400. def update(index=0,moves=nil,megaButton=0)
  401. refresh(index,moves,megaButton)
  402. end
  403.  
  404. def refresh(index,moves,megaButton)
  405. return if !moves
  406. self.bitmap.clear
  407. moveboxes=_INTL("Graphics/Pictures/battleFightButtons")
  408. textpos=[]
  409. for i in 0...4
  410. next if i==index
  411. next if moves[i].id==0
  412. x=((i%2)==0) ? 4 : 192
  413. y=((i/2)==0) ? 6 : 48
  414. y+=UPPERGAP
  415. self.bitmap.blt(x,y,@buttonbitmap.bitmap,Rect.new(0,moves[i].type*46,192,46))
  416. textpos.push([_INTL("{1}",moves[i].name),x+96,y+8,2,
  417. PokeBattle_SceneConstants::MENUBASECOLOR,PokeBattle_SceneConstants::MENUSHADOWCOLOR])
  418. end
  419. ppcolors=[
  420. PokeBattle_SceneConstants::PPTEXTBASECOLOR,PokeBattle_SceneConstants::PPTEXTSHADOWCOLOR,
  421. PokeBattle_SceneConstants::PPTEXTBASECOLOR,PokeBattle_SceneConstants::PPTEXTSHADOWCOLOR,
  422. PokeBattle_SceneConstants::PPTEXTBASECOLORYELLOW,PokeBattle_SceneConstants::PPTEXTSHADOWCOLORYELLOW,
  423. PokeBattle_SceneConstants::PPTEXTBASECOLORORANGE,PokeBattle_SceneConstants::PPTEXTSHADOWCOLORORANGE,
  424. PokeBattle_SceneConstants::PPTEXTBASECOLORRED,PokeBattle_SceneConstants::PPTEXTSHADOWCOLORRED
  425. ]
  426. for i in 0...4
  427. next if i!=index
  428. next if moves[i].id==0
  429. x=((i%2)==0) ? 4 : 192
  430. y=((i/2)==0) ? 6 : 48
  431. y+=UPPERGAP
  432. self.bitmap.blt(x,y,@buttonbitmap.bitmap,Rect.new(192,moves[i].type*46,192,46))
  433. self.bitmap.blt(416,20+UPPERGAP,@typebitmap.bitmap,Rect.new(0,moves[i].type*28,64,28))
  434. textpos.push([_INTL("{1}",moves[i].name),x+96,y+8,2,
  435. PokeBattle_SceneConstants::MENUBASECOLOR,PokeBattle_SceneConstants::MENUSHADOWCOLOR])
  436. if moves[i].totalpp>0
  437. ppfraction=(4.0*moves[i].pp/moves[i].totalpp).ceil
  438. textpos.push([_INTL("PP: {1}/{2}",moves[i].pp,moves[i].totalpp),
  439. 448,50+UPPERGAP,2,ppcolors[(4-ppfraction)*2],ppcolors[(4-ppfraction)*2+1]])
  440. end
  441. end
  442. pbDrawTextPositions(self.bitmap,textpos)
  443. if megaButton>0
  444. self.bitmap.blt(146,0,@megaevobitmap.bitmap,Rect.new(0,(megaButton-1)*46,96,46))
  445. end
  446. end
  447. end
  448.  
  449.  
  450.  
  451. #===============================================================================
  452. # Data box for safari battles
  453. #===============================================================================
  454. class SafariDataBox < SpriteWrapper
  455. attr_accessor :selected
  456. attr_reader :appearing
  457.  
  458. def initialize(battle,viewport=nil)
  459. super(viewport)
  460. @selected=0
  461. @battle=battle
  462. @databox=AnimatedBitmap.new("Graphics/Pictures/battlePlayerSafari")
  463. @spriteX=PokeBattle_SceneConstants::SAFARIBOX_X
  464. @spriteY=PokeBattle_SceneConstants::SAFARIBOX_Y
  465. @appearing=false
  466. @contents=BitmapWrapper.new(@databox.width,@databox.height)
  467. self.bitmap=@contents
  468. self.visible=false
  469. self.z=50
  470. refresh
  471. end
  472.  
  473. def appear
  474. refresh
  475. self.visible=true
  476. self.opacity=255
  477. self.x=@spriteX+240
  478. self.y=@spriteY
  479. @appearing=true
  480. end
  481.  
  482. def refresh
  483. self.bitmap.clear
  484. self.bitmap.blt(0,0,@databox.bitmap,Rect.new(0,0,@databox.width,@databox.height))
  485. pbSetSystemFont(self.bitmap)
  486. textpos=[]
  487. base=PokeBattle_SceneConstants::BOXTEXTBASECOLOR
  488. shadow=PokeBattle_SceneConstants::BOXTEXTSHADOWCOLOR
  489. textpos.push([_INTL("Safari Balls"),30,8,false,base,shadow])
  490. textpos.push([_INTL("Left: {1}",@battle.ballcount),30,38,false,base,shadow])
  491. pbDrawTextPositions(self.bitmap,textpos)
  492. end
  493.  
  494. def update
  495. super
  496. if @appearing
  497. self.x-=12
  498. self.x=@spriteX if self.x<@spriteX
  499. @appearing=false if self.x<=@spriteX
  500. self.y=@spriteY
  501. return
  502. end
  503. self.x=@spriteX
  504. self.y=@spriteY
  505. end
  506. end
  507.  
  508.  
  509.  
  510. #===============================================================================
  511. # Data box for regular battles (both single and double)
  512. #===============================================================================
  513. class PokemonDataBox < SpriteWrapper
  514. attr_reader :battler
  515. attr_accessor :selected
  516. attr_accessor :appearing
  517. attr_reader :animatingHP
  518. attr_reader :animatingEXP
  519.  
  520. def initialize(battler,doublebattle,viewport=nil)
  521. super(viewport)
  522. @explevel=0
  523. @battler=battler
  524. @selected=0
  525. @frame=0
  526. @showhp=false
  527. @showexp=false
  528. @appearing=false
  529. @animatingHP=false
  530. @starthp=0
  531. @currenthp=0
  532. @endhp=0
  533. @expflash=0
  534. if (@battler.index&1)==0 # if player's Pokémon
  535. @spritebaseX=34
  536. else
  537. @spritebaseX=16
  538. end
  539. if doublebattle
  540. case @battler.index
  541. when 0
  542. @databox=AnimatedBitmap.new("Graphics/Pictures/battlePlayerBoxD")
  543. @spriteX=PokeBattle_SceneConstants::PLAYERBOXD1_X
  544. @spriteY=PokeBattle_SceneConstants::PLAYERBOXD1_Y
  545. when 1
  546. @databox=AnimatedBitmap.new("Graphics/Pictures/battleFoeBoxD")
  547. @spriteX=PokeBattle_SceneConstants::FOEBOXD1_X
  548. @spriteY=PokeBattle_SceneConstants::FOEBOXD1_Y
  549. when 2
  550. @databox=AnimatedBitmap.new("Graphics/Pictures/battlePlayerBoxD")
  551. @spriteX=PokeBattle_SceneConstants::PLAYERBOXD2_X
  552. @spriteY=PokeBattle_SceneConstants::PLAYERBOXD2_Y
  553. when 3
  554. @databox=AnimatedBitmap.new("Graphics/Pictures/battleFoeBoxD")
  555. @spriteX=PokeBattle_SceneConstants::FOEBOXD2_X
  556. @spriteY=PokeBattle_SceneConstants::FOEBOXD2_Y
  557. end
  558. else
  559. case @battler.index
  560. when 0
  561. @databox=AnimatedBitmap.new("Graphics/Pictures/battlePlayerBoxS")
  562. @spriteX=PokeBattle_SceneConstants::PLAYERBOX_X
  563. @spriteY=PokeBattle_SceneConstants::PLAYERBOX_Y
  564. @showhp=true
  565. @showexp=true
  566. when 1
  567. @databox=AnimatedBitmap.new("Graphics/Pictures/battleFoeBoxS")
  568. @spriteX=PokeBattle_SceneConstants::FOEBOX_X
  569. @spriteY=PokeBattle_SceneConstants::FOEBOX_Y
  570. end
  571. end
  572. @statuses=AnimatedBitmap.new(_INTL("Graphics/Pictures/battleStatuses"))
  573. @contents=BitmapWrapper.new(@databox.width,@databox.height)
  574. self.bitmap=@contents
  575. self.visible=false
  576. self.z=50
  577. refreshExpLevel
  578. refresh
  579. end
  580.  
  581. def dispose
  582. @statuses.dispose
  583. @databox.dispose
  584. @contents.dispose
  585. super
  586. end
  587.  
  588. def refreshExpLevel
  589. if !@battler.pokemon
  590. @explevel=0
  591. else
  592. growthrate=@battler.pokemon.growthrate
  593. startexp=PBExperience.pbGetStartExperience(@battler.pokemon.level,growthrate)
  594. endexp=PBExperience.pbGetStartExperience(@battler.pokemon.level+1,growthrate)
  595. if startexp==endexp
  596. @explevel=0
  597. else
  598. @explevel=(@battler.pokemon.exp-startexp)*PokeBattle_SceneConstants::EXPGAUGESIZE/(endexp-startexp)
  599. end
  600. end
  601. end
  602.  
  603. def exp
  604. return @animatingEXP ? @currentexp : @explevel
  605. end
  606.  
  607. def hp
  608. return @animatingHP ? @currenthp : @battler.hp
  609. end
  610.  
  611. def animateHP(oldhp,newhp)
  612. @starthp=oldhp
  613. @currenthp=oldhp
  614. @endhp=newhp
  615. @animatingHP=true
  616. end
  617.  
  618. def animateEXP(oldexp,newexp)
  619. @currentexp=oldexp
  620. @endexp=newexp
  621. @animatingEXP=true
  622. end
  623.  
  624. def appear
  625. refreshExpLevel
  626. refresh
  627. self.visible=true
  628. self.opacity=255
  629. if (@battler.index&1)==0 # if player's Pokémon
  630. self.x=@spriteX+320
  631. else
  632. self.x=@spriteX-320
  633. end
  634. self.y=@spriteY
  635. @appearing=true
  636. end
  637. # draw data box
  638. def refresh
  639. self.bitmap.clear
  640. return if !@battler.pokemon
  641. self.bitmap.blt(0,0,@databox.bitmap,Rect.new(0,0,@databox.width,@databox.height))
  642. base=PokeBattle_SceneConstants::BOXTEXTBASECOLOR
  643. shadow=PokeBattle_SceneConstants::BOXTEXTSHADOWCOLOR
  644. pokename=@battler.name
  645. pbSetSystemFont(self.bitmap)
  646. textpos=[
  647. [pokename,@spritebaseX+8,6,false,base,shadow]
  648. ]
  649. genderX=self.bitmap.text_size(pokename).width
  650. genderX+=@spritebaseX+14
  651. case @battler.displayGender
  652. when 0 # Male
  653. textpos.push([_INTL("♂"),genderX,6,false,Color.new(48,96,216),shadow])
  654. when 1 # Female
  655. textpos.push([_INTL("♀"),genderX,6,false,Color.new(248,88,40),shadow])
  656. end
  657. pbDrawTextPositions(self.bitmap,textpos)
  658. pbSetSmallFont(self.bitmap)
  659. textpos=[
  660. [_INTL("Lv{1}",@battler.level),@spritebaseX+202,8,true,base,shadow]
  661. ]
  662. if @showhp
  663. hpstring=_ISPRINTF("{1: 2d}/{2: 2d}",self.hp,@battler.totalhp)
  664. textpos.push([hpstring,@spritebaseX+188,48,true,base,shadow])
  665. end
  666. pbDrawTextPositions(self.bitmap,textpos)
  667. imagepos=[]
  668. if @battler.isShiny?
  669. shinyX=206
  670. shinyX=-6 if (@battler.index&1)==0 # If player's Pokémon
  671. imagepos.push(["Graphics/Pictures/shiny.png",@spritebaseX+shinyX,36,0,0,-1,-1])
  672. end
  673. if @battler.isMega?
  674. imagepos.push(["Graphics/Pictures/battleMegaEvoBox.png",@spritebaseX+8,34,0,0,-1,-1])
  675. elsif @battler.isPrimal?
  676. if isConst?(@battler.pokemon.species,PBSpecies,:KYOGRE)
  677. imagepos.push(["Graphics/Pictures/battlePrimalKyogreBox.png",@spritebaseX+140,4,0,0,-1,-1])
  678. elsif isConst?(@battler.pokemon.species,PBSpecies,:GROUDON)
  679. imagepos.push(["Graphics/Pictures/battlePrimalGroudonBox.png",@spritebaseX+140,4,0,0,-1,-1])
  680. end
  681. end
  682. if @battler.owned && (@battler.index&1)==1
  683. imagepos.push(["Graphics/Pictures/battleBoxOwned.png",@spritebaseX+8,36,0,0,-1,-1])
  684. end
  685. pbDrawImagePositions(self.bitmap,imagepos)
  686. if @battler.status>0
  687. self.bitmap.blt(@spritebaseX+24,36,@statuses.bitmap,
  688. Rect.new(0,(@battler.status-1)*16,44,16))
  689. end
  690. hpGaugeSize=PokeBattle_SceneConstants::HPGAUGESIZE
  691. hpgauge=@battler.totalhp==0 ? 0 : (self.hp*hpGaugeSize/@battler.totalhp)
  692. hpgauge=2 if hpgauge==0 && self.hp>0
  693. hpzone=0
  694. hpzone=1 if self.hp<=(@battler.totalhp/2).floor
  695. hpzone=2 if self.hp<=(@battler.totalhp/4).floor
  696. hpcolors=[
  697. PokeBattle_SceneConstants::HPCOLORGREENDARK,
  698. PokeBattle_SceneConstants::HPCOLORGREEN,
  699. PokeBattle_SceneConstants::HPCOLORYELLOWDARK,
  700. PokeBattle_SceneConstants::HPCOLORYELLOW,
  701. PokeBattle_SceneConstants::HPCOLORREDDARK,
  702. PokeBattle_SceneConstants::HPCOLORRED
  703. ]
  704. # fill with black (shows what the HP used to be)
  705. hpGaugeX=PokeBattle_SceneConstants::HPGAUGE_X
  706. hpGaugeY=PokeBattle_SceneConstants::HPGAUGE_Y
  707. if @animatingHP && self.hp>0
  708. self.bitmap.fill_rect(@spritebaseX+hpGaugeX,hpGaugeY,
  709. @starthp*hpGaugeSize/@battler.totalhp,6,Color.new(0,0,0))
  710. end
  711. # fill with HP color
  712. self.bitmap.fill_rect(@spritebaseX+hpGaugeX,hpGaugeY,hpgauge,2,hpcolors[hpzone*2])
  713. self.bitmap.fill_rect(@spritebaseX+hpGaugeX,hpGaugeY+2,hpgauge,4,hpcolors[hpzone*2+1])
  714. if @showexp
  715. # fill with EXP color
  716. expGaugeX=PokeBattle_SceneConstants::EXPGAUGE_X
  717. expGaugeY=PokeBattle_SceneConstants::EXPGAUGE_Y
  718. self.bitmap.fill_rect(@spritebaseX+expGaugeX,expGaugeY,self.exp,2,
  719. PokeBattle_SceneConstants::EXPCOLORSHADOW)
  720. self.bitmap.fill_rect(@spritebaseX+expGaugeX,expGaugeY+2,self.exp,2,
  721. PokeBattle_SceneConstants::EXPCOLORBASE)
  722. end
  723. end
  724.  
  725. def update
  726. super
  727. @frame+=1
  728. if @animatingHP
  729. if @currenthp<@endhp
  730. @currenthp+=[1,(@battler.totalhp/PokeBattle_SceneConstants::HPGAUGESIZE).floor].max
  731. @currenthp=@endhp if @currenthp>@endhp
  732. elsif @currenthp>@endhp
  733. @currenthp-=[1,(@battler.totalhp/PokeBattle_SceneConstants::HPGAUGESIZE).floor].max
  734. @currenthp=@endhp if @currenthp<@endhp
  735. end
  736. @animatingHP=false if @currenthp==@endhp
  737. refresh
  738. end
  739. if @animatingEXP
  740. if !@showexp
  741. @currentexp=@endexp
  742. elsif @currentexp<@endexp # Gaining Exp
  743. if @endexp>=PokeBattle_SceneConstants::EXPGAUGESIZE ||
  744. @endexp-@currentexp>=PokeBattle_SceneConstants::EXPGAUGESIZE/4
  745. @currentexp+=4
  746. else
  747. @currentexp+=2
  748. end
  749. @currentexp=@endexp if @currentexp>@endexp
  750. elsif @currentexp>@endexp # Losing Exp
  751. if @endexp==0 ||
  752. @currentexp-@endexp>=PokeBattle_SceneConstants::EXPGAUGESIZE/4
  753. @currentexp-=4
  754. elsif @currentexp>@endexp
  755. @currentexp-=2
  756. end
  757. @currentexp=@endexp if @currentexp<@endexp
  758. end
  759. refresh
  760. if @currentexp==@endexp
  761. if @currentexp==PokeBattle_SceneConstants::EXPGAUGESIZE
  762. if @expflash==0
  763. pbSEPlay("expfull")
  764. self.flash(Color.new(64,200,248),8)
  765. @expflash=8
  766. else
  767. @expflash-=1
  768. if @expflash==0
  769. @animatingEXP=false
  770. refreshExpLevel
  771. end
  772. end
  773. else
  774. @animatingEXP=false
  775. end
  776. end
  777. end
  778. if @appearing
  779. if (@battler.index&1)==0 # if player's Pokémon
  780. self.x-=12
  781. self.x=@spriteX if self.x<@spriteX
  782. @appearing=false if self.x<=@spriteX
  783. else
  784. self.x+=12
  785. self.x=@spriteX if self.x>@spriteX
  786. @appearing=false if self.x>=@spriteX
  787. end
  788. self.y=@spriteY
  789. return
  790. end
  791. self.x=@spriteX
  792. self.y=@spriteY
  793. # Data box bobbing while Pokémon is selected
  794. if ((@frame/10).floor&1)==1 && @selected==1 # Choosing commands for this Pokémon
  795. self.y=@spriteY+2
  796. elsif ((@frame/10).floor&1)==1 && @selected==2 # When targeted or damaged
  797. self.y=@spriteY+2
  798. end
  799. end
  800. end
  801.  
  802.  
  803.  
  804. #===============================================================================
  805. # Shows the enemy trainer(s)'s Pokémon being thrown out. It appears at coords
  806. # (@spritex,@spritey), and moves in y to @endspritey where it stays for the rest
  807. # of the battle, i.e. the latter is the more important value.
  808. # Doesn't show the ball itself being thrown.
  809. #===============================================================================
  810. class PokeballSendOutAnimation
  811. SPRITESTEPS=10
  812. STARTZOOM=0.125
  813.  
  814. def initialize(sprite,spritehash,pkmn,illusionpoke,doublebattle)
  815. @illusionpoke=illusionpoke
  816. @disposed=false
  817. @ballused=pkmn.pokemon ? pkmn.pokemon.ballused : 0
  818. if @illusionpoke
  819. @ballused=@illusionpoke.ballused || 0
  820. end
  821. @PokemonBattlerSprite=sprite
  822. @PokemonBattlerSprite.visible=false
  823. @PokemonBattlerSprite.tone=Tone.new(248,248,248,248)
  824. @pokeballsprite=IconSprite.new(0,0,sprite.viewport)
  825. @pokeballsprite.setBitmap(sprintf("Graphics/Pictures/ball%02d",@ballused))
  826. if doublebattle
  827. @spritex=PokeBattle_SceneConstants::FOEBATTLERD1_X if pkmn.index==1
  828. @spritex=PokeBattle_SceneConstants::FOEBATTLERD2_X if pkmn.index==3
  829. else
  830. @spritex=PokeBattle_SceneConstants::FOEBATTLER_X
  831. end
  832. @spritey=0
  833. if @illusionpoke
  834. @endspritey=adjustBattleSpriteY(sprite,@illusionpoke.species,pkmn.index)
  835. else
  836. @endspritey=adjustBattleSpriteY(sprite,pkmn.species,pkmn.index)
  837. end
  838. if doublebattle
  839. @spritey=PokeBattle_SceneConstants::FOEBATTLERD1_Y if pkmn.index==1
  840. @spritey=PokeBattle_SceneConstants::FOEBATTLERD2_Y if pkmn.index==3
  841. @endspritey+=PokeBattle_SceneConstants::FOEBATTLERD1_Y if pkmn.index==1
  842. @endspritey+=PokeBattle_SceneConstants::FOEBATTLERD2_Y if pkmn.index==3
  843. else
  844. @spritey=PokeBattle_SceneConstants::FOEBATTLER_Y
  845. @endspritey+=PokeBattle_SceneConstants::FOEBATTLER_Y
  846. end
  847. @spritehash=spritehash
  848. @pokeballsprite.x=@spritex-@pokeballsprite.bitmap.width/2
  849. @pokeballsprite.y=@spritey-@pokeballsprite.bitmap.height/2-4
  850. @pokeballsprite.z=@PokemonBattlerSprite.z+1
  851. @pkmn=pkmn
  852. @shadowX=@spritex
  853. @shadowY=@spritey
  854. if @spritehash["shadow#{@pkmn.index}"] && @spritehash["shadow#{@pkmn.index}"].bitmap!=nil
  855. @shadowX-=@spritehash["shadow#{@pkmn.index}"].bitmap.width/2
  856. @shadowY-=@spritehash["shadow#{@pkmn.index}"].bitmap.height/2
  857. end
  858. @shadowVisible=showShadow?(pkmn.species)
  859. if @illusionpoke
  860. @shadowVisible=showShadow?(@illusionpoke.species)
  861. end
  862. @stepspritey=(@spritey-@endspritey)
  863. @zoomstep=(1.0-STARTZOOM)/SPRITESTEPS
  864. @animdone=false
  865. @frame=0
  866. end
  867.  
  868. def disposed?
  869. return @disposed
  870. end
  871.  
  872. def animdone?
  873. return @animdone
  874. end
  875.  
  876. def dispose
  877. return if disposed?
  878. @pokeballsprite.dispose
  879. @disposed=true
  880. end
  881.  
  882. def update
  883. return if disposed?
  884. @pokeballsprite.update
  885. @frame+=1
  886. if @frame==2
  887. pbSEPlay("recall")
  888. end
  889. if @frame==4
  890. @PokemonBattlerSprite.visible=true
  891. @PokemonBattlerSprite.zoom_x=STARTZOOM
  892. @PokemonBattlerSprite.zoom_y=STARTZOOM
  893. pbSpriteSetCenter(@PokemonBattlerSprite,@spritex,@spritey)
  894. if @illusionpoke
  895. pbPlayCry(@illusionpoke)
  896. else
  897. pbPlayCry(@pkmn.pokemon ? @pkmn.pokemon : @pkmn.species)
  898. end
  899. @pokeballsprite.setBitmap(sprintf("Graphics/Pictures/ball%02d_open",@ballused))
  900. end
  901. if @frame==8
  902. @pokeballsprite.visible=false
  903. end
  904. if @frame>8 && @frame<=16
  905. color=Color.new(248,248,248,256-(16-@frame)*32)
  906. @spritehash["enemybase"].color=color
  907. @spritehash["playerbase"].color=color
  908. @spritehash["battlebg"].color=color
  909. for i in 0...4
  910. @spritehash["shadow#{i}"].color=color if @spritehash["shadow#{i}"]
  911. end
  912. end
  913. if @frame>16 && @frame<=24
  914. color=Color.new(248,248,248,(24-@frame)*32)
  915. tone=(24-@frame)*32
  916. @PokemonBattlerSprite.tone=Tone.new(tone,tone,tone,tone)
  917. @spritehash["enemybase"].color=color
  918. @spritehash["playerbase"].color=color
  919. @spritehash["battlebg"].color=color
  920. for i in 0...4
  921. @spritehash["shadow#{i}"].color=color if @spritehash["shadow#{i}"]
  922. end
  923. end
  924. if @frame>5 && @PokemonBattlerSprite.zoom_x<1.0
  925. @PokemonBattlerSprite.zoom_x+=@zoomstep
  926. @PokemonBattlerSprite.zoom_y+=@zoomstep
  927. @PokemonBattlerSprite.zoom_x=1.0 if @PokemonBattlerSprite.zoom_x > 1.0
  928. @PokemonBattlerSprite.zoom_y=1.0 if @PokemonBattlerSprite.zoom_y > 1.0
  929. currentY=@spritey-(@stepspritey*@PokemonBattlerSprite.zoom_y)
  930. pbSpriteSetCenter(@PokemonBattlerSprite,@spritex,currentY)
  931. @PokemonBattlerSprite.y=currentY
  932. end
  933. if @PokemonBattlerSprite.tone.gray<=0 && @PokemonBattlerSprite.zoom_x>=1.0
  934. @animdone=true
  935. if @spritehash["shadow#{@pkmn.index}"]
  936. @spritehash["shadow#{@pkmn.index}"].x=@shadowX
  937. @spritehash["shadow#{@pkmn.index}"].y=@shadowY
  938. @spritehash["shadow#{@pkmn.index}"].visible=@shadowVisible
  939. end
  940. end
  941. end
  942. end
  943.  
  944.  
  945.  
  946. #===============================================================================
  947. # Shows the player's (or partner's) Pokémon being thrown out. It appears at
  948. # (@spritex,@spritey), and moves in y to @endspritey where it stays for the rest
  949. # of the battle, i.e. the latter is the more important value.
  950. # Doesn't show the ball itself being thrown.
  951. #===============================================================================
  952. class PokeballPlayerSendOutAnimation
  953. # Ball curve: 8,52; 22,44; 52, 96
  954. # Player: Color.new(16*8,23*8,30*8)
  955. SPRITESTEPS=10
  956. STARTZOOM=0.125
  957.  
  958. def initialize(sprite,spritehash,pkmn,illusionpoke,doublebattle)
  959. @illusionpoke=illusionpoke
  960. @disposed=false
  961. @PokemonBattlerSprite=sprite
  962. @pkmn=pkmn
  963. @PokemonBattlerSprite.visible=false
  964. @PokemonBattlerSprite.tone=Tone.new(248,248,248,248)
  965. @spritehash=spritehash
  966. if doublebattle
  967. @spritex=PokeBattle_SceneConstants::PLAYERBATTLERD1_X if pkmn.index==0
  968. @spritex=PokeBattle_SceneConstants::PLAYERBATTLERD2_X if pkmn.index==2
  969. else
  970. @spritex=PokeBattle_SceneConstants::PLAYERBATTLER_X
  971. end
  972. @spritey=0
  973. if @illusionpoke
  974. @endspritey=adjustBattleSpriteY(sprite,@illusionpoke.species,pkmn.index)
  975. else
  976. @endspritey=adjustBattleSpriteY(sprite,pkmn.species,pkmn.index)
  977. end
  978. if doublebattle
  979. @spritey+=PokeBattle_SceneConstants::PLAYERBATTLERD1_Y if pkmn.index==0
  980. @spritey+=PokeBattle_SceneConstants::PLAYERBATTLERD2_Y if pkmn.index==2
  981. @endspritey+=PokeBattle_SceneConstants::PLAYERBATTLERD1_Y if pkmn.index==0
  982. @endspritey+=PokeBattle_SceneConstants::PLAYERBATTLERD2_Y if pkmn.index==2
  983. else
  984. @spritey+=PokeBattle_SceneConstants::PLAYERBATTLER_Y
  985. @endspritey+=PokeBattle_SceneConstants::PLAYERBATTLER_Y
  986. end
  987. @animdone=false
  988. @frame=0
  989. end
  990.  
  991. def disposed?
  992. return @disposed
  993. end
  994.  
  995. def animdone?
  996. return @animdone
  997. end
  998.  
  999. def dispose
  1000. return if disposed?
  1001. @disposed=true
  1002. end
  1003.  
  1004. def update
  1005. return if disposed?
  1006. @frame+=1
  1007. if @frame==4
  1008. @PokemonBattlerSprite.visible=true
  1009. @PokemonBattlerSprite.zoom_x=STARTZOOM
  1010. @PokemonBattlerSprite.zoom_y=STARTZOOM
  1011. pbSEPlay("recall")
  1012. pbSpriteSetCenter(@PokemonBattlerSprite,@spritex,@spritey)
  1013. if @illusionpoke
  1014. pbPlayCry(@illusionpoke)
  1015. else
  1016. pbPlayCry(@pkmn.pokemon ? @pkmn.pokemon : @pkmn.species)
  1017. end
  1018. end
  1019. if @frame>8 && @frame<=16
  1020. color=Color.new(248,248,248,256-(16-@frame)*32)
  1021. @spritehash["enemybase"].color=color
  1022. @spritehash["playerbase"].color=color
  1023. @spritehash["battlebg"].color=color
  1024. for i in 0...4
  1025. @spritehash["shadow#{i}"].color=color if @spritehash["shadow#{i}"]
  1026. end
  1027. end
  1028. if @frame>16 && @frame<=24
  1029. color=Color.new(248,248,248,(24-@frame)*32)
  1030. tone=(24-@frame)*32
  1031. @PokemonBattlerSprite.tone=Tone.new(tone,tone,tone,tone)
  1032. @spritehash["enemybase"].color=color
  1033. @spritehash["playerbase"].color=color
  1034. @spritehash["battlebg"].color=color
  1035. for i in 0...4
  1036. @spritehash["shadow#{i}"].color=color if @spritehash["shadow#{i}"]
  1037. end
  1038. end
  1039. if @frame>5 && @PokemonBattlerSprite.zoom_x<1.0
  1040. @PokemonBattlerSprite.zoom_x+=0.1
  1041. @PokemonBattlerSprite.zoom_y+=0.1
  1042. @PokemonBattlerSprite.zoom_x=1.0 if @PokemonBattlerSprite.zoom_x > 1.0
  1043. @PokemonBattlerSprite.zoom_y=1.0 if @PokemonBattlerSprite.zoom_y > 1.0
  1044. pbSpriteSetCenter(@PokemonBattlerSprite,@spritex,0)
  1045. @PokemonBattlerSprite.y=@spritey+(@endspritey-@spritey)*@PokemonBattlerSprite.zoom_y
  1046. end
  1047. if @PokemonBattlerSprite.tone.gray<=0 && @PokemonBattlerSprite.zoom_x>=1.0
  1048. @animdone=true
  1049. end
  1050. end
  1051. end
  1052.  
  1053.  
  1054.  
  1055. #===============================================================================
  1056. # Shows the enemy trainer(s) and the enemy party lineup sliding off screen.
  1057. # Doesn't show the ball thrown or the Pokémon.
  1058. #===============================================================================
  1059. class TrainerFadeAnimation
  1060. def initialize(sprites)
  1061. @frame=0
  1062. @sprites=sprites
  1063. @animdone=false
  1064. end
  1065.  
  1066. def animdone?
  1067. return @animdone
  1068. end
  1069.  
  1070. def update
  1071. return if @animdone
  1072. @frame+=1
  1073. @sprites["trainer"].x+=8
  1074. @sprites["trainer2"].x+=8 if @sprites["trainer2"]
  1075. @sprites["partybarfoe"].x+=8
  1076. @sprites["partybarfoe"].opacity-=12
  1077. for i in 0...6
  1078. @sprites["enemy#{i}"].opacity-=12
  1079. @sprites["enemy#{i}"].x+=8 if @frame>=i*4
  1080. end
  1081. @animdone=true if @sprites["trainer"].x>=Graphics.width &&
  1082. (!@sprites["trainer2"] || @sprites["trainer2"].x>=Graphics.width)
  1083. end
  1084. end
  1085.  
  1086.  
  1087.  
  1088. #===============================================================================
  1089. # Shows the player (and partner) and the player party lineup sliding off screen.
  1090. # Shows the player's/partner's throwing animation (if they have one).
  1091. # Doesn't show the ball thrown or the Pokémon.
  1092. #===============================================================================
  1093. class PlayerFadeAnimation
  1094. def initialize(sprites)
  1095. @frame=0
  1096. @sprites=sprites
  1097. @animdone=false
  1098. end
  1099.  
  1100. def animdone?
  1101. return @animdone
  1102. end
  1103.  
  1104. def update
  1105. return if @animdone
  1106. @frame+=1
  1107. @sprites["player"].x-=8
  1108. @sprites["playerB"].x-=8 if @sprites["playerB"]
  1109. @sprites["partybarplayer"].x-=8
  1110. @sprites["partybarplayer"].opacity-=12
  1111. for i in 0...6
  1112. if @sprites["player#{i}"]
  1113. @sprites["player#{i}"].opacity-=12
  1114. @sprites["player#{i}"].x-=8 if @frame>=i*4
  1115. end
  1116. end
  1117. pa=@sprites["player"]
  1118. pb=@sprites["playerB"]
  1119. pawidth=128
  1120. pbwidth=128
  1121. if (pa && pa.bitmap && !pa.bitmap.disposed?)
  1122. if pa.bitmap.height<pa.bitmap.width
  1123. numframes=pa.bitmap.width/pa.bitmap.height # Number of frames
  1124. pawidth=pa.bitmap.width/numframes # Width per frame
  1125. @sprites["player"].src_rect.x=pawidth*1 if @frame>0
  1126. @sprites["player"].src_rect.x=pawidth*2 if @frame>8
  1127. @sprites["player"].src_rect.x=pawidth*3 if @frame>12
  1128. @sprites["player"].src_rect.x=pawidth*4 if @frame>16
  1129. @sprites["player"].src_rect.width=pawidth
  1130. else
  1131. pawidth=pa.bitmap.width
  1132. @sprites["player"].src_rect.x=0
  1133. @sprites["player"].src_rect.width=pawidth
  1134. end
  1135. end
  1136. if (pb && pb.bitmap && !pb.bitmap.disposed?)
  1137. if pb.bitmap.height<pb.bitmap.width
  1138. numframes=pb.bitmap.width/pb.bitmap.height # Number of frames
  1139. pbwidth=pb.bitmap.width/numframes # Width per frame
  1140. @sprites["playerB"].src_rect.x=pbwidth*1 if @frame>0
  1141. @sprites["playerB"].src_rect.x=pbwidth*2 if @frame>8
  1142. @sprites["playerB"].src_rect.x=pbwidth*3 if @frame>12
  1143. @sprites["playerB"].src_rect.x=pbwidth*4 if @frame>16
  1144. @sprites["playerB"].src_rect.width=pbwidth
  1145. else
  1146. pbwidth=pb.bitmap.width
  1147. @sprites["playerB"].src_rect.x=0
  1148. @sprites["playerB"].src_rect.width=pbwidth
  1149. end
  1150. end
  1151. if pb
  1152. @animdone=true if pb.x<=-pbwidth
  1153. else
  1154. @animdone=true if pa.x<=-pawidth
  1155. end
  1156. end
  1157. end
  1158.  
  1159.  
  1160.  
  1161. #===============================================================================
  1162. # Shows the player's Poké Ball being thrown to capture a Pokémon.
  1163. #===============================================================================
  1164. def pokeballThrow(ball,shakes,critical,targetBattler,scene,battler,burst=-1,showplayer=false)
  1165. balltype=pbGetBallType(ball)
  1166. animtrainer=false
  1167. if showplayer && @sprites["player"].bitmap.width>@sprites["player"].bitmap.height
  1168. animtrainer=true
  1169. end
  1170. oldvisible=@sprites["shadow#{targetBattler}"].visible
  1171. @sprites["shadow#{targetBattler}"].visible=false
  1172. ball=sprintf("Graphics/Pictures/ball%02d",balltype)
  1173. ballopen=sprintf("Graphics/Pictures/ball%02d_open",balltype)
  1174. # sprites
  1175. spritePoke=@sprites["pokemon#{targetBattler}"]
  1176. spriteBall=IconSprite.new(0,0,@viewport)
  1177. spriteBall.visible=false
  1178. spritePlayer=@sprites["player"] if animtrainer
  1179. # pictures
  1180. pictureBall=PictureEx.new(spritePoke.z+1)
  1181. picturePoke=PictureEx.new(spritePoke.z)
  1182. dims=[spritePoke.x,spritePoke.y]
  1183. center=getSpriteCenter(@sprites["pokemon#{targetBattler}"])
  1184. if @battle.doublebattle
  1185. ballendy=PokeBattle_SceneConstants::FOEBATTLERD1_Y-4 if targetBattler==1
  1186. ballendy=PokeBattle_SceneConstants::FOEBATTLERD2_Y-4 if targetBattler==3
  1187. else
  1188. ballendy=PokeBattle_SceneConstants::FOEBATTLER_Y-4
  1189. end
  1190. if animtrainer
  1191. picturePlayer=PictureEx.new(spritePoke.z+2)
  1192. playerpos=[@sprites["player"].x,@sprites["player"].y]
  1193. end
  1194. # starting positions
  1195. pictureBall.moveVisible(1,true)
  1196. pictureBall.moveName(1,ball)
  1197. pictureBall.moveOrigin(1,PictureOrigin::Center)
  1198. if animtrainer
  1199. pictureBall.moveXY(0,1,64,256)
  1200. else
  1201. pictureBall.moveXY(0,1,10,180)
  1202. end
  1203. picturePoke.moveVisible(1,true)
  1204. picturePoke.moveOrigin(1,PictureOrigin::Center)
  1205. picturePoke.moveXY(0,1,center[0],center[1])
  1206. if animtrainer
  1207. picturePlayer.moveVisible(1,true)
  1208. picturePlayer.moveName(1,spritePlayer.name)
  1209. picturePlayer.moveOrigin(1,PictureOrigin::TopLeft)
  1210. picturePlayer.moveXY(0,1,playerpos[0],playerpos[1])
  1211. end
  1212. # directives
  1213. picturePoke.moveSE(1,"Audio/SE/throw")
  1214. if animtrainer
  1215. pictureBall.moveCurve(30,1,64,256,30+Graphics.width/2,10,center[0],center[1])
  1216. pictureBall.moveAngle(30,1,-720)
  1217. else
  1218. pictureBall.moveCurve(30,1,150,70,30+Graphics.width/2,10,center[0],center[1])
  1219. pictureBall.moveAngle(30,1,-1080)
  1220. end
  1221. pictureBall.moveAngle(0,pictureBall.totalDuration,0)
  1222. delay=pictureBall.totalDuration+4
  1223. picturePoke.moveTone(10,delay,Tone.new(0,-224,-224,0))
  1224. delay=picturePoke.totalDuration
  1225. picturePoke.moveSE(delay,"Audio/SE/recall")
  1226. pictureBall.moveName(delay+4,ballopen)
  1227. if animtrainer
  1228. picturePlayer.moveSrc(1,@sprites["player"].bitmap.height,0)
  1229. picturePlayer.moveXY(0,1,playerpos[0]-14,playerpos[1])
  1230. picturePlayer.moveSrc(4,@sprites["player"].bitmap.height*2,0)
  1231. picturePlayer.moveXY(0,4,playerpos[0]-12,playerpos[1])
  1232. picturePlayer.moveSrc(8,@sprites["player"].bitmap.height*3,0)
  1233. picturePlayer.moveXY(0,8,playerpos[0]+20,playerpos[1])
  1234. picturePlayer.moveSrc(16,@sprites["player"].bitmap.height*4,0)
  1235. picturePlayer.moveXY(0,16,playerpos[0]+16,playerpos[1])
  1236. picturePlayer.moveSrc(40,0,0)
  1237. picturePlayer.moveXY(0,40,playerpos[0],playerpos[1])
  1238. end
  1239. loop do
  1240. pictureBall.update
  1241. picturePoke.update
  1242. picturePlayer.update if animtrainer
  1243. setPictureIconSprite(spriteBall,pictureBall)
  1244. setPictureSprite(spritePoke,picturePoke)
  1245. setPictureIconSprite(spritePlayer,picturePlayer) if animtrainer
  1246. pbGraphicsUpdate
  1247. pbInputUpdate
  1248. pbFrameUpdate
  1249. break if !pictureBall.running? && !picturePoke.running?
  1250. end
  1251. # Burst animation here
  1252. if burst>=0 && scene.battle.battlescene
  1253. scene.pbCommonAnimation("BallBurst#{burst}",battler,nil)
  1254. end
  1255. pictureBall.clearProcesses
  1256. picturePoke.clearProcesses
  1257. delay=0
  1258. picturePoke.moveZoom(15,delay,0)
  1259. picturePoke.moveXY(15,delay,center[0],center[1])
  1260. picturePoke.moveSE(delay+10,"Audio/SE/jumptoball")
  1261. picturePoke.moveVisible(delay+15,false)
  1262. pictureBall.moveName(picturePoke.totalDuration+2,ball)
  1263. delay=pictureBall.totalDuration+6
  1264. if critical
  1265. pictureBall.moveSE(delay,"Audio/SE/ballshake")
  1266. pictureBall.moveXY(2,delay,center[0]+4,center[1])
  1267. pictureBall.moveXY(4,pictureBall.totalDuration,center[0]-4,center[1])
  1268. pictureBall.moveSE(pictureBall.totalDuration,"Audio/SE/ballshake")
  1269. pictureBall.moveXY(4,pictureBall.totalDuration,center[0]+4,center[1])
  1270. pictureBall.moveXY(4,pictureBall.totalDuration,center[0]-4,center[1])
  1271. pictureBall.moveXY(2,pictureBall.totalDuration,center[0],center[1])
  1272. delay=pictureBall.totalDuration+4
  1273. end
  1274. pictureBall.moveXY(10,delay,center[0],ballendy)
  1275. pictureBall.moveSE(pictureBall.totalDuration,"Audio/SE/balldrop")
  1276. pictureBall.moveXY(5,pictureBall.totalDuration+2,center[0],ballendy-((ballendy-center[1])/2))
  1277. pictureBall.moveXY(5,pictureBall.totalDuration+2,center[0],ballendy)
  1278. pictureBall.moveSE(pictureBall.totalDuration,"Audio/SE/balldrop")
  1279. pictureBall.moveXY(3,pictureBall.totalDuration+2,center[0],ballendy-((ballendy-center[1])/4))
  1280. pictureBall.moveXY(3,pictureBall.totalDuration+2,center[0],ballendy)
  1281. pictureBall.moveSE(pictureBall.totalDuration,"Audio/SE/balldrop")
  1282. pictureBall.moveXY(1,pictureBall.totalDuration+2,center[0],ballendy-((ballendy-center[1])/8))
  1283. pictureBall.moveXY(1,pictureBall.totalDuration+2,center[0],ballendy)
  1284. pictureBall.moveSE(pictureBall.totalDuration,"Audio/SE/balldrop")
  1285. picturePoke.moveXY(0,pictureBall.totalDuration,center[0],ballendy)
  1286. delay=pictureBall.totalDuration+18# if shakes==0
  1287. [shakes,3].min.times do
  1288. pictureBall.moveSE(delay,"Audio/SE/ballshake")
  1289. pictureBall.moveXY(3,delay,center[0]-8,ballendy)
  1290. pictureBall.moveAngle(3,delay,20) # positive means counterclockwise
  1291. delay=pictureBall.totalDuration
  1292. pictureBall.moveXY(6,delay,center[0]+8,ballendy)
  1293. pictureBall.moveAngle(6,delay,-20) # negative means clockwise
  1294. delay=pictureBall.totalDuration
  1295. pictureBall.moveXY(3,delay,center[0],ballendy)
  1296. pictureBall.moveAngle(3,delay,0)
  1297. delay=pictureBall.totalDuration+18
  1298. end
  1299. if shakes<4
  1300. picturePoke.moveSE(delay,"Audio/SE/recall")
  1301. pictureBall.moveName(delay,ballopen)
  1302. pictureBall.moveVisible(delay+10,false)
  1303. picturePoke.moveVisible(delay,true)
  1304. picturePoke.moveZoom(15,delay,100)
  1305. picturePoke.moveXY(15,delay,center[0],center[1])
  1306. picturePoke.moveTone(0,delay,Tone.new(248,248,248,248))
  1307. picturePoke.moveTone(24,delay,Tone.new(0,0,0,0))
  1308. delay=picturePoke.totalDuration
  1309. end
  1310. pictureBall.moveXY(0,delay,center[0],ballendy)
  1311. picturePoke.moveOrigin(picturePoke.totalDuration,PictureOrigin::TopLeft)
  1312. picturePoke.moveXY(0,picturePoke.totalDuration,dims[0],dims[1])
  1313. loop do
  1314. pictureBall.update
  1315. picturePoke.update
  1316. setPictureIconSprite(spriteBall,pictureBall)
  1317. setPictureSprite(spritePoke,picturePoke)
  1318. pbGraphicsUpdate
  1319. pbInputUpdate
  1320. pbFrameUpdate
  1321. break if !pictureBall.running? && !picturePoke.running?
  1322. end
  1323. if shakes<4
  1324. @sprites["shadow#{targetBattler}"].visible=oldvisible
  1325. spriteBall.dispose
  1326. else
  1327. spriteBall.tone=Tone.new(-64,-64,-64,128)
  1328. pbSEPlay("balldrop",100,150)
  1329. @sprites["capture"]=spriteBall
  1330. spritePoke.visible=false
  1331. end
  1332. end
  1333.  
  1334.  
  1335.  
  1336. #===============================================================================
  1337. # Battle scene (the visuals of the battle)
  1338. #===============================================================================
  1339. class PokeBattle_Scene
  1340. attr_accessor :abortable
  1341. attr_reader :viewport
  1342. attr_reader :sprites
  1343. BLANK = 0
  1344. MESSAGEBOX = 1
  1345. COMMANDBOX = 2
  1346. FIGHTBOX = 3
  1347.  
  1348. def initialize
  1349. @battle=nil
  1350. @lastcmd=[0,0,0,0]
  1351. @lastmove=[0,0,0,0]
  1352. @pkmnwindows=[nil,nil,nil,nil]
  1353. @sprites={}
  1354. @battlestart=true
  1355. @messagemode=false
  1356. @abortable=false
  1357. @aborted=false
  1358. end
  1359.  
  1360. def pbUpdate
  1361. partyAnimationUpdate
  1362. @sprites["battlebg"].update if @sprites["battlebg"].respond_to?("update")
  1363. end
  1364.  
  1365. def pbGraphicsUpdate
  1366. partyAnimationUpdate
  1367. @sprites["battlebg"].update if @sprites["battlebg"].respond_to?("update")
  1368. Graphics.update
  1369. end
  1370.  
  1371. def pbInputUpdate
  1372. Input.update
  1373. if Input.trigger?(Input::B) && @abortable && !@aborted
  1374. @aborted=true
  1375. @battle.pbAbort
  1376. end
  1377. end
  1378.  
  1379. def pbShowWindow(windowtype)
  1380. @sprites["messagebox"].visible = (windowtype==MESSAGEBOX ||
  1381. windowtype==COMMANDBOX ||
  1382. windowtype==FIGHTBOX ||
  1383. windowtype==BLANK )
  1384. @sprites["messagewindow"].visible = (windowtype==MESSAGEBOX)
  1385. @sprites["commandwindow"].visible = (windowtype==COMMANDBOX)
  1386. @sprites["fightwindow"].visible = (windowtype==FIGHTBOX)
  1387. end
  1388.  
  1389. def pbSetMessageMode(mode)
  1390. @messagemode=mode
  1391. msgwindow=@sprites["messagewindow"]
  1392. if mode # Within Pokémon command
  1393. msgwindow.baseColor=PokeBattle_SceneConstants::MENUBASECOLOR
  1394. msgwindow.shadowColor=PokeBattle_SceneConstants::MENUSHADOWCOLOR
  1395. msgwindow.opacity=255
  1396. msgwindow.x=16
  1397. msgwindow.width=Graphics.width
  1398. msgwindow.height=96
  1399. msgwindow.y=Graphics.height-msgwindow.height+2
  1400. else
  1401. msgwindow.baseColor=PokeBattle_SceneConstants::MESSAGEBASECOLOR
  1402. msgwindow.shadowColor=PokeBattle_SceneConstants::MESSAGESHADOWCOLOR
  1403. msgwindow.opacity=0
  1404. msgwindow.x=16
  1405. msgwindow.width=Graphics.width-32
  1406. msgwindow.height=96
  1407. msgwindow.y=Graphics.height-msgwindow.height+2
  1408. end
  1409. end
  1410.  
  1411. def pbWaitMessage
  1412. if @briefmessage
  1413. pbShowWindow(MESSAGEBOX)
  1414. cw=@sprites["messagewindow"]
  1415. 60.times do
  1416. pbGraphicsUpdate
  1417. pbInputUpdate
  1418. pbFrameUpdate(cw)
  1419. end
  1420. cw.text=""
  1421. cw.visible=false
  1422. @briefmessage=false
  1423. end
  1424. end
  1425.  
  1426. def pbDisplay(msg,brief=false)
  1427. pbDisplayMessage(msg,brief)
  1428. end
  1429.  
  1430. def pbDisplayMessage(msg,brief=false)
  1431. pbWaitMessage
  1432. pbRefresh
  1433. pbShowWindow(MESSAGEBOX)
  1434. cw=@sprites["messagewindow"]
  1435. cw.text=msg
  1436. i=0
  1437. loop do
  1438. pbGraphicsUpdate
  1439. pbInputUpdate
  1440. pbFrameUpdate(cw)
  1441. if i==40
  1442. cw.text=""
  1443. cw.visible=false
  1444. return
  1445. end
  1446. if Input.trigger?(Input::C) || @abortable
  1447. if cw.pausing?
  1448. pbPlayDecisionSE() if !@abortable
  1449. cw.resume
  1450. end
  1451. end
  1452. if !cw.busy?
  1453. if brief
  1454. @briefmessage=true
  1455. return
  1456. end
  1457. i+=1
  1458. end
  1459. end
  1460. end
  1461.  
  1462. def pbDisplayPausedMessage(msg)
  1463. pbWaitMessage
  1464. pbRefresh
  1465. pbShowWindow(MESSAGEBOX)
  1466. if @messagemode
  1467. @switchscreen.pbDisplay(msg)
  1468. return
  1469. end
  1470. cw=@sprites["messagewindow"]
  1471. cw.text=_ISPRINTF("{1:s}\1",msg)
  1472. loop do
  1473. pbGraphicsUpdate
  1474. pbInputUpdate
  1475. pbFrameUpdate(cw)
  1476. if Input.trigger?(Input::C) || @abortable
  1477. if cw.busy?
  1478. pbPlayDecisionSE() if cw.pausing? && !@abortable
  1479. cw.resume
  1480. elsif !inPartyAnimation?
  1481. cw.text=""
  1482. pbPlayDecisionSE()
  1483. cw.visible=false if @messagemode
  1484. return
  1485. end
  1486. end
  1487. cw.update
  1488. end
  1489. end
  1490.  
  1491. def pbDisplayConfirmMessage(msg)
  1492. return pbShowCommands(msg,[_INTL("Yes"),_INTL("No")],1)==0
  1493. end
  1494.  
  1495. def pbShowCommands(msg,commands,defaultValue)
  1496. pbWaitMessage
  1497. pbRefresh
  1498. pbShowWindow(MESSAGEBOX)
  1499. dw=@sprites["messagewindow"]
  1500. dw.text=msg
  1501. cw = Window_CommandPokemon.new(commands)
  1502. cw.x=Graphics.width-cw.width
  1503. cw.y=Graphics.height-cw.height-dw.height
  1504. cw.index=0
  1505. cw.viewport=@viewport
  1506. pbRefresh
  1507. loop do
  1508. cw.visible=!dw.busy?
  1509. pbGraphicsUpdate
  1510. pbInputUpdate
  1511. pbFrameUpdate(cw)
  1512. dw.update
  1513. if Input.trigger?(Input::B) && defaultValue>=0
  1514. if dw.busy?
  1515. pbPlayDecisionSE() if dw.pausing?
  1516. dw.resume
  1517. else
  1518. cw.dispose
  1519. dw.text=""
  1520. return defaultValue
  1521. end
  1522. end
  1523. if Input.trigger?(Input::C)
  1524. if dw.busy?
  1525. pbPlayDecisionSE() if dw.pausing?
  1526. dw.resume
  1527. else
  1528. cw.dispose
  1529. dw.text=""
  1530. return cw.index
  1531. end
  1532. end
  1533. end
  1534. end
  1535.  
  1536. def pbFrameUpdate(cw=nil)
  1537. cw.update if cw
  1538. for i in 0...4
  1539. if @sprites["battlebox#{i}"]
  1540. @sprites["battlebox#{i}"].update
  1541. end
  1542. if @sprites["pokemon#{i}"]
  1543. @sprites["pokemon#{i}"].update
  1544. end
  1545. end
  1546. end
  1547.  
  1548. def pbRefresh
  1549. for i in 0...4
  1550. if @sprites["battlebox#{i}"]
  1551. @sprites["battlebox#{i}"].refresh
  1552. end
  1553. end
  1554. end
  1555.  
  1556. def pbAddSprite(id,x,y,filename,viewport)
  1557. sprite=IconSprite.new(x,y,viewport)
  1558. if filename
  1559. sprite.setBitmap(filename) rescue nil
  1560. end
  1561. @sprites[id]=sprite
  1562. return sprite
  1563. end
  1564.  
  1565. def pbAddPlane(id,filename,viewport)
  1566. sprite=AnimatedPlane.new(viewport)
  1567. if filename
  1568. sprite.setBitmap(filename)
  1569. end
  1570. @sprites[id]=sprite
  1571. return sprite
  1572. end
  1573.  
  1574. def pbDisposeSprites
  1575. pbDisposeSpriteHash(@sprites)
  1576. end
  1577.  
  1578. def pbBeginCommandPhase
  1579. # Called whenever a new round begins.
  1580. @battlestart=false
  1581. end
  1582.  
  1583. def pbShowOpponent(index)
  1584. if @battle.opponent
  1585. if @battle.opponent.is_a?(Array)
  1586. trainerfile=pbTrainerSpriteFile(@battle.opponent[index].trainertype)
  1587. else
  1588. trainerfile=pbTrainerSpriteFile(@battle.opponent.trainertype)
  1589. end
  1590. else
  1591. trainerfile="Graphics/Characters/trfront"
  1592. end
  1593. pbAddSprite("trainer",Graphics.width,PokeBattle_SceneConstants::FOETRAINER_Y,
  1594. trainerfile,@viewport)
  1595. if @sprites["trainer"].bitmap
  1596. @sprites["trainer"].y-=@sprites["trainer"].bitmap.height
  1597. @sprites["trainer"].z=8
  1598. end
  1599. 20.times do
  1600. pbGraphicsUpdate
  1601. pbInputUpdate
  1602. pbFrameUpdate
  1603. @sprites["trainer"].x-=6
  1604. end
  1605. end
  1606.  
  1607. def pbHideOpponent
  1608. 20.times do
  1609. pbGraphicsUpdate
  1610. pbInputUpdate
  1611. pbFrameUpdate
  1612. @sprites["trainer"].x+=6
  1613. end
  1614. end
  1615.  
  1616. def pbShowHelp(text)
  1617. @sprites["helpwindow"].resizeToFit(text,Graphics.width)
  1618. @sprites["helpwindow"].y=0
  1619. @sprites["helpwindow"].x=0
  1620. @sprites["helpwindow"].text=text
  1621. @sprites["helpwindow"].visible=true
  1622. end
  1623.  
  1624. def pbHideHelp
  1625. @sprites["helpwindow"].visible=false
  1626. end
  1627.  
  1628. def pbBackdrop
  1629. environ=@battle.environment
  1630. # Choose backdrop
  1631. backdrop="Field"
  1632. if environ==PBEnvironment::Cave
  1633. backdrop="Cave"
  1634. elsif environ==PBEnvironment::MovingWater || environ==PBEnvironment::StillWater
  1635. backdrop="Water"
  1636. elsif environ==PBEnvironment::Underwater
  1637. backdrop="Underwater"
  1638. elsif environ==PBEnvironment::Rock
  1639. backdrop="Mountain"
  1640. else
  1641. if !$game_map || !pbGetMetadata($game_map.map_id,MetadataOutdoor)
  1642. backdrop="IndoorA"
  1643. end
  1644. end
  1645. if $game_map
  1646. back=pbGetMetadata($game_map.map_id,MetadataBattleBack)
  1647. if back && back!=""
  1648. backdrop=back
  1649. end
  1650. end
  1651. if $PokemonGlobal && $PokemonGlobal.nextBattleBack
  1652. backdrop=$PokemonGlobal.nextBattleBack
  1653. end
  1654. # Choose bases
  1655. base=""
  1656. trialname=""
  1657. if environ==PBEnvironment::Grass || environ==PBEnvironment::TallGrass
  1658. trialname="Grass"
  1659. elsif environ==PBEnvironment::Sand
  1660. trialname="Sand"
  1661. elsif $PokemonGlobal.surfing
  1662. trialname="Water"
  1663. end
  1664. if pbResolveBitmap(sprintf("Graphics/Battlebacks/playerbase"+backdrop+trialname))
  1665. base=trialname
  1666. end
  1667. # Choose time of day
  1668. time=""
  1669. if ENABLESHADING
  1670. trialname=""
  1671. timenow=pbGetTimeNow
  1672. if PBDayNight.isNight?(timenow)
  1673. trialname="Night"
  1674. elsif PBDayNight.isEvening?(timenow)
  1675. trialname="Eve"
  1676. end
  1677. if pbResolveBitmap(sprintf("Graphics/Battlebacks/battlebg"+backdrop+trialname))
  1678. time=trialname
  1679. end
  1680. end
  1681. # Apply graphics
  1682. battlebg="Graphics/Battlebacks/battlebg"+backdrop+time
  1683. enemybase="Graphics/Battlebacks/enemybase"+backdrop+base+time
  1684. playerbase="Graphics/Battlebacks/playerbase"+backdrop+base+time
  1685. pbAddPlane("battlebg",battlebg,@viewport)
  1686. pbAddSprite("playerbase",
  1687. PokeBattle_SceneConstants::PLAYERBASEX,
  1688. PokeBattle_SceneConstants::PLAYERBASEY,playerbase,@viewport)
  1689. @sprites["playerbase"].x-=@sprites["playerbase"].bitmap.width/2 if @sprites["playerbase"].bitmap!=nil
  1690. @sprites["playerbase"].y-=@sprites["playerbase"].bitmap.height if @sprites["playerbase"].bitmap!=nil
  1691. pbAddSprite("enemybase",
  1692. PokeBattle_SceneConstants::FOEBASEX,
  1693. PokeBattle_SceneConstants::FOEBASEY,enemybase,@viewport)
  1694. @sprites["enemybase"].x-=@sprites["enemybase"].bitmap.width/2 if @sprites["enemybase"].bitmap!=nil
  1695. @sprites["enemybase"].y-=@sprites["enemybase"].bitmap.height/2 if @sprites["enemybase"].bitmap!=nil
  1696. @sprites["battlebg"].z=0
  1697. @sprites["playerbase"].z=1
  1698. @sprites["enemybase"].z=1
  1699. end
  1700.  
  1701. # Returns whether the party line-ups are currently appearing on-screen
  1702. def inPartyAnimation?
  1703. return @enablePartyAnim && @partyAnimPhase<3
  1704. end
  1705.  
  1706. # Shows the party line-ups appearing on-screen
  1707. def partyAnimationUpdate
  1708. return if !inPartyAnimation?
  1709. ballmovedist=16 # How far a ball moves each frame
  1710. # Bar slides on
  1711. if @partyAnimPhase==0
  1712. @sprites["partybarfoe"].x+=16
  1713. @sprites["partybarplayer"].x-=16
  1714. if @sprites["partybarfoe"].x+@sprites["partybarfoe"].bitmap.width>=PokeBattle_SceneConstants::FOEPARTYBAR_X
  1715. @sprites["partybarfoe"].x=PokeBattle_SceneConstants::FOEPARTYBAR_X-@sprites["partybarfoe"].bitmap.width
  1716. @sprites["partybarplayer"].x=PokeBattle_SceneConstants::PLAYERPARTYBAR_X
  1717. @partyAnimPhase=1
  1718. end
  1719. return
  1720. end
  1721. # Set up all balls ready to slide on
  1722. if @partyAnimPhase==1
  1723. @xposplayer=PokeBattle_SceneConstants::PLAYERPARTYBALL1_X
  1724. counter=0
  1725. # Make sure the ball starts off-screen
  1726. while @xposplayer<Graphics.width
  1727. counter+=1; @xposplayer+=ballmovedist
  1728. end
  1729. @xposenemy=PokeBattle_SceneConstants::FOEPARTYBALL1_X-counter*ballmovedist
  1730. for i in 0...6
  1731. # Choose the ball's graphic (player's side)
  1732. ballgraphic="Graphics/Pictures/ballempty"
  1733. if i<@battle.party1.length && @battle.party1[i]
  1734. if @battle.party1[i].hp<=0 || @battle.party1[i].isEgg?
  1735. ballgraphic="Graphics/Pictures/ballfainted"
  1736. elsif @battle.party1[i].status>0
  1737. ballgraphic="Graphics/Pictures/ballstatus"
  1738. else
  1739. ballgraphic="Graphics/Pictures/ballnormal"
  1740. end
  1741. end
  1742. pbAddSprite("player#{i}",
  1743. @xposplayer+i*ballmovedist*6,PokeBattle_SceneConstants::PLAYERPARTYBALL1_Y,
  1744. ballgraphic,@viewport)
  1745. @sprites["player#{i}"].z=41
  1746. # Choose the ball's graphic (opponent's side)
  1747. ballgraphic="Graphics/Pictures/ballempty"
  1748. enemyindex=i
  1749. if @battle.doublebattle && i>=3
  1750. enemyindex=(i%3)+@battle.pbSecondPartyBegin(1)
  1751. end
  1752. if enemyindex<@battle.party2.length && @battle.party2[enemyindex]
  1753. if @battle.party2[enemyindex].hp<=0 || @battle.party2[enemyindex].isEgg?
  1754. ballgraphic="Graphics/Pictures/ballfainted"
  1755. elsif @battle.party2[enemyindex].status>0
  1756. ballgraphic="Graphics/Pictures/ballstatus"
  1757. else
  1758. ballgraphic="Graphics/Pictures/ballnormal"
  1759. end
  1760. end
  1761. pbAddSprite("enemy#{i}",
  1762. @xposenemy-i*ballmovedist*6,PokeBattle_SceneConstants::FOEPARTYBALL1_Y,
  1763. ballgraphic,@viewport)
  1764. @sprites["enemy#{i}"].z=41
  1765. end
  1766. @partyAnimPhase=2
  1767. end
  1768. # Balls slide on
  1769. if @partyAnimPhase==2
  1770. for i in 0...6
  1771. if @sprites["enemy#{i}"].x<PokeBattle_SceneConstants::FOEPARTYBALL1_X-i*PokeBattle_SceneConstants::FOEPARTYBALL_GAP
  1772. @sprites["enemy#{i}"].x+=ballmovedist
  1773. @sprites["player#{i}"].x-=ballmovedist
  1774. if @sprites["enemy#{i}"].x>=PokeBattle_SceneConstants::FOEPARTYBALL1_X-i*PokeBattle_SceneConstants::FOEPARTYBALL_GAP
  1775. @sprites["enemy#{i}"].x=PokeBattle_SceneConstants::FOEPARTYBALL1_X-i*PokeBattle_SceneConstants::FOEPARTYBALL_GAP
  1776. @sprites["player#{i}"].x=PokeBattle_SceneConstants::PLAYERPARTYBALL1_X+i*PokeBattle_SceneConstants::PLAYERPARTYBALL_GAP
  1777. if i==5
  1778. @partyAnimPhase=3
  1779. end
  1780. end
  1781. end
  1782. end
  1783. end
  1784. end
  1785.  
  1786. def pbStartBattle(battle)
  1787. # Called whenever the battle begins
  1788. @battle=battle
  1789. @lastcmd=[0,0,0,0]
  1790. @lastmove=[0,0,0,0]
  1791. @showingplayer=true
  1792. @showingenemy=true
  1793. @sprites.clear
  1794. @viewport=Viewport.new(0,Graphics.height/2,Graphics.width,0)
  1795. @viewport.z=99999
  1796. @traineryoffset=(Graphics.height-320) # Adjust player's side for screen size
  1797. @foeyoffset=(@traineryoffset*3/4).floor # Adjust foe's side for screen size
  1798. pbBackdrop
  1799. pbAddSprite("partybarfoe",
  1800. PokeBattle_SceneConstants::FOEPARTYBAR_X,
  1801. PokeBattle_SceneConstants::FOEPARTYBAR_Y,
  1802. "Graphics/Pictures/battleLineup",@viewport)
  1803. pbAddSprite("partybarplayer",
  1804. PokeBattle_SceneConstants::PLAYERPARTYBAR_X,
  1805. PokeBattle_SceneConstants::PLAYERPARTYBAR_Y,
  1806. "Graphics/Pictures/battleLineup",@viewport)
  1807. @sprites["partybarfoe"].x-=@sprites["partybarfoe"].bitmap.width
  1808. @sprites["partybarplayer"].mirror=true
  1809. @sprites["partybarfoe"].z=40
  1810. @sprites["partybarplayer"].z=40
  1811. @sprites["partybarfoe"].visible=false
  1812. @sprites["partybarplayer"].visible=false
  1813. if @battle.player.is_a?(Array)
  1814. trainerfile=pbPlayerSpriteBackFile(@battle.player[0].trainertype)
  1815. pbAddSprite("player",
  1816. PokeBattle_SceneConstants::PLAYERTRAINERD1_X,
  1817. PokeBattle_SceneConstants::PLAYERTRAINERD1_Y,trainerfile,@viewport)
  1818. trainerfile=pbTrainerSpriteBackFile(@battle.player[1].trainertype)
  1819. pbAddSprite("playerB",
  1820. PokeBattle_SceneConstants::PLAYERTRAINERD2_X,
  1821. PokeBattle_SceneConstants::PLAYERTRAINERD2_Y,trainerfile,@viewport)
  1822. if @sprites["player"].bitmap
  1823. if @sprites["player"].bitmap.width>@sprites["player"].bitmap.height
  1824. @sprites["player"].src_rect.x=0
  1825. @sprites["player"].src_rect.width=@sprites["player"].bitmap.width/5
  1826. end
  1827. @sprites["player"].x-=(@sprites["player"].src_rect.width/2)
  1828. @sprites["player"].y-=@sprites["player"].bitmap.height
  1829. @sprites["player"].z=30
  1830. end
  1831. if @sprites["playerB"].bitmap
  1832. if @sprites["playerB"].bitmap.width>@sprites["playerB"].bitmap.height
  1833. @sprites["playerB"].src_rect.x=0
  1834. @sprites["playerB"].src_rect.width=@sprites["playerB"].bitmap.width/5
  1835. end
  1836. @sprites["playerB"].x-=(@sprites["playerB"].src_rect.width/2)
  1837. @sprites["playerB"].y-=@sprites["playerB"].bitmap.height
  1838. @sprites["playerB"].z=31
  1839. end
  1840. else
  1841. trainerfile=pbPlayerSpriteBackFile(@battle.player.trainertype)
  1842. pbAddSprite("player",
  1843. PokeBattle_SceneConstants::PLAYERTRAINER_X,
  1844. PokeBattle_SceneConstants::PLAYERTRAINER_Y,trainerfile,@viewport)
  1845. if @sprites["player"].bitmap
  1846. if @sprites["player"].bitmap.width>@sprites["player"].bitmap.height
  1847. @sprites["player"].src_rect.x=0
  1848. @sprites["player"].src_rect.width=@sprites["player"].bitmap.width/5
  1849. end
  1850. @sprites["player"].x-=(@sprites["player"].src_rect.width/2)
  1851. @sprites["player"].y-=@sprites["player"].bitmap.height
  1852. @sprites["player"].z=30
  1853. end
  1854. end
  1855. if @battle.opponent
  1856. if @battle.opponent.is_a?(Array)
  1857. trainerfile=pbTrainerSpriteFile(@battle.opponent[1].trainertype)
  1858. pbAddSprite("trainer2",
  1859. PokeBattle_SceneConstants::FOETRAINERD2_X,
  1860. PokeBattle_SceneConstants::FOETRAINERD2_Y,trainerfile,@viewport)
  1861. trainerfile=pbTrainerSpriteFile(@battle.opponent[0].trainertype)
  1862. pbAddSprite("trainer",
  1863. PokeBattle_SceneConstants::FOETRAINERD1_X,
  1864. PokeBattle_SceneConstants::FOETRAINERD1_Y,trainerfile,@viewport)
  1865. else
  1866. trainerfile=pbTrainerSpriteFile(@battle.opponent.trainertype)
  1867. pbAddSprite("trainer",
  1868. PokeBattle_SceneConstants::FOETRAINER_X,
  1869. PokeBattle_SceneConstants::FOETRAINER_Y,trainerfile,@viewport)
  1870. end
  1871. else
  1872. trainerfile="Graphics/Characters/trfront"
  1873. pbAddSprite("trainer",
  1874. PokeBattle_SceneConstants::FOETRAINER_X,
  1875. PokeBattle_SceneConstants::FOETRAINER_Y,trainerfile,@viewport)
  1876. end
  1877. if @sprites["trainer"].bitmap
  1878. @sprites["trainer"].x-=(@sprites["trainer"].bitmap.width/2)
  1879. @sprites["trainer"].y-=@sprites["trainer"].bitmap.height
  1880. @sprites["trainer"].z=8
  1881. end
  1882. if @sprites["trainer2"] && @sprites["trainer2"].bitmap
  1883. @sprites["trainer2"].x-=(@sprites["trainer2"].bitmap.width/2)
  1884. @sprites["trainer2"].y-=@sprites["trainer2"].bitmap.height
  1885. @sprites["trainer2"].z=7
  1886. end
  1887. @sprites["shadow0"]=IconSprite.new(0,0,@viewport)
  1888. @sprites["shadow0"].z=3
  1889. pbAddSprite("shadow1",0,0,"Graphics/Pictures/battleShadow",@viewport)
  1890. @sprites["shadow1"].z=3
  1891. @sprites["shadow1"].visible=false
  1892. @sprites["pokemon0"]=PokemonBattlerSprite.new(battle.doublebattle,0,@viewport)
  1893. @sprites["pokemon0"].z=21
  1894. @sprites["pokemon1"]=PokemonBattlerSprite.new(battle.doublebattle,1,@viewport)
  1895. @sprites["pokemon1"].z=16
  1896. if battle.doublebattle
  1897. @sprites["shadow2"]=IconSprite.new(0,0,@viewport)
  1898. @sprites["shadow2"].z=3
  1899. pbAddSprite("shadow3",0,0,"Graphics/Pictures/battleShadow",@viewport)
  1900. @sprites["shadow3"].z=3
  1901. @sprites["shadow3"].visible=false
  1902. @sprites["pokemon2"]=PokemonBattlerSprite.new(battle.doublebattle,2,@viewport)
  1903. @sprites["pokemon2"].z=26
  1904. @sprites["pokemon3"]=PokemonBattlerSprite.new(battle.doublebattle,3,@viewport)
  1905. @sprites["pokemon3"].z=11
  1906. end
  1907. @sprites["battlebox0"]=PokemonDataBox.new(battle.battlers[0],battle.doublebattle,@viewport)
  1908. @sprites["battlebox1"]=PokemonDataBox.new(battle.battlers[1],battle.doublebattle,@viewport)
  1909. if battle.doublebattle
  1910. @sprites["battlebox2"]=PokemonDataBox.new(battle.battlers[2],battle.doublebattle,@viewport)
  1911. @sprites["battlebox3"]=PokemonDataBox.new(battle.battlers[3],battle.doublebattle,@viewport)
  1912. end
  1913. if $PokemonSystem.textskin==0
  1914. pbAddSprite("messagebox",0,Graphics.height-96,"Graphics/Pictures/battleMessage",@viewport)
  1915. elsif $PokemonSystem.textskin==1 # windowskin "speech hgss 2"
  1916. pbAddSprite("messagebox",0,Graphics.height-96,"Graphics/Pictures/battleMessage2",@viewport)
  1917. elsif $PokemonSystem.textskin==2
  1918. pbAddSprite("messagebox",0,Graphics.height-96,"Graphics/Pictures/battleMessage3",@viewport)
  1919. elsif $PokemonSystem.textskin==3
  1920. pbAddSprite("messagebox",0,Graphics.height-96,"Graphics/Pictures/battleMessage4",@viewport)
  1921. elsif $PokemonSystem.textskin==4
  1922. pbAddSprite("messagebox",0,Graphics.height-96,"Graphics/Pictures/battleMessage5",@viewport)
  1923. elsif $PokemonSystem.textskin==5
  1924. pbAddSprite("messagebox",0,Graphics.height-96,"Graphics/Pictures/battleMessage6",@viewport)
  1925. end
  1926. @sprites["messagebox"].z=90
  1927. @sprites["helpwindow"]=Window_UnformattedTextPokemon.newWithSize("",0,0,32,32,@viewport)
  1928. @sprites["helpwindow"].visible=false
  1929. @sprites["helpwindow"].z=90
  1930. @sprites["messagewindow"]=Window_AdvancedTextPokemon.new("")
  1931. @sprites["messagewindow"].letterbyletter=true
  1932. @sprites["messagewindow"].viewport=@viewport
  1933. @sprites["messagewindow"].z=100
  1934. @sprites["commandwindow"]=CommandMenuDisplay.new(@viewport)
  1935. @sprites["commandwindow"].z=100
  1936. @sprites["fightwindow"]=FightMenuDisplay.new(nil,@viewport)
  1937. @sprites["fightwindow"].z=100
  1938. pbShowWindow(MESSAGEBOX)
  1939. pbSetMessageMode(false)
  1940. trainersprite1=@sprites["trainer"]
  1941. trainersprite2=@sprites["trainer2"]
  1942. if !@battle.opponent
  1943. @sprites["trainer"].visible=false
  1944. if @battle.party2.length>=1
  1945. if @battle.party2.length==1
  1946. species=@battle.party2[0].species
  1947. @sprites["pokemon1"].setPokemonBitmap(@battle.party2[0],false)
  1948. @sprites["pokemon1"].tone=Tone.new(-128,-128,-128,-128)
  1949. @sprites["pokemon1"].x=PokeBattle_SceneConstants::FOEBATTLER_X
  1950. @sprites["pokemon1"].x-=@sprites["pokemon1"].width/2
  1951. @sprites["pokemon1"].y=PokeBattle_SceneConstants::FOEBATTLER_Y
  1952. @sprites["pokemon1"].y+=adjustBattleSpriteY(@sprites["pokemon1"],species,1)
  1953. @sprites["pokemon1"].visible=true
  1954. @sprites["shadow1"].x=PokeBattle_SceneConstants::FOEBATTLER_X
  1955. @sprites["shadow1"].y=PokeBattle_SceneConstants::FOEBATTLER_Y
  1956. @sprites["shadow1"].x-=@sprites["shadow1"].bitmap.width/2 if @sprites["shadow1"].bitmap!=nil
  1957. @sprites["shadow1"].y-=@sprites["shadow1"].bitmap.height/2 if @sprites["shadow1"].bitmap!=nil
  1958. @sprites["shadow1"].visible=showShadow?(species)
  1959. trainersprite1=@sprites["pokemon1"]
  1960. elsif @battle.party2.length==2
  1961. species=@battle.party2[0].species
  1962. @sprites["pokemon1"].setPokemonBitmap(@battle.party2[0],false)
  1963. @sprites["pokemon1"].tone=Tone.new(-128,-128,-128,-128)
  1964. @sprites["pokemon1"].x=PokeBattle_SceneConstants::FOEBATTLERD1_X
  1965. @sprites["pokemon1"].x-=@sprites["pokemon1"].width/2
  1966. @sprites["pokemon1"].y=PokeBattle_SceneConstants::FOEBATTLERD1_Y
  1967. @sprites["pokemon1"].y+=adjustBattleSpriteY(@sprites["pokemon1"],species,1)
  1968. @sprites["pokemon1"].visible=true
  1969. @sprites["shadow1"].x=PokeBattle_SceneConstants::FOEBATTLERD1_X
  1970. @sprites["shadow1"].y=PokeBattle_SceneConstants::FOEBATTLERD1_Y
  1971. @sprites["shadow1"].x-=@sprites["shadow1"].bitmap.width/2 if @sprites["shadow1"].bitmap!=nil
  1972. @sprites["shadow1"].y-=@sprites["shadow1"].bitmap.height/2 if @sprites["shadow1"].bitmap!=nil
  1973. @sprites["shadow1"].visible=showShadow?(species)
  1974. trainersprite1=@sprites["pokemon1"]
  1975. species=@battle.party2[1].species
  1976. @sprites["pokemon3"].setPokemonBitmap(@battle.party2[1],false)
  1977. @sprites["pokemon3"].tone=Tone.new(-128,-128,-128,-128)
  1978. @sprites["pokemon3"].x=PokeBattle_SceneConstants::FOEBATTLERD2_X
  1979. @sprites["pokemon3"].x-=@sprites["pokemon3"].width/2
  1980. @sprites["pokemon3"].y=PokeBattle_SceneConstants::FOEBATTLERD2_Y
  1981. @sprites["pokemon3"].y+=adjustBattleSpriteY(@sprites["pokemon3"],species,3)
  1982. @sprites["pokemon3"].visible=true
  1983. @sprites["shadow3"].x=PokeBattle_SceneConstants::FOEBATTLERD2_X
  1984. @sprites["shadow3"].y=PokeBattle_SceneConstants::FOEBATTLERD2_Y
  1985. @sprites["shadow3"].x-=@sprites["shadow3"].bitmap.width/2 if @sprites["shadow3"].bitmap!=nil
  1986. @sprites["shadow3"].y-=@sprites["shadow3"].bitmap.height/2 if @sprites["shadow3"].bitmap!=nil
  1987. @sprites["shadow3"].visible=showShadow?(species)
  1988. trainersprite2=@sprites["pokemon3"]
  1989. end
  1990. end
  1991. end
  1992. #################
  1993. # Move trainers/bases/etc. off-screen
  1994. oldx=[]
  1995. oldx[0]=@sprites["playerbase"].x; @sprites["playerbase"].x+=Graphics.width
  1996. oldx[1]=@sprites["player"].x; @sprites["player"].x+=Graphics.width
  1997. if @sprites["playerB"]
  1998. oldx[2]=@sprites["playerB"].x; @sprites["playerB"].x+=Graphics.width
  1999. end
  2000. oldx[3]=@sprites["enemybase"].x; @sprites["enemybase"].x-=Graphics.width
  2001. oldx[4]=trainersprite1.x; trainersprite1.x-=Graphics.width
  2002. if trainersprite2
  2003. oldx[5]=trainersprite2.x; trainersprite2.x-=Graphics.width
  2004. end
  2005. oldx[6]=@sprites["shadow1"].x; @sprites["shadow1"].x-=Graphics.width
  2006. if @sprites["shadow3"]
  2007. oldx[7]=@sprites["shadow3"].x; @sprites["shadow3"].x-=Graphics.width
  2008. end
  2009. @sprites["partybarfoe"].x-=PokeBattle_SceneConstants::FOEPARTYBAR_X
  2010. @sprites["partybarplayer"].x+=Graphics.width-PokeBattle_SceneConstants::PLAYERPARTYBAR_X
  2011. #################
  2012. appearspeed=12
  2013. (1+Graphics.width/appearspeed).times do
  2014. tobreak=true
  2015. if @viewport.rect.y>0
  2016. @viewport.rect.y-=appearspeed/2
  2017. @viewport.rect.y=0 if @viewport.rect.y<0
  2018. @viewport.rect.height+=appearspeed
  2019. @viewport.rect.height=Graphics.height if @viewport.rect.height>Graphics.height
  2020. tobreak=false
  2021. end
  2022. if !tobreak
  2023. for i in @sprites
  2024. i[1].ox=@viewport.rect.x
  2025. i[1].oy=@viewport.rect.y
  2026. end
  2027. end
  2028. if @sprites["playerbase"].x>oldx[0]
  2029. @sprites["playerbase"].x-=appearspeed; tobreak=false
  2030. @sprites["playerbase"].x=oldx[0] if @sprites["playerbase"].x<oldx[0]
  2031. end
  2032. if @sprites["player"].x>oldx[1]
  2033. @sprites["player"].x-=appearspeed; tobreak=false
  2034. @sprites["player"].x=oldx[1] if @sprites["player"].x<oldx[1]
  2035. end
  2036. if @sprites["playerB"] && @sprites["playerB"].x>oldx[2]
  2037. @sprites["playerB"].x-=appearspeed; tobreak=false
  2038. @sprites["playerB"].x=oldx[2] if @sprites["playerB"].x<oldx[2]
  2039. end
  2040. if @sprites["enemybase"].x<oldx[3]
  2041. @sprites["enemybase"].x+=appearspeed; tobreak=false
  2042. @sprites["enemybase"].x=oldx[3] if @sprites["enemybase"].x>oldx[3]
  2043. end
  2044. if trainersprite1.x<oldx[4]
  2045. trainersprite1.x+=appearspeed; tobreak=false
  2046. trainersprite1.x=oldx[4] if trainersprite1.x>oldx[4]
  2047. end
  2048. if trainersprite2 && trainersprite2.x<oldx[5]
  2049. trainersprite2.x+=appearspeed; tobreak=false
  2050. trainersprite2.x=oldx[5] if trainersprite2.x>oldx[5]
  2051. end
  2052. if @sprites["shadow1"].x<oldx[6]
  2053. @sprites["shadow1"].x+=appearspeed; tobreak=false
  2054. @sprites["shadow1"].x=oldx[6] if @sprites["shadow1"].x>oldx[6]
  2055. end
  2056. if @sprites["shadow3"] && @sprites["shadow3"].x<oldx[7]
  2057. @sprites["shadow3"].x+=appearspeed; tobreak=false
  2058. @sprites["shadow3"].x=oldx[7] if @sprites["shadow3"].x>oldx[7]
  2059. end
  2060. pbGraphicsUpdate
  2061. pbInputUpdate
  2062. pbFrameUpdate
  2063. break if tobreak
  2064. end
  2065. #################
  2066. if @battle.opponent
  2067. @enablePartyAnim=true
  2068. @partyAnimPhase=0
  2069. @sprites["partybarfoe"].visible=true
  2070. @sprites["partybarplayer"].visible=true
  2071. else
  2072. pbPlayCry(@battle.party2[0]) # Play cry for wild Pokémon
  2073. @sprites["battlebox1"].appear
  2074. @sprites["battlebox3"].appear if @battle.party2.length==2
  2075. appearing=true
  2076. begin
  2077. pbGraphicsUpdate
  2078. pbInputUpdate
  2079. pbFrameUpdate
  2080. @sprites["pokemon1"].tone.red+=8 if @sprites["pokemon1"].tone.red<0
  2081. @sprites["pokemon1"].tone.blue+=8 if @sprites["pokemon1"].tone.blue<0
  2082. @sprites["pokemon1"].tone.green+=8 if @sprites["pokemon1"].tone.green<0
  2083. @sprites["pokemon1"].tone.gray+=8 if @sprites["pokemon1"].tone.gray<0
  2084. appearing=@sprites["battlebox1"].appearing
  2085. if @battle.party2.length==2
  2086. @sprites["pokemon3"].tone.red+=8 if @sprites["pokemon3"].tone.red<0
  2087. @sprites["pokemon3"].tone.blue+=8 if @sprites["pokemon3"].tone.blue<0
  2088. @sprites["pokemon3"].tone.green+=8 if @sprites["pokemon3"].tone.green<0
  2089. @sprites["pokemon3"].tone.gray+=8 if @sprites["pokemon3"].tone.gray<0
  2090. appearing=(appearing || @sprites["battlebox3"].appearing)
  2091. end
  2092. end while appearing
  2093. # Show shiny animation for wild Pokémon
  2094. if @battle.battlers[1].isShiny? && @battle.battlescene
  2095. pbCommonAnimation("Shiny",@battle.battlers[1],nil)
  2096. end
  2097. if @battle.party2.length==2
  2098. if @battle.battlers[3].isShiny? && @battle.battlescene
  2099. pbCommonAnimation("Shiny",@battle.battlers[3],nil)
  2100. end
  2101. end
  2102. end
  2103. end
  2104.  
  2105. def pbEndBattle(result)
  2106. @abortable=false
  2107. pbShowWindow(BLANK)
  2108. # Fade out all sprites
  2109. pbBGMFade(1.0)
  2110. pbFadeOutAndHide(@sprites)
  2111. pbDisposeSprites
  2112. end
  2113.  
  2114. def pbRecall(battlerindex)
  2115. @briefmessage=false
  2116. if @battle.pbIsOpposing?(battlerindex)
  2117. origin=PokeBattle_SceneConstants::FOEBATTLER_Y
  2118. if @battle.doublebattle
  2119. origin=PokeBattle_SceneConstants::FOEBATTLERD1_Y if battlerindex==1
  2120. origin=PokeBattle_SceneConstants::FOEBATTLERD2_Y if battlerindex==3
  2121. end
  2122. @sprites["shadow#{battlerindex}"].visible=false
  2123. else
  2124. origin=PokeBattle_SceneConstants::PLAYERBATTLER_Y
  2125. if @battle.doublebattle
  2126. origin=PokeBattle_SceneConstants::PLAYERBATTLERD1_Y if battlerindex==0
  2127. origin=PokeBattle_SceneConstants::PLAYERBATTLERD2_Y if battlerindex==2
  2128. end
  2129. end
  2130. spritePoke=@sprites["pokemon#{battlerindex}"]
  2131. picturePoke=PictureEx.new(spritePoke.z)
  2132. dims=[spritePoke.x,spritePoke.y]
  2133. center=getSpriteCenter(spritePoke)
  2134. # starting positions
  2135. picturePoke.moveVisible(1,true)
  2136. picturePoke.moveOrigin(1,PictureOrigin::Center)
  2137. picturePoke.moveXY(0,1,center[0],center[1])
  2138. # directives
  2139. picturePoke.moveTone(10,1,Tone.new(248,248,248,248))
  2140. delay=picturePoke.totalDuration
  2141. picturePoke.moveSE(delay,"Audio/SE/recall")
  2142. picturePoke.moveZoom(15,delay,0)
  2143. picturePoke.moveXY(15,delay,center[0],origin)
  2144. picturePoke.moveVisible(picturePoke.totalDuration,false)
  2145. picturePoke.moveTone(0,picturePoke.totalDuration,Tone.new(0,0,0,0))
  2146. picturePoke.moveOrigin(picturePoke.totalDuration,PictureOrigin::TopLeft)
  2147. loop do
  2148. picturePoke.update
  2149. setPictureSprite(spritePoke,picturePoke)
  2150. pbGraphicsUpdate
  2151. pbInputUpdate
  2152. pbFrameUpdate
  2153. break if !picturePoke.running?
  2154. end
  2155. end
  2156.  
  2157. def pbTrainerSendOut(battlerindex,pkmn)
  2158. illusionpoke=@battle.battlers[battlerindex].effects[PBEffects::Illusion]
  2159. @briefmessage=false
  2160. fadeanim=nil
  2161. while inPartyAnimation?; end
  2162. if @showingenemy
  2163. fadeanim=TrainerFadeAnimation.new(@sprites)
  2164. end
  2165. frame=0
  2166. @sprites["pokemon#{battlerindex}"].setPokemonBitmap(pkmn,false)
  2167. if illusionpoke
  2168. @sprites["pokemon#{battlerindex}"].setPokemonBitmap(illusionpoke,false)
  2169. end
  2170. sendout=PokeballSendOutAnimation.new(@sprites["pokemon#{battlerindex}"],
  2171. @sprites,@battle.battlers[battlerindex],illusionpoke,@battle.doublebattle)
  2172. loop do
  2173. fadeanim.update if fadeanim
  2174. frame+=1
  2175. if frame==1
  2176. @sprites["battlebox#{battlerindex}"].appear
  2177. end
  2178. if frame>=10
  2179. sendout.update
  2180. end
  2181. pbGraphicsUpdate
  2182. pbInputUpdate
  2183. pbFrameUpdate
  2184. break if (!fadeanim || fadeanim.animdone?) && sendout.animdone? &&
  2185. !@sprites["battlebox#{battlerindex}"].appearing
  2186. end
  2187. if @battle.battlers[battlerindex].isShiny? && @battle.battlescene
  2188. pbCommonAnimation("Shiny",@battle.battlers[battlerindex],nil)
  2189. end
  2190. sendout.dispose
  2191. if @showingenemy
  2192. @showingenemy=false
  2193. pbDisposeSprite(@sprites,"trainer")
  2194. pbDisposeSprite(@sprites,"partybarfoe")
  2195. for i in 0...6
  2196. pbDisposeSprite(@sprites,"enemy#{i}")
  2197. end
  2198. end
  2199. pbRefresh
  2200. end
  2201.  
  2202. def pbSendOut(battlerindex,pkmn) # Player sending out Pokémon
  2203. while inPartyAnimation?; end
  2204. illusionpoke=@battle.battlers[battlerindex].effects[PBEffects::Illusion]
  2205. balltype=pkmn.ballused
  2206. balltype=illusionpoke.ballused if illusionpoke
  2207. ballbitmap=sprintf("Graphics/Pictures/ball%02d",balltype)
  2208. pictureBall=PictureEx.new(32)
  2209. delay=1
  2210. pictureBall.moveVisible(delay,true)
  2211. pictureBall.moveName(delay,ballbitmap)
  2212. pictureBall.moveOrigin(delay,PictureOrigin::Center)
  2213. # Setting the ball's movement path
  2214. path=[[0, 146], [10, 134], [21, 122], [30, 112],
  2215. [39, 104], [46, 99], [53, 95], [61, 93],
  2216. [68, 93], [75, 96], [82, 102], [89, 111],
  2217. [94, 121], [100, 134], [106, 150], [111, 166],
  2218. [116, 183], [120, 199], [124, 216], [127, 238]]
  2219. spriteBall=IconSprite.new(0,0,@viewport)
  2220. spriteBall.visible=false
  2221. angle=0
  2222. multiplier=1.0
  2223. if @battle.doublebattle
  2224. multiplier=(battlerindex==0) ? 0.7 : 1.3
  2225. end
  2226. for coord in path
  2227. delay=pictureBall.totalDuration
  2228. pictureBall.moveAngle(0,delay,angle)
  2229. pictureBall.moveXY(1,delay,coord[0]*multiplier,coord[1])
  2230. angle+=40
  2231. angle%=360
  2232. end
  2233. pictureBall.adjustPosition(0,@traineryoffset)
  2234. @sprites["battlebox#{battlerindex}"].visible=false
  2235. @briefmessage=false
  2236. fadeanim=nil
  2237. if @showingplayer
  2238. fadeanim=PlayerFadeAnimation.new(@sprites)
  2239. end
  2240. frame=0
  2241. @sprites["pokemon#{battlerindex}"].setPokemonBitmap(pkmn,true)
  2242. if illusionpoke
  2243. @sprites["pokemon#{battlerindex}"].setPokemonBitmap(illusionpoke,true)
  2244. end
  2245. sendout=PokeballPlayerSendOutAnimation.new(@sprites["pokemon#{battlerindex}"],
  2246. @sprites,@battle.battlers[battlerindex],illusionpoke,@battle.doublebattle)
  2247. loop do
  2248. fadeanim.update if fadeanim
  2249. frame+=1
  2250. if frame>1 && !pictureBall.running? && !@sprites["battlebox#{battlerindex}"].appearing
  2251. @sprites["battlebox#{battlerindex}"].appear
  2252. end
  2253. if frame>=3 && !pictureBall.running?
  2254. sendout.update
  2255. end
  2256. if (frame>=10 || !fadeanim) && pictureBall.running?
  2257. pictureBall.update
  2258. setPictureIconSprite(spriteBall,pictureBall)
  2259. end
  2260. pbGraphicsUpdate
  2261. pbInputUpdate
  2262. pbFrameUpdate
  2263. break if (!fadeanim || fadeanim.animdone?) && sendout.animdone? &&
  2264. !@sprites["battlebox#{battlerindex}"].appearing
  2265. end
  2266. spriteBall.dispose
  2267. sendout.dispose
  2268. if @battle.battlers[battlerindex].isShiny? && @battle.battlescene
  2269. pbCommonAnimation("Shiny",@battle.battlers[battlerindex],nil)
  2270. end
  2271. if @showingplayer
  2272. @showingplayer=false
  2273. pbDisposeSprite(@sprites,"player")
  2274. pbDisposeSprite(@sprites,"partybarplayer")
  2275. for i in 0...6
  2276. pbDisposeSprite(@sprites,"player#{i}")
  2277. end
  2278. end
  2279. pbRefresh
  2280. end
  2281.  
  2282. def pbTrainerWithdraw(battle,pkmn)
  2283. pbRefresh
  2284. end
  2285.  
  2286. def pbWithdraw(battle,pkmn)
  2287. pbRefresh
  2288. end
  2289.  
  2290. def pbMoveString(move)
  2291. ret=_INTL("{1}",move.name)
  2292. typename=PBTypes.getName(move.type)
  2293. if move.id>0
  2294. ret+=_INTL(" ({1}) PP: {2}/{3}",typename,move.pp,move.totalpp)
  2295. end
  2296. return ret
  2297. end
  2298.  
  2299. def pbBeginAttackPhase
  2300. pbSelectBattler(-1)
  2301. pbGraphicsUpdate
  2302. end
  2303.  
  2304. def pbSafariStart
  2305. @briefmessage=false
  2306. @sprites["battlebox0"]=SafariDataBox.new(@battle,@viewport)
  2307. @sprites["battlebox0"].appear
  2308. loop do
  2309. @sprites["battlebox0"].update
  2310. pbGraphicsUpdate
  2311. pbInputUpdate
  2312. pbFrameUpdate
  2313. break if !@sprites["battlebox0"].appearing
  2314. end
  2315. pbRefresh
  2316. end
  2317.  
  2318. def pbResetCommandIndices
  2319. @lastcmd=[0,0,0,0]
  2320. end
  2321.  
  2322. def pbResetMoveIndex(index)
  2323. @lastmove[index]=0
  2324. end
  2325.  
  2326. def pbSafariCommandMenu(index)
  2327. pbCommandMenuEx(index,[
  2328. _INTL("What will\n{1} throw?",@battle.pbPlayer.name),
  2329. _INTL("Ball"),
  2330. _INTL("Bait"),
  2331. _INTL("Rock"),
  2332. _INTL("Run")
  2333. ],2)
  2334. end
  2335.  
  2336. # Use this method to display the list of commands.
  2337. # Return values: 0=Fight, 1=Bag, 2=Pokémon, 3=Run, 4=Call
  2338. def pbCommandMenu(index)
  2339. shadowTrainer=(hasConst?(PBTypes,:SHADOW) && @battle.opponent)
  2340. ret=pbCommandMenuEx(index,[
  2341. _INTL("What will\n{1} do?",@battle.battlers[index].name),
  2342. _INTL("Fight"),
  2343. _INTL("Bag"),
  2344. _INTL("Pokémon"),
  2345. shadowTrainer ? _INTL("Call") : _INTL("Run")
  2346. ],(shadowTrainer ? 1 : 0))
  2347. ret=4 if ret==3 && shadowTrainer # Convert "Run" to "Call"
  2348. return ret
  2349. end
  2350.  
  2351. def pbCommandMenuEx(index,texts,mode=0) # Mode: 0 - regular battle
  2352. pbShowWindow(COMMANDBOX) # 1 - Shadow Pokémon battle
  2353. cw=@sprites["commandwindow"] # 2 - Safari Zone
  2354. cw.setTexts(texts) # 3 - Bug Catching Contest
  2355. cw.index=@lastcmd[index]
  2356. cw.mode=mode
  2357. pbSelectBattler(index)
  2358. pbRefresh
  2359. loop do
  2360. pbGraphicsUpdate
  2361. pbInputUpdate
  2362. pbFrameUpdate(cw)
  2363. # Update selected command
  2364. if Input.trigger?(Input::LEFT) && (cw.index&1)==1
  2365. pbPlayCursorSE()
  2366. cw.index-=1
  2367. elsif Input.trigger?(Input::RIGHT) && (cw.index&1)==0
  2368. pbPlayCursorSE()
  2369. cw.index+=1
  2370. elsif Input.trigger?(Input::UP) && (cw.index&2)==2
  2371. pbPlayCursorSE()
  2372. cw.index-=2
  2373. elsif Input.trigger?(Input::DOWN) && (cw.index&2)==0
  2374. pbPlayCursorSE()
  2375. cw.index+=2
  2376. end
  2377. if Input.trigger?(Input::C) # Confirm choice
  2378. pbPlayDecisionSE()
  2379. ret=cw.index
  2380. @lastcmd[index]=ret
  2381. return ret
  2382. elsif Input.trigger?(Input::B) && index==2 && @lastcmd[0]!=2 # Cancel
  2383. pbPlayDecisionSE()
  2384. return -1
  2385. end
  2386. end
  2387. end
  2388.  
  2389. # Use this method to display the list of moves for a Pokémon
  2390. def pbFightMenu(index)
  2391. pbShowWindow(FIGHTBOX)
  2392. cw = @sprites["fightwindow"]
  2393. battler=@battle.battlers[index]
  2394. cw.battler=battler
  2395. lastIndex=@lastmove[index]
  2396. if battler.moves[lastIndex].id!=0
  2397. cw.setIndex(lastIndex)
  2398. else
  2399. cw.setIndex(0)
  2400. end
  2401. cw.megaButton=0
  2402. cw.megaButton=1 if @battle.pbCanMegaEvolve?(index)
  2403. pbSelectBattler(index)
  2404. pbRefresh
  2405. loop do
  2406. pbGraphicsUpdate
  2407. pbInputUpdate
  2408. pbFrameUpdate(cw)
  2409. # Update selected command
  2410. if Input.trigger?(Input::LEFT) && (cw.index&1)==1
  2411. pbPlayCursorSE() if cw.setIndex(cw.index-1)
  2412. elsif Input.trigger?(Input::RIGHT) && (cw.index&1)==0
  2413. pbPlayCursorSE() if cw.setIndex(cw.index+1)
  2414. elsif Input.trigger?(Input::UP) && (cw.index&2)==2
  2415. pbPlayCursorSE() if cw.setIndex(cw.index-2)
  2416. elsif Input.trigger?(Input::DOWN) && (cw.index&2)==0
  2417. pbPlayCursorSE() if cw.setIndex(cw.index+2)
  2418. end
  2419. if Input.trigger?(Input::C) # Confirm choice
  2420. ret=cw.index
  2421. pbPlayDecisionSE()
  2422. @lastmove[index]=ret
  2423. return ret
  2424. elsif Input.trigger?(Input::A) # Use Mega Evolution
  2425. if @battle.pbCanMegaEvolve?(index)
  2426. @battle.pbRegisterMegaEvolution(index)
  2427. cw.megaButton=2
  2428. pbPlayDecisionSE()
  2429. end
  2430. elsif Input.trigger?(Input::B) # Cancel fight menu
  2431. @lastmove[index]=cw.index
  2432. pbPlayCancelSE()
  2433. return -1
  2434. end
  2435. end
  2436. end
  2437.  
  2438. # Use this method to display the inventory
  2439. # The return value is the item chosen, or 0 if the choice was canceled.
  2440. def pbItemMenu(index)
  2441. ret=0
  2442. retindex=-1
  2443. pkmnid=-1
  2444. endscene=true
  2445. oldsprites=pbFadeOutAndHide(@sprites)
  2446. itemscene=PokemonBag_Scene.new
  2447. itemscene.pbStartScene($PokemonBag)
  2448. loop do
  2449. item=itemscene.pbChooseItem
  2450. break if item==0
  2451. usetype=$ItemData[item][ITEMBATTLEUSE]
  2452. cmdUse=-1
  2453. commands=[]
  2454. if usetype==0
  2455. commands[commands.length]=_INTL("Cancel")
  2456. else
  2457. commands[cmdUse=commands.length]=_INTL("Use")
  2458. commands[commands.length]=_INTL("Cancel")
  2459. end
  2460. itemname=PBItems.getName(item)
  2461. command=itemscene.pbShowCommands(_INTL("{1} is selected.",itemname),commands)
  2462. if cmdUse>=0 && command==cmdUse
  2463. if usetype==1 || usetype==3
  2464. modparty=[]
  2465. for i in 0...6
  2466. modparty.push(@battle.party1[@battle.party1order[i]])
  2467. end
  2468. pkmnlist=PokemonScreen_Scene.new
  2469. pkmnscreen=PokemonScreen.new(pkmnlist,modparty)
  2470. itemscene.pbEndScene
  2471. pkmnscreen.pbStartScene(_INTL("Use on which Pokémon?"),@battle.doublebattle)
  2472. activecmd=pkmnscreen.pbChoosePokemon
  2473. pkmnid=@battle.party1order[activecmd]
  2474. if activecmd>=0 && pkmnid>=0 && ItemHandlers.hasBattleUseOnPokemon(item)
  2475. pkmnlist.pbEndScene
  2476. ret=item
  2477. retindex=pkmnid
  2478. endscene=false
  2479. break
  2480. end
  2481. pkmnlist.pbEndScene
  2482. itemscene.pbStartScene($PokemonBag)
  2483. elsif usetype==2 || usetype==4
  2484. if ItemHandlers.hasBattleUseOnBattler(item)
  2485. ret=item
  2486. retindex=index
  2487. break
  2488. end
  2489. end
  2490. end
  2491. end
  2492. pbConsumeItemInBattle($PokemonBag,ret) if ret>0
  2493. itemscene.pbEndScene if endscene
  2494. pbFadeInAndShow(@sprites,oldsprites)
  2495. return [ret,retindex]
  2496. end
  2497.  
  2498. # Called whenever a Pokémon should forget a move. It should return -1 if the
  2499. # selection is canceled, or 0 to 3 to indicate the move to forget. The function
  2500. # should not allow HM moves to be forgotten.
  2501. def pbForgetMove(pokemon,moveToLearn)
  2502. ret=-1
  2503. pbFadeOutIn(99999){
  2504. scene=PokemonSummaryScene.new
  2505. screen=PokemonSummary.new(scene)
  2506. ret=screen.pbStartForgetScreen([pokemon],0,moveToLearn)
  2507. }
  2508. return ret
  2509. end
  2510.  
  2511. # Called whenever a Pokémon needs one of its moves chosen. Used for Ether.
  2512. def pbChooseMove(pokemon,message)
  2513. ret=-1
  2514. pbFadeOutIn(99999){
  2515. scene=PokemonSummaryScene.new
  2516. screen=PokemonSummary.new(scene)
  2517. ret=screen.pbStartChooseMoveScreen([pokemon],0,message)
  2518. }
  2519. return ret
  2520. end
  2521.  
  2522. def pbNameEntry(helptext,pokemon)
  2523. return pbEnterPokemonName(helptext,0,10,"",pokemon)
  2524. end
  2525.  
  2526. def pbSelectBattler(index,selectmode=1)
  2527. numwindows=@battle.doublebattle ? 4 : 2
  2528. for i in 0...numwindows
  2529. sprite=@sprites["battlebox#{i}"]
  2530. sprite.selected=(i==index) ? selectmode : 0
  2531. sprite=@sprites["pokemon#{i}"]
  2532. sprite.selected=(i==index) ? selectmode : 0
  2533. end
  2534. end
  2535.  
  2536. def pbFirstTarget(index,targettype)
  2537. case targettype
  2538. when PBTargets::SingleNonUser
  2539. for i in 0...4
  2540. if i!=index && !@battle.battlers[i].isFainted? &&
  2541. @battle.battlers[index].pbIsOpposing?(i)
  2542. return i
  2543. end
  2544. end
  2545. when PBTargets::UserOrPartner
  2546. return index
  2547. end
  2548. return -1
  2549. end
  2550.  
  2551. def pbUpdateSelected(index)
  2552. numwindows=@battle.doublebattle ? 4 : 2
  2553. for i in 0...numwindows
  2554. if i==index
  2555. @sprites["battlebox#{i}"].selected=2
  2556. @sprites["pokemon#{i}"].selected=2
  2557. else
  2558. @sprites["battlebox#{i}"].selected=0
  2559. @sprites["pokemon#{i}"].selected=0
  2560. end
  2561. @sprites["battlebox#{i}"].update
  2562. @sprites["pokemon#{i}"].update
  2563. end
  2564. end
  2565.  
  2566. # Use this method to make the player choose a target
  2567. # for certain moves in double battles.
  2568. def pbChooseTarget(index,targettype)
  2569. pbShowWindow(FIGHTBOX)
  2570. cw = @sprites["fightwindow"]
  2571. battler=@battle.battlers[index]
  2572. cw.battler=battler
  2573. lastIndex=@lastmove[index]
  2574. if battler.moves[lastIndex].id!=0
  2575. cw.setIndex(lastIndex)
  2576. else
  2577. cw.setIndex(0)
  2578. end
  2579.  
  2580. curwindow=pbFirstTarget(index,targettype)
  2581. if curwindow==-1
  2582. raise RuntimeError.new(_INTL("No targets somehow..."))
  2583. end
  2584. loop do
  2585. pbGraphicsUpdate
  2586. pbInputUpdate
  2587. pbFrameUpdate
  2588. pbUpdateSelected(curwindow)
  2589. if Input.trigger?(Input::C)
  2590. pbUpdateSelected(-1)
  2591. return curwindow
  2592. end
  2593. if Input.trigger?(Input::B)
  2594. pbUpdateSelected(-1)
  2595. return -1
  2596. end
  2597. if curwindow>=0
  2598. if Input.trigger?(Input::RIGHT) || Input.trigger?(Input::DOWN)
  2599. loop do
  2600. case targettype
  2601. when PBTargets::SingleNonUser
  2602. case curwindow
  2603. when 0; newcurwindow=2
  2604. when 1; newcurwindow=0
  2605. when 2; newcurwindow=3
  2606. when 3; newcurwindow=1
  2607. end
  2608. when PBTargets::UserOrPartner
  2609. newcurwindow=(curwindow+2)%4
  2610. end
  2611. curwindow=newcurwindow
  2612. next if targettype==PBTargets::SingleNonUser && curwindow==index
  2613. break if !@battle.battlers[curwindow].isFainted?
  2614. end
  2615. elsif Input.trigger?(Input::LEFT) || Input.trigger?(Input::UP)
  2616. loop do
  2617. case targettype
  2618. when PBTargets::SingleNonUser
  2619. case curwindow
  2620. when 0; newcurwindow=1
  2621. when 1; newcurwindow=3
  2622. when 2; newcurwindow=0
  2623. when 3; newcurwindow=2
  2624. end
  2625. when PBTargets::UserOrPartner
  2626. newcurwindow=(curwindow+2)%4
  2627. end
  2628. curwindow=newcurwindow
  2629. next if targettype==PBTargets::SingleNonUser && curwindow==index
  2630. break if !@battle.battlers[curwindow].isFainted?
  2631. end
  2632. end
  2633. end
  2634. end
  2635. end
  2636.  
  2637. def pbSwitch(index,lax,cancancel)
  2638. party=@battle.pbParty(index)
  2639. partypos=@battle.party1order
  2640. ret=-1
  2641. # Fade out and hide all sprites
  2642. visiblesprites=pbFadeOutAndHide(@sprites)
  2643. pbShowWindow(BLANK)
  2644. pbSetMessageMode(true)
  2645. modparty=[]
  2646. for i in 0...6
  2647. modparty.push(party[partypos[i]])
  2648. end
  2649. scene=PokemonScreen_Scene.new
  2650. @switchscreen=PokemonScreen.new(scene,modparty)
  2651. @switchscreen.pbStartScene(_INTL("Choose a Pokémon."),
  2652. @battle.doublebattle && !@battle.fullparty1)
  2653. loop do
  2654. scene.pbSetHelpText(_INTL("Choose a Pokémon."))
  2655. activecmd=@switchscreen.pbChoosePokemon
  2656. if cancancel && activecmd==-1
  2657. ret=-1
  2658. break
  2659. end
  2660. if activecmd>=0
  2661. commands=[]
  2662. cmdShift=-1
  2663. cmdSummary=-1
  2664. pkmnindex=partypos[activecmd]
  2665. commands[cmdShift=commands.length]=_INTL("Switch In") if !party[pkmnindex].isEgg?
  2666. commands[cmdSummary=commands.length]=_INTL("Summary")
  2667. commands[commands.length]=_INTL("Cancel")
  2668. command=scene.pbShowCommands(_INTL("Do what with {1}?",party[pkmnindex].name),commands)
  2669. if cmdShift>=0 && command==cmdShift
  2670. canswitch=lax ? @battle.pbCanSwitchLax?(index,pkmnindex,true) :
  2671. @battle.pbCanSwitch?(index,pkmnindex,true)
  2672. if canswitch
  2673. ret=pkmnindex
  2674. break
  2675. end
  2676. elsif cmdSummary>=0 && command==cmdSummary
  2677. scene.pbSummary(activecmd)
  2678. end
  2679. end
  2680. end
  2681. @switchscreen.pbEndScene
  2682. @switchscreen=nil
  2683. pbShowWindow(BLANK)
  2684. pbSetMessageMode(false)
  2685. # back to main battle screen
  2686. pbFadeInAndShow(@sprites,visiblesprites)
  2687. return ret
  2688. end
  2689.  
  2690. def pbDamageAnimation(pkmn,effectiveness)
  2691. pkmnsprite=@sprites["pokemon#{pkmn.index}"]
  2692. shadowsprite=@sprites["shadow#{pkmn.index}"]
  2693. sprite=@sprites["battlebox#{pkmn.index}"]
  2694. oldshadowvisible=shadowsprite.visible
  2695. oldvisible=sprite.visible
  2696. sprite.selected=3
  2697. @briefmessage=false
  2698. 6.times do
  2699. pbGraphicsUpdate
  2700. pbInputUpdate
  2701. pbFrameUpdate
  2702. end
  2703. case effectiveness
  2704. when 0
  2705. pbSEPlay("normaldamage")
  2706. when 1
  2707. pbSEPlay("notverydamage")
  2708. when 2
  2709. pbSEPlay("superdamage")
  2710. end
  2711. 8.times do
  2712. pkmnsprite.visible=!pkmnsprite.visible
  2713. if oldshadowvisible
  2714. shadowsprite.visible=!shadowsprite.visible
  2715. end
  2716. 4.times do
  2717. pbGraphicsUpdate
  2718. pbInputUpdate
  2719. pbFrameUpdate
  2720. sprite.update
  2721. end
  2722. end
  2723. sprite.selected=0
  2724. sprite.visible=oldvisible
  2725. end
  2726.  
  2727. # This method is called whenever a Pokémon's HP changes.
  2728. # Used to animate the HP bar.
  2729. def pbHPChanged(pkmn,oldhp,anim=false)
  2730. @briefmessage=false
  2731. hpchange=pkmn.hp-oldhp
  2732. if hpchange<0
  2733. hpchange=-hpchange
  2734. PBDebug.log("[HP change] #{pkmn.pbThis} lost #{hpchange} HP (#{oldhp}=>#{pkmn.hp})")
  2735. else
  2736. PBDebug.log("[HP change] #{pkmn.pbThis} gained #{hpchange} HP (#{oldhp}=>#{pkmn.hp})")
  2737. end
  2738. if anim && @battle.battlescene
  2739. if pkmn.hp>oldhp
  2740. pbCommonAnimation("HealthUp",pkmn,nil)
  2741. elsif pkmn.hp<oldhp
  2742. pbCommonAnimation("HealthDown",pkmn,nil)
  2743. end
  2744. end
  2745. sprite=@sprites["battlebox#{pkmn.index}"]
  2746. sprite.animateHP(oldhp,pkmn.hp)
  2747. while sprite.animatingHP
  2748. pbGraphicsUpdate
  2749. pbInputUpdate
  2750. pbFrameUpdate
  2751. sprite.update
  2752. end
  2753. end
  2754.  
  2755. # This method is called whenever a Pokémon faints.
  2756. def pbFainted(pkmn)
  2757. frames=pbCryFrameLength(pkmn.pokemon)
  2758. pbPlayCry(pkmn.pokemon)
  2759. frames.times do
  2760. pbGraphicsUpdate
  2761. pbInputUpdate
  2762. pbFrameUpdate
  2763. end
  2764. @sprites["shadow#{pkmn.index}"].visible=false
  2765. pkmnsprite=@sprites["pokemon#{pkmn.index}"]
  2766. ycoord=0
  2767. if @battle.doublebattle
  2768. ycoord=PokeBattle_SceneConstants::PLAYERBATTLERD1_Y if pkmn.index==0
  2769. ycoord=PokeBattle_SceneConstants::FOEBATTLERD1_Y if pkmn.index==1
  2770. ycoord=PokeBattle_SceneConstants::PLAYERBATTLERD2_Y if pkmn.index==2
  2771. ycoord=PokeBattle_SceneConstants::FOEBATTLERD2_Y if pkmn.index==3
  2772. else
  2773. if @battle.pbIsOpposing?(pkmn.index)
  2774. ycoord=PokeBattle_SceneConstants::FOEBATTLER_Y
  2775. else
  2776. ycoord=PokeBattle_SceneConstants::PLAYERBATTLER_Y
  2777. end
  2778. end
  2779. pbSEPlay("faint")
  2780. loop do
  2781. pkmnsprite.y+=8
  2782. if pkmnsprite.y-pkmnsprite.oy+pkmnsprite.src_rect.height>=ycoord
  2783. pkmnsprite.src_rect.height=ycoord-pkmnsprite.y+pkmnsprite.oy
  2784. end
  2785. pbGraphicsUpdate
  2786. pbInputUpdate
  2787. pbFrameUpdate
  2788. break if pkmnsprite.y>=ycoord
  2789. end
  2790. pkmnsprite.visible=false
  2791. 8.times do
  2792. @sprites["battlebox#{pkmn.index}"].opacity-=32
  2793. pbGraphicsUpdate
  2794. pbInputUpdate
  2795. pbFrameUpdate
  2796. end
  2797. @sprites["battlebox#{pkmn.index}"].visible=false
  2798. pkmn.pbResetForm
  2799. end
  2800.  
  2801. # Use this method to choose a command for the enemy.
  2802. def pbChooseEnemyCommand(index)
  2803. @battle.pbDefaultChooseEnemyCommand(index)
  2804. end
  2805.  
  2806. # Use this method to choose a new Pokémon for the enemy
  2807. # The enemy's party is guaranteed to have at least one choosable member.
  2808. def pbChooseNewEnemy(index,party)
  2809. @battle.pbDefaultChooseNewEnemy(index,party)
  2810. end
  2811.  
  2812. # This method is called when the player wins a wild Pokémon battle.
  2813. # This method can change the battle's music for example.
  2814. def pbWildBattleSuccess
  2815. pbBGMPlay(pbGetWildVictoryME())
  2816. end
  2817.  
  2818. # This method is called when the player wins a Trainer battle.
  2819. # This method can change the battle's music for example.
  2820. def pbTrainerBattleSuccess
  2821. pbBGMPlay(pbGetTrainerVictoryME(@battle.opponent))
  2822. end
  2823.  
  2824. def pbEXPBar(pokemon,battler,startexp,endexp,tempexp1,tempexp2)
  2825. if battler
  2826. @sprites["battlebox#{battler.index}"].refreshExpLevel
  2827. exprange=(endexp-startexp)
  2828. startexplevel=0
  2829. endexplevel=0
  2830. if exprange!=0
  2831. startexplevel=(tempexp1-startexp)*PokeBattle_SceneConstants::EXPGAUGESIZE/exprange
  2832. endexplevel=(tempexp2-startexp)*PokeBattle_SceneConstants::EXPGAUGESIZE/exprange
  2833. end
  2834. @sprites["battlebox#{battler.index}"].animateEXP(startexplevel,endexplevel)
  2835. while @sprites["battlebox#{battler.index}"].animatingEXP
  2836. pbGraphicsUpdate
  2837. pbInputUpdate
  2838. pbFrameUpdate
  2839. @sprites["battlebox#{battler.index}"].update
  2840. end
  2841. end
  2842. end
  2843.  
  2844. def pbShowPokedex(species)
  2845. pbFadeOutIn(99999){
  2846. scene=PokemonPokedexScene.new
  2847. screen=PokemonPokedex.new(scene)
  2848. screen.pbDexEntry(species)
  2849. }
  2850. end
  2851.  
  2852. def pbChangeSpecies(attacker,species)
  2853. pkmn=@sprites["pokemon#{attacker.index}"]
  2854. shadow=@sprites["shadow#{attacker.index}"]
  2855. back=!@battle.pbIsOpposing?(attacker.index)
  2856. pkmn.setPokemonBitmapSpecies(attacker.pokemon,species,back)
  2857. pkmn.x=-pkmn.bitmap.width/2
  2858. pkmn.y=adjustBattleSpriteY(pkmn,species,attacker.index)
  2859. if @battle.doublebattle
  2860. case attacker.index
  2861. when 0
  2862. pkmn.x+=PokeBattle_SceneConstants::PLAYERBATTLERD1_X
  2863. pkmn.y+=PokeBattle_SceneConstants::PLAYERBATTLERD1_Y
  2864. when 1
  2865. pkmn.x+=PokeBattle_SceneConstants::FOEBATTLERD1_X
  2866. pkmn.y+=PokeBattle_SceneConstants::FOEBATTLERD1_Y
  2867. when 2
  2868. pkmn.x+=PokeBattle_SceneConstants::PLAYERBATTLERD2_X
  2869. pkmn.y+=PokeBattle_SceneConstants::PLAYERBATTLERD2_Y
  2870. when 3
  2871. pkmn.x+=PokeBattle_SceneConstants::FOEBATTLERD2_X
  2872. pkmn.y+=PokeBattle_SceneConstants::FOEBATTLERD2_Y
  2873. end
  2874. else
  2875. pkmn.x+=PokeBattle_SceneConstants::PLAYERBATTLER_X if attacker.index==0
  2876. pkmn.y+=PokeBattle_SceneConstants::PLAYERBATTLER_Y if attacker.index==0
  2877. pkmn.x+=PokeBattle_SceneConstants::FOEBATTLER_X if attacker.index==1
  2878. pkmn.y+=PokeBattle_SceneConstants::FOEBATTLER_Y if attacker.index==1
  2879. end
  2880. if shadow && !back
  2881. shadow.visible=showShadow?(species)
  2882. end
  2883. end
  2884.  
  2885. def pbChangePokemon(attacker,pokemon)
  2886. pkmn=@sprites["pokemon#{attacker.index}"]
  2887. shadow=@sprites["shadow#{attacker.index}"]
  2888. back=!@battle.pbIsOpposing?(attacker.index)
  2889. pkmn.setPokemonBitmap(pokemon,back)
  2890. pkmn.x=-pkmn.bitmap.width/2
  2891. pkmn.y=adjustBattleSpriteY(pkmn,pokemon.species,attacker.index)
  2892. if @battle.doublebattle
  2893. case attacker.index
  2894. when 0
  2895. pkmn.x+=PokeBattle_SceneConstants::PLAYERBATTLERD1_X
  2896. pkmn.y+=PokeBattle_SceneConstants::PLAYERBATTLERD1_Y
  2897. when 1
  2898. pkmn.x+=PokeBattle_SceneConstants::FOEBATTLERD1_X
  2899. pkmn.y+=PokeBattle_SceneConstants::FOEBATTLERD1_Y
  2900. when 2
  2901. pkmn.x+=PokeBattle_SceneConstants::PLAYERBATTLERD2_X
  2902. pkmn.y+=PokeBattle_SceneConstants::PLAYERBATTLERD2_Y
  2903. when 3
  2904. pkmn.x+=PokeBattle_SceneConstants::FOEBATTLERD2_X
  2905. pkmn.y+=PokeBattle_SceneConstants::FOEBATTLERD2_Y
  2906. end
  2907. else
  2908. pkmn.x+=PokeBattle_SceneConstants::PLAYERBATTLER_X if attacker.index==0
  2909. pkmn.y+=PokeBattle_SceneConstants::PLAYERBATTLER_Y if attacker.index==0
  2910. pkmn.x+=PokeBattle_SceneConstants::FOEBATTLER_X if attacker.index==1
  2911. pkmn.y+=PokeBattle_SceneConstants::FOEBATTLER_Y if attacker.index==1
  2912. end
  2913. if shadow && !back
  2914. shadow.visible=showShadow?(pokemon.species)
  2915. end
  2916. end
  2917.  
  2918. def pbSaveShadows
  2919. shadows=[]
  2920. for i in 0...4
  2921. s=@sprites["shadow#{i}"]
  2922. shadows[i]=s ? s.visible : false
  2923. s.visible=false if s
  2924. end
  2925. yield
  2926. for i in 0...4
  2927. s=@sprites["shadow#{i}"]
  2928. s.visible=shadows[i] if s
  2929. end
  2930. end
  2931.  
  2932. def pbFindAnimation(moveid,userIndex,hitnum)
  2933. begin
  2934. move2anim=load_data("Data/move2anim.dat")
  2935. noflip=false
  2936. if (userIndex&1)==0 # On player's side
  2937. anim=move2anim[0][moveid]
  2938. else # On opposing side
  2939. anim=move2anim[1][moveid]
  2940. noflip=true if anim
  2941. anim=move2anim[0][moveid] if !anim
  2942. end
  2943. return [anim+hitnum,noflip] if anim
  2944. # Actual animation not found, get the default animation for the move's type
  2945. move=PBMoveData.new(moveid)
  2946. type=move.type
  2947. typedefaultanim=[[:NORMAL,:TACKLE],
  2948. [:FIGHTING,:COMETPUNCH],
  2949. [:FLYING,:GUST],
  2950. [:POISON,:SLUDGE],
  2951. [:GROUND,:MUDSLAP],
  2952. [:ROCK,:ROCKTHROW],
  2953. [:BUG,:TWINEEDLE],
  2954. [:GHOST,:NIGHTSHADE],
  2955. [:STEEL,:GYROBALL],
  2956. [:FIRE,:EMBER],
  2957. [:WATER,:WATERGUN],
  2958. [:GRASS,:RAZORLEAF],
  2959. [:ELECTRIC,:THUNDERSHOCK],
  2960. [:PSYCHIC,:CONFUSION],
  2961. [:ICE,:ICEBALL],
  2962. [:DRAGON,:DRAGONRAGE],
  2963. [:DARK,:PURSUIT],
  2964. [:FAIRY,:FAIRYWIND]]
  2965. for i in typedefaultanim
  2966. if isConst?(type,PBTypes,i[0]) && hasConst?(PBMoves,i[1])
  2967. noflip=false
  2968. if (userIndex&1)==0 # On player's side
  2969. anim=move2anim[0][getConst(PBMoves,i[1])]
  2970. else # On opposing side
  2971. anim=move2anim[1][getConst(PBMoves,i[1])]
  2972. noflip=true if anim
  2973. anim=move2anim[0][getConst(PBMoves,i[1])] if !anim
  2974. end
  2975. return [anim,noflip] if anim
  2976. break
  2977. end
  2978. end
  2979. # Default animation for the move's type not found, use Tackle's animation
  2980. if hasConst?(PBMoves,:TACKLE)
  2981. anim=move2anim[0][getConst(PBMoves,:TACKLE)]
  2982. return [anim,false] if anim
  2983. end
  2984. rescue
  2985. return nil
  2986. end
  2987. return nil
  2988. end
  2989.  
  2990. def pbCommonAnimation(animname,user,target,hitnum=0)
  2991. animations=load_data("Data/PkmnAnimations.rxdata")
  2992. for i in 0...animations.length
  2993. if animations[i] && animations[i].name=="Common:"+animname
  2994. pbAnimationCore(animations[i],user,(target!=nil) ? target : user)
  2995. return
  2996. end
  2997. end
  2998. end
  2999.  
  3000. def pbAnimation(moveid,user,target,hitnum=0)
  3001. animid=pbFindAnimation(moveid,user.index,hitnum)
  3002. return if !animid
  3003. anim=animid[0]
  3004. animations=load_data("Data/PkmnAnimations.rxdata")
  3005. pbSaveShadows {
  3006. if animid[1] # On opposing side and using OppMove animation
  3007. pbAnimationCore(animations[anim],target,user,true)
  3008. else # On player's side, and/or using Move animation
  3009. pbAnimationCore(animations[anim],user,target)
  3010. end
  3011. }
  3012. if PBMoveData.new(moveid).function==0x69 && user && target # Transform
  3013. # Change form to transformed version
  3014. pbChangePokemon(user,target.pokemon)
  3015. end
  3016. end
  3017.  
  3018. def pbAnimationCore(animation,user,target,oppmove=false)
  3019. return if !animation
  3020. @briefmessage=false
  3021. usersprite=(user) ? @sprites["pokemon#{user.index}"] : nil
  3022. targetsprite=(target) ? @sprites["pokemon#{target.index}"] : nil
  3023. olduserx=usersprite ? usersprite.x : 0
  3024. oldusery=usersprite ? usersprite.y : 0
  3025. oldtargetx=targetsprite ? targetsprite.x : 0
  3026. oldtargety=targetsprite ? targetsprite.y : 0
  3027. if !targetsprite
  3028. target=user if !target
  3029. animplayer=PBAnimationPlayerX.new(animation,user,target,self,oppmove)
  3030. userwidth=(!usersprite || !usersprite.bitmap || usersprite.bitmap.disposed?) ? 128 : usersprite.bitmap.width
  3031. userheight=(!usersprite || !usersprite.bitmap || usersprite.bitmap.disposed?) ? 128 : usersprite.bitmap.height
  3032. animplayer.setLineTransform(
  3033. PokeBattle_SceneConstants::FOCUSUSER_X,PokeBattle_SceneConstants::FOCUSUSER_Y,
  3034. PokeBattle_SceneConstants::FOCUSTARGET_X,PokeBattle_SceneConstants::FOCUSTARGET_Y,
  3035. olduserx+(userwidth/2),oldusery+(userheight/2),
  3036. olduserx+(userwidth/2),oldusery+(userheight/2))
  3037. else
  3038. animplayer=PBAnimationPlayerX.new(animation,user,target,self,oppmove)
  3039. userwidth=(!usersprite || !usersprite.bitmap || usersprite.bitmap.disposed?) ? 128 : usersprite.bitmap.width
  3040. userheight=(!usersprite || !usersprite.bitmap || usersprite.bitmap.disposed?) ? 128 : usersprite.bitmap.height
  3041. targetwidth=(!targetsprite.bitmap || targetsprite.bitmap.disposed?) ? 128 : targetsprite.bitmap.width
  3042. targetheight=(!targetsprite.bitmap || targetsprite.bitmap.disposed?) ? 128 : targetsprite.bitmap.height
  3043. animplayer.setLineTransform(
  3044. PokeBattle_SceneConstants::FOCUSUSER_X,PokeBattle_SceneConstants::FOCUSUSER_Y,
  3045. PokeBattle_SceneConstants::FOCUSTARGET_X,PokeBattle_SceneConstants::FOCUSTARGET_Y,
  3046. olduserx+(userwidth/2),oldusery+(userheight/2),
  3047. oldtargetx+(targetwidth/2),oldtargety+(targetheight/2))
  3048. end
  3049. animplayer.start
  3050. while animplayer.playing?
  3051. animplayer.update
  3052. pbGraphicsUpdate
  3053. pbInputUpdate
  3054. pbFrameUpdate
  3055. end
  3056. usersprite.ox=0 if usersprite
  3057. usersprite.oy=0 if usersprite
  3058. usersprite.x=olduserx if usersprite
  3059. usersprite.y=oldusery if usersprite
  3060. targetsprite.ox=0 if targetsprite
  3061. targetsprite.oy=0 if targetsprite
  3062. targetsprite.x=oldtargetx if targetsprite
  3063. targetsprite.y=oldtargety if targetsprite
  3064. animplayer.dispose
  3065. end
  3066.  
  3067. def pbLevelUp(pokemon,battler,oldtotalhp,oldattack,olddefense,oldspeed,
  3068. oldspatk,oldspdef)
  3069. pbTopRightWindow(_INTL("Max. HP<r>+{1}\r\nAttack<r>+{2}\r\nDefense<r>+{3}\r\nSp. Atk<r>+{4}\r\nSp. Def<r>+{5}\r\nSpeed<r>+{6}",
  3070. pokemon.totalhp-oldtotalhp,
  3071. pokemon.attack-oldattack,
  3072. pokemon.defense-olddefense,
  3073. pokemon.spatk-oldspatk,
  3074. pokemon.spdef-oldspdef,
  3075. pokemon.speed-oldspeed))
  3076. pbTopRightWindow(_INTL("Max. HP<r>{1}\r\nAttack<r>{2}\r\nDefense<r>{3}\r\nSp. Atk<r>{4}\r\nSp. Def<r>{5}\r\nSpeed<r>{6}",
  3077. pokemon.totalhp,pokemon.attack,pokemon.defense,pokemon.spatk,pokemon.spdef,pokemon.speed))
  3078. end
  3079.  
  3080. def pbThrowAndDeflect(ball,targetBattler)
  3081. @briefmessage=false
  3082. balltype=pbGetBallType(ball)
  3083. ball=sprintf("Graphics/Pictures/ball%02d",balltype)
  3084. # sprite
  3085. spriteBall=IconSprite.new(0,0,@viewport)
  3086. spriteBall.visible=false
  3087. # picture
  3088. pictureBall=PictureEx.new(@sprites["pokemon#{targetBattler}"].z+1)
  3089. center=getSpriteCenter(@sprites["pokemon#{targetBattler}"])
  3090. # starting positions
  3091. pictureBall.moveVisible(1,true)
  3092. pictureBall.moveName(1,ball)
  3093. pictureBall.moveOrigin(1,PictureOrigin::Center)
  3094. pictureBall.moveXY(0,1,10,180)
  3095. # directives
  3096. pictureBall.moveSE(1,"Audio/SE/throw")
  3097. pictureBall.moveCurve(30,1,150,70,30+Graphics.width/2,10,center[0],center[1])
  3098. pictureBall.moveAngle(30,1,-1080)
  3099. pictureBall.moveAngle(0,pictureBall.totalDuration,0)
  3100. delay=pictureBall.totalDuration
  3101. pictureBall.moveSE(delay,"Audio/SE/balldrop")
  3102. pictureBall.moveXY(20,delay,0,Graphics.height)
  3103. loop do
  3104. pictureBall.update
  3105. setPictureIconSprite(spriteBall,pictureBall)
  3106. pbGraphicsUpdate
  3107. pbInputUpdate
  3108. pbFrameUpdate
  3109. break if !pictureBall.running?
  3110. end
  3111. spriteBall.dispose
  3112. end
  3113.  
  3114. def pbThrow(ball,shakes,critical,targetBattler,showplayer=false)
  3115. @briefmessage=false
  3116. burst=-1
  3117. animations=load_data("Data/PkmnAnimations.rxdata")
  3118. for i in 0...2
  3119. t=(i==0) ? ball : 0
  3120. for j in 0...animations.length
  3121. if animations[j]
  3122. if animations[j].name=="Common:BallBurst#{t}"
  3123. burst=t if burst<0
  3124. break
  3125. end
  3126. end
  3127. end
  3128. break if burst>=0
  3129. end
  3130. pokeballThrow(ball,shakes,critical,targetBattler,self,@battle.battlers[targetBattler],burst,showplayer)
  3131. end
  3132.  
  3133. def pbThrowSuccess
  3134. if !@battle.opponent
  3135. @briefmessage=false
  3136. pbMEPlay("Jingle - HMTM")
  3137. frames=(3.5*Graphics.frame_rate).to_i
  3138. frames.times do
  3139. pbGraphicsUpdate
  3140. pbInputUpdate
  3141. pbFrameUpdate
  3142. end
  3143. end
  3144. end
  3145.  
  3146. def pbHideCaptureBall
  3147. if @sprites["capture"]
  3148. loop do
  3149. break if @sprites["capture"].opacity<=0
  3150. @sprites["capture"].opacity-=12
  3151. pbGraphicsUpdate
  3152. pbInputUpdate
  3153. pbFrameUpdate
  3154. end
  3155. end
  3156. end
  3157.  
  3158. def pbThrowBait
  3159. @briefmessage=false
  3160. ball=sprintf("Graphics/Pictures/battleBait")
  3161. armanim=false
  3162. if @sprites["player"].bitmap.width>@sprites["player"].bitmap.height
  3163. armanim=true
  3164. end
  3165. # sprites
  3166. spritePoke=@sprites["pokemon1"]
  3167. spritePlayer=@sprites["player"]
  3168. spriteBall=IconSprite.new(0,0,@viewport)
  3169. spriteBall.visible=false
  3170. # pictures
  3171. pictureBall=PictureEx.new(spritePoke.z+1)
  3172. picturePoke=PictureEx.new(spritePoke.z)
  3173. picturePlayer=PictureEx.new(spritePoke.z+2)
  3174. dims=[spritePoke.x,spritePoke.y]
  3175. pokecenter=getSpriteCenter(@sprites["pokemon1"])
  3176. playerpos=[@sprites["player"].x,@sprites["player"].y]
  3177. ballendy=PokeBattle_SceneConstants::FOEBATTLER_Y-4
  3178. # starting positions
  3179. pictureBall.moveVisible(1,true)
  3180. pictureBall.moveName(1,ball)
  3181. pictureBall.moveOrigin(1,PictureOrigin::Center)
  3182. pictureBall.moveXY(0,1,64,256)
  3183. picturePoke.moveVisible(1,true)
  3184. picturePoke.moveOrigin(1,PictureOrigin::Center)
  3185. picturePoke.moveXY(0,1,pokecenter[0],pokecenter[1])
  3186. picturePlayer.moveVisible(1,true)
  3187. picturePlayer.moveName(1,@sprites["player"].name)
  3188. picturePlayer.moveOrigin(1,PictureOrigin::TopLeft)
  3189. picturePlayer.moveXY(0,1,playerpos[0],playerpos[1])
  3190. # directives
  3191. picturePoke.moveSE(1,"Audio/SE/throw")
  3192. pictureBall.moveCurve(30,1,64,256,Graphics.width/2,48,
  3193. PokeBattle_SceneConstants::FOEBATTLER_X-48,
  3194. PokeBattle_SceneConstants::FOEBATTLER_Y)
  3195. pictureBall.moveAngle(30,1,-720)
  3196. pictureBall.moveAngle(0,pictureBall.totalDuration,0)
  3197. if armanim
  3198. picturePlayer.moveSrc(1,@sprites["player"].bitmap.height,0)
  3199. picturePlayer.moveXY(0,1,playerpos[0]-14,playerpos[1])
  3200. picturePlayer.moveSrc(4,@sprites["player"].bitmap.height*2,0)
  3201. picturePlayer.moveXY(0,4,playerpos[0]-12,playerpos[1])
  3202. picturePlayer.moveSrc(8,@sprites["player"].bitmap.height*3,0)
  3203. picturePlayer.moveXY(0,8,playerpos[0]+20,playerpos[1])
  3204. picturePlayer.moveSrc(16,@sprites["player"].bitmap.height*4,0)
  3205. picturePlayer.moveXY(0,16,playerpos[0]+16,playerpos[1])
  3206. picturePlayer.moveSrc(40,0,0)
  3207. picturePlayer.moveXY(0,40,playerpos[0],playerpos[1])
  3208. end
  3209. # Show Pokémon jumping before eating the bait
  3210. picturePoke.moveSE(50,"Audio/SE/jump")
  3211. picturePoke.moveXY(8,50,pokecenter[0],pokecenter[1]-8)
  3212. picturePoke.moveXY(8,58,pokecenter[0],pokecenter[1])
  3213. pictureBall.moveVisible(66,false)
  3214. picturePoke.moveSE(66,"Audio/SE/jump")
  3215. picturePoke.moveXY(8,66,pokecenter[0],pokecenter[1]-8)
  3216. picturePoke.moveXY(8,74,pokecenter[0],pokecenter[1])
  3217. # TODO: Show Pokémon eating the bait (pivots at the bottom right corner)
  3218. picturePoke.moveOrigin(picturePoke.totalDuration,PictureOrigin::TopLeft)
  3219. picturePoke.moveXY(0,picturePoke.totalDuration,dims[0],dims[1])
  3220. loop do
  3221. pictureBall.update
  3222. picturePoke.update
  3223. picturePlayer.update
  3224. setPictureIconSprite(spriteBall,pictureBall)
  3225. setPictureSprite(spritePoke,picturePoke)
  3226. setPictureIconSprite(spritePlayer,picturePlayer)
  3227. pbGraphicsUpdate
  3228. pbInputUpdate
  3229. pbFrameUpdate
  3230. break if !pictureBall.running? && !picturePoke.running? && !picturePlayer.running?
  3231. end
  3232. spriteBall.dispose
  3233. end
  3234.  
  3235. def pbThrowRock
  3236. @briefmessage=false
  3237. ball=sprintf("Graphics/Pictures/battleRock")
  3238. anger=sprintf("Graphics/Pictures/battleAnger")
  3239. armanim=false
  3240. if @sprites["player"].bitmap.width>@sprites["player"].bitmap.height
  3241. armanim=true
  3242. end
  3243. # sprites
  3244. spritePoke=@sprites["pokemon1"]
  3245. spritePlayer=@sprites["player"]
  3246. spriteBall=IconSprite.new(0,0,@viewport)
  3247. spriteBall.visible=false
  3248. spriteAnger=IconSprite.new(0,0,@viewport)
  3249. spriteAnger.visible=false
  3250. # pictures
  3251. pictureBall=PictureEx.new(spritePoke.z+1)
  3252. picturePoke=PictureEx.new(spritePoke.z)
  3253. picturePlayer=PictureEx.new(spritePoke.z+2)
  3254. pictureAnger=PictureEx.new(spritePoke.z+1)
  3255. dims=[spritePoke.x,spritePoke.y]
  3256. pokecenter=getSpriteCenter(@sprites["pokemon1"])
  3257. playerpos=[@sprites["player"].x,@sprites["player"].y]
  3258. ballendy=PokeBattle_SceneConstants::FOEBATTLER_Y-4
  3259. # starting positions
  3260. pictureBall.moveVisible(1,true)
  3261. pictureBall.moveName(1,ball)
  3262. pictureBall.moveOrigin(1,PictureOrigin::Center)
  3263. pictureBall.moveXY(0,1,64,256)
  3264. picturePoke.moveVisible(1,true)
  3265. picturePoke.moveOrigin(1,PictureOrigin::Center)
  3266. picturePoke.moveXY(0,1,pokecenter[0],pokecenter[1])
  3267. picturePlayer.moveVisible(1,true)
  3268. picturePlayer.moveName(1,@sprites["player"].name)
  3269. picturePlayer.moveOrigin(1,PictureOrigin::TopLeft)
  3270. picturePlayer.moveXY(0,1,playerpos[0],playerpos[1])
  3271. pictureAnger.moveVisible(1,false)
  3272. pictureAnger.moveName(1,anger)
  3273. pictureAnger.moveXY(0,1,pokecenter[0]-56,pokecenter[1]-48)
  3274. pictureAnger.moveOrigin(1,PictureOrigin::Center)
  3275. pictureAnger.moveZoom(0,1,100)
  3276. # directives
  3277. picturePoke.moveSE(1,"Audio/SE/throw")
  3278. pictureBall.moveCurve(30,1,64,256,Graphics.width/2,48,pokecenter[0],pokecenter[1])
  3279. pictureBall.moveAngle(30,1,-720)
  3280. pictureBall.moveAngle(0,pictureBall.totalDuration,0)
  3281. pictureBall.moveSE(30,"Audio/SE/notverydamage")
  3282. if armanim
  3283. picturePlayer.moveSrc(1,@sprites["player"].bitmap.height,0)
  3284. picturePlayer.moveXY(0,1,playerpos[0]-14,playerpos[1])
  3285. picturePlayer.moveSrc(4,@sprites["player"].bitmap.height*2,0)
  3286. picturePlayer.moveXY(0,4,playerpos[0]-12,playerpos[1])
  3287. picturePlayer.moveSrc(8,@sprites["player"].bitmap.height*3,0)
  3288. picturePlayer.moveXY(0,8,playerpos[0]+20,playerpos[1])
  3289. picturePlayer.moveSrc(16,@sprites["player"].bitmap.height*4,0)
  3290. picturePlayer.moveXY(0,16,playerpos[0]+16,playerpos[1])
  3291. picturePlayer.moveSrc(40,0,0)
  3292. picturePlayer.moveXY(0,40,playerpos[0],playerpos[1])
  3293. end
  3294. pictureBall.moveVisible(40,false)
  3295. # Show Pokémon being angry
  3296. pictureAnger.moveSE(48,"Audio/SE/jump")
  3297. pictureAnger.moveVisible(48,true)
  3298. pictureAnger.moveZoom(8,48,130)
  3299. pictureAnger.moveZoom(8,56,100)
  3300. pictureAnger.moveXY(0,64,pokecenter[0]+56,pokecenter[1]-64)
  3301. pictureAnger.moveSE(64,"Audio/SE/jump")
  3302. pictureAnger.moveZoom(8,64,130)
  3303. pictureAnger.moveZoom(8,72,100)
  3304. pictureAnger.moveVisible(80,false)
  3305. picturePoke.moveOrigin(picturePoke.totalDuration,PictureOrigin::TopLeft)
  3306. picturePoke.moveXY(0,picturePoke.totalDuration,dims[0],dims[1])
  3307. loop do
  3308. pictureBall.update
  3309. picturePoke.update
  3310. picturePlayer.update
  3311. pictureAnger.update
  3312. setPictureIconSprite(spriteBall,pictureBall)
  3313. setPictureSprite(spritePoke,picturePoke)
  3314. setPictureIconSprite(spritePlayer,picturePlayer)
  3315. setPictureIconSprite(spriteAnger,pictureAnger)
  3316. pbGraphicsUpdate
  3317. pbInputUpdate
  3318. pbFrameUpdate
  3319. break if !pictureBall.running? && !picturePoke.running? &&
  3320. !picturePlayer.running? && !pictureAnger.running?
  3321. end
  3322. spriteBall.dispose
  3323. end
  3324. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement