Advertisement
Diego-Mertens

evol

Mar 11th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 29.08 KB | None | 0 0
  1. module PBEvolution
  2. Unknown = 0 # Do not use
  3. Happiness = 1
  4. HappinessDay = 2
  5. HappinessNight = 3
  6. Level = 4
  7. Trade = 5
  8. TradeItem = 6
  9. Item = 7
  10. AttackGreater = 8
  11. AtkDefEqual = 9
  12. DefenseGreater = 10
  13. Silcoon = 11
  14. Cascoon = 12
  15. Ninjask = 13
  16. Shedinja = 14
  17. Beauty = 15
  18. ItemMale = 16
  19. ItemFemale = 17
  20. DayHoldItem = 18
  21. NightHoldItem = 19
  22. HasMove = 20
  23. HasInParty = 21
  24. LevelMale = 22
  25. LevelFemale = 23
  26. Location = 24
  27. TradeSpecies = 25
  28. LevelDay = 26
  29. LevelNight = 27
  30. LevelDarkInParty = 28
  31. LevelRain = 29
  32. HappinessMoveType = 30
  33. Custom1 = 31
  34. Custom2 = 32
  35. Custom3 = 33
  36. Custom4 = 34
  37. Custom5 = 35
  38.  
  39. EVONAMES=["Unknown",
  40. "Happiness","HappinessDay","HappinessNight","Level","Trade",
  41. "TradeItem","Item","AttackGreater","AtkDefEqual","DefenseGreater",
  42. "Silcoon","Cascoon","Ninjask","Shedinja","Beauty",
  43. "ItemMale","ItemFemale","DayHoldItem","NightHoldItem","HasMove",
  44. "HasInParty","LevelMale","LevelFemale","Location","TradeSpecies",
  45. "LevelDay","LevelNight","LevelDarkInParty","LevelRain","HappinessMoveType",
  46. "Custom1","Custom2","Custom3","Custom4","Custom5"
  47. ]
  48.  
  49. # 0 = no parameter
  50. # 1 = Positive integer
  51. # 2 = Item internal name
  52. # 3 = Move internal name
  53. # 4 = Species internal name
  54. # 5 = Type internal name
  55. EVOPARAM=[0, # Unknown (do not use)
  56. 0,0,0,1,0, # Happiness, HappinessDay, HappinessNight, Level, Trade
  57. 2,2,1,1,1, # TradeItem, Item, AttackGreater, AtkDefEqual, DefenseGreater
  58. 1,1,1,1,1, # Silcoon, Cascoon, Ninjask, Shedinja, Beauty
  59. 2,2,2,2,3, # ItemMale, ItemFemale, DayHoldItem, NightHoldItem, HasMove
  60. 4,1,1,1,4, # HasInParty, LevelMale, LevelFemale, Location, TradeSpecies
  61. 1,1,1,1,5, # LevelDay, LevelNight, LevelDarkInParty, LevelRain, HappinessMoveType
  62. 1,1,1,1,1 # Custom 1-5
  63. ]
  64. end
  65.  
  66.  
  67.  
  68. #===============================================================================
  69. # Evolution helper functions
  70. #===============================================================================
  71. def pbGetEvolvedFormData(species)
  72. ret=[]
  73. _EVOTYPEMASK=0x7F
  74. _EVODATAMASK=0x80
  75. _EVONEXTFORM=0x00
  76. pbRgssOpen("Data/evolutions.dat","rb"){|f|
  77. f.pos=(species-1)*8
  78. offset=f.fgetdw
  79. length=f.fgetdw
  80. if length>0
  81. f.pos=offset
  82. i=0; loop do break unless i<length
  83. evo=f.fgetb
  84. evonib=evo&_EVOTYPEMASK
  85. level=f.fgetw
  86. poke=f.fgetw
  87. if (evo&_EVODATAMASK)==_EVONEXTFORM
  88. ret.push([evonib,level,poke])
  89. end
  90. i+=5
  91. end
  92. end
  93. }
  94. return ret
  95. end
  96.  
  97. def pbGetPreviousForm(species) # Unused
  98. _EVOTYPEMASK=0x7F
  99. _EVODATAMASK=0x80
  100. _EVOPREVFORM=0x80
  101. pbRgssOpen("Data/evolutions.dat","rb"){|f|
  102. f.pos=(species-1)*8
  103. offset=f.fgetdw
  104. length=f.fgetdw
  105. if length>0
  106. f.pos=offset
  107. i=0; loop do break unless i<length
  108. evo=f.fgetb
  109. evonib=evo&_EVOTYPEMASK
  110. level=f.fgetw
  111. poke=f.fgetw
  112. if (evo&_EVODATAMASK)==_EVOPREVFORM
  113. return poke
  114. end
  115. i+=5
  116. end
  117. end
  118. }
  119. return species
  120. end
  121.  
  122. def pbGetBabySpecies(species,item1=-1,item2=-1)
  123. ret=species
  124. _EVOTYPEMASK=0x7F
  125. _EVODATAMASK=0x80
  126. _EVOPREVFORM=0x80
  127. pbRgssOpen("Data/evolutions.dat","rb"){|f|
  128. f.pos=(species-1)*8
  129. offset=f.fgetdw
  130. length=f.fgetdw
  131. if length>0
  132. f.pos=offset
  133. i=0; loop do break unless i<length
  134. evo=f.fgetb
  135. evonib=evo&_EVOTYPEMASK
  136. level=f.fgetw
  137. poke=f.fgetw
  138. if poke<=PBSpecies.maxValueF && (evo&_EVODATAMASK)==_EVOPREVFORM # evolved from
  139. if item1>=0 && item2>=0
  140. dexdata=pbOpenDexData
  141. pbDexDataOffset(dexdata,poke,54)
  142. incense=dexdata.fgetw
  143. dexdata.close
  144. ret=poke if item1==incense || item2==incense
  145. else
  146. ret=poke
  147. end
  148. break
  149. end
  150. i+=5
  151. end
  152. end
  153. }
  154. if ret!=species
  155. ret=pbGetBabySpecies(ret)
  156. end
  157. return ret
  158. end
  159.  
  160. def pbGetMinimumLevel(species)
  161. ret=-1
  162. _EVOTYPEMASK=0x7F
  163. _EVODATAMASK=0x80
  164. _EVOPREVFORM=0x80
  165. pbRgssOpen("Data/evolutions.dat","rb"){|f|
  166. f.pos=(species-1)*8
  167. offset=f.fgetdw
  168. length=f.fgetdw
  169. if length>0
  170. f.pos=offset
  171. i=0; loop do break unless i<length
  172. evo=f.fgetb
  173. evonib=evo&_EVOTYPEMASK
  174. level=f.fgetw
  175. poke=f.fgetw
  176. if poke<=PBSpecies.maxValueF &&
  177. (evo&_EVODATAMASK)==_EVOPREVFORM && # evolved from
  178. [PBEvolution::Level,PBEvolution::LevelMale,
  179. PBEvolution::LevelFemale,PBEvolution::AttackGreater,
  180. PBEvolution::AtkDefEqual,PBEvolution::DefenseGreater,
  181. PBEvolution::Silcoon,PBEvolution::Cascoon,
  182. PBEvolution::Ninjask,PBEvolution::Shedinja,
  183. PBEvolution::LevelDay,PBEvolution::LevelNight,
  184. PBEvolution::LevelDarkInParty,PBEvolution::LevelRain].include?(evonib)
  185. ret=(ret==-1) ? level : [ret,level].min
  186. break
  187. end
  188. i+=5
  189. end
  190. end
  191. }
  192. return (ret==-1) ? 1 : ret
  193. end
  194.  
  195. def pbEvoDebug # Unused
  196. _EVOTYPEMASK=0x7F
  197. _EVODATAMASK=0x80
  198. pbRgssOpen("Data/evolutions.dat","rb"){|f|
  199. for species in 1..PBSpecies.maxValueF
  200. f.pos=(species-1)*8
  201. offset=f.fgetdw
  202. length=f.fgetdw
  203. puts PBSpecies.getName(species)
  204. if length>0
  205. f.pos=offset
  206. i=0; loop do break unless i<length
  207. evo=f.fgetb
  208. evonib=evo&_EVOTYPEMASK
  209. level=f.fgetw
  210. poke=f.fgetw
  211. puts sprintf("type=%02X, data=%02X, name=%s, level=%d",
  212. evonib,evo&_EVODATAMASK,PBSpecies.getName(poke),level)
  213. if poke==0
  214. p f.eof?
  215. break
  216. end
  217. i+=5
  218. end
  219. end
  220. end
  221. }
  222. end
  223.  
  224.  
  225.  
  226. #===============================================================================
  227. # Evolution animation
  228. #===============================================================================
  229. class SpriteMetafile
  230. VIEWPORT = 0
  231. TONE = 1
  232. SRC_RECT = 2
  233. VISIBLE = 3
  234. X = 4
  235. Y = 5
  236. Z = 6
  237. OX = 7
  238. OY = 8
  239. ZOOM_X = 9
  240. ZOOM_Y = 10
  241. ANGLE = 11
  242. MIRROR = 12
  243. BUSH_DEPTH = 13
  244. OPACITY = 14
  245. BLEND_TYPE = 15
  246. COLOR = 16
  247. FLASHCOLOR = 17
  248. FLASHDURATION = 18
  249. BITMAP = 19
  250.  
  251. def length
  252. return @metafile.length
  253. end
  254.  
  255. def [](i)
  256. return @metafile[i]
  257. end
  258.  
  259. def initialize(viewport=nil)
  260. @metafile=[]
  261. @values=[
  262. viewport,
  263. Tone.new(0,0,0,0),Rect.new(0,0,0,0),
  264. true,
  265. 0,0,0,0,0,100,100,
  266. 0,false,0,255,0,
  267. Color.new(0,0,0,0),Color.new(0,0,0,0),
  268. 0
  269. ]
  270. end
  271.  
  272. def disposed?
  273. return false
  274. end
  275.  
  276. def dispose
  277. end
  278.  
  279. def flash(color,duration)
  280. if duration>0
  281. @values[FLASHCOLOR]=color.clone
  282. @values[FLASHDURATION]=duration
  283. @metafile.push([FLASHCOLOR,color])
  284. @metafile.push([FLASHDURATION,duration])
  285. end
  286. end
  287.  
  288. def x
  289. return @values[X]
  290. end
  291.  
  292. def x=(value)
  293. @values[X]=value
  294. @metafile.push([X,value])
  295. end
  296.  
  297. def y
  298. return @values[Y]
  299. end
  300.  
  301. def y=(value)
  302. @values[Y]=value
  303. @metafile.push([Y,value])
  304. end
  305.  
  306. def bitmap
  307. return nil
  308. end
  309.  
  310. def bitmap=(value)
  311. if value && !value.disposed?
  312. @values[SRC_RECT].set(0,0,value.width,value.height)
  313. @metafile.push([SRC_RECT,@values[SRC_RECT].clone])
  314. end
  315. end
  316.  
  317. def src_rect
  318. return @values[SRC_RECT]
  319. end
  320.  
  321. def src_rect=(value)
  322. @values[SRC_RECT]=value
  323. @metafile.push([SRC_RECT,value])
  324. end
  325.  
  326. def visible
  327. return @values[VISIBLE]
  328. end
  329.  
  330. def visible=(value)
  331. @values[VISIBLE]=value
  332. @metafile.push([VISIBLE,value])
  333. end
  334.  
  335. def z
  336. return @values[Z]
  337. end
  338.  
  339. def z=(value)
  340. @values[Z]=value
  341. @metafile.push([Z,value])
  342. end
  343.  
  344. def ox
  345. return @values[OX]
  346. end
  347.  
  348. def ox=(value)
  349. @values[OX]=value
  350. @metafile.push([OX,value])
  351. end
  352.  
  353. def oy
  354. return @values[OY]
  355. end
  356.  
  357. def oy=(value)
  358. @values[OY]=value
  359. @metafile.push([OY,value])
  360. end
  361.  
  362. def zoom_x
  363. return @values[ZOOM_X]
  364. end
  365.  
  366. def zoom_x=(value)
  367. @values[ZOOM_X]=value
  368. @metafile.push([ZOOM_X,value])
  369. end
  370.  
  371. def zoom_y
  372. return @values[ZOOM_Y]
  373. end
  374.  
  375. def zoom_y=(value)
  376. @values[ZOOM_Y]=value
  377. @metafile.push([ZOOM_Y,value])
  378. end
  379.  
  380. def zoom=(value)
  381. @values[ZOOM_X]=value
  382. @metafile.push([ZOOM_X,value])
  383. @values[ZOOM_Y]=value
  384. @metafile.push([ZOOM_Y,value])
  385. end
  386.  
  387. def angle
  388. return @values[ANGLE]
  389. end
  390.  
  391. def angle=(value)
  392. @values[ANGLE]=value
  393. @metafile.push([ANGLE,value])
  394. end
  395.  
  396. def mirror
  397. return @values[MIRROR]
  398. end
  399.  
  400. def mirror=(value)
  401. @values[MIRROR]=value
  402. @metafile.push([MIRROR,value])
  403. end
  404.  
  405. def bush_depth
  406. return @values[BUSH_DEPTH]
  407. end
  408.  
  409. def bush_depth=(value)
  410. @values[BUSH_DEPTH]=value
  411. @metafile.push([BUSH_DEPTH,value])
  412. end
  413.  
  414. def opacity
  415. return @values[OPACITY]
  416. end
  417.  
  418. def opacity=(value)
  419. @values[OPACITY]=value
  420. @metafile.push([OPACITY,value])
  421. end
  422.  
  423. def blend_type
  424. return @values[BLEND_TYPE]
  425. end
  426.  
  427. def blend_type=(value)
  428. @values[BLEND_TYPE]=value
  429. @metafile.push([BLEND_TYPE,value])
  430. end
  431.  
  432. def color
  433. return @values[COLOR]
  434. end
  435.  
  436. def color=(value)
  437. @values[COLOR]=value.clone
  438. @metafile.push([COLOR,@values[COLOR]])
  439. end
  440.  
  441. def tone
  442. return @values[TONE]
  443. end
  444.  
  445. def tone=(value)
  446. @values[TONE]=value.clone
  447. @metafile.push([TONE,@values[TONE]])
  448. end
  449.  
  450. def update
  451. @metafile.push([-1,nil])
  452. end
  453. end
  454.  
  455.  
  456.  
  457. class SpriteMetafilePlayer
  458. def initialize(metafile,sprite=nil)
  459. @metafile=metafile
  460. @sprites=[]
  461. @playing=false
  462. @index=0
  463. @sprites.push(sprite) if sprite
  464. end
  465.  
  466. def add(sprite)
  467. @sprites.push(sprite)
  468. end
  469.  
  470. def playing?
  471. return @playing
  472. end
  473.  
  474. def play
  475. @playing=true
  476. @index=0
  477. end
  478.  
  479. def update
  480. if @playing
  481. for j in @index...@metafile.length
  482. @index=j+1
  483. break if @metafile[j][0]<0
  484. code=@metafile[j][0]
  485. value=@metafile[j][1]
  486. for sprite in @sprites
  487. case code
  488. when SpriteMetafile::X; sprite.x=value
  489. when SpriteMetafile::Y; sprite.y=value
  490. when SpriteMetafile::OX; sprite.ox=value
  491. when SpriteMetafile::OY; sprite.oy=value
  492. when SpriteMetafile::ZOOM_X; sprite.zoom_x=value
  493. when SpriteMetafile::ZOOM_Y; sprite.zoom_y=value
  494. when SpriteMetafile::SRC_RECT; sprite.src_rect=value
  495. when SpriteMetafile::VISIBLE; sprite.visible=value
  496. when SpriteMetafile::Z; sprite.z=value # prevent crashes
  497. when SpriteMetafile::ANGLE; sprite.angle=(value==180) ? 179.9 : value
  498. when SpriteMetafile::MIRROR; sprite.mirror=value
  499. when SpriteMetafile::BUSH_DEPTH; sprite.bush_depth=value
  500. when SpriteMetafile::OPACITY; sprite.opacity=value
  501. when SpriteMetafile::BLEND_TYPE; sprite.blend_type=value
  502. when SpriteMetafile::COLOR; sprite.color=value
  503. when SpriteMetafile::TONE; sprite.tone=value
  504. end
  505. end
  506. end
  507. @playing=false if @index==@metafile.length
  508. end
  509. end
  510. end
  511.  
  512.  
  513.  
  514. def pbSaveSpriteState(sprite)
  515. state=[]
  516. return state if !sprite || sprite.disposed?
  517. state[SpriteMetafile::BITMAP] = sprite.x
  518. state[SpriteMetafile::X] = sprite.x
  519. state[SpriteMetafile::Y] = sprite.y
  520. state[SpriteMetafile::SRC_RECT] = sprite.src_rect.clone
  521. state[SpriteMetafile::VISIBLE] = sprite.visible
  522. state[SpriteMetafile::Z] = sprite.z
  523. state[SpriteMetafile::OX] = sprite.ox
  524. state[SpriteMetafile::OY] = sprite.oy
  525. state[SpriteMetafile::ZOOM_X] = sprite.zoom_x
  526. state[SpriteMetafile::ZOOM_Y] = sprite.zoom_y
  527. state[SpriteMetafile::ANGLE] = sprite.angle
  528. state[SpriteMetafile::MIRROR] = sprite.mirror
  529. state[SpriteMetafile::BUSH_DEPTH] = sprite.bush_depth
  530. state[SpriteMetafile::OPACITY] = sprite.opacity
  531. state[SpriteMetafile::BLEND_TYPE] = sprite.blend_type
  532. state[SpriteMetafile::COLOR] = sprite.color.clone
  533. state[SpriteMetafile::TONE] = sprite.tone.clone
  534. return state
  535. end
  536.  
  537. def pbRestoreSpriteState(sprite,state)
  538. return if !state || !sprite || sprite.disposed?
  539. sprite.x = state[SpriteMetafile::X]
  540. sprite.y = state[SpriteMetafile::Y]
  541. sprite.src_rect = state[SpriteMetafile::SRC_RECT]
  542. sprite.visible = state[SpriteMetafile::VISIBLE]
  543. sprite.z = state[SpriteMetafile::Z]
  544. sprite.ox = state[SpriteMetafile::OX]
  545. sprite.oy = state[SpriteMetafile::OY]
  546. sprite.zoom_x = state[SpriteMetafile::ZOOM_X]
  547. sprite.zoom_y = state[SpriteMetafile::ZOOM_Y]
  548. sprite.angle = state[SpriteMetafile::ANGLE]
  549. sprite.mirror = state[SpriteMetafile::MIRROR]
  550. sprite.bush_depth = state[SpriteMetafile::BUSH_DEPTH]
  551. sprite.opacity = state[SpriteMetafile::OPACITY]
  552. sprite.blend_type = state[SpriteMetafile::BLEND_TYPE]
  553. sprite.color = state[SpriteMetafile::COLOR]
  554. sprite.tone = state[SpriteMetafile::TONE]
  555. end
  556.  
  557. def pbSaveSpriteStateAndBitmap(sprite)
  558. return [] if !sprite || sprite.disposed?
  559. state=pbSaveSpriteState(sprite)
  560. state[SpriteMetafile::BITMAP]=sprite.bitmap
  561. return state
  562. end
  563.  
  564. def pbRestoreSpriteStateAndBitmap(sprite,state)
  565. return if !state || !sprite || sprite.disposed?
  566. sprite.bitmap=state[SpriteMetafile::BITMAP]
  567. pbRestoreSpriteState(sprite,state)
  568. return state
  569. end
  570.  
  571.  
  572.  
  573. class PokemonEvolutionScene
  574. private
  575.  
  576. def pbGenerateMetafiles(s1x,s1y,s2x,s2y)
  577. sprite=SpriteMetafile.new
  578. sprite2=SpriteMetafile.new
  579. sprite.opacity=255
  580. sprite2.opacity=255
  581. sprite2.zoom=0.0
  582. sprite.ox=s1x
  583. sprite.oy=s1y
  584. sprite2.ox=s2x
  585. sprite2.oy=s2y
  586. alpha=0
  587. for j in 0...26
  588. if sprite.pbHasType?(:GRASS)
  589. sprite.color.red=92
  590. sprite.color.green=255
  591. sprite.color.blue=45
  592. sprite.color.alpha=255
  593. sprite.color=sprite.color
  594. alpha+=5
  595. elsif sprite.pbHasType?(:DARK)
  596. sprite.color.red=29
  597. sprite.color.green=10
  598. sprite.color.blue=47
  599. sprite.color.alpha=255
  600. sprite.color=sprite.color
  601. alpha+=5
  602. elsif sprite.pbHasType?(:ELECTRIC)
  603. sprite.color.red=255
  604. sprite.color.green=128
  605. sprite.color.blue=0
  606. sprite.color.alpha=255
  607. sprite.color=sprite.color
  608. alpha+=5
  609. else#
  610. sprite.color.red=255
  611. sprite.color.green=255
  612. sprite.color.blue=255
  613. sprite.color.alpha=alpha
  614. sprite.color=sprite.color
  615. sprite.update
  616. alpha+=5
  617. end#
  618. end
  619. totaltempo=0
  620. currenttempo=25
  621. maxtempo=7*Graphics.frame_rate
  622. while totaltempo<maxtempo
  623. for j in 0...currenttempo
  624. if alpha<255
  625. if sprite2.pbHasType?(:GRASS)
  626. sprite2.color.red=92
  627. sprite2.color.green=255
  628. sprite2.color.blue=45
  629. sprite2.color.alpha=255
  630. sprite2.color=sprite.color
  631. alpha+=10
  632. elsif sprite2.pbHasType?(:DARK)
  633. sprite2.color.red=29
  634. sprite2.color.green=10
  635. sprite2.color.blue=47
  636. sprite2.color.alpha=255
  637. sprite2.color=sprite.color
  638. alpha+=10
  639. elsif sprite2.pbHasType?(:ELECTRIC)
  640. sprite2.color.red=255
  641. sprite2.color.green=128
  642. sprite2.color.blue=0
  643. sprite2.color.alpha=255
  644. sprite2.color=sprite.color
  645. alpha+=10
  646. else#
  647. sprite2.color.red=255
  648. sprite2.color.green=255
  649. sprite2.color.blue=255
  650. sprite2.color.alpha=255
  651. sprite2.update
  652. alpha+=10
  653. end#
  654.  
  655. end
  656. sprite.zoom=[1.1*(currenttempo-j-1)/currenttempo,1.0].min
  657. sprite2.zoom=[1.1*(j+1)/currenttempo,1.0].min
  658. sprite.update
  659. sprite2.update
  660. end
  661. totaltempo+=currenttempo
  662. if totaltempo+currenttempo<maxtempo
  663. for j in 0...currenttempo
  664. sprite.zoom=[1.1*(j+1)/currenttempo,1.0].min
  665. sprite2.zoom=[1.1*(currenttempo-j-1)/currenttempo,1.0].min
  666. sprite.update
  667. sprite2.update
  668. end
  669. end
  670. totaltempo+=currenttempo
  671. currenttempo=[(currenttempo/1.5).floor,5].max
  672. end
  673. @metafile1=sprite
  674. @metafile2=sprite2
  675. end
  676.  
  677. public
  678.  
  679. def pbUpdate(animating=false)
  680. if animating # Pokémon shouldn't animate during the evolution animation
  681. @sprites["background"].update
  682. else
  683. pbUpdateSpriteHash(@sprites)
  684. end
  685. end
  686.  
  687. def pbUpdateNarrowScreen
  688. if @bgviewport.rect.y<20*4
  689. @bgviewport.rect.height-=2*4
  690. if @bgviewport.rect.height<Graphics.height-64
  691. @bgviewport.rect.y+=4
  692. @sprites["background"].oy=@bgviewport.rect.y
  693. end
  694. end
  695. end
  696.  
  697. def pbUpdateExpandScreen
  698. if @bgviewport.rect.y>0
  699. @bgviewport.rect.y-=4
  700. @sprites["background"].oy=@bgviewport.rect.y
  701. end
  702. if @bgviewport.rect.height<Graphics.height
  703. @bgviewport.rect.height+=2*4
  704. end
  705. end
  706.  
  707. def pbFlashInOut(canceled,oldstate,oldstate2)
  708. tone=0
  709. loop do
  710. Graphics.update
  711. pbUpdate(true)
  712. pbUpdateExpandScreen
  713. tone+=10
  714. @viewport.tone.set(tone,tone,tone,0)
  715. break if tone>=255
  716. end
  717. @bgviewport.rect.y=0
  718. @bgviewport.rect.height=Graphics.height
  719. @sprites["background"].oy=0
  720. if canceled
  721. pbRestoreSpriteState(@sprites["rsprite1"],oldstate)
  722. pbRestoreSpriteState(@sprites["rsprite2"],oldstate2)
  723. @sprites["rsprite1"].visible=true
  724. @sprites["rsprite1"].zoom_x=1.0
  725. @sprites["rsprite1"].zoom_y=1.0
  726. @sprites["rsprite1"].color.alpha=0
  727. @sprites["rsprite2"].visible=false
  728. else
  729. @sprites["rsprite1"].visible=false
  730. @sprites["rsprite2"].visible=true
  731. @sprites["rsprite2"].zoom_x=1.0
  732. @sprites["rsprite2"].zoom_y=1.0
  733. @sprites["rsprite2"].color.alpha=0
  734. end
  735. 10.times do
  736. Graphics.update
  737. pbUpdate(true)
  738. end
  739. tone=255
  740. loop do
  741. Graphics.update
  742. pbUpdate
  743. tone=[tone-20,0].max
  744. @viewport.tone.set(tone,tone,tone,0)
  745. break if tone<=0
  746. end
  747. end
  748.  
  749. def pbStartScreen(pokemon,newspecies)
  750. @pokemon = pokemon
  751. @newspecies = newspecies
  752. @sprites = {}
  753. @bgviewport = Viewport.new(0,0,Graphics.width,Graphics.height)
  754. @bgviewport.z = 99999
  755. @viewport = Viewport.new(0,0,Graphics.width,Graphics.height)
  756. @viewport.z = 99999
  757. @msgviewport = Viewport.new(0,0,Graphics.width,Graphics.height)
  758. @msgviewport.z = 99999
  759. addBackgroundOrColoredPlane(@sprites,"background","evolutionbg",
  760. Color.new(248,248,248),@bgviewport)
  761. rsprite1 = PokemonSprite.new(@viewport)
  762. rsprite1.setOffset(PictureOrigin::Center)
  763. rsprite1.setPokemonBitmap(@pokemon,false)
  764. rsprite1.x = Graphics.width/2
  765. rsprite1.y = (Graphics.height-64)/2
  766. rsprite2 = PokemonSprite.new(@viewport)
  767. rsprite2.setOffset(PictureOrigin::Center)
  768. rsprite2.setPokemonBitmapSpecies(@pokemon,@newspecies,false)
  769. rsprite2.x = rsprite1.x
  770. rsprite2.y = rsprite1.y
  771. rsprite2.opacity = 0
  772. @sprites["rsprite1"] = rsprite1
  773. @sprites["rsprite2"] = rsprite2
  774. pbGenerateMetafiles(rsprite1.ox,rsprite1.oy,rsprite2.ox,rsprite2.oy)
  775. @sprites["msgwindow"] = Kernel.pbCreateMessageWindow(@msgviewport)
  776. pbFadeInAndShow(@sprites) { pbUpdate }
  777. end
  778.  
  779. # Closes the evolution screen.
  780. def pbEndScreen
  781. Kernel.pbDisposeMessageWindow(@sprites["msgwindow"])
  782. pbFadeOutAndHide(@sprites) { pbUpdate }
  783. pbDisposeSpriteHash(@sprites)
  784. @viewport.dispose
  785. @bgviewport.dispose
  786. @msgviewport.dispose
  787. end
  788.  
  789. # Opens the evolution screen
  790. def pbEvolution(cancancel=true)
  791. metaplayer1 = SpriteMetafilePlayer.new(@metafile1,@sprites["rsprite1"])
  792. metaplayer2 = SpriteMetafilePlayer.new(@metafile2,@sprites["rsprite2"])
  793. metaplayer1.play
  794. metaplayer2.play
  795. pbBGMStop
  796. pbPlayCry(@pokemon)
  797. Kernel.pbMessageDisplay(@sprites["msgwindow"],
  798. _INTL("\\se[]What?\r\n{1} is evolving!\\^",@pokemon.name)) { pbUpdate }
  799. Kernel.pbMessageWaitForInput(@sprites["msgwindow"],100,true) { pbUpdate }
  800. pbPlayDecisionSE
  801. oldstate = pbSaveSpriteState(@sprites["rsprite1"])
  802. oldstate2 = pbSaveSpriteState(@sprites["rsprite2"])
  803. pbMEPlay("Evolution start")
  804. pbBGMPlay("Evolution")
  805. canceled = false
  806. begin
  807. pbUpdateNarrowScreen
  808. metaplayer1.update
  809. metaplayer2.update
  810. Graphics.update
  811. Input.update
  812. pbUpdate(true)
  813. if Input.trigger?(Input::B) && cancancel
  814. pbBGMStop
  815. pbPlayCancelSE
  816. canceled = true
  817. break
  818. end
  819. end while metaplayer1.playing? && metaplayer2.playing?
  820. pbFlashInOut(canceled,oldstate,oldstate2)
  821. if canceled
  822. Kernel.pbMessageDisplay(@sprites["msgwindow"],
  823. _INTL("Huh?\r\n{1} stopped evolving!",@pokemon.name)) { pbUpdate }
  824. else
  825. pbEvolutionSuccess
  826. end
  827. end
  828.  
  829. def pbEvolutionSuccess
  830. # Play cry of evolved species
  831. frames = pbCryFrameLength(@newspecies,@pokemon.form)
  832. pbBGMStop
  833. pbPlayCrySpecies(@newspecies,@pokemon.form)
  834. frames.times do
  835. Graphics.update
  836. pbUpdate
  837. end
  838. # Success jingle/message
  839. pbMEPlay("Evolution success")
  840. newspeciesname = PBSpecies.getName(@newspecies)
  841. oldspeciesname = PBSpecies.getName(@pokemon.species)
  842. Kernel.pbMessageDisplay(@sprites["msgwindow"],
  843. _INTL("\\se[]Congratulations! Your {1} evolved into {2}!\\wt[80]",
  844. @pokemon.name,newspeciesname)) { pbUpdate }
  845. @sprites["msgwindow"].text = ""
  846. # Check for consumed item and Pokémon duplication (i.e. Shedinja)
  847. removeItem = false
  848. createSpecies = pbCheckEvolutionEx(@pokemon){|pokemon,evonib,level,poke|
  849. case evonib
  850. when PBEvolution::Shedinja
  851. next poke if $PokemonBag.pbHasItem?(getConst(PBItems,:POKEBALL))
  852. when PBEvolution::TradeItem,PBEvolution::DayHoldItem,PBEvolution::NightHoldItem
  853. removeItem = true if poke==@newspecies # Item is now consumed
  854. end
  855. next -1
  856. }
  857. @pokemon.setItem(0) if removeItem
  858. # Modify Pokémon to make it evolved
  859. @pokemon.species = @newspecies
  860. @pokemon.name = newspeciesname if @pokemon.name==oldspeciesname
  861. @pokemon.form = 0 if isConst?(@pokemon.species,PBSpecies,:MOTHIM)
  862. @pokemon.calcStats
  863. # See and own evolved species
  864. $Trainer.seen[@newspecies] = true
  865. $Trainer.owned[@newspecies] = true
  866. pbSeenForm(@pokemon)
  867. # Learn moves upon evolution for evolved species
  868. movelist = @pokemon.getMoveList
  869. for i in movelist
  870. if i[0]==0 || i[0]==@pokemon.level # Learned a new move
  871. pbLearnMove(@pokemon,i[1],true) { pbUpdate }
  872. end
  873. end
  874. # Duplicate Pokémon (i.e. Shedinja)
  875. if createSpecies>0 && $Trainer.party.length<6
  876. newpokemon = @pokemon.clone
  877. newpokemon.species = createSpecies
  878. newpokemon.name = PBSpecies.getName(createSpecies)
  879. newpokemon.iv = @pokemon.iv.clone
  880. newpokemon.ev = @pokemon.ev.clone
  881. newpokemon.markings = 0
  882. newpokemon.ballused = 0
  883. newpokemon.setItem(0)
  884. newpokemon.clearAllRibbons
  885. newpokemon.calcStats
  886. newpokemon.heal
  887. # Add duplicate Pokémon to party
  888. $Trainer.party.push(newpokemon)
  889. # See and own duplicate Pokémon
  890. $Trainer.seen[createSpecies] = true
  891. $Trainer.owned[createSpecies] = true
  892. pbSeenForm(newpokemon)
  893. # Consume Poké Ball
  894. $PokemonBag.pbDeleteItem(getConst(PBItems,:POKEBALL))
  895. end
  896. end
  897. end
  898.  
  899.  
  900.  
  901. #===============================================================================
  902. # Evolution methods
  903. #===============================================================================
  904. def pbMiniCheckEvolution(pokemon,evonib,level,poke)
  905. case evonib
  906. when PBEvolution::Happiness
  907. return poke if pokemon.happiness>=220
  908. when PBEvolution::HappinessDay
  909. return poke if pokemon.happiness>=220 && PBDayNight.isDay?
  910. when PBEvolution::HappinessNight
  911. return poke if pokemon.happiness>=220 && PBDayNight.isNight?
  912. when PBEvolution::HappinessMoveType
  913. if pokemon.happiness>=220
  914. for m in pokemon.moves
  915. return poke if m.id>0 && m.type==level
  916. end
  917. end
  918. when PBEvolution::Level
  919. return poke if pokemon.level>=level
  920. when PBEvolution::LevelDay
  921. return poke if pokemon.level>=level && PBDayNight.isDay?
  922. when PBEvolution::LevelNight
  923. return poke if pokemon.level>=level && PBDayNight.isNight?
  924. when PBEvolution::LevelMale
  925. return poke if pokemon.level>=level && pokemon.isMale?
  926. when PBEvolution::LevelFemale
  927. return poke if pokemon.level>=level && pokemon.isFemale?
  928. when PBEvolution::AttackGreater # Hitmonlee
  929. return poke if pokemon.level>=level && pokemon.attack>pokemon.defense
  930. when PBEvolution::AtkDefEqual # Hitmontop
  931. return poke if pokemon.level>=level && pokemon.attack==pokemon.defense
  932. when PBEvolution::DefenseGreater # Hitmonchan
  933. return poke if pokemon.level>=level && pokemon.attack<pokemon.defense
  934. when PBEvolution::Silcoon
  935. return poke if pokemon.level>=level && (((pokemon.personalID>>16)&0xFFFF)%10)<5
  936. when PBEvolution::Cascoon
  937. return poke if pokemon.level>=level && (((pokemon.personalID>>16)&0xFFFF)%10)>=5
  938. when PBEvolution::Ninjask
  939. return poke if pokemon.level>=level
  940. when PBEvolution::Shedinja
  941. return -1
  942. when PBEvolution::DayHoldItem
  943. return poke if pokemon.item==level && PBDayNight.isDay?
  944. when PBEvolution::NightHoldItem
  945. return poke if pokemon.item==level && PBDayNight.isNight?
  946. when PBEvolution::HasMove
  947. for m in pokemon.moves
  948. return poke if m.id==level
  949. end
  950. when PBEvolution::HasInParty
  951. for i in $Trainer.pokemonParty
  952. return poke if i.species==level
  953. end
  954. when PBEvolution::LevelDarkInParty
  955. if pokemon.level>=level
  956. for i in $Trainer.pokemonParty
  957. return poke if i.hasType?(:DARK)
  958. end
  959. end
  960. when PBEvolution::Location
  961. return poke if $game_map.map_id==level
  962. when PBEvolution::LevelRain
  963. if pokemon.level>=level
  964. if $game_screen && ($game_screen.weather==PBFieldWeather::Rain ||
  965. $game_screen.weather==PBFieldWeather::HeavyRain ||
  966. $game_screen.weather==PBFieldWeather::Storm)
  967. return poke
  968. end
  969. end
  970. when PBEvolution::Beauty # Feebas
  971. return poke if pokemon.beauty>=level
  972. when PBEvolution::Trade, PBEvolution::TradeItem, PBEvolution::TradeSpecies
  973. return -1
  974. when PBEvolution::Custom1
  975. # Add code for custom evolution type 1
  976. when PBEvolution::Custom2
  977. # Add code for custom evolution type 2
  978. when PBEvolution::Custom3
  979. # Add code for custom evolution type 3
  980. when PBEvolution::Custom4
  981. # Add code for custom evolution type 4
  982. when PBEvolution::Custom5
  983. # Add code for custom evolution type 5
  984. end
  985. return -1
  986. end
  987.  
  988. def pbMiniCheckEvolutionItem(pokemon,evonib,level,poke,item)
  989. # Checks for when an item is used on the Pokémon (e.g. an evolution stone)
  990. case evonib
  991. when PBEvolution::Item
  992. return poke if level==item
  993. when PBEvolution::ItemMale
  994. return poke if level==item && pokemon.isMale?
  995. when PBEvolution::ItemFemale
  996. return poke if level==item && pokemon.isFemale?
  997. end
  998. return -1
  999. end
  1000.  
  1001. # Checks whether a Pokemon can evolve now. If a block is given, calls the block
  1002. # with the following parameters:
  1003. # Pokemon to check; evolution type; level or other parameter; ID of the new Pokemon species
  1004. def pbCheckEvolutionEx(pokemon)
  1005. return -1 if pokemon.species<=0 || pokemon.egg?
  1006. return -1 if isConst?(pokemon.item,PBItems,:EVERSTONE)
  1007. return -1 if isConst?(pokemon.species,PBSpecies,:PICHU) && pokemon.form==1
  1008. ret=-1
  1009. for form in pbGetEvolvedFormData(pbGetFSpeciesFromForm(pokemon.species,pokemon.form))
  1010. ret = yield pokemon,form[0],form[1],form[2]
  1011. break if ret>0
  1012. end
  1013. return ret
  1014. end
  1015.  
  1016. # Checks whether a Pokemon can evolve now. If an item is used on the Pokémon,
  1017. # checks whether the Pokemon can evolve with the given item.
  1018. def pbCheckEvolution(pokemon,item=0)
  1019. if item==0
  1020. return pbCheckEvolutionEx(pokemon){|pokemon,evonib,level,poke|
  1021. next pbMiniCheckEvolution(pokemon,evonib,level,poke)
  1022. }
  1023. else
  1024. return pbCheckEvolutionEx(pokemon){|pokemon,evonib,level,poke|
  1025. next pbMiniCheckEvolutionItem(pokemon,evonib,level,poke,item)
  1026. }
  1027. end
  1028. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement