From e7d116780fc9a35f9c09a8f983ee7b69502f0fdf Mon Sep 17 00:00:00 2001 From: Maruno17 Date: Wed, 19 May 2021 20:25:51 +0100 Subject: [PATCH] Removed alternate map rendering code --- Data/Scripts/001_Settings.rb | 2 - .../004_Game classes/008_Game_Event.rb | 1 - .../005_Sprites/003_Sprite_Character.rb | 3 +- Data/Scripts/005_Sprites/007_Spriteset_Map.rb | 15 +- .../005_Sprites/008_Sprite_AnimationSprite.rb | 12 +- .../005_Sprites/013_ScreenPosHelper.rb | 43 ++ .../006_Map renderer/001_TilemapLoader.rb | 15 +- ...002_Tilemap_XP.rb => 002_CustomTilemap.rb} | 0 ...wingHelper.rb => 003_TileDrawingHelper.rb} | 30 -- .../003_Tilemap_Perspective.rb | 386 ------------------ .../006_Map renderer/004_Tilemap_Original.rb | 117 ------ Data/Scripts/016_UI/015_UI_Options.rb | 2 - 12 files changed, 51 insertions(+), 575 deletions(-) create mode 100644 Data/Scripts/005_Sprites/013_ScreenPosHelper.rb rename Data/Scripts/006_Map renderer/{002_Tilemap_XP.rb => 002_CustomTilemap.rb} (100%) rename Data/Scripts/006_Map renderer/{005_TileDrawingHelper.rb => 003_TileDrawingHelper.rb} (89%) delete mode 100644 Data/Scripts/006_Map renderer/003_Tilemap_Perspective.rb delete mode 100644 Data/Scripts/006_Map renderer/004_Tilemap_Original.rb diff --git a/Data/Scripts/001_Settings.rb b/Data/Scripts/001_Settings.rb index 02ddda3b0..df79a7a76 100644 --- a/Data/Scripts/001_Settings.rb +++ b/Data/Scripts/001_Settings.rb @@ -24,8 +24,6 @@ module Settings SCREEN_HEIGHT = 384 # The default screen scale factor. Possible values are 0.5, 1.0, 1.5 and 2.0. SCREEN_SCALE = 1.0 - # Map view mode (0=original, 1=custom, 2=perspective). - MAP_VIEW_MODE = 1 #============================================================================= diff --git a/Data/Scripts/004_Game classes/008_Game_Event.rb b/Data/Scripts/004_Game classes/008_Game_Event.rb index d899b7f3e..40965fdc3 100644 --- a/Data/Scripts/004_Game classes/008_Game_Event.rb +++ b/Data/Scripts/004_Game classes/008_Game_Event.rb @@ -244,7 +244,6 @@ class Game_Event < Game_Character def should_update?(recalc=false) return @to_update if !recalc - return true if $PokemonSystem.tilemap==2 return true if @trigger && (@trigger == 3 || @trigger == 4) return true if @move_route_forcing return true if @event.name[/update/i] diff --git a/Data/Scripts/005_Sprites/003_Sprite_Character.rb b/Data/Scripts/005_Sprites/003_Sprite_Character.rb index 584d668c4..3b2254a9f 100644 --- a/Data/Scripts/005_Sprites/003_Sprite_Character.rb +++ b/Data/Scripts/005_Sprites/003_Sprite_Character.rb @@ -148,8 +148,7 @@ class Sprite_Character < RPG::Sprite self.oy -= @character.bob_height end if self.visible - if $PokemonSystem.tilemap == 0 || - (@character.is_a?(Game_Event) && @character.name[/regulartone/i]) + if @character.is_a?(Game_Event) && @character.name[/regulartone/i] self.tone.set(0, 0, 0, 0) else pbDayNightTint(self) diff --git a/Data/Scripts/005_Sprites/007_Spriteset_Map.rb b/Data/Scripts/005_Sprites/007_Spriteset_Map.rb index 99375fa3a..ac0f1490e 100644 --- a/Data/Scripts/005_Sprites/007_Spriteset_Map.rb +++ b/Data/Scripts/005_Sprites/007_Spriteset_Map.rb @@ -114,18 +114,9 @@ class Spriteset_Map tmoy = (@map.display_y/Game_Map::Y_SUBPIXELS).round @tilemap.ox = tmox @tilemap.oy = tmoy - if $PokemonSystem.tilemap==0 # Original Map View only, to prevent wrapping - @@viewport1.rect.x = [-tmox,0].max - @@viewport1.rect.y = [-tmoy,0].max - @@viewport1.rect.width = [@tilemap.map_data.xsize*Game_Map::TILE_WIDTH-tmox,Graphics.width].min - @@viewport1.rect.height = [@tilemap.map_data.ysize*Game_Map::TILE_HEIGHT-tmoy,Graphics.height].min - @@viewport1.ox = [-tmox,0].max - @@viewport1.oy = [-tmoy,0].max - else - @@viewport1.rect.set(0,0,Graphics.width,Graphics.height) - @@viewport1.ox = 0 - @@viewport1.oy = 0 - end + @@viewport1.rect.set(0,0,Graphics.width,Graphics.height) + @@viewport1.ox = 0 + @@viewport1.oy = 0 @@viewport1.ox += $game_screen.shake @tilemap.update @panorama.ox = tmox/2 diff --git a/Data/Scripts/005_Sprites/008_Sprite_AnimationSprite.rb b/Data/Scripts/005_Sprites/008_Sprite_AnimationSprite.rb index 15965348c..a39f0c485 100644 --- a/Data/Scripts/005_Sprites/008_Sprite_AnimationSprite.rb +++ b/Data/Scripts/005_Sprites/008_Sprite_AnimationSprite.rb @@ -76,16 +76,8 @@ class Spriteset_Map def update return if @tilemap.disposed? - if $PokemonSystem.tilemap==0 - if self.map==$game_map - pbDayNightTint(@@viewport3) - else - @@viewport3.tone.set(0,0,0,0) - end - else - pbDayNightTint(@tilemap) - @@viewport3.tone.set(0,0,0,0) - end + pbDayNightTint(@tilemap) + @@viewport3.tone.set(0,0,0,0) _animationSprite_update for i in 0...@usersprites.length @usersprites[i].update if !@usersprites[i].disposed? diff --git a/Data/Scripts/005_Sprites/013_ScreenPosHelper.rb b/Data/Scripts/005_Sprites/013_ScreenPosHelper.rb new file mode 100644 index 000000000..418bbd9bf --- /dev/null +++ b/Data/Scripts/005_Sprites/013_ScreenPosHelper.rb @@ -0,0 +1,43 @@ +module ScreenPosHelper + def self.pbScreenZoomX(ch) + return Game_Map::TILE_WIDTH/32.0 + end + + def self.pbScreenZoomY(ch) + return Game_Map::TILE_HEIGHT/32.0 + end + + def self.pbScreenX(ch) + return ch.screen_x + end + + def self.pbScreenY(ch) + return ch.screen_y + end + + @heightcache={} + + def self.bmHeight(bm) + h=@heightcache[bm] + if !h + bmap=AnimatedBitmap.new("Graphics/Characters/"+bm,0) + h=bmap.height + @heightcache[bm]=h + bmap.dispose + end + return h + end + + def self.pbScreenZ(ch,height=nil) + if height==nil + height=0 + if ch.tile_id > 0 + height=32 + elsif ch.character_name!="" + height=bmHeight(ch.character_name)/4 + end + end + ret=ch.screen_z(height) + return ret + end +end diff --git a/Data/Scripts/006_Map renderer/001_TilemapLoader.rb b/Data/Scripts/006_Map renderer/001_TilemapLoader.rb index b38d9dc23..9540718eb 100644 --- a/Data/Scripts/006_Map renderer/001_TilemapLoader.rb +++ b/Data/Scripts/006_Map renderer/001_TilemapLoader.rb @@ -8,18 +8,7 @@ class TilemapLoader end def updateClass - case $PokemonSystem.tilemap - when 1 # Custom (recommended) - setClass(CustomTilemap) - when 2 # Perspective - setClass(Draw_Tilemap) - else # Original (SynchronizedTilemap) or custom (CustomTilemap) - if Tilemap.method_defined?(:passages) - setClass(CustomTilemap) - else - setClass(SynchronizedTilemap) - end - end + setClass(CustomTilemap) end def setClass(cls) @@ -38,7 +27,7 @@ class TilemapLoader end @tilemap.dispose @tilemap = newtilemap - newtilemap.update if cls!=SynchronizedTilemap + newtilemap.update else @tilemap = newtilemap end diff --git a/Data/Scripts/006_Map renderer/002_Tilemap_XP.rb b/Data/Scripts/006_Map renderer/002_CustomTilemap.rb similarity index 100% rename from Data/Scripts/006_Map renderer/002_Tilemap_XP.rb rename to Data/Scripts/006_Map renderer/002_CustomTilemap.rb diff --git a/Data/Scripts/006_Map renderer/005_TileDrawingHelper.rb b/Data/Scripts/006_Map renderer/003_TileDrawingHelper.rb similarity index 89% rename from Data/Scripts/006_Map renderer/005_TileDrawingHelper.rb rename to Data/Scripts/006_Map renderer/003_TileDrawingHelper.rb index ac6cb22dd..80d9e3277 100644 --- a/Data/Scripts/006_Map renderer/005_TileDrawingHelper.rb +++ b/Data/Scripts/006_Map renderer/003_TileDrawingHelper.rb @@ -146,36 +146,6 @@ end #=============================================================================== # #=============================================================================== -# Unused -def createMinimap2(mapid) - map=load_data(sprintf("Data/Map%03d.rxdata",mapid)) rescue nil - return BitmapWrapper.new(32,32) if !map - bitmap=BitmapWrapper.new(map.width*4,map.height*4) - black=Color.new(0,0,0) - bigmap=(map.width>40 && map.height>40) - tilesets=$data_tilesets - tileset=tilesets[map.tileset_id] - return bitmap if !tileset - helper=TileDrawingHelper.fromTileset(tileset) - for y in 0...map.height - for x in 0...map.width - if bigmap - next if (x>8 && x<=map.width-8 && y>8 && y<=map.height-8) - end - for z in 0..2 - id=map.data[x,y,z] - next if id==0 || !id - helper.bltSmallTile(bitmap,x*4,y*4,4,4,id) - end - end - end - bitmap.fill_rect(0,0,bitmap.width,1,black) - bitmap.fill_rect(0,bitmap.height-1,bitmap.width,1,black) - bitmap.fill_rect(0,0,1,bitmap.height,black) - bitmap.fill_rect(bitmap.width-1,0,1,bitmap.height,black) - return bitmap -end - def createMinimap(mapid) map=load_data(sprintf("Data/Map%03d.rxdata",mapid)) rescue nil return BitmapWrapper.new(32,32) if !map diff --git a/Data/Scripts/006_Map renderer/003_Tilemap_Perspective.rb b/Data/Scripts/006_Map renderer/003_Tilemap_Perspective.rb deleted file mode 100644 index 41c1c1133..000000000 --- a/Data/Scripts/006_Map renderer/003_Tilemap_Perspective.rb +++ /dev/null @@ -1,386 +0,0 @@ -module ScreenPosHelper - def self.pbScreenZoomX(ch) - zoom=1.0 - if $PokemonSystem.tilemap==2 - zoom=((ch.screen_y - 16) - (Graphics.height / 2)) * - (Draw_Tilemap::Pitch*1.0 / (Graphics.height * 25)) + 1 - end - return zoom*Game_Map::TILE_WIDTH/32.0 - end - - def self.pbScreenZoomY(ch) - zoom=1.0 - if $PokemonSystem.tilemap==2 - zoom=((ch.screen_y - 16) - (Graphics.height / 2)) * - (Draw_Tilemap::Pitch*1.0 / (Graphics.height * 25)) + 1 - end - return zoom*Game_Map::TILE_HEIGHT/32.0 - end - - def self.pbScreenX(ch) - ret=ch.screen_x - if $PokemonSystem.tilemap==2 - widthdiv2=(Graphics.width / 2) - ret=widthdiv2+(ret-widthdiv2)*pbScreenZoomX(ch) - end - return ret - end - - def self.pbScreenY(ch) - ret=ch.screen_y - if $PokemonSystem.tilemap==2 && Draw_Tilemap::Curve && Draw_Tilemap::Pitch != 0 - zoomy=pbScreenZoomY(ch) - oneMinusZoomY=1-zoomy - ret += (8 * oneMinusZoomY * (oneMinusZoomY / - (2 * ((Draw_Tilemap::Pitch*1.0 / 100) / (Graphics.height*1.0 / 16.0))) + 0.5)) - end - return ret - end - - @heightcache={} - - def self.bmHeight(bm) - h=@heightcache[bm] - if !h - bmap=AnimatedBitmap.new("Graphics/Characters/"+bm,0) - h=bmap.height - @heightcache[bm]=h - bmap.dispose - end - return h - end - - def self.pbScreenZ(ch,height=nil) - if height==nil - height=0 - if ch.tile_id > 0 - height=32 - elsif ch.character_name!="" - height=bmHeight(ch.character_name)/4 - end - end - ret=ch.screen_z(height) - if $PokemonSystem.tilemap==2 - ret-=(pbScreenZoomY(ch) < 0.5 ? 1000 : 0) - end - return ret - end -end - -############################################### - - - -class Draw_Tilemap # This class controls a set of sprites, with - attr_reader :tileset # different Z values, arranged into horizontal bars - attr_reader :map_data - attr_reader :flash_data - attr_reader :priorities - attr_reader :terrain_tags - attr_reader :autotiles - attr_accessor :bitmaps - attr_accessor :pitch - attr_accessor :ox - attr_accessor :oy - attr_accessor :visible - attr_reader :viewport - attr_accessor :color - attr_accessor :tone - StripSize = 16 - Curve = true - Pitch = 3 - FlashOpacity = [100,90,80,70,80,90] - - def initialize(viewport=nil) - @tileset=nil - @map_data=nil - @priorities=nil - @terrain_tags=nil - @autotiles=[nil,nil,nil,nil,nil,nil,nil] - @viewport=viewport - @visible=true - @helper=TileDrawingHelper.new(nil,@autotiles) - @drawnstrips=[] - @contentstrips=[] - @disposed=false - @bitmaps=[] - @sprites=[] - @ox=0 - @oy=0 - @tone=Tone.new(0,0,0,0) - @color=Color.new(0,0,0,0) - @flash_data=nil - @numsprites=0 - end - - def tileset=(value) - @tileset=value - @helper.tileset=value - @doredraw=true - end - - def map_data=(value) - @map_data=value - @doredraw=true - end - - def flash_data=(value) - @flash_data=value - @doredraw=true - end - - def priorities=(value) - @priorities=value - @doredraw=true - end - - def terrain_tags=(value) - @terrain_tags=value - @doredraw=true - end - - def redrawmap - # Provide blank data in proper object form - self.clear - xsize=@map_data.xsize - ysize=@map_data.ysize - # Bitmaps used for each priority's drawing. Priorities 2-5 are combined. - @bitmaps = [Bitmap.new(xsize*32, ysize*32+StripSize), - Bitmap.new(xsize*32, ysize*32+StripSize), - Bitmap.new(xsize*32, ysize*32+StripSize)] - for i in @bitmaps - i.clear - end - if @flash_data - @bitmaps.push(Bitmap.new(xsize*32, ysize*32+StripSize)) - end - @drawnstrips.clear - @contentstrips.clear - # Generate blank sprites - @sprites.clear - @numsprites=ysize * (32 / StripSize) - @map_data.zsize.times do # For each layer - @sprites.push([]) - @contentstrips.push([]) - end - if @flash_data - @sprites.push([]) - @contentstrips.push([]) - end - end - - def update - if !@flash_data.nil? && @sprites.length>0 - flashindex=@sprites.length-1 - for j in 0...@numsprites - sprite=@sprites[flashindex][j] - next if !sprite.is_a?(Sprite) - sprite.opacity=FlashOpacity[(Graphics.frame_count/2) % 6] - end - end - for s in @sprites - for sprite in s - next if !sprite.is_a?(Sprite) - # sprite.tone=@tone - # sprite.color=@color - end - end - if @doredraw - @drawnstrips=[] - redrawmap - @doredraw=false - elsif @oldOx==@ox && @oldOy==@oy - return - end - @oldOx=@ox - @oldOy=@oy - @pitch = Pitch - minvalue=[0, ((Graphics.height / 2) - - ((Graphics.height * 60) / @pitch) + @oy) / StripSize].max.to_i - maxvalue=[@numsprites - 1,(@oy + Graphics.height) / StripSize].min.to_i - return if minvalue>maxvalue - for j in 0...@numsprites - if jmaxvalue - for i in 0...@sprites.length - sprite=@sprites[i][j] - if sprite - sprite.dispose if sprite.is_a?(Sprite) - @sprites[i][j]=nil - end - end - else - drawStrip(j) - end - end - vpy=@viewport.rect.y - vpr=@viewport.rect.x+@viewport.rect.width - numsprites=0 - for i in @sprites - numsprites+=i.compact.length - end - for j in minvalue..maxvalue - # For each strip within the visible screen, update OX/Y - x=Graphics.width/2 - sox=@ox+x - y = (j * StripSize - @oy) - zoom_x=1.0 - zoom_y=1.0 - unless @pitch == 0 # Apply X Zoom - zoom_x = (y - Graphics.height*1.0 / 2) * (@pitch*1.0 / (Graphics.height * 25)) + 1 - if Curve # Zoom Y values same as X, and compensate - zoom_y = zoom_x - yadd = StripSize*1.0 * (1 - zoom_y) * ((1 - zoom_y) / - (2 * ((@pitch*1.0 / 100) / (Graphics.height*1.0 / (StripSize * 2)))) + 0.5) - y+=yadd - end - end - xstart=(x-sox*zoom_x) - yend=(y+(StripSize*2)*zoom_y) - if xstart>vpr || yend<=vpy - for i in 0...@sprites.length - sprite=@sprites[i][j] - if sprite.is_a?(Sprite) - sprite.dispose - @sprites[i][j]=nil - end - end - else - for i in 0...@sprites.length - sprite=@sprites[i][j] - next if !sprite - if sprite==true - sprite=newSprite(i,j) - @sprites[i][j]=sprite - end - sprite.visible=@visible - sprite.x = x - sprite.ox = sox - sprite.y = y - sprite.zoom_x = zoom_x - sprite.zoom_y = zoom_y - end - end - end - end - - def clear - for i in @bitmaps - i.dispose - end - @bitmaps.clear - for i in 0...@sprites.length - for j in 0...@sprites[i].length - @sprites[i][j].dispose if @sprites[i][j].is_a?(Sprite) - end - @sprites[i].clear - end - @sprites.clear - end - - def dispose - return if @disposed - self.clear - for i in 0...7 - self.autotiles[i]=nil - end - @helper=nil - @sprites=nil - @bitmaps=nil - @disposed = true - end - - def disposed? - return @disposed - end - - def newSprite(i,j) - sprite=Sprite.new(@viewport) - sprite.bitmap=@bitmaps[i] - sprite.src_rect.set(0, j * StripSize, @map_data.xsize * 32, StripSize * 2) - sprite.x = Graphics.width / 2 - sprite.y = -64 - sprite.z = (i * 32) - sprite.tone=@tone - sprite.color=@color - if i==@bitmaps.length-1 && !@flash_data.nil? - sprite.blend_type=1 - sprite.z=1 - sprite.opacity=FlashOpacity[(Graphics.frame_count/2) % 6] - end - return sprite - end - - def drawStrip(j) - minY=(j*StripSize)/32 - maxY=(j*StripSize+StripSize*2)/32 - minY=0 if minY<0 - minY=@map_data.ysize-1 if minY>@map_data.ysize-1 - maxY=0 if maxY<0 - maxY=@map_data.ysize-1 if maxY>@map_data.ysize-1 - for y in minY..maxY - if !@drawnstrips[y] - for x in 0...@map_data.xsize - draw_position(x, y) - end - @drawnstrips[y]=true - end - end - for i in 0...@sprites.length # For each priority - sprite=@sprites[i][j] - if !sprite || (sprite!=true && sprite.disposed?) - havecontent=false - for y in minY..maxY - havecontent=havecontent||@contentstrips[i][y] - end - sprite=(havecontent) ? true : nil - @sprites[i][j]=sprite - end - end - end - - def draw_position(x, y) - for layer in 0...@map_data.zsize - pos = @map_data[x, y, layer] - priopos=@priorities[pos] - priopos=0 if !priopos - prio=(20 - @helper.bltTile(@bitmaps[prio],x*32,y*32,pos,0) - end - if !@flash_data.nil? - lastlayer=@bitmaps.length-1 - id=@flash_data[x,y,0] - r=(id>>8)&15 - g=(id>>4)&15 - b=(id)&15 - @contentstrips[lastlayer][y]=true - color=Color.new(r*16,g*16,b*16) - @bitmaps[lastlayer].fill_rect(x*32,y*32,32,32,color) - end - end -end - - - -class Sprite_Character - alias perspectivetilemap_initialize initialize - attr_accessor :character - - def initialize(viewport, character = nil) - @character = character - perspectivetilemap_initialize(viewport,character) - end - - alias update_or :update - - def update - update_or - if $PokemonSystem.tilemap==2 - self.zoom_y=ScreenPosHelper.pbScreenZoomY(@character) - self.zoom_x=ScreenPosHelper.pbScreenZoomX(@character) - self.x=ScreenPosHelper.pbScreenX(@character) - self.y=ScreenPosHelper.pbScreenY(@character) - self.z=ScreenPosHelper.pbScreenZ(@character,@ch) - end - end -end diff --git a/Data/Scripts/006_Map renderer/004_Tilemap_Original.rb b/Data/Scripts/006_Map renderer/004_Tilemap_Original.rb deleted file mode 100644 index 1ee2bf736..000000000 --- a/Data/Scripts/006_Map renderer/004_Tilemap_Original.rb +++ /dev/null @@ -1,117 +0,0 @@ -#=============================================================================== -# -#=============================================================================== -class SynchronizedTilemapAutotilesInternal - def initialize(oldat) - @atdisposables = [[],[],[],[],[],[],[]] - @atframes = [[],[],[],[],[],[],[]] - @atframe = [-1,-1,-1,-1,-1,-1,-1] - @autotiles = [] - @oldat = oldat - end - - def dispose - for i in 0...7 - for bitmap in @atdisposables[i] - bitmap.dispose - end - @atdisposables[i].clear - @atframes[i].clear - end - end - - def [](i) - return @autotiles[i] - end - - def []=(i,value) - for frame in @atdisposables[i] - frame.dispose - end - @atframe[i] = -1 - @atframes[i].clear - @atdisposables[i].clear - if value && !value.disposed? - if value.height==32 - frames = value.width/32 - for j in 0...frames - @atdisposables[i][j] = Bitmap.new(32,32) - @atdisposables[i][j].blt(0,0,value,Rect.new(j*32,0,32,32)) - @atframes[i][j] = @atdisposables[i][j] - end - elsif value.height==128 - frames = value.width/96 - for j in 0...frames - @atdisposables[i][j] = Bitmap.new(96,128) - @atdisposables[i][j].blt(0,0,value,Rect.new(j*96,0,96,128)) - @atframes[i][j] = @atdisposables[i][j] - end - else - @atframes[i][0] = value - end - else - @atframes[i][0] = value - end - @autotiles[i] = value - sync - end - - def sync - for i in 0...7 - frames = [1,@atframes[i].length].max - frame = (Graphics.frame_count/15)%frames - if frames>1 && @atframe[i]!=frame - @oldat[i] = @atframes[i][frame] - @atframe[i] = frame - end - end - end -end - - - -class SynchronizedTilemapAutotiles - def initialize(autotiles) - @autotiles = autotiles - end - - def [](i) - return @autotiles[i] - end - - def []=(i,value) - @autotiles[i] = value - end -end - - - -class SynchronizedTilemap < Tilemap - # This class derives from Tilemap just to synchronize - # the tilemap animation. - attr_accessor :numupdates - - def initialize(viewport=nil) - super(viewport) - @updating = true - @autotiles = SynchronizedTilemapAutotilesInternal.new(self.autotiles) - @autos = SynchronizedTilemapAutotiles.new(@autotiles) - @updating = false - end - - def dispose - @autotiles.dispose - super - end - - def autotiles - return @autos if !@updating - super - end - - def update - return if disposed? - @autotiles.sync - super - end -end diff --git a/Data/Scripts/016_UI/015_UI_Options.rb b/Data/Scripts/016_UI/015_UI_Options.rb index 9384811db..2bd0049d9 100644 --- a/Data/Scripts/016_UI/015_UI_Options.rb +++ b/Data/Scripts/016_UI/015_UI_Options.rb @@ -27,8 +27,6 @@ class PokemonSystem @sevolume = 100 # Volume of sound effects @textinput = 0 # Text input mode (0=cursor, 1=keyboard) end - - def tilemap; return Settings::MAP_VIEW_MODE; end end #===============================================================================