diff --git a/Data/Scripts/001_Settings.rb b/Data/Scripts/001_Settings.rb index 5a183cf55..d8220f49f 100644 --- a/Data/Scripts/001_Settings.rb +++ b/Data/Scripts/001_Settings.rb @@ -254,6 +254,12 @@ module Settings [0, 52, 20, 14, "mapHiddenFaraday", false] ] + # Allow the player to fly to a known location directly from the Town Map. + # Checks will still be made for things like badges, dependent events, + # whether the player has a Pokemon in their party that knows Fly and + # whether the player is indoors. + CAN_FLY_FROM_TOWN_MAP = true + #============================================================================= # A list of maps used by roaming Pokémon. Each map has an array of other maps diff --git a/Data/Scripts/012_Overworld/004_Overworld_FieldMoves.rb b/Data/Scripts/012_Overworld/004_Overworld_FieldMoves.rb index 5108cfdbb..3edb5f54b 100644 --- a/Data/Scripts/012_Overworld/004_Overworld_FieldMoves.rb +++ b/Data/Scripts/012_Overworld/004_Overworld_FieldMoves.rb @@ -493,16 +493,7 @@ HiddenMoveHandlers::UseMove.add(:FLASH,proc { |move,pokemon| # Fly #=============================================================================== HiddenMoveHandlers::CanUseMove.add(:FLY,proc { |move,pkmn,showmsg| - next false if !pbCheckHiddenMoveBadge(Settings::BADGE_FOR_FLY,showmsg) - if $game_player.has_follower? - pbMessage(_INTL("It can't be used when you have someone with you.")) if showmsg - next false - end - if !$game_map.metadata&.outdoor_map - pbMessage(_INTL("Can't use that here.")) if showmsg - next false - end - next true + next pbCanFly?(pkmn, showmsg) }) HiddenMoveHandlers::UseMove.add(:FLY,proc { |move,pokemon| @@ -510,10 +501,37 @@ HiddenMoveHandlers::UseMove.add(:FLY,proc { |move,pokemon| pbMessage(_INTL("Can't use that here.")) next false end - if !pbHiddenMoveAnimation(pokemon) - pbMessage(_INTL("{1} used {2}!",pokemon.name,GameData::Move.get(move).name)) + pbFlyToNewLocation(pokemon) + next true +}) + +def pbCanFly?(pkmn = nil, showmsg = false) + return false if !$DEBUG && !pkmn && $Trainer.pokemon_party.none? { |poke| poke.hasMove?(:FLY) } + return false if !pbCheckHiddenMoveBadge(Settings::BADGE_FOR_FLY, showmsg) + if $game_player.has_follower? + pbMessage(_INTL("It can't be used when you have someone with you.")) if showmsg + return false end + if !$game_map.metadata&.outdoor_map + pbMessage(_INTL("Can't use that here.")) if showmsg + return false + end + return true +end + +def pbFlyToNewLocation(pkmn = nil, move = :FLY) + if !pkmn + fly_party = $Trainer.pokemon_party.select { |poke| poke.hasMove?(move) } + return false if fly_party.empty? && !$DEBUG + pkmn = fly_party[0] + end + if !pkmn || !pbHiddenMoveAnimation(pkmn) + name = !pkmn ? $Trainer.name : pkmn.name + pbMessage(_INTL("{1} used {2}!", name, GameData::Move.get(move).name)) + end + return false if !$PokemonTemp.flydata pbFadeOutIn { + pbSEPlay("Anim/Wind1") $game_temp.player_new_map_id = $PokemonTemp.flydata[0] $game_temp.player_new_x = $PokemonTemp.flydata[1] $game_temp.player_new_y = $PokemonTemp.flydata[2] @@ -522,10 +540,12 @@ HiddenMoveHandlers::UseMove.add(:FLY,proc { |move,pokemon| $scene.transfer_player $game_map.autoplay $game_map.refresh + yield if block_given? + pbWait(Graphics.frame_rate/4) } pbEraseEscapePoint - next true -}) + return true +end diff --git a/Data/Scripts/013_Items/002_Item_Effects.rb b/Data/Scripts/013_Items/002_Item_Effects.rb index 6669fc065..4a218fd8b 100644 --- a/Data/Scripts/013_Items/002_Item_Effects.rb +++ b/Data/Scripts/013_Items/002_Item_Effects.rb @@ -53,6 +53,11 @@ ItemHandlers::UseFromBag.add(:ITEMFINDER,proc { |item| ItemHandlers::UseFromBag.copy(:ITEMFINDER,:DOWSINGMCHN,:DOWSINGMACHINE) +ItemHandlers::UseFromBag.add(:TOWNMAP,proc { |item| + pbShowMap(-1, false) + next ($PokemonTemp.flydata ? 2 : 0) +}) + #=============================================================================== # ConfirmUseInField handlers # Return values: true/false @@ -302,8 +307,13 @@ ItemHandlers::UseInField.add(:ITEMFINDER,proc { |item| ItemHandlers::UseInField.copy(:ITEMFINDER,:DOWSINGMCHN,:DOWSINGMACHINE) ItemHandlers::UseInField.add(:TOWNMAP,proc { |item| - pbShowMap(-1,false) - next true + ret = false + if !$PokemonTemp.flydata + pbShowMap(-1, false) + ret = !$PokemonTemp.flydata.nil? + end + pbFlyToNewLocation + next ret }) ItemHandlers::UseInField.add(:COINCASE,proc { |item| diff --git a/Data/Scripts/016_UI/001_UI_PauseMenu.rb b/Data/Scripts/016_UI/001_UI_PauseMenu.rb index 5b8c23f10..43a038973 100644 --- a/Data/Scripts/016_UI/001_UI_PauseMenu.rb +++ b/Data/Scripts/016_UI/001_UI_PauseMenu.rb @@ -110,6 +110,7 @@ class PokemonPauseMenu cmdSave = -1 cmdOption = -1 cmdPokegear = -1 + cmdTownMap = -1 cmdDebug = -1 cmdQuit = -1 cmdEndGame = -1 @@ -119,6 +120,8 @@ class PokemonPauseMenu commands[cmdPokemon = commands.length] = _INTL("Pokémon") if $Trainer.party_count > 0 commands[cmdBag = commands.length] = _INTL("Bag") if !pbInBugContest? commands[cmdPokegear = commands.length] = _INTL("Pokégear") if $Trainer.has_pokegear + # Any reasonable game will have either have the Town Map as an item or in the Pokegear. Never both at once. + commands[cmdTownMap = commands.length] = _INTL("Town Map") if $PokemonBag.pbHasItem?(:TOWNMAP) && !$Trainer.has_pokegear commands[cmdTrainer = commands.length] = $Trainer.name if pbInSafari? if Settings::SAFARI_STEPS <= 0 @@ -207,8 +210,19 @@ class PokemonPauseMenu scene = PokemonPokegear_Scene.new screen = PokemonPokegearScreen.new(scene) screen.pbStartScreen - @scene.pbRefresh + ($PokemonTemp.flydata) ? @scene.pbEndScene : @scene.pbRefresh } + if pbFlyToNewLocation + $game_temp.in_menu = false + return + end + elsif cmdTownMap>=0 && command==cmdTownMap + pbShowMap(-1, false) + ($PokemonTemp.flydata) ? @scene.pbEndScene : @scene.pbRefresh + if pbFlyToNewLocation + $game_temp.in_menu = false + return + end elsif cmdTrainer>=0 && command==cmdTrainer pbPlayDecisionSE pbFadeOutIn { diff --git a/Data/Scripts/016_UI/008_UI_Pokegear.rb b/Data/Scripts/016_UI/008_UI_Pokegear.rb index 248671f94..c7cae7a16 100644 --- a/Data/Scripts/016_UI/008_UI_Pokegear.rb +++ b/Data/Scripts/016_UI/008_UI_Pokegear.rb @@ -140,6 +140,7 @@ class PokemonPokegearScreen break elsif cmdMap>=0 && cmd==cmdMap pbShowMap(-1,false) + break if $PokemonTemp.flydata elsif cmdPhone>=0 && cmd==cmdPhone pbFadeOutIn { PokemonPhoneScene.new.start diff --git a/Data/Scripts/016_UI/009_UI_RegionMap.rb b/Data/Scripts/016_UI/009_UI_RegionMap.rb index 5b797847c..21a73bb93 100644 --- a/Data/Scripts/016_UI/009_UI_RegionMap.rb +++ b/Data/Scripts/016_UI/009_UI_RegionMap.rb @@ -2,56 +2,49 @@ # #=============================================================================== class MapBottomSprite < SpriteWrapper - attr_reader :mapname - attr_reader :maplocation + attr_reader :mapname, :maplocation - def initialize(viewport=nil) + def initialize(viewport = nil) super(viewport) @mapname = "" @maplocation = "" @mapdetails = "" - @thisbitmap = BitmapWrapper.new(Graphics.width,Graphics.height) - pbSetSystemFont(@thisbitmap) - self.x = 0 - self.y = 0 - self.bitmap = @thisbitmap + @thisbitmap = BitmapWrapper.new(Graphics.width, Graphics.height) + self.bitmap = BitmapWrapper.new(Graphics.width, Graphics.height) + pbSetSystemFont(self.bitmap) refresh end - def dispose - @thisbitmap.dispose - super - end - def mapname=(value) - if @mapname!=value + if @mapname != value @mapname = value refresh end end def maplocation=(value) - if @maplocation!=value + if @maplocation != value @maplocation = value refresh end end - def mapdetails=(value) # From Wichu - if @mapdetails!=value + # From Wichu + def mapdetails=(value) + if @mapdetails != value @mapdetails = value refresh end end def refresh - self.bitmap.clear + bitmap.clear textpos = [ - [@mapname,18,-8,0,Color.new(248,248,248),Color.new(0,0,0)], - [@maplocation,18,348,0,Color.new(248,248,248),Color.new(0,0,0)], - [@mapdetails,Graphics.width-16,348,1,Color.new(248,248,248),Color.new(0,0,0)] + [@mapname, 18, -8, 0, Color.new(248, 248, 248), Color.new(0, 0, 0)], + [@maplocation, 18, 348, 0, Color.new(248, 248, 248), Color.new(0, 0, 0)], + [@mapdetails, Graphics.width - 16, 348, 1, Color.new(248, 248, 248), Color.new(0, 0, 0)] ] - pbDrawTextPositions(self.bitmap,textpos) + pbDrawTextPositions(bitmap, textpos) end end @@ -59,14 +52,14 @@ end # #=============================================================================== class PokemonRegionMap_Scene - LEFT = 0 - TOP = 0 - RIGHT = 29 - BOTTOM = 19 - SQUAREWIDTH = 16 - SQUAREHEIGHT = 16 + LEFT = 0 + TOP = 0 + RIGHT = 29 + BOTTOM = 19 + SQUARE_WIDTH = 16 + SQUARE_HEIGHT = 16 - def initialize(region=-1,wallmap=true) + def initialize(region =- 1, wallmap = true) @region = region @wallmap = wallmap end @@ -75,105 +68,112 @@ class PokemonRegionMap_Scene pbUpdateSpriteHash(@sprites) end - def pbStartScene(aseditor=false,mode=0) - @editor = aseditor - @viewport = Viewport.new(0,0,Graphics.width,Graphics.height) + def pbStartScene(as_editor = false, fly_map = false) + @editor = as_editor + @viewport = Viewport.new(0, 0, Graphics.width, Graphics.height) @viewport.z = 99999 @sprites = {} - @mapdata = pbLoadTownMapData - map_metadata = $game_map.metadata - playerpos = (map_metadata) ? map_metadata.town_map_position : nil + @map_data = pbLoadTownMapData + @fly_map = fly_map + @mode = fly_map ? 1 : 0 + map_metadata = GameData::MapMetadata.try_get($game_map.map_id) + playerpos = map_metadata ? map_metadata.town_map_position : nil if !playerpos mapindex = 0 - @map = @mapdata[0] - @mapX = LEFT - @mapY = TOP - elsif @region>=0 && @region!=playerpos[0] && @mapdata[@region] + @map = @map_data[0] + @map_x = LEFT + @map_y = TOP + elsif @region >= 0 && @region != playerpos[0] && @map_data[@region] mapindex = @region - @map = @mapdata[@region] - @mapX = LEFT - @mapY = TOP + @map = @map_data[@region] + @map_x = LEFT + @map_y = TOP else mapindex = playerpos[0] - @map = @mapdata[playerpos[0]] - @mapX = playerpos[1] - @mapY = playerpos[2] + @map = @map_data[playerpos[0]] + @map_x = playerpos[1] + @map_y = playerpos[2] mapsize = map_metadata.town_map_size - if mapsize && mapsize[0] && mapsize[0]>0 + if mapsize && mapsize[0] && mapsize[0] > 0 sqwidth = mapsize[0] - sqheight = (mapsize[1].length*1.0/mapsize[0]).ceil - if sqwidth>1 - @mapX += ($game_player.x*sqwidth/$game_map.width).floor - end - if sqheight>1 - @mapY += ($game_player.y*sqheight/$game_map.height).floor - end + sqheight = (mapsize[1].length * 1.0 / mapsize[0]).ceil + @map_x += ($game_player.x * sqwidth / $game_map.width).floor if sqwidth > 1 + @map_y += ($game_player.y * sqheight / $game_map.height).floor if sqheight > 1 end end - if !@map + unless @map pbMessage(_INTL("The map data cannot be found.")) return false end - addBackgroundOrColoredPlane(@sprites,"background","mapbg",Color.new(0,0,0),@viewport) - @sprites["map"] = IconSprite.new(0,0,@viewport) + addBackgroundOrColoredPlane(@sprites, "background", "mapbg", Color.new(0, 0, 0), @viewport) + @sprites["map"] = IconSprite.new(0, 0, @viewport) @sprites["map"].setBitmap("Graphics/Pictures/#{@map[1]}") - @sprites["map"].x += (Graphics.width-@sprites["map"].bitmap.width)/2 - @sprites["map"].y += (Graphics.height-@sprites["map"].bitmap.height)/2 - for hidden in Settings::REGION_MAP_EXTRAS - if hidden[0]==mapindex && ((@wallmap && hidden[5]) || - (!@wallmap && hidden[1]>0 && $game_switches[hidden[1]])) - if !@sprites["map2"] - @sprites["map2"] = BitmapSprite.new(480,320,@viewport) - @sprites["map2"].x = @sprites["map"].x - @sprites["map2"].y = @sprites["map"].y - end - pbDrawImagePositions(@sprites["map2"].bitmap,[ - ["Graphics/Pictures/#{hidden[4]}",hidden[2]*SQUAREWIDTH,hidden[3]*SQUAREHEIGHT] - ]) + @sprites["map"].x += (Graphics.width - @sprites["map"].bitmap.width) / 2 + @sprites["map"].y += (Graphics.height - @sprites["map"].bitmap.height) / 2 + Settings::REGION_MAP_EXTRAS.each do |hidden| + next unless hidden[0] == mapindex && ((@wallmap && hidden[5]) || location_hidden?(hidden[1])) + unless @sprites["map2"] + @sprites["map2"] = BitmapSprite.new(480, 320, @viewport) + @sprites["map2"].x = @sprites["map"].x + @sprites["map2"].y = @sprites["map"].y end + pbDrawImagePositions(@sprites["map2"].bitmap, [ + ["Graphics/Pictures/#{hidden[4]}", hidden[2] * SQUARE_WIDTH, hidden[3] * SQUARE_HEIGHT] + ]) end @sprites["mapbottom"] = MapBottomSprite.new(@viewport) - @sprites["mapbottom"].mapname = pbGetMessage(MessageTypes::RegionNames,mapindex) - @sprites["mapbottom"].maplocation = pbGetMapLocation(@mapX,@mapY) - @sprites["mapbottom"].mapdetails = pbGetMapDetails(@mapX,@mapY) - if playerpos && mapindex==playerpos[0] - @sprites["player"] = IconSprite.new(0,0,@viewport) + @sprites["mapbottom"].mapname = pbGetMessage(MessageTypes::RegionNames, mapindex) + @sprites["mapbottom"].maplocation = pbGetMapLocation(@map_x, @map_y) + @sprites["mapbottom"].mapdetails = pbGetMapDetails(@map_x, @map_y) + if playerpos && mapindex == playerpos[0] + @sprites["player"] = IconSprite.new(0, 0, @viewport) @sprites["player"].setBitmap(GameData::TrainerType.player_map_icon_filename($Trainer.trainer_type)) - @sprites["player"].x = -SQUAREWIDTH/2+(@mapX*SQUAREWIDTH)+(Graphics.width-@sprites["map"].bitmap.width)/2 - @sprites["player"].y = -SQUAREHEIGHT/2+(@mapY*SQUAREHEIGHT)+(Graphics.height-@sprites["map"].bitmap.height)/2 + @sprites["player"].x = get_x_coord_on_grid(@map_x) + @sprites["player"].y = get_y_coord_on_grid(@map_y) end - if mode>0 - k = 0 - for i in LEFT..RIGHT - for j in TOP..BOTTOM - healspot = pbGetHealingSpot(i,j) - if healspot && $PokemonGlobal.visitedMaps[healspot[0]] - @sprites["point#{k}"] = AnimatedSprite.create("Graphics/Pictures/mapFly",2,16) - @sprites["point#{k}"].viewport = @viewport - @sprites["point#{k}"].x = -SQUAREWIDTH/2+(i*SQUAREWIDTH)+(Graphics.width-@sprites["map"].bitmap.width)/2 - @sprites["point#{k}"].y = -SQUAREHEIGHT/2+(j*SQUAREHEIGHT)+(Graphics.height-@sprites["map"].bitmap.height)/2 - @sprites["point#{k}"].play - k += 1 - end - end + k = 0 + (LEFT..RIGHT).each do |i| + (TOP..BOTTOM).each do |j| + healspot = pbGetHealingSpot(i, j) + next unless healspot && $PokemonGlobal.visitedMaps[healspot[0]] + @sprites["point#{k}"] = AnimatedSprite.create("Graphics/Pictures/mapFly", 2, 16) + @sprites["point#{k}"].viewport = @viewport + @sprites["point#{k}"].x = get_x_coord_on_grid(i) + @sprites["point#{k}"].y = get_y_coord_on_grid(j) + @sprites["point#{k}"].visible = @mode == 1 + @sprites["point#{k}"].play + k += 1 end end - @sprites["cursor"] = AnimatedSprite.create("Graphics/Pictures/mapCursor",2,5) + @sprites["cursor"] = AnimatedSprite.create("Graphics/Pictures/mapCursor", 2, 5) @sprites["cursor"].viewport = @viewport - @sprites["cursor"].x = -SQUAREWIDTH/2+(@mapX*SQUAREWIDTH)+(Graphics.width-@sprites["map"].bitmap.width)/2 - @sprites["cursor"].y = -SQUAREHEIGHT/2+(@mapY*SQUAREHEIGHT)+(Graphics.height-@sprites["map"].bitmap.height)/2 + @sprites["cursor"].x = get_x_coord_on_grid(@map_x) + @sprites["cursor"].y = get_y_coord_on_grid(@map_y) @sprites["cursor"].play + @sprites["help"] = BitmapSprite.new(Graphics.width, 28, @viewport) + refresh_fly_screen @changed = false pbFadeInAndShow(@sprites) { pbUpdate } - return true + end + + def get_x_coord_on_grid(x) + return -SQUARE_WIDTH / 2 + (x * SQUARE_WIDTH) + (Graphics.width - @sprites["map"].bitmap.width) / 2 + end + + def get_y_coord_on_grid(y) + return -SQUARE_HEIGHT / 2 + (y * SQUARE_HEIGHT) + (Graphics.height - @sprites["map"].bitmap.height) / 2 + end + + def location_hidden?(loc) + return !@wallmap && loc.is_a?(Integer) && loc >0 && $game_switches[loc] end # TODO: Why is this PBS file writer here? def pbSaveMapData File.open("PBS/town_map.txt","wb") { |f| Compiler.add_PBS_header_to_file(f) - for i in 0...@mapdata.length - map = @mapdata[i] + for i in 0...@map_data.length + map = @map_data[i] next if !map f.write("\#-------------------------------\r\n") f.write(sprintf("[%d]\r\n",i)) @@ -194,39 +194,31 @@ class PokemonRegionMap_Scene @viewport.dispose end - def pbGetMapLocation(x,y) - return "" if !@map[2] - for loc in @map[2] - if loc[0]==x && loc[1]==y - if !loc[7] || (!@wallmap && $game_switches[loc[7]]) - maploc = pbGetMessageFromHash(MessageTypes::PlaceNames,loc[2]) - return @editor ? loc[2] : maploc - else - return "" - end + def pbGetMapLocation(x, y) + return "" unless @map[2] + maps = @map[2].select { |loc| loc[0] == x && loc[1] == y } + return "" if maps.empty? + maps.each do |loc| + if !location_hidden?(loc[7]) + maploc = pbGetMessageFromHash(MessageTypes::PlaceNames, loc[2]) + return @editor ? loc[2] : maploc + else + return "" end end - return "" end def pbChangeMapLocation(x,y) - return if !@editor - return "" if !@map[2] - currentname = "" - currentobj = nil - for loc in @map[2] - if loc[0]==x && loc[1]==y - currentobj = loc - currentname = loc[2] - break - end - end - currentname = pbMessageFreeText(_INTL("Set the name for this point."),currentname,false,250) { pbUpdate } + return "" unless @editor && @map[2] + map = @map[2].select { |loc| loc[0] == x && loc[1] == y }[0] + currentobj = map + currentname = map[2] + currentname = pbMessageFreeText(_INTL("Set the name for this point."), currentname, false, 250) { pbUpdate } if currentname if currentobj currentobj[2] = currentname else - newobj = [x,y,currentname,""] + newobj = [x, y, currentname, ""] @map[2].push(newobj) end @changed = true @@ -234,107 +226,112 @@ class PokemonRegionMap_Scene end def pbGetMapDetails(x,y) # From Wichu, with my help - return "" if !@map[2] - for loc in @map[2] - if loc[0]==x && loc[1]==y - if !loc[7] || (!@wallmap && $game_switches[loc[7]]) - mapdesc = pbGetMessageFromHash(MessageTypes::PlaceDescriptions,loc[3]) - return (@editor) ? loc[3] : mapdesc - else - return "" - end + return "" unless @map[2] + maps = @map[2].select { |loc| loc[0] == x && loc[1] == y } + return "" if maps.empty? + maps.each do |loc| + if !location_hidden?(loc[7]) + mapdesc = pbGetMessageFromHash(MessageTypes::PlaceDescriptions,loc[3]) + return (@editor) ? loc[3] : mapdesc + else + return "" end end - return "" end def pbGetHealingSpot(x,y) - return nil if !@map[2] - for loc in @map[2] - if loc[0]==x && loc[1]==y - if !loc[4] || !loc[5] || !loc[6] - return nil - else - return [loc[4],loc[5],loc[6]] - end - end + return nil unless @map[2] + maps = @map[2].select { |loc| loc[0] == x && loc[1] == y } + return nil if maps.empty? + maps.each do |loc| + return ((loc[4] && loc[5] && loc[6]) ? [loc[4],loc[5],loc[6]] : nil) end - return nil end - def pbMapScene(mode=0) - xOffset = 0 - yOffset = 0 - newX = 0 - newY = 0 - @sprites["cursor"].x = -SQUAREWIDTH/2+(@mapX*SQUAREWIDTH)+(Graphics.width-@sprites["map"].bitmap.width)/2 - @sprites["cursor"].y = -SQUAREHEIGHT/2+(@mapY*SQUAREHEIGHT)+(Graphics.height-@sprites["map"].bitmap.height)/2 + def refresh_fly_screen + return if @fly_map || !pbCanFly? || !Settings::CAN_FLY_FROM_TOWN_MAP + @sprites["help"].bitmap.clear + pbSetSystemFont(@sprites["help"].bitmap) + text = @mode == 0 ? _INTL("ACTION: Open Fly Menu") : _INTL("ACTION: Close Fly Menu") + pbDrawTextPositions(@sprites["help"].bitmap, [[text, Graphics.width - 8, -8, 1, Color.new(248,248,248), Color.new(0,0,0)]]) + @sprites.each do |key, sprite| + next if !key.include?("point") + sprite.visible = @mode == 1 + sprite.frame = 0 + end + end + + def pbMapScene + x_offset = 0 + y_offset = 0 + new_x = 0 + new_y = 0 + dist_per_frame = 8 * 20 / Graphics.frame_rate loop do Graphics.update Input.update pbUpdate - if xOffset!=0 || yOffset!=0 - distancePerFrame = 8*20/Graphics.frame_rate - xOffset += (xOffset>0) ? -distancePerFrame : (xOffset<0) ? distancePerFrame : 0 - yOffset += (yOffset>0) ? -distancePerFrame : (yOffset<0) ? distancePerFrame : 0 - @sprites["cursor"].x = newX-xOffset - @sprites["cursor"].y = newY-yOffset + if x_offset != 0 || y_offset != 0 + x_offset += (x_offset > 0) ? -dist_per_frame : (x_offset < 0) ? dist_per_frame : 0 + y_offset += (y_offset > 0) ? -dist_per_frame : (y_offset < 0) ? dist_per_frame : 0 + @sprites["cursor"].x = new_x - x_offset + @sprites["cursor"].y = new_y - y_offset next end - @sprites["mapbottom"].maplocation = pbGetMapLocation(@mapX,@mapY) - @sprites["mapbottom"].mapdetails = pbGetMapDetails(@mapX,@mapY) ox = 0 oy = 0 case Input.dir8 when 1 # lower left - oy = 1 if @mapYLEFT + oy = 1 if @map_y < BOTTOM + ox = -1 if @map_x > LEFT when 2 # down - oy = 1 if @mapYLEFT + ox = -1 if @map_x > LEFT when 6 # right - ox = 1 if @mapXTOP - ox = -1 if @mapX>LEFT + oy = -1 if @map_y > TOP + ox = -1 if @map_x > LEFT when 8 # up - oy = -1 if @mapY>TOP + oy = -1 if @map_y > TOP when 9 # upper right - oy = -1 if @mapY>TOP - ox = 1 if @mapX TOP + ox = 1 if @map_x < RIGHT end - if ox!=0 || oy!=0 - @mapX += ox - @mapY += oy - xOffset = ox*SQUAREWIDTH - yOffset = oy*SQUAREHEIGHT - newX = @sprites["cursor"].x+xOffset - newY = @sprites["cursor"].y+yOffset + if ox != 0 || oy != 0 + @map_x += ox + @map_y += oy + x_offset = ox * SQUARE_WIDTH + y_offset = oy * SQUARE_HEIGHT + new_x = @sprites["cursor"].x + x_offset + new_y = @sprites["cursor"].y + y_offset end + @sprites["mapbottom"].maplocation = pbGetMapLocation(@map_x, @map_y) + @sprites["mapbottom"].mapdetails = pbGetMapDetails(@map_x, @map_y) if Input.trigger?(Input::BACK) if @editor && @changed - if pbConfirmMessage(_INTL("Save changes?")) { pbUpdate } - pbSaveMapData - end - if pbConfirmMessage(_INTL("Exit from the map?")) { pbUpdate } - break - end + pbSaveMapData if pbConfirmMessage(_INTL("Save changes?")) { pbUpdate } + break if pbConfirmMessage(_INTL("Exit from the map?")) { pbUpdate } else break end - elsif Input.trigger?(Input::USE) && mode==1 # Choosing an area to fly to - healspot = pbGetHealingSpot(@mapX,@mapY) - if healspot - if $PokemonGlobal.visitedMaps[healspot[0]] || ($DEBUG && Input.press?(Input::CTRL)) - return healspot - end + elsif Input.trigger?(Input::USE) && @mode == 1 # Choosing an area to fly to + healspot = pbGetHealingSpot(@map_x, @map_y) + if healspot && + ($PokemonGlobal.visitedMaps[healspot[0]] || ($DEBUG && Input.press?(Input::CTRL))) + name = pbGetMapNameFromId(healspot[0]) + return healspot if @fly_map || pbConfirmMessage(_INTL("Would you like to fly to {1}?", name)) { pbUpdate } end elsif Input.trigger?(Input::USE) && @editor # Intentionally after other USE input check - pbChangeMapLocation(@mapX,@mapY) + pbChangeMapLocation(@map_x, @map_y) + elsif Input.trigger?(Input::ACTION) && !@wallmap && !@fly_map && pbCanFly? + pbPlayDecisionSE + @mode = (@mode == 1 ? 0 : 1) + refresh_fly_screen end end pbPlayCloseMenuSE @@ -351,26 +348,28 @@ class PokemonRegionMapScreen end def pbStartFlyScreen - @scene.pbStartScene(false,1) - ret = @scene.pbMapScene(1) + @scene.pbStartScene(false, true) + ret = @scene.pbMapScene @scene.pbEndScene return ret end def pbStartScreen @scene.pbStartScene($DEBUG) - @scene.pbMapScene + ret = @scene.pbMapScene @scene.pbEndScene + return ret end end #=============================================================================== # #=============================================================================== -def pbShowMap(region=-1,wallmap=true) +def pbShowMap(region = -1, wallmap = true) pbFadeOutIn { - scene = PokemonRegionMap_Scene.new(region,wallmap) + scene = PokemonRegionMap_Scene.new(region, wallmap) screen = PokemonRegionMapScreen.new(scene) - screen.pbStartScreen + ret = screen.pbStartScreen + $PokemonTemp.flydata = ret if ret && !wallmap } end diff --git a/Data/Scripts/Gen 8 notes.txt b/Data/Scripts/Gen 8 notes.txt index cc5476d7b..face03194 100644 --- a/Data/Scripts/Gen 8 notes.txt +++ b/Data/Scripts/Gen 8 notes.txt @@ -8,9 +8,6 @@ Other notes: - If a battle ends because of Rocky Helmet damage, the side that the Rocky Helmet holder is on should lose (Gen 7+) or win (Gen 6-). -Can use Fly from within the Town Map if possible. (Good QoL, add if possible.) -(Will be implemented by me in the next PR) - Make example event that combines the Gen 8 fossils. #=============================================================================== @@ -24,8 +21,6 @@ toggled. (Probably don't bother implementing.) Bicycle that can work on water. -Town Map added to the pause menu. (Don't bother adding.) - Remote access to storage boxes via the party screen if you have the Pokémon Box Link item (and it's allowed to be used - in Gyms and some other places it's forbidden). @@ -92,6 +87,10 @@ New evolution methods: Added AI for new moves/items/abilities. +Can use Fly from within the Town Map if possible. + +Town Map added to the pause menu. + Ability Effect Changes - Intimidate now triggers Rattled. Rattled needs a new ability handler just for triggering this way.