Help - Search - Members - Calendar
Full Version: Berka's Fog of War
RPG RPG Revolution Forums > Scripting > Script Submissions > RGSS2-Submissions
berka
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


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

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
darkt6
I was wondering, how to bring the FoW back after you get rid of it?
berka
Well... this is not the same way at all.
I have not thought about this feature and I think that adding that could bring more lag.
But I'll see for that !
best regards,

berka

PS: My English is quite bad tonight, maybe am I so tired tongue.gif
Steve_1993
Great script! happy.gif
buny
please some one for demo??
MysTaFoX
Oh goodies I'm using this.
It works, I give u a hi-five for that.
reijubv
Finally!
I've trying to create this and I've failed...!

This script will be very very useful for my current project to limit player's line of sight...!!
SirCumferance
Copied the script, love the script. But got one problem:
On the main map, the hero enters the town. I am looking to remove the fog for the town so set the switch to On (hide fog)
then when the hero leaves town, I set the switch to Off (unhide fog) and get an error. Could you help?
Thanks
platipus
didnt work for me.
SirCumferance
QUOTE (platipus @ Jul 14 2009, 04:29 PM) *
didnt work for me.

What didnt work? The whole fog of war thing? Did you download the fog image and then import it? You gotta look in the script too and make sure the name of the uploaded fog matches. And the switch for fog off is whatever you want.

As for me, I am still hoping to get some help. I tried tweaking it but I am not capable of any sort of scripting.
Any takers for helping? Please?
elfyelf
very nice, ill find a use of it in my game.
Ill also give you credit :]
SojaBird
You might want to fix the codebox...

Greatzz,
SojaBird.
rgangsta
nice one
SirCumferance
So, I still need help to get it to clear a map of the fog. The switch causes errors and the clear_fog command fills it up with black. I wrote Berka but got nada in response. Someone, give me a shout on some help, please.
Secretmapper
The hud also is covered with fog, so as the messages. How to fix it? Also, after an event, I receive an error message.
Kread-EX
Just alter the ZFog value to 100 or lower. >_>
And what error message?
wild_bill236
the script looks great but what do i type when i call the script so i can see the opening auto-event?
Kread-EX
CODE
Fog.clear_fog(id)

Replace id with the real id of the map you want to clear. It's indicated in the editor.
wild_bill236
QUOTE (Kread-EX @ Jan 17 2012, 01:22 AM) *
CODE
Fog.clear_fog(id)

Replace id with the real id of the map you want to clear. It's indicated in the editor.

thanks for the quick reply. but how do i find my map id? when i type in the name of the map i get an error message.
Kread-EX
Right-click on your map (on the map tree) and select Map Properties. A box will appear, and on top of this box, your map name and a number like ID:XXX. This number is the ID. Just remove the extra zeroes (for instance, if it displays ID:007, the ID is 7).
wild_bill236
QUOTE (Kread-EX @ Jan 17 2012, 09:07 AM) *
Right-click on your map (on the map tree) and select Map Properties. A box will appear, and on top of this box, your map name and a number like ID:XXX. This number is the ID. Just remove the extra zeroes (for instance, if it displays ID:007, the ID is 7).


ok i found it thanks.

now one more question what kind of even do i put it in? i tried to put in in my opening auto-event but didn't work and then i tried a parrallel process event and i still wont work and my map id was 002. and this is what i put Fog.clear_fog(2). but it wont work on my map i even tried it on other maps.

thanks for all your help

ok i figured out where i messed up at. when i ues the code Fog.clear_fog(id) it resets the fog so i need the code to show my whole map please
Kread-EX
Woah you're right. Why did he called the method 'clear' in that case >_<

Actually it appears you need a switch to clear (for real) the fog. Check this in the script configuration:
CODE
IDFog      = 1

Replace 1 with the switch you want to use, and turn it to ON.
wild_bill236
QUOTE (Kread-EX @ Jan 18 2012, 03:35 AM) *
Woah you're right. Why did he called the method 'clear' in that case >_<

Actually it appears you need a switch to clear (for real) the fog. Check this in the script configuration:
CODE
IDFog      = 1

Replace 1 with the switch you want to use, and turn it to ON.


ok but now how do i find the switch id?

sorry i'm a noob when it comes to scripts sometimes i can get it right and other times i get lost trying to read them lol
munkis
QUOTE (wild_bill236 @ Jan 18 2012, 03:02 AM) *
ok but now how do i find the switch id?


When you go to insert a command into an event. there'll be a button (fourth one down on the first page) labeled Control Switches; click on it. The number shown in the first box is the switch ID; just remove the extra zeroes when you change the switch ID in the script.
wild_bill236
QUOTE (munkis @ Jan 18 2012, 06:52 AM) *
QUOTE (wild_bill236 @ Jan 18 2012, 03:02 AM) *
ok but now how do i find the switch id?


When you go to insert a command into an event. there'll be a button (fourth one down on the first page) labeled Control Switches; click on it. The number shown in the first box is the switch ID; just remove the extra zeroes when you change the switch ID in the script.


ok i got it working but here's the problem. it wont work on the game i'm working on at the moment i don't know if it's another script or an event that causing it not to work right on this game but i went like i was going to start a new project and it worked perfectly so i'm not sure whats goin on. i can upload it on mediafire if you want and see if you might find the problem.

a big thanks for all your help you really helped me out alot.
Kread-EX
Either you are turning the switch off before the map can update, either there's another script which uses the same switch.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Invision Power Board © 2001-2013 Invision Power Services, Inc.