Version: 0.1
By: Berka
Introduction
Add a fog system like Age of Empires games
Features
- Fog saving
- Fog clearing
- Fog hiding
- Threading system for display
Screenshots

Demo
none
Script
Code:
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#                Fog of War            22/05/09 Â
#-------------------------------------------------------------------------------
#    ver.0.1          par Berka            rgss.2    Â
#            http://www.rpgmakervx-fr.com             Â
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#            Add a Fog of War on the Map      Â
#-------------------------------------------------------------------------------
# Â Commands: Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
# Â Fog.clear_fog(map_id) Â Â Â Â Â # clear the bitmap (all black) Â
#  vu_par_hero?(x,y)        # chek if [x,y] is viewed by the hero   Â
#  $RayonFog = i          # modify the hero's view range   Â
#-------------------------------------------------------------------------------
# Â Features: Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â
#  * Switch hides the fog          Â
#  * the fog of each map is saved               Â
#  * threading system (faster) for fog's borders       Â
#  Do not use for large maps: FPS may be down   Â
#=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Â
module Berka
 module Brouillard
  $RayonFog  = 3      # View Range: calculs are optimized for 3 or 6
  FichFog   = "fog.png"  # File of fog tileset: only the first pattern is used
              #  may be placed on: Graphics/System
  IDFog    = 1      # Switch_Id: if switch == true: hides the fog
  ZFog    = 300     # fogs 's priorities     Â
  Act_GC   = true     # Garbage Collector managment
 Â
        # Do not Change !!!!
  Tiles={         # fog's tileset indexes
   "0"=>2816,"1"=>2824,"12"=>2844,"123"=>2844,"1234"=>2856,"12346"=>2860,
   "123467"=>2860,"1234678"=>2862,"12346789"=>2862,"1234679"=>2860,"123468"=>2862,
   "1234689"=>2862,"123469"=>2860,"12347"=>2856,"123478"=>2859,"1234789"=>2859,
   "123479"=>2857,"12348"=>2859,"123489"=>2859,"12349"=>2857,"1236"=>2854,
   "12367"=>2855,"123678"=>2861,"123679"=>2855,"1236789"=>2861,"12368"=>2861,
   "123689"=>2861,"12369"=>2854,"1237"=>2845,"12378"=>2849,"123789"=>2849,
   "12379"=>2847,"1238"=>2849,"12389"=>2849,"1239"=>2846,"124"=>2856,"1246"=>2860,
   "12467"=>2860,"124678"=>2862,"1246789"=>2862,"124679"=>2860,"12468"=>2862,
   "124689"=>2862,"12469"=>2860,"1247"=>2856,"12478"=>2859,"124789"=>2859,
   "12479"=>2857,"1248"=>2859,"12489"=>2859,"1249"=>2857,"126"=>2854,"1267"=>2855,
   "12678"=>2861,"126789"=>2861,"12679"=>2855,"1268"=>2861,"12689"=>2861,"1269"=>2854,
   "127"=>2845,"1278"=>2849,"12789"=>2849,"128"=>2849,"1289"=>2849,"129"=>2846,
   "13"=>2828,"134"=>2834,"1346"=>2848,"13467"=>2848,"134678"=>2858,"1346789"=>2858,
   "134679"=>2848,"13468"=>2858,"134689"=>2858,"13469"=>2848,"1347"=>2834,
   "13478"=>2851,"134789"=>2851,"13479"=>2835,"1348"=>2851,"13489"=>2851,
   "1349"=>2835,"136"=>2841,"1367"=>2843,"13678"=>2853,"136789"=>2853,"13679"=>2843,
   "1368"=>2853,"13689"=>2853,"1369"=>2841,"137"=>2829,"1378"=>2839,"13789"=>2839,
   "138"=>2839,"1389"=>2839,"139"=>2830,"14"=>2832,"146"=>2848,"1467"=>2848,
   "14678"=>2858,"146789"=>2858,"14679"=>2848,"1468"=>2862,"14689"=>2858,"1469"=>2848,
   "147"=>2832,"1478"=>2850,"14789"=>2850,"1479"=>2833,"148"=>2850,"1489"=>2850,
   "149"=>2833,"16"=>2841,"167"=>2843,"1678"=>2853,"16789"=>2853,"1679"=>2848,
   "168"=>2853,"1689"=>2853,"169"=>2841,"17"=>2825,"178"=>2838,"1789"=>2838,
   "179"=>2827,"18"=>2838,"189"=>2838,"19"=>2826,"2"=>2844,"23"=>2844,"234"=>2856,
   "2346"=>2860,"23467"=>2860,"234678"=>2862,"2346789"=>2862,"234679"=>2862,
   "23468"=>2862,"234689"=>2862,"23469"=>2860,"2347"=>2856,"23478"=>2859,
   "234789"=>2859,"23479"=>2857,"2348"=>2859,"23489"=>2859,"2348"=>2859,"236"=>2854,
   "2367"=>2855,"23678"=>2861,"236789"=>2861,"23679"=>2855,"2368"=>2861,"23689"=>2861,
   "2369"=>2854,"237"=>2845,"2378"=>2849,"23789"=>2849,"2379"=>2847,"238"=>2849,
   "2389"=>2849,"239"=>2846,"24"=>2856,"246"=>2860,"2467"=>2860,"24678"=>2862,
   "246789"=>2862,"24679"=>2860,"2468"=>2862,"24689"=>2862,"2469"=>2860,"247"=>2856,
   "2478"=>2859,"24789"=>2859,"2479"=>2847,"248"=>2859,"2489"=>2859,"249"=>2857,
   "26"=>2854,"267"=>2854,"2678"=>2861,"26789"=>2861,"2679"=>2855,"268"=>2861,
   "2689"=>2861,"269"=>2854,"27"=>2845,"278"=>2849,"2789"=>2849,"279"=>2847,"28"=>2849,
   "289"=>2849,"29"=>2846,"3"=>2820,"34"=>2834,"346"=>2848,"3467"=>2848,"34678"=>2858,
   "346789"=>2858,"34679"=>2848,"3468"=>2858,"34689"=>2858,"3469"=>2848,"347"=>2834,
   "3478"=>2851,"34789"=>2851,"3479"=>2835,"348"=>2851,"3489"=>2851,"349"=>2835,
   "36"=>2840,"367"=>2842,"3678"=>2852,"36789"=>2852,"3679"=>2842,"368"=>2852,
   "3689"=>2852,"369"=>2840,"37"=>2821,"378"=>2837,"3789"=>2837,"379"=>2823,
   "38"=>2837,"389"=>2837,"39"=>2822,"4"=>2832,"46"=>2848,"467"=>2848,"4678"=>2858,
   "46789"=>2858,"4679"=>2848,"468"=>2858,"4689"=>2858,"469"=>2848,"47"=>2832,
   "478"=>2850,"4789"=>2850,"479"=>2833,"48"=>2850,"489"=>2850,"49"=>2833,
   "6"=>2840,"67"=>2842,"678"=>2852,"6789"=>2852,"679"=>2842,"68"=>2852,
   "689"=>2852,"69"=>2840,"7"=>2817,"78"=>2836,"789"=>2836,"79"=>2819,"8"=>2836,
   "89"=>2836,"9"=>2818 Â
  } # et tu payes ton mal de crâne, pour trouver chaque valeur ^^
 end
