Advertisement
Guest User

Untitled

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