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.

[VX] Berka's Fog of War

Fog of War
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
fog_sc10.png


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

un10.png

deux10.png

trois11.png

Big Thanks to Jess !
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
 
{FR}Dude :p
faut que tu nommes tes variables en anglais...étant donné que tout le code qui n'est pas de toi est en anglais... ca serait plus homogène, et au moins les scripteurs non Fr comprendrait ton code sans souci. ( pareil qd tu fais des commentaires ).{FR}

Cool script for dark dungeons :)
 
/FR
Ce code est le mien.
Si tu parles des méthodes clear_fog, ce sont les miennes (et soit dit en passant ce sont les plus simples des fonctions du script).
Je ne me serais pas permi de piquer le boulot d'un autre.
La seule partie du code qui n'est pas la mienne est l'equation du viewrange de nearfantastica:
Math.sqrt(((x-tx)**2+(y-ty)**2))
C'est vrai que je déteste commenter mon code... faut que je m'y oblige...
Merci :thumb:
/FR

regards,
berka
 
^^ vui je sais qu'il est de toi, je faisais référence au méthode de base du rgss et de ruby :p
genre "game_map", "Scene_file" etc...
t'as des trucs genre "br_obscurcis" qu'un anglophone pigera que dalle...
Après je suis comme toi je commente pas des masses mon code :p
 
L'ennui principal c'est que (t'as du le voir ^^) je poste mes scripts sur de nombreux fora. Je fais deux versions: Fr et En. Donc, déjà que je déteste traduire les instructions... si je dois traduire aussi les méthode :barf:
(Ils vont gueuler de voir autant de francais, ici ! :haha: )
berka
 

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