diff --git a/Data/Scripts/010_Scenes/001_Transitions.rb b/Data/Scripts/010_Scenes/001_Transitions.rb index 62fb4fd7a..45f530ddb 100644 --- a/Data/Scripts/010_Scenes/001_Transitions.rb +++ b/Data/Scripts/010_Scenes/001_Transitions.rb @@ -12,17 +12,17 @@ module Graphics end end - def self.transition(duration=8,filename="",vague=20) + def self.transition(duration = 8, filename = "", vague = 20) duration = duration.floor - if judge_special_transition(duration,filename) + if judge_special_transition(duration, filename) duration = 0 filename = "" end begin - transition_KGC_SpecialTransition(duration,filename,vague) + transition_KGC_SpecialTransition(duration, filename, vague) rescue Exception - if filename!="" - transition_KGC_SpecialTransition(duration,"",vague) + if filename != "" + transition_KGC_SpecialTransition(duration, "", vague) end end if STOP_WHILE_TRANSITION && !@_interrupt_transition @@ -35,8 +35,8 @@ module Graphics def self.update update_KGC_SpecialTransition =begin - if Graphics.frame_count%40==0 - count=0 + if Graphics.frame_count % 40 == 0 + count = 0 ObjectSpace.each_object(Object) { |o| count += 1 } echo("Objects: #{count}\r\n") end @@ -55,39 +55,39 @@ module Graphics dc = File.basename(filename).downcase case dc # Other coded transitions - when "breakingglass"; @@transition = BreakingGlass.new(duration) - when "rotatingpieces"; @@transition = ShrinkingPieces.new(duration,true) - when "shrinkingpieces"; @@transition = ShrinkingPieces.new(duration,false) - when "splash"; @@transition = SplashTransition.new(duration) - when "random_stripe_v"; @@transition = RandomStripeTransition.new(duration,0) - when "random_stripe_h"; @@transition = RandomStripeTransition.new(duration,1) - when "zoomin"; @@transition = ZoomInTransition.new(duration) - when "scrolldown"; @@transition = ScrollScreen.new(duration,2) - when "scrollleft"; @@transition = ScrollScreen.new(duration,4) - when "scrollright"; @@transition = ScrollScreen.new(duration,6) - when "scrollup"; @@transition = ScrollScreen.new(duration,8) - when "scrolldownleft"; @@transition = ScrollScreen.new(duration,1) - when "scrolldownright"; @@transition = ScrollScreen.new(duration,3) - when "scrollupleft"; @@transition = ScrollScreen.new(duration,7) - when "scrollupright"; @@transition = ScrollScreen.new(duration,9) - when "mosaic"; @@transition = MosaicTransition.new(duration) + when "breakingglass"; @@transition = Transitions::BreakingGlass.new(duration) + when "rotatingpieces"; @@transition = Transitions::ShrinkingPieces.new(duration, true) + when "shrinkingpieces"; @@transition = Transitions::ShrinkingPieces.new(duration, false) + when "splash"; @@transition = Transitions::SplashTransition.new(duration) + when "random_stripe_v"; @@transition = Transitions::RandomStripeTransition.new(duration, 0) + when "random_stripe_h"; @@transition = Transitions::RandomStripeTransition.new(duration, 1) + when "zoomin"; @@transition = Transitions::ZoomInTransition.new(duration) + when "scrolldown"; @@transition = Transitions::ScrollScreen.new(duration, 2) + when "scrollleft"; @@transition = Transitions::ScrollScreen.new(duration, 4) + when "scrollright"; @@transition = Transitions::ScrollScreen.new(duration, 6) + when "scrollup"; @@transition = Transitions::ScrollScreen.new(duration, 8) + when "scrolldownleft"; @@transition = Transitions::ScrollScreen.new(duration, 1) + when "scrolldownright"; @@transition = Transitions::ScrollScreen.new(duration, 3) + when "scrollupleft"; @@transition = Transitions::ScrollScreen.new(duration, 7) + when "scrollupright"; @@transition = Transitions::ScrollScreen.new(duration, 9) + when "mosaic"; @@transition = Transitions::MosaicTransition.new(duration) # HGSS transitions - when "snakesquares"; @@transition = SnakeSquares.new(duration) - when "diagonalbubbletl"; @@transition = DiagonalBubble.new(duration,0) - when "diagonalbubbletr"; @@transition = DiagonalBubble.new(duration,1) - when "diagonalbubblebl"; @@transition = DiagonalBubble.new(duration,2) - when "diagonalbubblebr"; @@transition = DiagonalBubble.new(duration,3) - when "risingsplash"; @@transition = RisingSplash.new(duration) - when "twoballpass"; @@transition = TwoBallPass.new(duration) - when "spinballsplit"; @@transition = SpinBallSplit.new(duration) - when "threeballdown"; @@transition = ThreeBallDown.new(duration) - when "balldown"; @@transition = BallDown.new(duration) - when "wavythreeballup"; @@transition = WavyThreeBallUp.new(duration) - when "wavyspinball"; @@transition = WavySpinBall.new(duration) - when "fourballburst"; @@transition = FourBallBurst.new(duration) + when "snakesquares"; @@transition = Transitions::SnakeSquares.new(duration) + when "diagonalbubbletl"; @@transition = Transitions::DiagonalBubble.new(duration, 0) + when "diagonalbubbletr"; @@transition = Transitions::DiagonalBubble.new(duration, 1) + when "diagonalbubblebl"; @@transition = Transitions::DiagonalBubble.new(duration, 2) + when "diagonalbubblebr"; @@transition = Transitions::DiagonalBubble.new(duration, 3) + when "risingsplash"; @@transition = Transitions::RisingSplash.new(duration) + when "twoballpass"; @@transition = Transitions::TwoBallPass.new(duration) + when "spinballsplit"; @@transition = Transitions::SpinBallSplit.new(duration) + when "threeballdown"; @@transition = Transitions::ThreeBallDown.new(duration) + when "balldown"; @@transition = Transitions::BallDown.new(duration) + when "wavythreeballup"; @@transition = Transitions::WavyThreeBallUp.new(duration) + when "wavyspinball"; @@transition = Transitions::WavySpinBall.new(duration) + when "fourballburst"; @@transition = Transitions::FourBallBurst.new(duration) # Graphic transitions - when ""; @@transition = FadeTransition.new(duration) - else; ret=false + when ""; @@transition = Transitions::FadeTransition.new(duration) + else; ret = false end Graphics.frame_reset if ret return ret @@ -97,1520 +97,1491 @@ end #=============================================================================== -# +# Screen transition classes #=============================================================================== -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 +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].visible = false - @sprites[i].dispose + @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 - @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 + 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 - 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 + def update + return if disposed? + continue = false for i in 0...@numtiles - @sprites[i].visible = false - @sprites[i].dispose + @sprites[i].opacity -= @opacitychange + @y[i] += @offset[i] + @sprites[i].y = @y[i] + continue = true if @sprites[i].opacity>0 end - @sprites.clear - @viewport.dispose if @viewport - @disposed = true + self.dispose if !continue 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 + #============================================================================= + # + #============================================================================= + 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 - @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 + 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 - @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 + 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 - def disposed?; @disposed; end + #============================================================================= + # + #============================================================================= + class SplashTransition + SPLASH_SIZE = 32 - 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 + 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) - buffer = @buffer - sprite = @sprite - phase = @numframes-@duration - sprite.bitmap.clear + mag = 40.0/@numframes 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) + 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.opacity = 384*@duration/@numframes - @duration -= 1 + @sprite.bitmap.blt(0,0,@buffer,@buffer.rect) end - end - private + def disposed?; @disposed; end - 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 + 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 - 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 + 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 - 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) + 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 FadeTransition + 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 = BitmapCache.load_bitmap("Graphics/Transitions/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 - rect.y = i*size - sprite.bitmap.blt(0,rect.y,buffer,rect) + @frame[k] = 2*k*(@numframes-1/@addzoom)/50 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 + def disposed?; @disposed; end - -#=============================================================================== -# -#=============================================================================== -class MosaicTransition - def initialize(numframes) - @duration = numframes - @numframes = numframes - @disposed = false - if @numframes<=0 - @disposed = true - return + 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 - @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 FadeTransition - 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 = BitmapCache.load_bitmap("Graphics/Transitions/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 + 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 - 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 + #============================================================================= + # 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 = BitmapCache.load_bitmap("Graphics/Transitions/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; k = i*cx+(cx-1-j) # Top right + when 2; k = @numtiles-1-(i*cx+(cx-1-j)) # Bottom left + when 3; k = @numtiles-1-k # Bottom right + end + @frame[k] = ((0.6*j*width+0.8*i*height)*(@numframes/50)/l).floor end end - @sprites.clear + @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 = BitmapCache.load_bitmap("Graphics/Transitions/water_1") + @splashbitmap = BitmapCache.load_bitmap("Graphics/Transitions/water_2") + @blackbitmap = BitmapCache.load_bitmap("Graphics/Transitions/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 - 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 + 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 - @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 = BitmapCache.load_bitmap("Graphics/Transitions/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; k = i*cx+(cx-1-j) # Top right - when 2; k = @numtiles-1-(i*cx+(cx-1-j)) # Bottom left - when 3; 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 + #============================================================================= + # HGSS trainer outdoor day + #============================================================================= + class TwoBallPass + def initialize(numframes) + @numframes = numframes + @duration = numframes + @disposed = false + if @numframes<=0 + @disposed = true + return end - @sprites.clear + @blackbitmap = BitmapCache.load_bitmap("Graphics/Transitions/black_half") + @ballbitmap = BitmapCache.load_bitmap("Graphics/Transitions/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 - 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 + #============================================================================= + # HGSS trainer outdoor night + #============================================================================= + class SpinBallSplit + def initialize(numframes) + @numframes = numframes + @duration = numframes + @disposed = false + if @numframes<=0 + @disposed = true + return + end + @blackbitmap = BitmapCache.load_bitmap("Graphics/Transitions/black_half") + @ballbitmap = BitmapCache.load_bitmap("Graphics/Transitions/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 = BitmapCache.load_bitmap("Graphics/Transitions/black_square") + @ballbitmap = BitmapCache.load_bitmap("Graphics/Transitions/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 - 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 = BitmapCache.load_bitmap("Graphics/Transitions/water_1") - @splashbitmap = BitmapCache.load_bitmap("Graphics/Transitions/water_2") - @blackbitmap = BitmapCache.load_bitmap("Graphics/Transitions/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 + @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 - @duration -= 1 - end -end + def disposed?; @disposed; end - -#=============================================================================== -# HGSS trainer outdoor day -#=============================================================================== -class TwoBallPass - def initialize(numframes) - @numframes = numframes - @duration = numframes - @disposed = false - if @numframes<=0 + 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 - return end - @blackbitmap = BitmapCache.load_bitmap("Graphics/Transitions/black_half") - @ballbitmap = BitmapCache.load_bitmap("Graphics/Transitions/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 + 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 - @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 + @duration -= 1 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 = BitmapCache.load_bitmap("Graphics/Transitions/black_half") + @curvebitmap = BitmapCache.load_bitmap("Graphics/Transitions/black_curve") + @ballbitmap = BitmapCache.load_bitmap("Graphics/Transitions/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 -#=============================================================================== -# HGSS trainer outdoor night -#=============================================================================== -class SpinBallSplit - def initialize(numframes) - @numframes = numframes - @duration = numframes - @disposed = false - if @numframes<=0 + 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 - return end - @blackbitmap = BitmapCache.load_bitmap("Graphics/Transitions/black_half") - @ballbitmap = BitmapCache.load_bitmap("Graphics/Transitions/ball_large") - @buffer = Graphics.snap_to_bitmap - if !@blackbitmap || !@ballbitmap || !@buffer + + 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 = BitmapCache.load_bitmap("Graphics/Transitions/black_half") + @ballbitmap = BitmapCache.load_bitmap("Graphics/Transitions/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 - 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 + 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 - # 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 + @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 - @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 = BitmapCache.load_bitmap("Graphics/Transitions/black_square") - @ballbitmap = BitmapCache.load_bitmap("Graphics/Transitions/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 + @blackbitmap = BitmapCache.load_bitmap("Graphics/Transitions/black_half") + @ballbitmap = BitmapCache.load_bitmap("Graphics/Transitions/ball_large") + @buffer = Graphics.snap_to_bitmap + if !@blackbitmap || !@ballbitmap || !@buffer + @disposed = true + return 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]) + @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 - 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 + @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 - @duration -= 1 - end -end + def disposed?; @disposed; end - -#=============================================================================== -# HGSS trainer indoor night -# HGSS trainer cave -#=============================================================================== -class BallDown - def initialize(numframes) - @numframes = numframes - @duration = numframes - @disposed = false - if @numframes<=0 + 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 - return end - @blackbitmap = BitmapCache.load_bitmap("Graphics/Transitions/black_half") - @curvebitmap = BitmapCache.load_bitmap("Graphics/Transitions/black_curve") - @ballbitmap = BitmapCache.load_bitmap("Graphics/Transitions/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 = BitmapCache.load_bitmap("Graphics/Transitions/black_half") - @ballbitmap = BitmapCache.load_bitmap("Graphics/Transitions/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)) + 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 = BitmapCache.load_bitmap("Graphics/Transitions/black_wedge_1") + @black2bitmap = BitmapCache.load_bitmap("Graphics/Transitions/black_wedge_2") + @black3bitmap = BitmapCache.load_bitmap("Graphics/Transitions/black_wedge_3") + @black4bitmap = BitmapCache.load_bitmap("Graphics/Transitions/black_wedge_4") + @ballbitmap = BitmapCache.load_bitmap("Graphics/Transitions/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 - @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 = BitmapCache.load_bitmap("Graphics/Transitions/black_half") - @ballbitmap = BitmapCache.load_bitmap("Graphics/Transitions/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 = BitmapCache.load_bitmap("Graphics/Transitions/black_wedge_1") - @black2bitmap = BitmapCache.load_bitmap("Graphics/Transitions/black_wedge_2") - @black3bitmap = BitmapCache.load_bitmap("Graphics/Transitions/black_wedge_3") - @black4bitmap = BitmapCache.load_bitmap("Graphics/Transitions/black_wedge_4") - @ballbitmap = BitmapCache.load_bitmap("Graphics/Transitions/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