Changed: TilemapXP @@ -18,0 +18,3 @@ + +class CustomTilemapSprite < Sprite +end @@ -81,1 +84,1 @@ - @layer0=Sprite.new(viewport) + @layer0=CustomTilemapSprite.new(viewport) @@ -94,0 +97,1 @@ + @priotilesfast=[] @@ -362,1 +366,1 @@ - sprite=Sprite.new(@viewport) + sprite=CustomTilemapSprite.new(@viewport) @@ -379,1 +383,1 @@ - sprite=Sprite.new(@viewport) + sprite=CustomTilemapSprite.new(@viewport) @@ -430,1 +434,1 @@ - @flash=Sprite.new(viewport) + @flash=CustomTilemapSprite.new(viewport) @@ -433,0 +437,2 @@ + @flash.tone=tone + @flash.color=color @@ -667,1 +673,0 @@ - #echo "refreshing priorectautos" @@ -676,1 +681,1 @@ - #echoln "checking #{@priorectautos.length} of #{@prioautotiles.length}" +# echoln ["autos",@priorect,@priorectautos.length,@prioautotiles.length] @@ -842,9 +847,18 @@ - for prio in @priotiles - x=prio[0] - y=prio[1] - next if xmaxX - next if ymaxY - id=prio[3] - xpos=(x*@tileWidth)-@ox - ypos=(y*@tileHeight)-@oy - count=addTile(@tiles,count,xpos,ypos,id) + if !@priotilesrect || !@priotilesfast || + @priorect[0]!=minX || + @priorect[1]!=minY || + @priorect[2]!=maxX || + @priorect[3]!=maxY + @priotilesfast=@priotiles.find_all{|tile| + x=tile[0] + y=tile[1] + # "next" means "return" here + next !(xmaxX||ymaxY) + } + @priorect=[minX,minY,maxX,maxY] + end +# echoln [minX,minY,maxX,maxY,@priotilesfast.length,@priotiles.length] + for prio in @priotilesfast + xpos=(prio[0]*@tileWidth)-@ox + ypos=(prio[1]*@tileHeight)-@oy + count=addTile(@tiles,count,xpos,ypos,prio[3]) @@ -853,9 +867,15 @@ - for z in 0...@map_data.zsize - for y in minY..maxY - for x in minX..maxX - id = @map_data[x, y, z] - next if id==0 || !@priorities[id] - next if @priorities[id]==0 - xpos=(x*@tileWidth)-@ox - ypos=(y*@tileHeight)-@oy - count=addTile(@tiles,count,xpos,ypos,id) + if !@priotilesrect || !@priotilesfast || + @priorect[0]!=minX || + @priorect[1]!=minY || + @priorect[2]!=maxX || + @priorect[3]!=maxY + @priotilesfast=[] + for z in 0...@map_data.zsize + for y in minY..maxY + for x in minX..maxX + id = @map_data[x, y, z] + next if id==0 || !@priorities[id] + next if @priorities[id]==0 + @priotilesfast.push([x,y,z,id]) + end + end @@ -863,1 +883,6 @@ - end + @priotilesrect=[minX,minY,maxX,maxY] + end + for prio in @priotilesfast + xpos=(prio[0]*@tileWidth)-@ox + ypos=(prio[1]*@tileHeight)-@oy + count=addTile(@tiles,count,xpos,ypos,prio[3]) Changed: Sprite_Picture @@ -1,13 +1,1 @@ -#============================================================================== -# ** Sprite_Picture -#------------------------------------------------------------------------------ -# This sprite is used to display the picture.It observes the Game_Character -# class and automatically changes sprite conditions. -#============================================================================== - -class Sprite_Picture < Sprite - #-------------------------------------------------------------------------- - # * Object Initialization - # viewport : viewport - # picture : picture (Game_Picture) - #-------------------------------------------------------------------------- +class Sprite_Picture @@ -15,1 +3,1 @@ - super(viewport) + @viewport = viewport @@ -17,0 +5,1 @@ + @sprite = nil @@ -19,3 +8,0 @@ - #-------------------------------------------------------------------------- - # * Dispose - #-------------------------------------------------------------------------- @@ -23,2 +9,3 @@ - if self.bitmap != nil - self.bitmap.dispose + if @sprite + @sprite.bitmap.dispose if @sprite.bitmap != nil + @sprite.dispose @@ -26,1 +13,0 @@ - super @@ -28,3 +14,0 @@ - #-------------------------------------------------------------------------- - # * Frame Update - #-------------------------------------------------------------------------- @@ -32,1 +15,0 @@ - super @@ -40,2 +22,2 @@ - self.bitmap.dispose if self.bitmap - self.bitmap = RPG::Cache.picture(@picture_name) + @sprite=Sprite.new(@viewport) if !@sprite + @sprite.bitmap = RPG::Cache.picture(@picture_name) @@ -47,1 +29,4 @@ - self.visible = false + if @sprite + @sprite.dispose if @sprite + @sprite=nil + end @@ -51,1 +36,1 @@ - self.visible = true + @sprite.visible = true @@ -54,2 +39,2 @@ - self.ox = 0 - self.oy = 0 + @sprite.ox = 0 + @sprite.oy = 0 @@ -57,2 +42,2 @@ - self.ox = self.bitmap.width / 2 - self.oy = self.bitmap.height / 2 + @sprite.ox = @sprite.bitmap.width / 2 + @sprite.oy = @sprite.bitmap.height / 2 @@ -61,3 +46,3 @@ - self.x = @picture.x - self.y = @picture.y - self.z = @picture.number + @sprite.x = @picture.x + @sprite.y = @picture.y + @sprite.z = @picture.number @@ -65,4 +50,4 @@ - self.zoom_x = @picture.zoom_x / 100.0 - self.zoom_y = @picture.zoom_y / 100.0 - self.opacity = @picture.opacity - self.blend_type = @picture.blend_type + @sprite.zoom_x = @picture.zoom_x / 100.0 + @sprite.zoom_y = @picture.zoom_y / 100.0 + @sprite.opacity = @picture.opacity + @sprite.blend_type = @picture.blend_type @@ -70,2 +55,2 @@ - self.angle = @picture.angle - self.tone = @picture.tone + @sprite.angle = @picture.angle + @sprite.tone = @picture.tone Changed: Particle Engine @@ -109,0 +109,47 @@ +class ParticleSprite + attr_accessor :x,:y,:z,:opacity,:bitmap,:blend_type + def initialize(viewport) + @viewport=viewport + @sprite=nil + @x=0 + @y=0 + @z=0 + @opacity=255 + @bitmap=nil + @blend_type=0 + @minleft=0 + @mintop=0 + end + def bitmap=(value) + @bitmap=value + if value + @minleft=-value.width + @mintop=-value.height + else + @minleft=0 + @mintop=0 + end + end + def dispose + @sprite.dispose if @sprite + end + def update + w=Graphics.width + h=Graphics.height + if !@sprite && @x>=@minleft && @y>=@mintop && @x=w || @y>=h) + @sprite.dispose + @sprite=nil + end + if @sprite + @sprite.x=@x if @sprite.x!=@x + @sprite.y=@y if @sprite.y!=@y + @sprite.z=@z if @sprite.z!=@z + @sprite.opacity=@opacity if @sprite.opacity!=@opacity + @sprite.blend_type=@blend_type if @sprite.blend_type!=@blend_type + @sprite.bitmap=@bitmap if @sprite.bitmap!=@bitmap + end + end +end + @@ -146,0 +193,2 @@ + @bmwidth=32 + @bmheight=32 @@ -149,1 +198,1 @@ - @particles[i] = Sprite.new(@viewport) + @particles[i] = ParticleSprite.new(@viewport) @@ -151,0 +200,4 @@ + if i==0 && @particles[i].bitmap + @bmwidth=@particles[i].bitmap.width + @bmheight=@particles[i].bitmap.height + end @@ -155,1 +208,3 @@ - @opacity[i] = opacity + @opacity[i] = rand(opacity/4) + @particles[i].opacity = @opacity[i] + @particles[i].update @@ -168,10 +223,36 @@ - @startingx = self.x + @xoffset - @startingy = self.y + @yoffset - @__offsetx=(@real_x==@event.real_x) ? 0 : self.x-@screen_x - @__offsety=(@real_y==@event.real_y) ? 0 : self.y-@screen_y - @screen_x = self.x - @screen_y = self.y - @real_x = @event.real_x - @real_y = @event.real_y - for i in 0...@maxparticless - @particles[i].z = self.z+@zoffset + if @viewport && + (@viewport.rect.x >= Graphics.width || + @viewport.rect.y >= Graphics.height) + return + end + selfX=self.x + selfY=self.y + selfZ=self.z + newRealX=@event.real_x + newRealY=@event.real_y + @startingx = selfX + @xoffset + @startingy = selfY + @yoffset + @__offsetx=(@real_x==newRealX) ? 0 : selfX-@screen_x + @__offsety=(@real_y==newRealY) ? 0 : selfY-@screen_y + @screen_x = selfX + @screen_y = selfY + @real_x = newRealX + @real_y = newRealY + if @opacityvar>0 && @viewport + opac=(255.0/@opacityvar) + minX=opac*(-@xgravity*1.0 / @slowdown).floor + @startingx + maxX=opac*(@xgravity*1.0 / @slowdown).floor + @startingx + minY=opac*(-@ygravity*1.0 / @slowdown).floor + @startingy + maxY=@startingy + minX-=@bmwidth + minY-=@bmheight + maxX+=@bmwidth + maxY+=@bmheight + if maxX<0 || maxY<0 || minX>=Graphics.width || minY>=Graphics.height + echo "skipped" + return + end + end + particleZ=selfZ+@zoffset + for i in 0...@maxparticless + @particles[i].z = particleZ @@ -219,0 +300,1 @@ + calcParticlePos(i) @@ -227,1 +309,0 @@ - calcParticlePos(i) @@ -229,0 +310,1 @@ + @particles[i].update @@ -264,1 +346,1 @@ - 0,Graphics.height,0,Graphics.width, + -64,Graphics.height,-64,Graphics.width, @@ -273,3 +355,3 @@ - setParameters([0,0,0,80,20,0.5,0, - Graphics.height,0,Graphics.width,0.5,0.10,-5,-15,5,80]) - initParticles("smoke",100) + setParameters([0,0,0,80,20,0.5,-64, + Graphics.height,-64,Graphics.width,0.5,0.10,-5,-15,5,80]) + initParticles("smoke",250) @@ -282,2 +364,2 @@ - setParameters([1,1,1,10,rand(360),1,0, - Graphics.height,0,Graphics.width,0,3,-8,-15,20,0]) + setParameters([1,1,1,10,rand(360),1,-64, + Graphics.height,-64,Graphics.width,0,3,-8,-15,20,0]) @@ -296,1 +378,1 @@ - 0,Graphics.height,0,Graphics.width, + -64,Graphics.height,-64,Graphics.width, @@ -306,1 +388,1 @@ - 0,Graphics.height,0,Graphics.width, + -64,Graphics.height,-64,Graphics.width, @@ -316,1 +398,1 @@ - 0,Graphics.height,0,Graphics.width, + -64,Graphics.height,-64,Graphics.width, @@ -326,1 +408,1 @@ - 0,Graphics.height,0,Graphics.width, + -64,Graphics.height,-64,Graphics.width, @@ -337,1 +419,1 @@ - 0,Graphics.height,0,Graphics.width, + -64,Graphics.height,-64,Graphics.width, @@ -351,1 +433,1 @@ - 0,Graphics.height,0,Graphics.width, + -64,Graphics.height,-64,Graphics.width, @@ -389,1 +471,1 @@ - 0,Graphics.height,0,Graphics.width, + -64,Graphics.height,-64,Graphics.width, @@ -424,1 +506,1 @@ - 0,Graphics.height,0,Graphics.width, + -64,Graphics.height,-64,Graphics.width, @@ -434,1 +516,1 @@ - 0,Graphics.height,0,Graphics.width, + -64,Graphics.height,-64,Graphics.width, @@ -442,0 +524,1 @@ + @particles[i].update Changed: PokemonDayCare @@ -238,1 +238,1 @@ - if level<=5 + if level<=EGGINITIALLEVEL Changed: PBIntl @@ -288,1 +288,1 @@ - loadMessageFile(filename) + loadMessageFile(@filename) @@ -293,1 +293,1 @@ - loadMessageFile(filename) + loadMessageFile(@filename) @@ -612,11 +612,0 @@ - -def pbGetStringFile(filename) - ret=[] - File.open(filename,"rb"){|f| - length=f.fgetdw>>3 - for i in 0...length - ret.push(f.readName(i)) - end - } - return ret -end Changed: PokemonField @@ -340,1 +340,0 @@ - battle.cantescape=false @@ -960,0 +959,7 @@ +def pbCanUseBike?(mapid) + return true if pbGetMetadata(mapid,MetadataBicycleAlways) + val=pbGetMetadata(mapid,MetadataBicycle) + val=pbGetMetadata(mapid,MetadataOutdoor) if val==nil + return val ? true : false +end + @@ -981,7 +987,0 @@ - -def pbCanUseBike?(mapid) - return true if pbGetMetadata(mapid,MetadataBicycleAlways) - val=pbGetMetadata(mapid,MetadataBicycle) - val=pbGetMetadata(mapid,MetadataOutdoor) if val==nil - return val ? true : false -end @@ -1030,3 +1029,3 @@ - spriteset=e[0] - viewport=e[1] - map=spriteset.map + spriteset=e[0] # Spriteset being created + viewport=e[1] # Viewport used for tilemap and characters + map=spriteset.map # Map associated with the spriteset (not necessarily the current map). @@ -1174,3 +1173,3 @@ - surfbgm=pbGetMetadata(0,MetadataBicycleBGM) - if surfbgm - pbCueBGM(surfbgm,0.5) + bikebgm=pbGetMetadata(0,MetadataBicycleBGM) + if bikebgm + pbCueBGM(bikebgm,0.5) @@ -1255,0 +1254,53 @@ +end + +def pbRecord(text,maxtime=30.0) + text="" if !text + textwindow=Window_UnformattedTextPokemon.newWithSize(text, + 0,0,Graphics.width,Graphics.height-96) + textwindow.z=99999 + if text=="" + textwindow.visible=false + end + wave=nil + msgwindow=Kernel.pbCreateMessageWindow + skinfile=PokemonSkins.getDefaultTextSkin + pbLoadSkin(msgwindow,"Graphics/Windowskins/#{skinfile}") + oldvolume=Kernel.Audio_bgm_get_volume() + Kernel.Audio_bgm_set_volume(0) + delay=2 + delay.times do |i| + Kernel.pbDisplayMessageFancy(msgwindow, + _ISPRINTF("Recording in {1:d} second(s)...\nPress ESC to cancel.",delay-i),nil,0) + Graphics.frame_rate.times do + Graphics.update + Input.update + textwindow.update + msgwindow.update + if Input.trigger?(Input::B) + Kernel.Audio_bgm_set_volume(oldvolume) + Kernel.pbDisposeMessageWindow(msgwindow) + textwindow.dispose + return nil + end + end + end + Kernel.pbDisplayMessageFancy(msgwindow, + _INTL("NOW RECORDING\nPress ESC to stop recording."),nil,0) + if beginRecordUI + frames=(maxtime*Graphics.frame_rate).to_i + frames.times do + Graphics.update + Input.update + textwindow.update + msgwindow.update + if Input.trigger?(Input::B) + break + end + end + endRecord("record.wav") + wave=getWaveDataUI("record.wav",true) + end + Kernel.Audio_bgm_set_volume(oldvolume) + Kernel.pbDisposeMessageWindow(msgwindow) + textwindow.dispose + return wave Changed: TilemapLoader @@ -51,1 +51,1 @@ - @tilemap.disposed? + @tilemap && @tilemap.disposed? Changed: PokeBattle_ActualScene @@ -145,0 +145,7 @@ + @display=nil + if PokeBattle_Scene::USECOMMANDBOX + @display=Sprite.new(viewport) + @display.bitmap=BitmapCache.load_bitmap("Graphics/Pictures/commandbox.png") + @display.x=0 + @display.y=Graphics.height-96 + end @@ -154,0 +161,3 @@ + if PokeBattle_Scene::USECOMMANDBOX + @window.opacity=0 + end @@ -166,0 +176,1 @@ + @display.visible=value if @display @@ -171,0 +182,1 @@ + @display.x=value if @display @@ -176,0 +188,1 @@ + @display.y=value if @display @@ -181,0 +194,1 @@ + @display.oy=value if @display @@ -186,0 +200,1 @@ + @display.color=value if @display @@ -191,0 +206,1 @@ + @display.ox=value if @display @@ -196,0 +212,1 @@ + @display.z=value if @display @@ -201,0 +218,1 @@ + return if disposed? @@ -203,0 +221,2 @@ + @display.dispose if @display + @display.bitmap.dispose if @display && @display.bitmap @@ -207,0 +227,1 @@ + @display.update if @display @@ -227,4 +248,0 @@ - end - def dispose - @selarrow.dispose - super @@ -236,0 +253,1 @@ + @display.visible=value if @display @@ -241,0 +259,1 @@ + @display.x=value if @display @@ -246,0 +265,1 @@ + @display.y=value if @display @@ -251,0 +271,1 @@ + @display.oy=value if @display @@ -256,0 +277,1 @@ + @display.color=value if @display @@ -261,0 +283,1 @@ + @display.ox=value if @display @@ -266,0 +289,1 @@ + @display.z=value if @display @@ -271,0 +295,1 @@ + return if disposed? @@ -272,0 +297,2 @@ + @display.dispose if @display + @display.bitmap.dispose if @display && @display.bitmap @@ -277,0 +304,1 @@ + @display.update if @display @@ -279,0 +307,7 @@ + @display=nil + if PokeBattle_Scene::USEFIGHTBOX + @display=Sprite.new(viewport) + @display.bitmap=BitmapCache.load_bitmap("Graphics/Pictures/fightbox.png") + @display.x=0 + @display.y=Graphics.height-96 + end @@ -284,0 +319,4 @@ + if PokeBattle_Scene::USEFIGHTBOX + @window.opacity=0 + @info.opacity=0 + end @@ -1011,0 +1050,2 @@ +USECOMMANDBOX=false # If true, expects a file named Graphics/Pictures/commandbox.png +USEFIGHTBOX=false # If true, expects a file named Graphics/Pictures/fightbox.png Changed: PokemonTrainers @@ -169,1 +169,1 @@ - Kernel.pbMessage(_INTL("The trainer type {1} was not found in the trainer data.",symbol)) + Kernel.pbMessage(_INTL("The trainer type {1} was not found in the trainer data.\1",symbol)) @@ -191,1 +191,1 @@ -def pbTrainerCheck(trainerid,trainername,maxbattles) +def pbTrainerCheck(trainerid,trainername,maxbattles,startBattleId=0) @@ -199,1 +199,1 @@ - trainer=pbLoadTrainer(trainerid,trainername,i) + trainer=pbLoadTrainer(trainerid,trainername,i+startBattleId) @@ -202,1 +202,1 @@ - traineridstring=getConstantName(PBTrainers,trainerid) rescue nil + traineridstring=getConstantName(PBTrainers,trainerid) rescue "-" @@ -216,1 +216,1 @@ - traineridstring=getConstantName(PBTrainers,trainerid) rescue nil + traineridstring=getConstantName(PBTrainers,trainerid) rescue "-" @@ -218,1 +218,5 @@ - Kernel.pbMessage(_INTL("Can't find trainer ({1}, {2}) in Trainer data file.\1",traineridstring,trainername)) + if trainerparty!=0 + Kernel.pbMessage(_INTL("Can't find trainer ({1}, {2}, ID {3}) in Trainer data file.\1",traineridstring,trainername,trainerparty)) + else + Kernel.pbMessage(_INTL("Can't find trainer ({1}, {2}) in Trainer data file.\1",traineridstring,trainername)) + end @@ -223,1 +227,1 @@ - raise _INTL("Can't find trainer ({1}, {2})",traineridstring,trainername) + raise _INTL("Can't find trainer ({1}, {2}, ID {3})",traineridstring,trainername,trainerparty) Changed: SpriteResizer @@ -498,6 +498,9 @@ - if @bordername!=nil && @bordername!="" - @borderbitmap.dispose if @borderbitmap - @borderbitmap=RPG::Cache.picture(@bordername) - @sprite.bitmap=@borderbitmap - else - @sprite.bitmap=@defaultbitmap + @sprite.bitmap=nil + if @sprite.visible + if @bordername!=nil && @bordername!="" + @borderbitmap.dispose if @borderbitmap + @borderbitmap=RPG::Cache.picture(@bordername) + @sprite.bitmap=@borderbitmap + else + @sprite.bitmap=@defaultbitmap + end Changed: PokemonTilesetEditor @@ -112,0 +112,1 @@ + Kernel.pbMessage(_INTL("To ensure that the changes remain, close and reopen RPGXP for best results.")) Changed: PokemonWeather @@ -39,0 +39,1 @@ + @origviewport=viewport @@ -65,0 +66,3 @@ + end + def ensureSprites + return if @sprites.length>=40 @@ -66,1 +70,1 @@ - sprite = Sprite.new(viewport) + sprite = Sprite.new(@origviewport) @@ -68,1 +72,0 @@ - sprite.visible = false @@ -70,0 +73,3 @@ + sprite.ox = @ox + sprite.oy = @oy + sprite.visible = (i <= @max) @@ -100,0 +106,7 @@ + if @type==0 + for sprite in @sprites + sprite.dispose + end + @sprites.clear + return + end @@ -101,0 +114,1 @@ + ensureSprites @@ -131,1 +145,7 @@ - for i in 1..40 + if @max==0 + for sprite in @sprites + sprite.dispose + end + @sprites.clear + else + for i in 1..40 @@ -136,0 +156,1 @@ + end @@ -171,0 +192,1 @@ + ensureSprites Changed: Compiler @@ -2498,0 +2498,4 @@ +def pbPushElse(list,indent=0) + list.push(RPG::EventCommand.new(0,indent,[])) + list.push(RPG::EventCommand.new(411,indent-1,[])) +end @@ -2543,1 +2547,6 @@ - map=pbLoadRxData(filename) + if $RPGVX + filename+=".rvdata" + else + filename+=".rxdata" + end + map=load_data(filename) @@ -2547,0 +2556,1 @@ + Graphics.update @@ -2548,1 +2558,0 @@ - Graphics.update @@ -2555,0 +2564,5 @@ + newevent=pbConvertToItemEvent(map.events[key]) + if newevent + changed=true + map.events[key]=newevent + end @@ -2557,0 +2571,58 @@ + end +end + +def pbConvertToItemEvent(event) + return nil if !event || event.pages.length==0 + ret=RPG::Event.new(event.x,event.y) + name=event.name + ret.name=event.name + ret.id=event.id + ret.pages=[] + itemid=nil + itemname="" + hidden=false + if name[/^HiddenItem\:\s*(\w+)\s*$/] + itemname=$1 + return nil if !hasConst?(PBItems,itemname) + itemid=PBItems.const_get(itemname) + ret.name="HiddenItem" + hidden=true + elsif name[/^Item\:\s*(\w+)\s*$/] + itemname=$1 + return nil if !hasConst?(PBItems,itemname) + itemid=PBItems.const_get(itemname) + ret.name="Item" + else + return nil + end + # Event page 1 + page=RPG::Event::Page.new + if !hidden + page.graphic.character_name="itemball.png" + end + page.list=[] + pbPushBranch(page.list, + sprintf("Kernel.pbItemBall(::PBItems::%s)",itemname)) + pbPushSelfSwitch(page.list,"A",true,1) + pbPushElse(page.list,1) + pbPushBranchEnd(page.list,1) + pbPushEnd(page.list) + ret.pages.push(page) + # Event page 2 + page=RPG::Event::Page.new + page.condition.self_switch_valid=true + page.condition.self_switch_ch="A" + ret.pages.push(page) + return ret +end + +def pbTrainerBattleCheck(trtype,trname,trid) + if $DEBUG + if trtype.is_a?(String) || trtype.is_a?(Symbol) + pbTrainerTypeCheck(trtype) + return false if !hasConst?(PBTrainers,trtype) + trtype=PBTrainers.const_get(trtype) + end + if !pbLoadTrainer(trtype,trname,trid) + pbMissingTrainer(trtype,trname,trid) + end @@ -2639,5 +2711,1 @@ - pbPushScript(firstpage.list,sprintf("Kernel.pbTrainerCheck(%s,%d)",safetrcombo,battles.length)) - # Run trainer check now, except in editor - if !$INEDITOR - pbTrainerCheck(trtype,trname,battles.length) - end + pbPushScript(firstpage.list,sprintf("Kernel.pbTrainerCheck(%s,%d,%d)",safetrcombo,battles.length,battleid)) @@ -2646,0 +2714,2 @@ + # Run trainer check now, except in editor + pbTrainerBattleCheck(trtype,trname,battleid) if !$INEDITOR @@ -2693,0 +2763,2 @@ + # Run trainer check now, except in editor + pbTrainerBattleCheck(trtype,trname,battleid+i) if !$INEDITOR @@ -2695,1 +2767,1 @@ - safetrcombo,safequote2(espeech),i),1 + safetrcombo,safequote2(espeech),battleid+i),1 Changed: PokemonTrainerCard @@ -22,0 +22,3 @@ + if $PokemonGlobal.trainerRecording + $PokemonGlobal.trainerRecording.play + end Changed: PokeBattle_BattlePalace @@ -352,0 +352,16 @@ + end +end + + +# Time Attack +class PokeBattle_Move_113 < PokeBattle_Move + def pbOnStartUse(attacker) + totalsec = Graphics.frame_count / Graphics.frame_rate + min = totalsec / 60 % 60 + time = min % 10 # Get the ones digit of the current playtime minutes + @calcbasedamage=[10,20,40,50,60, + 70,80,100,150,200][time] + return true + end + def pbBaseDamage(basedmg,attacker,opponent) + return @calcbasedamage Changed: Audio @@ -323,5 +323,9 @@ - if position==nil || position==0 - Kernel.Audio_bgm_play(name,volume,pitch,0) - else - Kernel.Audio_bgm_play(name,volume,pitch,position) - Kernel.Audio_bgm_fadein(500) + begin + if position==nil || position==0 + Kernel.Audio_bgm_play(name,volume,pitch,0) + else + Kernel.Audio_bgm_play(name,volume,pitch,position) + Kernel.Audio_bgm_fadein(500) + end + rescue Hangup + bgm_play(name,volume,pitch,position) Changed: PokemonEditor @@ -570,1 +570,36 @@ - ret=pbCommands2(enccmd,commands,-1) + enccmd.z=99999 + enccmd.visible=true + enccmd.commands=commands + enccmd.height=Graphics.height if enccmd.height>Graphics.height + enccmd.x=0 + enccmd.y=0 + enccmd.active=true + enccmd.index=0 + ret=0 + command=0 + loop do + Graphics.update + Input.update + enccmd.update + if Input.trigger?(Input::A) && indexes[enccmd.index]>=0 + if Kernel.pbConfirmMessage(_INTL("Delete the encounter type {1}?",commands[enccmd.index])) + enc[1][indexes[enccmd.index]]=nil + commands.delete_at(enccmd.index) + indexes.delete_at(enccmd.index) + enccmd.commands=commands + if enccmd.index>=enccmd.commands.length + enccmd.index=enccmd.commands.length + end + end + end + if Input.trigger?(Input::B) + command=-1 + break + end + if Input.trigger?(Input::C) || enccmd.doubleclick? + command=enccmd.index + break + end + end + ret=command + enccmd.active=false @@ -1067,1 +1102,1 @@ - def initialize(selmap) + def initialize(selmap,addGlobal=false) @@ -1073,0 +1108,1 @@ + @addGlobalOffset=(addGlobal) ? 1 : 0 @@ -1075,1 +1111,1 @@ - @index=i if @maps[i][0]==@selmap + @index=i+@addGlobalOffset if @maps[i][0]==@selmap @@ -1086,0 +1122,3 @@ + if @addGlobalOffset==1 + @commands.push(_INTL("[GLOBAL]")) + end @@ -1092,1 +1131,4 @@ - return (index<0) ? -1 : @maps[index][0] + if @addGlobalOffset==1 + return 0 if index==0 + end + return (index<0) ? -1 : @maps[index-@addGlobalOffset][0] @@ -1101,1 +1143,2 @@ - @sprite.bitmap=createMinimap(@maps[index][0]) + return if index==0 && @addGlobalOffset==1 + @sprite.bitmap=createMinimap(@maps[index-@addGlobalOffset][0]) Changed: PokemonMessages @@ -738,1 +738,0 @@ - Audio.se_play(pbGetDecisionSE) @@ -740,1 +739,1 @@ - ret=Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0,commands,cmdIfCancel) + ret=Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0,commands,cmdIfCancel,true) @@ -742,1 +741,1 @@ - Kernel.pbDisplayMessageFancy(msgwindow,message) + Kernel.pbDisplayMessageFancy(msgwindow,message,-1,-1,nil,nil,true) @@ -755,1 +754,1 @@ - Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0) + Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0,nil,nil,true) @@ -764,1 +763,1 @@ - Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0) + Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0,nil,nil,false) @@ -774,1 +773,1 @@ - Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0) + Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0,nil,nil,true) @@ -784,1 +783,1 @@ - Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0) + Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0,nil,nil,true) @@ -794,1 +793,1 @@ - Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0) + Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0,nil,nil,true) @@ -804,1 +803,1 @@ - Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0) + Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0,nil,nil,true) @@ -815,1 +814,1 @@ - Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0) + Kernel.pbDisplayMessageFancy(msgwindow,message,-1,0,nil,nil,true) @@ -984,0 +983,2 @@ +def pbRecord(arg); end + @@ -986,1 +987,1 @@ - delay=-1,msgCommands=nil,msgCommandsCancel=-1) + delay=-1,msgCommands=nil,msgCommandsCancel=-1,sound=false) @@ -1073,0 +1074,2 @@ + unformattedText=toUnformattedText(text) + startSE=sound ? pbGetDecisionSE : nil @@ -1079,0 +1082,3 @@ + elsif control=="se" && i==0 + startSE="Audio/SE/#{param}" + controls[i]=nil @@ -1094,0 +1100,1 @@ + Audio.se_play(startSE) if startSE @@ -1219,0 +1226,3 @@ + if $DEBUG && Input.trigger?(Input::F6) + pbRecord(unformattedText) + end Changed: SpriteWindow @@ -846,1 +846,1 @@ - @sprites[i].dispose + @sprites[i].dispose if @sprites[i] @@ -1110,0 +1110,1 @@ + haveskin=@_windowskin && !@_windowskin.disposed? @@ -1116,1 +1117,1 @@ - if @_windowskin && !@_windowskin.disposed? + if haveskin Changed: PokemonSystem @@ -122,4 +122,37 @@ - end -end - -set_trace_func(nil) + if trigger?(Input::F7) + pbDebugF7 + end + end +end +=begin +module Graphics + unless defined?(update_gs_grap) + class << Graphics + alias update_gs_grap update + end + end + def self.update + update_gs_grap + if Graphics.frame_count%10==0 + activesprites=0 + activeviewports=0 + activebitmaps=0 + activeplanes=0 + activewindows=0 + activetilemaps=0 + activetmsprites=0 + numsprites=ObjectSpace.each_object(Sprite){|o| activesprites+=1 if !o.disposed?} + numtmsprites=ObjectSpace.each_object(CustomTilemapSprite){|o| activetmsprites+=1 if !o.disposed?} + numviewports=ObjectSpace.each_object(Viewport){|o| activeviewports+=1; o.x rescue activeviewports-=1} + numbitmaps=ObjectSpace.each_object(Bitmap){|o| activebitmaps+=1 if !o.disposed?} + numplanes=ObjectSpace.each_object(Plane){|o| activeplanes+=1 if !o.disposed?} + numwindows=ObjectSpace.each_object(Window){|o| activewindows+=1 if !o.disposed?} + numtilemaps=ObjectSpace.each_object(TilemapLoader){|o| activetilemaps+=1 if !o.disposed?} + echoln sprintf("spr=%d,%d,%d vp=%d,%d bm=%d,%d p=%d,%d win=%d,%d tile=%d,%d", + numsprites,activesprites,activetmsprites,numviewports,activeviewports, + numbitmaps,activebitmaps,numplanes,activeplanes, + numwindows,activewindows,numtilemaps,activetilemaps) + end + end +end +=end @@ -129,0 +162,4 @@ + begin + debugBitmaps + rescue + end @@ -133,15 +170,0 @@ -module Input - unless defined?(update_KGC_ScreenCapture2) - class << Input - alias update_KGC_ScreenCapture2 update - end - end - def self.update - update_KGC_ScreenCapture2 - if trigger?(Input::F7) - pbDebugF7 - end - end -end - - @@ -149,0 +171,91 @@ + +class Bitmap + # Fast methods for retrieving bitmap data + RtlMoveMemory_pi = Win32API.new('kernel32', 'RtlMoveMemory', 'pii', 'i') + RtlMoveMemory_ip = Win32API.new('kernel32', 'RtlMoveMemory', 'ipi', 'i') + def setData(x) + RtlMoveMemory_ip.call(self.address, x, x.length) + end + def getData + data = "rgba" * width * height + RtlMoveMemory_pi.call(data, self.address, data.length) + return data + end + def swap32(x) + return ((x>>24)&0x000000FF)| + ((x>>8)&0x0000FF00)| + ((x<<8)&0x00FF0000)| + ((x<<24)&0xFF000000) + end + def saveToPng(filename) + bytes=[ + 0x89,0x50,0x4E,0x47,0x0D,0x0A,0x1A,0x0A, + 0x00,0x00,0x00,0x0D + ].pack("CCCCCCCCCCCC") + ihdr=[ + 0x49,0x48,0x44,0x52, + swap32(self.width), + swap32(self.height), + 0x08,0x06,0x00,0x00,0x00 + ].pack("CCCCVVCCCCC") + crc=Zlib::crc32(ihdr) + ihdr+=[swap32(crc)].pack("V") + bytesPerScan=self.width*4 + row=(self.height-1)*bytesPerScan + data=self.getData + width=self.width + x="" + while row>=0 + x+="\0" + thisRow=data[row,bytesPerScan] + i=0;while i=0x90 + start=i + break + end + end + finish=start + i=samples.length-1 + while i>=start + s=samples[i] + if s<0x70 || s>=0x90 + finish=i+1 + break + end + i-=1 + end + if finish==start + return 4 # Nothing was recorded + end + start=0 + finish=samples.length + wave=WaveData.new(rate,samples[start,finish-start]) + return wave + elsif bitssample==16 + samples=data.unpack("v*") + start=0 + for i in 0...samples.length + s=samples[i] + if s>0x1000 && s<0xF000 + start=i + break + end + end + finish=start + i=samples.length-1 + while i>=start + s=samples[i] + if s<0x1000 && s<0xF000 + finish=i+1 + break + end + i-=1 + end + if finish==start + return 4 # Nothing was recorded + end + start=0 + # Convert to 8-bit samples + for i in start...finish + samples[i]=((samples[i]-0x8000)>>8)&0xFF + end + finish=samples.length + return WaveData.new(rate,samples[start,finish-start]) + end + end + } + return 2 +end + +def getWaveDataUI(filename,deleteFile=false) + error=getWaveData(filename) + if deleteFile + begin + File.delete(filename) + rescue Errno::EINVAL, Errno::EACCES, Errno::ENOENT + end + end + if error==1 + Kernel.pbMessage(_INTL("The recorded data could not be found or saved.")) + elsif error==2 + Kernel.pbMessage(_INTL("The recorded data was in an invalid format.")) + elsif error==3 + Kernel.pbMessage(_INTL("The recorded data's format is not supported.")) + elsif error==4 + Kernel.pbMessage(_INTL("There was no sound in the recording. Please ensure that a microphone is attached to the computer and is ready.")) + else + Kernel.pbMessage(_INTL("Recording was successful.")) + return error + end + return nil +end + +MciSendString = Win32API.new('winmm','mciSendString','%w(p,p,l,l)','l') +MciErrorString = Win32API.new('winmm','mciGetErrorString','%w(l,p,l)','l') @@ -1194,2 +1391,44 @@ - MciSendString.call("open new type waveaudio alias RECORDER buffer 5",0,0,0) - MciSendString.call("record RECORDER overwrite",0,0,0) + MciSendString.call("open new type waveaudio alias RECORDER buffer 4",0,0,0) + MciSendString.call("set RECORDER channels 1",0,0,0) + retval=MciSendString.call("record RECORDER",0,0,0) + return retval +end + +def beginRecordUI + code=beginRecord + case code + when 0; return true + when 256+66 + Kernel.pbMessage(_INTL("All recording devices are in use. Recording is not possible now.")) + return false + when 256+72 + Kernel.pbMessage(_INTL("No supported recording device was found. Recording is not possible.")) + return false + else + buffer="\0"*256 + MciErrorString.call(code,buffer,256) + Kernel.pbMessage(_INTL("Recording failed: {1}",buffer.gsub(/\x00/,""))) + return false + end +end + + +def getRecorderSample + buffer="\0"*256 + ret=0 + MciSendString.call("stop RECORDER",0,0,0) + MciSendString.call("status RECORDER bitspersample",buffer,256,0) + bitspersample=buffer.to_i + MciSendString.call("status RECORDER level",buffer,256,0) + MciSendString.call("record RECORDER",0,0,0) + if bitspersample==8 + ret=buffer.to_i<<8 # max 128 + else + ret=buffer.to_i # max 0x8000 + end + return ret +end + +def stopRecord() + MciSendString.call("stop RECORDER",0,0,0) + MciSendString.call("close RECORDER",0,0,0) @@ -1200,1 +1439,3 @@ - MciSendString.call("save RECORDER #{file}",0,0,0) + if file && file!="" + MciSendString.call("save RECORDER #{file}",0,0,0) + end @@ -1203,0 +1444,14 @@ + +class PokemonGlobalMetadata + attr_accessor :trainerRecording +end + +def pbRecordTrainer + wave=pbRecord(nil,10) + if wave + $PokemonGlobal.trainerRecording=wave + return true + end + return false +end + @@ -1308,15 +1563,0 @@ -=begin -Kernel.pbMessage("Now recording.") -beginRecord -100.times do - Graphics.update -end -endRecord("record.wav") -if !FileTest.exist?("record.wav") - Kernel.pbMessage("Recording failed.") -else - Audio.se_play("record.wav") - Kernel.pbMessage("Recording finished.") -end -=end - Changed: PokeBattle_Battle @@ -875,4 +875,0 @@ - if @cantescape - pbDisplayPaused(_INTL("Can't escape!")) - return 0 - end @@ -883,0 +879,4 @@ + end + if @cantescape + pbDisplayPaused(_INTL("Can't escape!")) + return 0 @@ -1650,0 +1650,1 @@ + return 0 if battler.hp<=0 @@ -1666,0 +1667,3 @@ + return i if battler.hp<=(battler.totalhp*2/3).floor && + (battler.status>0 || battler.effects[PBEffects::Confusion]>0) && + (pbAIRandom(10)<2) @@ -1668,0 +1672,10 @@ + when PBItems::XATTACK + return i if !battler.pbTooHigh?(PBStats::ATTACK) + when PBItems::XDEFEND + return i if !battler.pbTooHigh?(PBStats::DEFENSE) + when PBItems::XSPEED + return i if !battler.pbTooHigh?(PBStats::SPEED) + when PBItems::XSPECIAL + return i if !battler.pbTooHigh?(PBStats::SPATK) + when PBItems::XACCURACY + return i if !battler.pbTooHigh?(PBStats::ACCURACY) @@ -1707,0 +1721,30 @@ + when PBItems::XATTACK + if !battler.pbTooHigh?(PBStats::ATTACK) + battler.stages[PBStats::ATTACK]+=1 + pbCommonAnimation("StatUp",battler,nil) + pbDisplayBrief(_INTL("{1}'s Attack rose!",battler.pbThis)) + end + when PBItems::XDEFEND + if !battler.pbTooHigh?(PBStats::DEFENSE) + battler.stages[PBStats::DEFENSE]+=1 + pbCommonAnimation("StatUp",battler,nil) + pbDisplayBrief(_INTL("{1}'s Defense rose!",battler.pbThis)) + end + when PBItems::XSPEED + if !battler.pbTooHigh?(PBStats::SPEED) + battler.stages[PBStats::SPEED]+=1 + pbCommonAnimation("StatUp",battler,nil) + pbDisplayBrief(_INTL("{1}'s Speed rose!",battler.pbThis)) + end + when PBItems::XSPECIAL + if !battler.pbTooHigh?(PBStats::SPATK) + battler.stages[PBStats::SPATK]+=1 + pbCommonAnimation("StatUp",battler,nil) + pbDisplayBrief(_INTL("{1}'s Special Attack rose!",battler.pbThis)) + end + when PBItems::XACCURACY + if !battler.pbTooHigh?(PBStats::ACCURACY) + battler.stages[PBStats::ACCURACY]+=1 + pbCommonAnimation("StatUp",battler,nil) + pbDisplayBrief(_INTL("{1}'s accuracy rose!",battler.pbThis)) + end Changed: PokemonDebug @@ -166,0 +166,1 @@ + f.write(sprintf("############\r\n")) @@ -838,1 +839,1 @@ - numtilemaps=ObjectSpace.each_object(Tilemap){|o| activetilemaps+=1 if !o.disposed?} + numtilemaps=ObjectSpace.each_object(TilemapLoader){|o| activetilemaps+=1 if !o.disposed?} Changed: TilemapXP Changed: Sprite_Picture Changed: Particle Engine Changed: PokemonDayCare Changed: PBIntl Changed: PokemonField Changed: TilemapLoader Changed: PokeBattle_ActualScene Changed: PokemonTrainers Changed: SpriteResizer Changed: PokemonTilesetEditor Changed: PokemonWeather Changed: Compiler Changed: PokemonTrainerCard Changed: PokeBattle_BattlePalace Changed: Audio Changed: PokemonEditor Changed: PokemonMessages Changed: SpriteWindow Changed: PokemonSystem Changed: PokemonUtilities Changed: PokeBattle_Battle Changed: PokemonDebug