Envision, Create, Share

Welcome to HBGames, a leading amateur game development forum and Discord server. All are welcome, and amongst our ranks you will find experts in their field from all aspects of video game design and development.

2nd fog that effects the tileset but not the player

Kaoii

Member

I have made a similar request for the dual fog script before. The question was how do I make the fog appear below the player, and the answer I got was lowering the Z value in the script.

However - doing this results in a problem. Since I am primarily using dual fogs for cosmetic fog, lowering the Z value also makes tiles with priority appear over the fog, causing glitchiness and inconsistancy in the cosmetic fog.

This is the dual fog script:
Code:
#==============================================================================
# ** Double Fogs Script
# By: Daniel3579
#------------------------------------------------------------------------------
# The second fog appears over the first one.
# All of the below commands are done in the "Script..." event command.
# To change the 2nd fog, use $game_map.fog2_name = "filename"
# To change the 2nd fog's hue, use $game_map.fog2_hue = n
# n is equal to 0 through 360.
# To change the 2nd fog's opacity, use $game_map.fog2_opacity = n
# To change the 2nd fog's blend type, use $game_map.fog2_blend_type = n
# n is equal to 0, 1, or 2. 0 is normal.
# To change the 2nd fog's zoom, use $game_map.fog2_zoom = n
# n has to be a decimal, 1.0 is actual size.
# To change the 2nd fog's horizontal scroll, use $game_map.fog2_sx = n
# n is -256 to 256. 0 is still.
# To change the 2nd fog's vertical scroll, use $game_map.fog2_sy = n
# n is -256 to 256. 0 is still.
# To change the 2nd fog's tone, use $game_map.fog2_tone = tone
# tone is Tone.new(red, green, blue[, gray])
# To start a tone change in the 2nd fog, use
# $game_map.start_fog2_tone_change(tone, duration)
# tone is Tone.new(red, green, blue[, gray]) and 
# duration is the amount of frames.
# To start an opacity change in the 2nd fog, use
# $game_map.start_fog2_opacity_change(opacity, duration)
# opacity is the opacity you want it to change to, and
# duration is the amount of frames it takes to change.
#==============================================================================

#==============================================================================
# ** Game_Map
#------------------------------------------------------------------------------
#  This class handles the map. It includes scrolling and passable determining
#  functions. Refer to "$game_map" for the instance of this class.
#==============================================================================

class Game_Map
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :fog2_name                # fog2 file name
  attr_accessor :fog2_hue                 # fog2 hue
  attr_accessor :fog2_opacity             # fog2 opacity level
  attr_accessor :fog2_blend_type          # fog2 blending method
  attr_accessor :fog2_zoom                # fog2 zoom rate
  attr_accessor :fog2_sx                  # fog2 sx
  attr_accessor :fog2_sy                  # fog2 sy
  attr_reader   :fog2_ox                  # fog2 x-coordinate starting point
  attr_reader   :fog2_oy                  # fog2 y-coordinate starting point
  attr_reader   :fog2_tone                # fog2 color tone
  #--------------------------------------------------------------------------
  # * Alias Listings
  #--------------------------------------------------------------------------
  alias daniel_fog2_setup setup
  alias daniel_fog2_update update
  #--------------------------------------------------------------------------
  # * Setup
  #     map_id : map ID
  #--------------------------------------------------------------------------
  def setup(map_id)
    daniel_fog2_setup(map_id)
    @fog2_name = ""
    @fog2_hue = 0
    @fog2_opacity = 64
    @fog2_blend_type = 0
    @fog2_zoom = 200
    @fog2_sx = 0
    @fog2_sy = 0
    @fog2_ox = 0
    @fog2_oy = 0
    @fog2_tone = Tone.new(0, 0, 0, 0)
    @fog2_tone_target = Tone.new(0, 0, 0, 0)
    @fog2_tone_duration = 0
    @fog2_opacity_duration = 0
    @fog2_opacity_target = 0
  end
  #--------------------------------------------------------------------------
  # * Start Changing Fog Color Tone
  #     tone     : color tone
  #     duration : time
  #--------------------------------------------------------------------------
  def start_fog2_tone_change(tone, duration)
    @fog2_tone_target = tone.clone
    @fog2_tone_duration = duration
    if @fog2_tone_duration == 0
      @fog2_tone = @fog2_tone_target.clone
    end
  end
  #--------------------------------------------------------------------------
  # * Start Changing Fog Opacity Level
  #     opacity  : opacity level
  #     duration : time
  #--------------------------------------------------------------------------
  def start_fog2_opacity_change(opacity, duration)
    @fog2_opacity_target = opacity * 1.0
    @fog2_opacity_duration = duration
    if @fog2_opacity_duration == 0
      @fog2_opacity = @fog2_opacity_target
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    daniel_fog2_update
    @fog2_ox -= @fog2_sx / 8.0
    @fog2_oy -= @fog2_sy / 8.0
    if @fog2_tone_duration >= 1
      d = @fog2_tone_duration
      target = @fog2_tone_target
      @fog2_tone.red = (@fog2_tone.red * (d - 1) + target.red) / d
      @fog2_tone.green = (@fog2_tone.green * (d - 1) + target.green) / d
      @fog2_tone.blue = (@fog2_tone.blue * (d - 1) + target.blue) / d
      @fog2_tone.gray = (@fog2_tone.gray * (d - 1) + target.gray) / d
      @fog2_tone_duration -= 1
    end
    if @fog2_opacity_duration >= 1
      d = @fog2_opacity_duration
      @fog2_opacity = (@fog2_opacity * (d - 1) + @fog2_opacity_target) / d
      @fog2_opacity_duration -= 1
    end
  end