end
module Fog
 def self.clear_fog(id)
  $game_temp.br_maps.delete(id)
  return if !$scene.is_a?(Scene_Map)
  $scene.spriteset.dispose
  $scene.spriteset=Spriteset_Map.new
 end
end
Win32API.new('kernel32','SetPriorityClass','pi','i').call(
Win32API.new('kernel32','GetCurrentProcess','','i').call,256)
include Berka::Brouillard
class Spriteset_Map
 alias :br_create    :create_tilemap
 alias :br_dispose   :dispose_tilemap
 alias :br_view     :dispose_viewports
 alias :br_update    :update_tilemap   unless $@
 alias :br_view_update :update_viewports  unless $@
 attr_accessor :br_tile,:tilemap
 def create_tilemap
  br_create
  @br_tile=Tilemap.new(@br_view=Viewport.new(0,0,Graphics.width,Graphics.height))
  @br_view.z=ZFog
  8.times{|i|@br_tile.bitmaps[i]=@tilemap.bitmaps[i].clone}
  @br_tile.bitmaps[1]=Cache.system(FichFog)
  @br_tile.map_data=Table.new($game_map.width,$game_map.height,3)
  clear_fog
 end
 def clear_fog
  w,h=$game_map.width,$game_map.height
  if $game_temp.br_maps.has_key?($game_map.map_id)
   for x in 0...w;for y in 0...h
    if $game_temp.br_maps[$game_map.map_id][x,y]==0
     @br_tile.map_data[x,y,1]=2816
     a||=true
    else
     @br_tile.map_data[x,y,1]=0
     a||=false
    end
   end;end
   if a
    Thread.new{for x in 0...w;for y in 0...h
     chk(x,y)
    end;end}
   end
  else
   $game_temp.br_maps[$game_map.map_id]||=Table.new(w,h)
   for x in 0...w;for y in 0...h
    @br_tile.map_data[x,y,1]=2816
    $game_temp.br_maps[$game_map.map_id][x,y]=0
   end;end
  end
 end
 def dispose_tilemap
  br_dispose
  @br_tile.dispose
 end
 def dispose_viewports
  br_view
  @br_view.dispose
 end
 def update_tilemap
  br_update
  if $game_switches[IDFog]
   @br_tile.dispose
   return
  end
  GC.start if !$game_player.moving?&&Act_GC
  return if !$game_temp.br_maps.has_key?($game_map.map_id)
  br_obscurcis
  x,y=$game_map.display_x/8,$game_map.display_y/8
  return if x==@br_tile.ox&&y==@br_tile.oy
  @br_tile.ox,@br_tile.oy=x,y
  @br_tile.update
 end
 def br_obscurcis
  x,y=$game_player.x,$game_player.y
  rx,ry=(x-$RayonFog-2..x+$RayonFog+2).to_a,(y-$RayonFog-2..y+$RayonFog+2).to_a
  for tx in rx
   for ty in ry
    r=Math.sqrt(((x-tx)**2+(y-ty)**2))
    chk(tx,ty)if r.between?($RayonFog,$RayonFog+2)
    next if !tx.between?(rx[0],rx[-1])
    if r<=$RayonFog
     @br_tile.map_data[tx,ty,1]=0
     $game_temp.br_maps[$game_map.map_id][tx,ty]=1
    end
   end
  end
 end
 def chk(x,y)
  return if !$game_temp.br_maps.has_key?($game_map.map_id)||x.nil?||y.nil?||
   $game_temp.br_maps[$game_map.map_id][x,y]==1
  d=@br_tile.map_data
  l=[]
  l<<1 if d[x-1,y+1,1]==0
  l<<2 if d[x,y+1,1]==0
  l<<3 if d[x+1,y+1,1]==0
  l<<4 if d[x-1,y,1]==0
  l<<6 if d[x+1,y,1]==0
  l<<9 if d[x+1,y-1,1]==0
  l<<8 if d[x,y-1,1]==0
  l<<7 if d[x-1,y-1,1]==0
  l=l.sort.join
  return if l.nil?||l==""
  @br_tile.map_data[x,y,1]=Tiles[l]
 end
 def update_viewports
  br_view_update
  @br_view.update
 end
end
class Game_Temp
 alias :br_initialize :initialize
 attr_accessor :br_maps
 def initialize
  br_initialize
  @br_maps={}
 end
end
def vu_par_hero?(x,y)
 Math.sqrt((($game_player.x-x)**2+($game_player.y-y)**2))<=$RayonFog
end
class Scene_Map<Scene_Base # correctif: mà j spriteset 1/frame
 attr_accessor :spriteset
 def update_basic
  Graphics.update        Â
  Input.update       Â
  $game_map.update      Â
 end
end
class Scene_File<Scene_Base
 alias :br_write_save :write_save_data
 alias :br_read_save  :read_save_data
 def write_save_data(file)
  br_write_save(file)
  Marshal.dump($game_temp.br_maps,file)
 end
 def read_save_data(file)
  br_read_save(file)
  $game_temp.br_maps=Marshal.load(file)
 end
end
Instructions
Add one of these pictures in Graphics/System/fog.png
Place the script above Main
Compatibility
I don't know: lot of aliases in the Spriteset class
Credits and Thanks
Jess for the picture
Terms and Conditions
this script is totally free of use, but I need an apparent credit in your game and:
Do not post these scripts anywhere without my permission !
have fun.
Berka