module Graphics @@transition = nil STOP_WHILE_TRANSITION = true unless defined?(transition_KGC_SpecialTransition) class << Graphics alias transition_KGC_SpecialTransition transition end class << Graphics alias update_KGC_SpecialTransition update end end def self.transition(duration = 8, filename = "", vague = 20) duration = duration.floor if judge_special_transition(duration, filename) duration = 0 filename = "" end begin transition_KGC_SpecialTransition(duration, filename, vague) rescue Exception if filename != "" transition_KGC_SpecialTransition(duration, "", vague) end end if STOP_WHILE_TRANSITION && !@_interrupt_transition while @@transition && !@@transition.disposed? update end end end def self.update update_KGC_SpecialTransition =begin if Graphics.frame_count % 40 == 0 count = 0 ObjectSpace.each_object(Object) { |o| count += 1 } echo("Objects: #{count}\r\n") end =end @@transition.update if @@transition && !@@transition.disposed? @@transition = nil if @@transition && @@transition.disposed? end def self.judge_special_transition(duration,filename) return false if @_interrupt_transition ret = true if @@transition && !@@transition.disposed? @@transition.dispose @@transition = nil end dc = File.basename(filename).downcase case dc # Other coded transitions when "breakingglass" then @@transition = Transitions::BreakingGlass.new(duration) when "rotatingpieces" then @@transition = Transitions::ShrinkingPieces.new(duration, true) when "shrinkingpieces" then @@transition = Transitions::ShrinkingPieces.new(duration, false) when "splash" then @@transition = Transitions::SplashTransition.new(duration) when "random_stripe_v" then @@transition = Transitions::RandomStripeTransition.new(duration, 0) when "random_stripe_h" then @@transition = Transitions::RandomStripeTransition.new(duration, 1) when "zoomin" then @@transition = Transitions::ZoomInTransition.new(duration) when "scrolldown" then @@transition = Transitions::ScrollScreen.new(duration, 2) when "scrollleft" then @@transition = Transitions::ScrollScreen.new(duration, 4) when "scrollright" then @@transition = Transitions::ScrollScreen.new(duration, 6) when "scrollup" then @@transition = Transitions::ScrollScreen.new(duration, 8) when "scrolldownleft" then @@transition = Transitions::ScrollScreen.new(duration, 1) when "scrolldownright" then @@transition = Transitions::ScrollScreen.new(duration, 3) when "scrollupleft" then @@transition = Transitions::ScrollScreen.new(duration, 7) when "scrollupright" then @@transition = Transitions::ScrollScreen.new(duration, 9) when "mosaic" then @@transition = Transitions::MosaicTransition.new(duration) # HGSS transitions when "snakesquares" then @@transition = Transitions::SnakeSquares.new(duration) when "diagonalbubbletl" then @@transition = Transitions::DiagonalBubble.new(duration, 0) when "diagonalbubbletr" then @@transition = Transitions::DiagonalBubble.new(duration, 1) when "diagonalbubblebl" then @@transition = Transitions::DiagonalBubble.new(duration, 2) when "diagonalbubblebr" then @@transition = Transitions::DiagonalBubble.new(duration, 3) when "risingsplash" then @@transition = Transitions::RisingSplash.new(duration) when "twoballpass" then @@transition = Transitions::TwoBallPass.new(duration) when "spinballsplit" then @@transition = Transitions::SpinBallSplit.new(duration) when "threeballdown" then @@transition = Transitions::ThreeBallDown.new(duration) when "balldown" then @@transition = Transitions::BallDown.new(duration) when "wavythreeballup" then @@transition = Transitions::WavyThreeBallUp.new(duration) when "wavyspinball" then @@transition = Transitions::WavySpinBall.new(duration) when "fourballburst" then @@transition = Transitions::FourBallBurst.new(duration) # Graphic transitions when "fadetoblack" then @@transition = Transitions::FadeToBlack.new(duration) when "" then @@transition = Transitions::FadeFromBlack.new(duration) else ret = false end Graphics.frame_reset if ret return ret end end #=============================================================================== # Screen transition classes #=============================================================================== module Transitions #============================================================================= # #============================================================================= class BreakingGlass def initialize(numframes) @disposed = false @numframes = numframes @opacitychange = (numframes<=0) ? 255 : 255.0/numframes cx = 6 cy = 5 @bitmap = Graphics.snap_to_bitmap if !@bitmap @disposed = true return end width = @bitmap.width/cx height = @bitmap.height/cy @numtiles = cx*cy @viewport = Viewport.new(0,0,Graphics.width,Graphics.height) @viewport.z = 99999 @sprites = [] @offset = [] @y = [] for i in 0...@numtiles @sprites[i] = Sprite.new(@viewport) @sprites[i].bitmap = @bitmap @sprites[i].x = width*(i%cx) @sprites[i].y = height*(i/cx) @sprites[i].src_rect.set(@sprites[i].x,@sprites[i].y,width,height) @offset[i] = (rand(100)+1)*3.0/100.0 @y[i] = @sprites[i].y end end def disposed?; @disposed; end def dispose if !disposed? @bitmap.dispose for i in 0...@numtiles @sprites[i].visible = false @sprites[i].dispose end @sprites.clear @viewport.dispose if @viewport @disposed = true end end def update return if disposed? continue = false for i in 0...@numtiles @sprites[i].opacity -= @opacitychange @y[i] += @offset[i] @sprites[i].y = @y[i] continue = true if @sprites[i].opacity>0 end self.dispose if !continue end end #============================================================================= # #============================================================================= class ShrinkingPieces def initialize(numframes,rotation) @disposed = false @rotation = rotation @numframes = numframes @opacitychange = (numframes<=0) ? 255 : 255.0/numframes cx = 6 cy = 5 @bitmap = Graphics.snap_to_bitmap if !@bitmap @disposed = true return end width = @bitmap.width/cx height = @bitmap.height/cy @numtiles = cx*cy @viewport = Viewport.new(0,0,Graphics.width,Graphics.height) @viewport.z = 99999 @sprites = [] for i in 0...@numtiles @sprites[i] = Sprite.new(@viewport) @sprites[i].bitmap = @bitmap @sprites[i].ox = width/2 @sprites[i].oy = height/2 @sprites[i].x = width*(i%cx)+@sprites[i].ox @sprites[i].y = height*(i/cx)+@sprites[i].oy @sprites[i].src_rect.set(width*(i%cx),height*(i/cx),width,height) end end def disposed?; @disposed; end def dispose if !disposed? @bitmap.dispose for i in 0...@numtiles @sprites[i].visible = false @sprites[i].dispose end @sprites.clear @viewport.dispose if @viewport @disposed = true end end def update return if disposed? continue = false for i in 0...@numtiles @sprites[i].opacity -= @opacitychange if @rotation @sprites[i].angle += 40 @sprites[i].angle %= 360 end @sprites[i].zoom_x = @sprites[i].opacity/255.0 @sprites[i].zoom_y = @sprites[i].opacity/255.0 continue = true if @sprites[i].opacity>0 end self.dispose if !continue end end #============================================================================= # #============================================================================= class SplashTransition SPLASH_SIZE = 32 def initialize(numframes,vague=9.6) @duration = numframes @numframes = numframes @splash_dir = [] @disposed = false if @numframes<=0 @disposed = true return end @buffer = Graphics.snap_to_bitmap if !@buffer @disposed = true return end @viewport = Viewport.new(0,0,Graphics.width,Graphics.height) @viewport.z = 99999 @sprite = Sprite.new(@viewport) @sprite.bitmap = Bitmap.new(Graphics.width, Graphics.height) size = SPLASH_SIZE size = [size,1].max cells = Graphics.width*Graphics.height/(size**2) rows = Graphics.width/size rect = Rect.new(0,0,size,size) mag = 40.0/@numframes cells.times { |i| rect.x = i%rows*size rect.y = i/rows*size x = rect.x/size-(rows>>1) y = rect.y/size-((cells/rows)>>1) r = Math.sqrt(x**2+y**2)/vague @splash_dir[i] = [] if r!=0 @splash_dir[i][0] = x/r @splash_dir[i][1] = y/r else @splash_dir[i][0] = (x!= 0) ? x*1.5 : pmrand*vague @splash_dir[i][1] = (y!= 0) ? y*1.5 : pmrand*vague end @splash_dir[i][0] += (rand-0.5)*vague @splash_dir[i][1] += (rand-0.5)*vague @splash_dir[i][0] *= mag @splash_dir[i][1] *= mag } @sprite.bitmap.blt(0,0,@buffer,@buffer.rect) end def disposed?; @disposed; end def dispose return if disposed? @buffer.dispose if @buffer @buffer = nil @sprite.visible = false @sprite.bitmap.dispose @sprite.dispose @viewport.dispose if @viewport @disposed = true end def update return if disposed? if @duration==0 dispose else size = SPLASH_SIZE cells = Graphics.width*Graphics.height/(size**2) rows = Graphics.width/size rect = Rect.new(0,0,size,size) buffer = @buffer sprite = @sprite phase = @numframes-@duration sprite.bitmap.clear cells.times { |i| rect.x = (i%rows)*size rect.y = (i/rows)*size dx = rect.x+@splash_dir[i][0]*phase dy = rect.y+@splash_dir[i][1]*phase sprite.bitmap.blt(dx,dy,buffer,rect) } sprite.opacity = 384*@duration/@numframes @duration -= 1 end end private def pmrand return (rand(2)==0) ? 1 : -1 end end #============================================================================= # #============================================================================= class RandomStripeTransition RAND_STRIPE_SIZE = 2 def initialize(numframes,direction) @duration = numframes @numframes = numframes @disposed = false if @numframes<=0 @disposed = true return end @buffer = Graphics.snap_to_bitmap if !@buffer @disposed = true return end @viewport = Viewport.new(0,0,Graphics.width,Graphics.height) @viewport.z = 99999 @sprite = Sprite.new(@viewport) @sprite.bitmap = Bitmap.new(Graphics.width,Graphics.height) ########## @direction = direction size = RAND_STRIPE_SIZE bands = ((@direction==0) ? Graphics.width : Graphics.height)/size @rand_stripe_deleted = [] @rand_stripe_deleted_count = 0 ary = (0...bands).to_a @rand_stripe_index_array = ary.sort_by { rand } ########## @sprite.bitmap.blt(0,0,@buffer,@buffer.rect) end def disposed?; @disposed; end def dispose return if disposed? @buffer.dispose if @buffer @buffer = nil @sprite.visible = false @sprite.bitmap.dispose @sprite.dispose @viewport.dispose if @viewport @disposed = true end def update return if disposed? if @duration==0 dispose else dir = @direction size = RAND_STRIPE_SIZE bands = ((dir==0) ? Graphics.width : Graphics.height)/size rect = Rect.new(0,0,(dir==0) ? size : Graphics.width,(dir==0) ? Graphics.height : size) buffer = @buffer sprite = @sprite count = (bands-bands*@duration/@numframes)-@rand_stripe_deleted_count while count > 0 @rand_stripe_deleted[@rand_stripe_index_array.pop] = true @rand_stripe_deleted_count += 1 count -= 1 end sprite.bitmap.clear bands.to_i.times { |i| unless @rand_stripe_deleted[i] if dir==0 rect.x = i*size sprite.bitmap.blt(rect.x,0,buffer,rect) else rect.y = i*size sprite.bitmap.blt(0,rect.y,buffer,rect) end end } @duration -= 1 end end end #============================================================================= # #============================================================================= class ZoomInTransition def initialize(numframes) @duration = numframes @numframes = numframes @disposed = false if @numframes<=0 @disposed = true return end @buffer = Graphics.snap_to_bitmap if !@buffer @disposed = true return end @width = @buffer.width @height = @buffer.height @viewport = Viewport.new(0,0,@width,@height) @viewport.z = 99999 @sprite = Sprite.new(@viewport) @sprite.bitmap = @buffer @sprite.ox = @width/2 @sprite.oy = @height/2 @sprite.x = @width/2 @sprite.y = @height/2 end def disposed?; @disposed; end def dispose return if disposed? @buffer.dispose if @buffer @buffer = nil @sprite.dispose if @sprite @viewport.dispose if @viewport @disposed = true end def update return if disposed? if @duration==0 dispose else @sprite.zoom_x += 0.2 @sprite.zoom_y += 0.2 @sprite.opacity = (@duration-1)*255/@numframes @duration -= 1 end end end #============================================================================= # #============================================================================= class ScrollScreen def initialize(numframes,direction) @numframes = numframes @duration = numframes @dir = direction @disposed = false if @numframes<=0 @disposed = true return end @buffer = Graphics.snap_to_bitmap if !@buffer @disposed = true return end @width = @buffer.width @height = @buffer.height @viewport = Viewport.new(0,0,@width,@height) @viewport.z = 99999 @sprite = Sprite.new(@viewport) @sprite.bitmap = @buffer end def disposed?; @disposed; end def dispose return if disposed? @buffer.dispose if @buffer @buffer = nil @sprite.dispose if @sprite @viewport.dispose if @viewport @disposed = true end def update return if disposed? if @duration==0 dispose else case @dir when 1 # down left @sprite.y += (@height/@numframes) @sprite.x -= (@width/@numframes) when 2 # down @sprite.y += (@height/@numframes) when 3 # down right @sprite.y += (@height/@numframes) @sprite.x += (@width/@numframes) when 4 # left @sprite.x -= (@width/@numframes) when 6 # right @sprite.x += (@width/@numframes) when 7 # up left @sprite.y -= (@height/@numframes) @sprite.x -= (@width/@numframes) when 8 # up @sprite.y -= (@height/@numframes) when 9 # up right @sprite.y -= (@height/@numframes) @sprite.x += (@width/@numframes) end @duration -= 1 end end end #============================================================================= # #============================================================================= class MosaicTransition def initialize(numframes) @duration = numframes @numframes = numframes @disposed = false if @numframes<=0 @disposed = true return end @buffer = Graphics.snap_to_bitmap if !@buffer @disposed = true return end @viewport = Viewport.new(0,0,Graphics.width,Graphics.height) @viewport.z = 99999 @sprite = Sprite.new(@viewport) @sprite.bitmap = @buffer @bitmapclone = @buffer.clone @bitmapclone2 = @buffer.clone end def disposed?; @disposed; end def dispose return if disposed? @buffer.dispose if @buffer @buffer = nil @sprite.dispose if @sprite @viewport.dispose if @viewport @disposed = true end def update return if disposed? if @duration==0 dispose else @bitmapclone2.stretch_blt( Rect.new(0,0,@buffer.width*@duration/@numframes,@buffer.height*@duration/@numframes), @bitmapclone, Rect.new(0,0,@buffer.width,@buffer.height)) @buffer.stretch_blt( Rect.new(0,0,@buffer.width,@buffer.height), @bitmapclone2, Rect.new(0,0,@buffer.width*@duration/@numframes,@buffer.height*@duration/@numframes)) @duration -= 1 end end end #============================================================================= # #============================================================================= class FadeToBlack def initialize(numframes) @duration = numframes @numframes = numframes @disposed = false if @duration<=0 @disposed = true return end @viewport = Viewport.new(0,0,Graphics.width,Graphics.height) @viewport.z = 99999 @sprite = BitmapSprite.new(Graphics.width,Graphics.height,@viewport) @sprite.bitmap.fill_rect(0,0,Graphics.width,Graphics.height,Color.new(0,0,0)) @sprite.opacity = 0 end def disposed?; @disposed; end def dispose return if disposed? @sprite.dispose if @sprite @viewport.dispose if @viewport @disposed = true end def update return if disposed? if @duration==0 dispose else @sprite.opacity = (@numframes - @duration + 1) * 255 / @numframes @duration -= 1 end end end #============================================================================= # #============================================================================= class FadeFromBlack def initialize(numframes) @duration = numframes @numframes = numframes @disposed = false if @duration<=0 @disposed = true return end @viewport = Viewport.new(0,0,Graphics.width,Graphics.height) @viewport.z = 99999 @sprite = BitmapSprite.new(Graphics.width,Graphics.height,@viewport) @sprite.bitmap.fill_rect(0,0,Graphics.width,Graphics.height,Color.new(0,0,0)) @sprite.opacity = 255 end def disposed?; @disposed; end def dispose return if disposed? @sprite.dispose if @sprite @viewport.dispose if @viewport @disposed = true end def update return if disposed? if @duration==0 dispose else @sprite.opacity = (@duration-1)*255/@numframes @duration -= 1 end end end #============================================================================= # HGSS wild outdoor #============================================================================= class SnakeSquares def initialize(numframes) @numframes = numframes @duration = numframes @disposed = false @bitmap = RPG::Cache.transition("black_square") if !@bitmap @disposed = true return end width = @bitmap.width height = @bitmap.height cx = Graphics.width/width # 8 cy = Graphics.height/height # 6 @numtiles = cx*cy @viewport = Viewport.new(0,0,Graphics.width,Graphics.height) @viewport.z = 99999 @sprites = [] @frame = [] @addzoom = 0.125*50/@numframes for i in 0...cy for j in 0...cx k = i*cx+j x = width*(j%cx) x = (cx-1)*width-x if (i<3 && i%2==1) || (i>=3 && i%2==0) @sprites[k] = Sprite.new(@viewport) @sprites[k].x = x+width/2 @sprites[k].y = height*i @sprites[k].ox = width/2 @sprites[k].visible = false @sprites[k].bitmap = @bitmap if k>=@numtiles/2 @frame[k] = 2*(@numtiles-k-1)*(@numframes-1/@addzoom)/50 else @frame[k] = 2*k*(@numframes-1/@addzoom)/50 end end end end def disposed?; @disposed; end def dispose if !disposed? @bitmap.dispose for i in 0...@numtiles if @sprites[i] @sprites[i].visible = false @sprites[i].dispose end end @sprites.clear @viewport.dispose if @viewport @disposed = true end end def update return if disposed? if @duration==0 dispose else count = @numframes-@duration for i in 0...@numtiles if @frame[i]=count @sprites[i].visible = true @sprites[i].zoom_x = @addzoom*(count-@frame[i]) @sprites[i].zoom_x = 1.0 if @sprites[i].zoom_x>1.0 end end end @duration -= 1 end end #============================================================================= # HGSS wild indoor day (origin=0) # HGSS wild indoor night (origin=3) # HGSS wild cave (origin=3) #============================================================================= class DiagonalBubble def initialize(numframes,origin=0) @numframes = numframes @duration = numframes @disposed = false @bitmap = RPG::Cache.transition("black_square") if !@bitmap @disposed = true return end width = @bitmap.width height = @bitmap.height cx = Graphics.width/width # 8 cy = Graphics.height/height # 6 @numtiles = cx*cy @viewport = Viewport.new(0,0,Graphics.width,Graphics.height) @viewport.z = 99999 @sprites = [] @frame = [] # 1.2, 0.6 and 0.8 determined by trigonometry of default screen size l = 1.2*Graphics.width/(@numtiles-8) for i in 0...cy for j in 0...cx k = i*cx+j @sprites[k] = Sprite.new(@viewport) @sprites[k].x = width*j+width/2 @sprites[k].y = height*i+height/2 @sprites[k].ox = width/2 @sprites[k].oy = height/2 @sprites[k].visible = false @sprites[k].bitmap = @bitmap case origin when 1 then k = i*cx+(cx-1-j) # Top right when 2 then k = @numtiles-1-(i*cx+(cx-1-j)) # Bottom left when 3 then k = @numtiles-1-k # Bottom right end @frame[k] = ((0.6*j*width+0.8*i*height)*(@numframes/50)/l).floor end end @addzoom = 0.125*50/@numframes end def disposed?; @disposed; end def dispose if !disposed? @bitmap.dispose for i in 0...@numtiles if @sprites[i] @sprites[i].visible = false @sprites[i].dispose end end @sprites.clear @viewport.dispose if @viewport @disposed = true end end def update return if disposed? if @duration==0 dispose else count = @numframes-@duration for i in 0...@numtiles if @frame[i]=count @sprites[i].visible = true @sprites[i].zoom_x = @addzoom*(count-@frame[i]) @sprites[i].zoom_x = 1.0 if @sprites[i].zoom_x>1.0 @sprites[i].zoom_y = @sprites[i].zoom_x end end end @duration -= 1 end end #============================================================================= # HGSS wild water #============================================================================= class RisingSplash def initialize(numframes) @numframes = numframes @duration = numframes @disposed = false if @numframes<=0 @disposed = true return end @bubblebitmap = RPG::Cache.transition("water_1") @splashbitmap = RPG::Cache.transition("water_2") @blackbitmap = RPG::Cache.transition("black_half") @buffer = Graphics.snap_to_bitmap if !@bubblebitmap || !@splashbitmap || !@blackbitmap || !@buffer @disposed = true return end @width = @buffer.width @height = @buffer.height @viewport = Viewport.new(0,0,@width,@height) @viewport.z = 99999 @rearsprite = Sprite.new(@viewport) @rearsprite.z = 1 @rearsprite.zoom_y = 2.0 @rearsprite.bitmap = @blackbitmap @bgsprites = [] rect = Rect.new(0,0,@width,2) for i in 0...@height/2 @bgsprites[i] = Sprite.new(@viewport) @bgsprites[i].y = i*2 @bgsprites[i].z = 2 @bgsprites[i].bitmap = @buffer rect.y = i*2 @bgsprites[i].src_rect = rect end @bubblesprite = Sprite.new(@viewport) @bubblesprite.y = @height @bubblesprite.z = 3 @bubblesprite.bitmap = @bubblebitmap @splashsprite = Sprite.new(@viewport) @splashsprite.y = @height @splashsprite.z = 4 @splashsprite.bitmap = @splashbitmap @blacksprite = Sprite.new(@viewport) @blacksprite.y = @height @blacksprite.z = 5 @blacksprite.zoom_y = 2.0 @blacksprite.bitmap = @blackbitmap @bubblesuby = @height*2/@numframes @splashsuby = @bubblesuby*2 @blacksuby = @height/(@numframes*0.1).floor @angmult = 2/(@numframes/50) end def disposed?; @disposed; end def dispose return if disposed? @buffer.dispose if @buffer @buffer = nil @bubblebitmap.dispose if @bubblebitmap @bubblebitmap = nil @splashbitmap.dispose if @splashbitmap @splashbitmap = nil @blackbitmap.dispose if @blackbitmap @blackbitmap = nil @rearsprite.dispose if @rearsprite for i in @bgsprites; i.dispose if i; end @bgsprites.clear @bubblesprite.dispose if @bubblesprite @splashsprite.dispose if @splashsprite @blacksprite.dispose if @blacksprite @viewport.dispose if @viewport @disposed = true end def update return if disposed? if @duration==0 dispose else angadd = (@numframes-@duration)*@angmult amp = 6*angadd/8; amp = 6 if amp>6 for i in 0...@bgsprites.length @bgsprites[i].x = amp*Math.sin((i+angadd)*Math::PI/10) end @bubblesprite.x = (@width-@bubblebitmap.width)/2 @bubblesprite.x -= 32*Math.sin((@numframes-@duration)/(@numframes/50)*3*Math::PI/60) @bubblesprite.y -= @bubblesuby if @duration<@numframes*0.5 @splashsprite.y -= @splashsuby end if @duration<@numframes*0.1 @blacksprite.y -= @blacksuby @blacksprite.y = 0 if @blacksprite.y<0 end end @duration -= 1 end end #============================================================================= # HGSS trainer outdoor day #============================================================================= class TwoBallPass def initialize(numframes) @numframes = numframes @duration = numframes @disposed = false if @numframes<=0 @disposed = true return end @blackbitmap = RPG::Cache.transition("black_half") @ballbitmap = RPG::Cache.transition("ball_small") @buffer = Graphics.snap_to_bitmap if !@blackbitmap || !@ballbitmap || !@buffer @disposed = true return end @width = @buffer.width @height = @buffer.height @viewport = Viewport.new(0,0,@width,@height) @viewport.z = 99999 @bgsprite = Sprite.new(@viewport) @bgsprite.x = @width/2 @bgsprite.y = @height/2 @bgsprite.ox = @width/2 @bgsprite.oy = @height/2 @bgsprite.bitmap = @buffer @blacksprites = [] @ballsprites = [] for i in 0...2 @blacksprites[i] = Sprite.new(@viewport) @blacksprites[i].x = (1-i*2)*@width @blacksprites[i].y = i*@height/2 @blacksprites[i].z = 1 @blacksprites[i].bitmap = @blackbitmap @ballsprites[i] = Sprite.new(@viewport) @ballsprites[i].x = (1-i)*@width + (1-i*2)*@ballbitmap.width/2 @ballsprites[i].y = @height/2 + (i*2-1)*@ballbitmap.height/2 @ballsprites[i].z = 2 @ballsprites[i].ox = @ballbitmap.width/2 @ballsprites[i].oy = @ballbitmap.height/2 @ballsprites[i].bitmap = @ballbitmap end @blacksprites[2] = Sprite.new(@viewport) @blacksprites[2].y = @height/2 @blacksprites[2].z = 1 @blacksprites[2].oy = @height/4 @blacksprites[2].zoom_y = 0.0 @blacksprites[2].bitmap = @blackbitmap @addxmult = 2.0*@width/((@numframes*0.6)**2) @addzoom = 0.02*50/@numframes end def disposed?; @disposed; end def dispose return if disposed? @buffer.dispose if @buffer @buffer = nil @blackbitmap.dispose if @blackbitmap @blackbitmap = nil @ballbitmap.dispose if @ballbitmap @ballbitmap = nil @bgsprite.dispose if @bgsprite for i in @blacksprites; i.dispose if i; end @blacksprites.clear for i in @ballsprites; i.dispose if i; end @ballsprites.clear @viewport.dispose if @viewport @disposed = true end def update return if disposed? if @duration==0 dispose elsif @duration>=@numframes*0.6 for i in 0...2 @ballsprites[i].x += (2*i-1)*((@width+@ballbitmap.width)/(0.4*@numframes)) @ballsprites[i].angle += (2*i-1)*(360.0/(0.2*@numframes)) end else addx = (@numframes*0.6-@duration)*@addxmult for i in 0...2 @bgsprite.zoom_x += @addzoom @bgsprite.zoom_y += @addzoom @blacksprites[i].x += (2*i-1)*addx end @blacksprites[2].zoom_y += 2*addx/@width @blacksprites[0].x = 0 if @blacksprites[0].x<0 @blacksprites[1].x = 0 if @blacksprites[1].x>0 end @duration -= 1 end end #============================================================================= # HGSS trainer outdoor night #============================================================================= class SpinBallSplit def initialize(numframes) @numframes = numframes @duration = numframes @disposed = false if @numframes<=0 @disposed = true return end @blackbitmap = RPG::Cache.transition("black_half") @ballbitmap = RPG::Cache.transition("ball_large") @buffer = Graphics.snap_to_bitmap if !@blackbitmap || !@ballbitmap || !@buffer @disposed = true return end @width = @buffer.width @height = @buffer.height @viewport = Viewport.new(0,0,@width,@height) @viewport.z = 99999 @bgsprites = [] @blacksprites = [] @ballsprites = [] for i in 0...2 @bgsprites[i] = Sprite.new(@viewport) @bgsprites[i].x = @width/2 @bgsprites[i].y = @height/2 @bgsprites[i].ox = @width/2 @bgsprites[i].oy = (1-i)*@height/2 @bgsprites[i].bitmap = @buffer @bgsprites[i].src_rect.set(0,i*@height/2,@width,@height/2) @blacksprites[i] = Sprite.new(@viewport) @blacksprites[i].x = (1-i*2)*@width @blacksprites[i].y = i*@height/2 @blacksprites[i].z = 1 @blacksprites[i].bitmap = @blackbitmap @ballsprites[i] = Sprite.new(@viewport) @ballsprites[i].x = @width/2 @ballsprites[i].y = @height/2 @ballsprites[i].z = 2 @ballsprites[i].ox = @ballbitmap.width/2 @ballsprites[i].oy = (1-i)*@ballbitmap.height/2 @ballsprites[i].zoom_x = 0.0 @ballsprites[i].zoom_y = 0.0 @ballsprites[i].bitmap = @ballbitmap end @addxmult = 2.0*@width/((@numframes*0.5)**2) @addzoom = 0.02*50/@numframes end def disposed?; @disposed; end def dispose return if disposed? @buffer.dispose if @buffer @buffer = nil @blackbitmap.dispose if @blackbitmap @blackbitmap = nil @ballbitmap.dispose if @ballbitmap @ballbitmap = nil for i in @bgsprites; i.dispose if i; end @bgsprites.clear for i in @blacksprites; i.dispose if i; end @blacksprites.clear for i in @ballsprites; i.dispose if i; end @ballsprites.clear @viewport.dispose if @viewport @disposed = true end def update return if disposed? if @duration==0 dispose elsif @duration>=@numframes*0.6 if @ballsprites[0].zoom_x<1.0 @ballsprites[0].zoom_x += (1.0/(0.4*@numframes)) @ballsprites[0].zoom_y += (1.0/(0.4*@numframes)) @ballsprites[0].angle -= (360.0/(0.4*@numframes)) if @ballsprites[0].zoom_x>=1.0 for i in 0...2 @ballsprites[i].src_rect.set(0,i*@ballbitmap.height/2, @ballbitmap.width,@ballbitmap.height/2) @ballsprites[i].zoom_x = @ballsprites[i].zoom_y = 1.0 @ballsprites[i].angle = 0.0 end end end # Gap between 0.6*@numframes and 0.5*@numframes elsif @duration<@numframes*0.5 addx = (@numframes*0.5-@duration)*@addxmult for i in 0...2 @bgsprites[i].x += (2*i-1)*addx @bgsprites[i].zoom_x += @addzoom @bgsprites[i].zoom_y += @addzoom @blacksprites[i].x += (2*i-1)*addx @ballsprites[i].x += (2*i-1)*addx end @blacksprites[0].x = 0 if @blacksprites[0].x<0 @blacksprites[1].x = 0 if @blacksprites[1].x>0 end @duration -= 1 end end #============================================================================= # HGSS trainer indoor day #============================================================================= class ThreeBallDown def initialize(numframes) @numframes = numframes @duration = numframes @disposed = false if @numframes<=0 @disposed = true return end @blackbitmap = RPG::Cache.transition("black_square") @ballbitmap = RPG::Cache.transition("ball_small") @buffer = Graphics.snap_to_bitmap if !@blackbitmap || !@ballbitmap || !@buffer @disposed = true return end @width = @buffer.width @height = @buffer.height cx = Graphics.width/@blackbitmap.width # 8 cy = Graphics.height/@blackbitmap.height # 6 @numtiles = cx*cy @viewport = Viewport.new(0,0,@width,@height) @viewport.z = 99999 @bgsprite = Sprite.new(@viewport) @bgsprite.x = @width/2 @bgsprite.y = @height/2 @bgsprite.ox = @width/2 @bgsprite.oy = @height/2 @bgsprite.bitmap = @buffer @frame = [] @blacksprites = [] for i in 0...cy for j in 0...cx k = i*cx+j @blacksprites[k] = Sprite.new(@viewport) @blacksprites[k].x = @blackbitmap.width*j @blacksprites[k].y = @blackbitmap.height*i @blacksprites[k].visible = false @blacksprites[k].bitmap = @blackbitmap @frame[k] = (((cy-i-1)*8+[0,4,1,6,7,2,5,3][j])*(@numframes*0.75)/@numtiles).floor end end @ballsprites = [] for i in 0...3 @ballsprites[i] = Sprite.new(@viewport) @ballsprites[i].x = 96+i*160 @ballsprites[i].y = -@ballbitmap.height-[400,0,100][i] @ballsprites[i].z = 2 @ballsprites[i].ox = @ballbitmap.width/2 @ballsprites[i].oy = @ballbitmap.height/2 @ballsprites[i].bitmap = @ballbitmap end @addyball = (@height+400+@ballbitmap.height*2)/(0.25*@numframes) @addangle = 1.5*360/(0.25*@numframes) @addzoom = 0.02*50/@numframes end def disposed?; @disposed; end def dispose return if disposed? @buffer.dispose if @buffer @buffer = nil @blackbitmap.dispose if @blackbitmap @blackbitmap = nil @ballbitmap.dispose if @ballbitmap @ballbitmap = nil @bgsprite.dispose if @bgsprite for i in @blacksprites; i.dispose if i; end @blacksprites.clear for i in @ballsprites; i.dispose if i; end @ballsprites.clear @viewport.dispose if @viewport @disposed = true end def update return if disposed? if @duration==0 dispose elsif @duration>=@numframes*0.75 for i in 0...@ballsprites.length @ballsprites[i].y += @addyball @ballsprites[i].angle -= @addangle*([1,-1][(i==2) ? 1 : 0]) end else count = (@numframes*0.75).floor-@duration for i in 0...@numtiles @blacksprites[i].visible = true if @frame[i]<=count end @bgsprite.zoom_x += @addzoom @bgsprite.zoom_y += @addzoom end @duration -= 1 end end #============================================================================= # HGSS trainer indoor night # HGSS trainer cave #============================================================================= class BallDown def initialize(numframes) @numframes = numframes @duration = numframes @disposed = false if @numframes<=0 @disposed = true return end @blackbitmap = RPG::Cache.transition("black_half") @curvebitmap = RPG::Cache.transition("black_curve") @ballbitmap = RPG::Cache.transition("ball_small") @buffer = Graphics.snap_to_bitmap if !@blackbitmap || !@curvebitmap || !@ballbitmap || !@buffer @disposed = true return end @width = @buffer.width @height = @buffer.height @viewport = Viewport.new(0,0,@width,@height) @viewport.z = 99999 @bgsprite = Sprite.new(@viewport) @bgsprite.x = @width/2 @bgsprite.y = @height/2 @bgsprite.ox = @width/2 @bgsprite.oy = @height/2 @bgsprite.bitmap = @buffer @blacksprites = [] @blacksprites[0] = Sprite.new(@viewport) @blacksprites[0].y = -@curvebitmap.height @blacksprites[0].z = 1 @blacksprites[0].oy = @blackbitmap.height @blacksprites[0].zoom_y = 2.0 @blacksprites[0].bitmap = @blackbitmap @blacksprites[1] = Sprite.new(@viewport) @blacksprites[1].y = -@curvebitmap.height @blacksprites[1].z = 1 @blacksprites[1].bitmap = @curvebitmap @ballsprite = Sprite.new(@viewport) @ballsprite.x = @width/2 @ballsprite.y = -@ballbitmap.height/2 @ballsprite.z = 2 @ballsprite.ox = @ballbitmap.width/2 @ballsprite.oy = @ballbitmap.height/2 @ballsprite.zoom_x = 0.25 @ballsprite.zoom_y = 0.25 @ballsprite.bitmap = @ballbitmap @addyball = (@height+@ballbitmap.height*2.5)/(0.5*@numframes) @addangle = 1.5*360/(0.5*@numframes) @addzoomball = 2.5/(0.5*@numframes) @addy = (@height+@curvebitmap.height)/(@numframes*0.5) @addzoom = 0.02*50/@numframes end def disposed?; @disposed; end def dispose return if disposed? @buffer.dispose if @buffer @buffer = nil @blackbitmap.dispose if @blackbitmap @blackbitmap = nil @curvebitmap.dispose if @curvebitmap @curvebitmap = nil @ballbitmap.dispose if @ballbitmap @ballbitmap = nil @bgsprite.dispose if @bgsprite for i in @blacksprites; i.dispose if i; end @blacksprites.clear @ballsprite.dispose @viewport.dispose if @viewport @disposed = true end def update return if disposed? if @duration==0 dispose elsif @duration>=@numframes*0.5 @ballsprite.y += @addyball @ballsprite.angle -= @addangle @ballsprite.zoom_x += @addzoomball @ballsprite.zoom_y += @addzoomball else @blacksprites[1].y += @addy @blacksprites[0].y = @blacksprites[1].y @bgsprite.zoom_x += @addzoom @bgsprite.zoom_y += @addzoom end @duration -= 1 end end #============================================================================= # HGSS trainer water day #============================================================================= class WavyThreeBallUp def initialize(numframes) @numframes = numframes @duration = numframes @disposed = false if @numframes<=0 @disposed = true return end @blackbitmap = RPG::Cache.transition("black_half") @ballbitmap = RPG::Cache.transition("ball_small") @buffer = Graphics.snap_to_bitmap if !@blackbitmap || !@ballbitmap || !@buffer @disposed = true return end @width = @buffer.width @height = @buffer.height @viewport = Viewport.new(0,0,@width,@height) @viewport.z = 99999 @rearsprite = Sprite.new(@viewport) @rearsprite.z = 1 @rearsprite.zoom_y = 2.0 @rearsprite.bitmap = @blackbitmap @bgsprites = [] rect = Rect.new(0,0,@width,2) for i in 0...@height/2 @bgsprites[i] = Sprite.new(@viewport) @bgsprites[i].y = i*2 @bgsprites[i].z = 2 @bgsprites[i].bitmap = @buffer rect.y = i*2 @bgsprites[i].src_rect = rect end @blacksprites = [] @ballsprites = [] for i in 0...3 @blacksprites[i] = Sprite.new(@viewport) @blacksprites[i].x = (i-1)*@width*2/3 @blacksprites[i].y = [@height*1.5,@height*3.25,@height*2.5][i] @blacksprites[i].z = 3 @blacksprites[i].zoom_y = 2.0 @blacksprites[i].bitmap = @blackbitmap @ballsprites[i] = Sprite.new(@viewport) @ballsprites[i].x = (2*i+1)*@width/6 @ballsprites[i].y = [@height*1.5,@height*3.25,@height*2.5][i] @ballsprites[i].z = 4 @ballsprites[i].ox = @ballbitmap.width/2 @ballsprites[i].oy = @ballbitmap.height/2 @ballsprites[i].bitmap = @ballbitmap end @suby = (@height*3.5)/(@numframes*0.6) @angmult = 4/(@numframes/50) end def disposed?; @disposed; end def dispose return if disposed? @buffer.dispose if @buffer @buffer = nil @blackbitmap.dispose if @blackbitmap @blackbitmap = nil @ballbitmap.dispose if @ballbitmap @ballbitmap = nil @rearsprite.dispose if @rearsprite for i in @bgsprites; i.dispose if i; end @bgsprites.clear for i in @blacksprites; i.dispose if i; end @blacksprites.clear for i in @ballsprites; i.dispose if i; end @ballsprites.clear @viewport.dispose if @viewport @disposed = true end def update return if disposed? if @duration==0 dispose else angadd = (@numframes-@duration)*@angmult amp = 24*angadd/16; amp = 24 if amp>24 for i in 0...@bgsprites.length @bgsprites[i].x = amp*Math.sin((i+angadd)*Math::PI/48)*((i%2)*2-1) end if @duration<@numframes*0.6 for i in 0...3 @blacksprites[i].y -= @suby @blacksprites[i].y = 0 if @blacksprites[i].y<0 @ballsprites[i].y -= @suby @ballsprites[i].angle += (2*(i%2)-1)*(360.0/(0.2*@numframes)) end end end @duration -= 1 end end #============================================================================= # HGSS trainer water night #============================================================================= class WavySpinBall def initialize(numframes) @numframes = numframes @duration = numframes @disposed = false if @numframes<=0 @disposed = true return end @blackbitmap = RPG::Cache.transition("black_half") @ballbitmap = RPG::Cache.transition("ball_large") @buffer = Graphics.snap_to_bitmap if !@blackbitmap || !@ballbitmap || !@buffer @disposed = true return end @width = @buffer.width @height = @buffer.height @viewport = Viewport.new(0,0,@width,@height) @viewport.z = 99999 @rearsprite = Sprite.new(@viewport) @rearsprite.z = 1 @rearsprite.zoom_y = 2.0 @rearsprite.bitmap = @blackbitmap @bgsprites = [] rect = Rect.new(0,0,@width,2) for i in 0...@height/2 @bgsprites[i] = Sprite.new(@viewport) @bgsprites[i].y = i*2 @bgsprites[i].z = 2 @bgsprites[i].bitmap = @buffer rect.y = i*2 @bgsprites[i].src_rect = rect end @ballsprite = Sprite.new(@viewport) @ballsprite.x = @width/2 @ballsprite.y = @height/2 @ballsprite.z = 3 @ballsprite.ox = @ballbitmap.width/2 @ballsprite.oy = @ballbitmap.height/2 @ballsprite.visible = false @ballsprite.bitmap = @ballbitmap @blacksprite = Sprite.new(@viewport) @blacksprite.x = @width/2 @blacksprite.y = @height/2 @blacksprite.z = 4 @blacksprite.ox = @blackbitmap.width/2 @blacksprite.oy = @blackbitmap.height/2 @blacksprite.visible = false @blacksprite.bitmap = @blackbitmap @angmult = 4/(@numframes/50) end def disposed?; @disposed; end def dispose return if disposed? @buffer.dispose if @buffer @buffer = nil @blackbitmap.dispose if @blackbitmap @blackbitmap = nil @ballbitmap.dispose if @ballbitmap @ballbitmap = nil @rearsprite.dispose if @rearsprite for i in @bgsprites; i.dispose if i; end @bgsprites.clear @ballsprite.dispose if @ballsprite @blacksprite.dispose if @blacksprite @viewport.dispose if @viewport @disposed = true end def update return if disposed? if @duration==0 dispose else angadd = (@numframes-@duration)*@angmult amp = 24*angadd/16; amp = 24 if amp>24 for i in 0...@bgsprites.length @bgsprites[i].x = amp*Math.sin((i+angadd)*Math::PI/48)*((i%2)*2-1) end @ballsprite.visible = true if @duration>=@numframes*0.6 @ballsprite.opacity = 255*(@numframes-@duration)/(@numframes*0.4) @ballsprite.angle = -360.0*(@numframes-@duration)/(@numframes*0.4) elsif @duration<@numframes*0.5 @blacksprite.visible = true @blacksprite.zoom_x = (@numframes*0.5-@duration)/(@numframes*0.5) @blacksprite.zoom_y = 2*(@numframes*0.5-@duration)/(@numframes*0.5) end end @duration -= 1 end end #============================================================================= # HGSS double trainers #============================================================================= class FourBallBurst def initialize(numframes) @numframes = numframes @duration = numframes @disposed = false if @numframes<=0 @disposed = true return end @black1bitmap = RPG::Cache.transition("black_wedge_1") @black2bitmap = RPG::Cache.transition("black_wedge_2") @black3bitmap = RPG::Cache.transition("black_wedge_3") @black4bitmap = RPG::Cache.transition("black_wedge_4") @ballbitmap = RPG::Cache.transition("ball_small") if !@black1bitmap || !@black2bitmap || !@black3bitmap || !@black4bitmap || !@ballbitmap @disposed = true return end @width = Graphics.width @height = Graphics.height @viewport = Viewport.new(0,0,@width,@height) @viewport.z = 99999 @ballsprites = [] for i in 0...4 @ballsprites[i] = Sprite.new(@viewport) @ballsprites[i].x = @width/2 @ballsprites[i].y = @height/2 @ballsprites[i].z = [2,1,3,0][i] @ballsprites[i].ox = @ballbitmap.width/2 @ballsprites[i].oy = @ballbitmap.height/2 @ballsprites[i].bitmap = @ballbitmap end @blacksprites = [] for i in 0...4 b = [@black1bitmap,@black2bitmap,@black3bitmap,@black4bitmap][i] @blacksprites[i] = Sprite.new(@viewport) @blacksprites[i].x = (i==1) ? 0 : @width/2 @blacksprites[i].y = (i==2) ? 0 : @height/2 @blacksprites[i].ox = (i%2==0) ? b.width/2 : 0 @blacksprites[i].oy = (i%2==0) ? 0 : b.height/2 @blacksprites[i].zoom_x = (i%2==0) ? 0.0 : 1.0 @blacksprites[i].zoom_y = (i%2==0) ? 1.0 : 0.0 @blacksprites[i].visible = false @blacksprites[i].bitmap = b end @addxball = (@width/2+@ballbitmap.width/2)/(@numframes*0.4) @addyball = (@height/2+@ballbitmap.height/2)/(@numframes*0.4) @addzoom = 1.0/(@numframes*0.6) end def disposed?; @disposed; end def dispose return if disposed? @black1bitmap.dispose if @black1bitmap @black1bitmap = nil @black2bitmap.dispose if @black2bitmap @black2bitmap = nil @black3bitmap.dispose if @black3bitmap @black3bitmap = nil @black4bitmap.dispose if @black4bitmap @black4bitmap = nil @ballbitmap.dispose if @ballbitmap @ballbitmap = nil for i in @ballsprites; i.dispose if i; end @ballsprites.clear for i in @blacksprites; i.dispose if i; end @blacksprites.clear @viewport.dispose if @viewport @disposed = true end def update return if disposed? if @duration==0 dispose elsif @duration>=@numframes*0.6 for i in 0...@ballsprites.length @ballsprites[i].x += (i==1) ? @addxball : (i==3) ? -@addxball : 0 @ballsprites[i].y += (i==0) ? @addyball : (i==2) ? -@addyball : 0 end else for i in 0...@blacksprites.length @blacksprites[i].visible = true @blacksprites[i].zoom_x += (i%2==0) ? @addzoom : 0 @blacksprites[i].zoom_y += (i%2==0) ? 0 : @addzoom end end @duration -= 1 end end end