end

#==============================================================================
# ** Spriteset_Map
#------------------------------------------------------------------------------
#  This class brings together map screen sprites, tilemaps, etc.
#  It's used within the Scene_Map class.
#==============================================================================

class Spriteset_Map
  #--------------------------------------------------------------------------
  # * Alias Listings
  #--------------------------------------------------------------------------
  alias daniel_fog2_dispose dispose
  alias daniel_fog2_update update
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  def initialize
    # Make viewports
    @viewport1 = Viewport.new(0, 0, 640, 480)
    @viewport2 = Viewport.new(0, 0, 640, 480)
    @viewport3 = Viewport.new(0, 0, 640, 480)
    @viewport2.z = 200
    @viewport3.z = 5000
    # Make tilemap
    @tilemap = Tilemap.new(@viewport1)
    @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
    for i in 0..6
      autotile_name = $game_map.autotile_names[i]
      @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
    end
    @tilemap.map_data = $game_map.data
    @tilemap.priorities = $game_map.priorities
    # Make panorama plane
    @panorama = Plane.new(@viewport1)
    @panorama.z = -1000
    # Make fog plane
    @fog = Plane.new(@viewport1)
    @fog.z = 3000
    # Make fog2 plane
    @fog2 = Plane.new(@viewport1)
    @fog2.z = 3050
    # Make character sprites
    @character_sprites = []
    for i in $game_map.events.keys.sort
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
      @character_sprites.push(sprite)
    end
    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
    # Make weather
    @weather = RPG::Weather.new(@viewport1)
    # Make picture sprites
    @picture_sprites = []
    for i in 1..50
      @picture_sprites.push(Sprite_Picture.new(@viewport2,
        $game_screen.pictures[i]))
    end
    # Make timer sprite
    @timer_sprite = Sprite_Timer.new
    # Frame update
    update
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    daniel_fog2_dispose
    @fog2.dispose
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    daniel_fog2_update
    if @fog2_name != $game_map.fog2_name or @fog2_hue != $game_map.fog2_hue
      @fog2_name = $game_map.fog2_name
      @fog2_hue = $game_map.fog2_hue
      if @fog2.bitmap != nil
        @fog2.bitmap.dispose
        @fog2.bitmap = nil
      end
      if @fog2_name != ""
        @fog2.bitmap = RPG::Cache.fog(@fog2_name, @fog2_hue)
      end
      Graphics.frame_reset
    end
    # Update fog2 plane
    @fog2.zoom_x = $game_map.fog2_zoom / 100.0
    @fog2.zoom_y = $game_map.fog2_zoom / 100.0
    @fog2.opacity = $game_map.fog2_opacity
    @fog2.blend_type = $game_map.fog2_blend_type
    @fog2.ox = $game_map.display_x / 4 + $game_map.fog2_ox
    @fog2.oy = $game_map.display_y / 4 + $game_map.fog2_oy
    @fog2.tone = $game_map.fog2_tone
  end
end

Is there any way to make the second fog appear above the tileset and all prioritized tiles but below the character so shadows and lighting appear below the characterset's feet?

Attached are two screenshots of the problems encountered. The first is without the Z value altered. You can see the umbrella's cosmetic fog shadow appears over the player's head. The second is with the Z value set to 1. You can see the glitchiness.
 
Hmm, Im thinking the closest you can get would be fog that's set to a certain layer of priority. As in Priority zero fog that only shows for parts fo the tile without a priority. By default, normal sized charsets are priority 1, then they gain priorities as they get taller. So you could probably get a fog that effects the floor but not the char rather easily, but it would also effect the higher priority tileset objects which may or may not be a good thing.
 

Thank you for viewing

HBGames is a leading amateur video game development forum and Discord server open to all ability levels. Feel free to have a nosey around!

Discord

Join our growing and active Discord server to discuss all aspects of game making in a relaxed environment. Join Us

Content

  • Our Games
  • Games in Development
  • Emoji by Twemoji.
    Top