Show posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - Rymdpotatis

1
RMXP Script Database / Re: [XP] Blizz-ABS
September 06, 2008, 09:03:52 am
I've read the user manual but I still don't quite understand skills. I understand what the different def self's do, but I can't seem to link it to my skills nor give them graphics.

  module Skills
   
    def self.type(id)
      return [DIRECT, 0.0]
    end
   
    def self.range(id)
      return 1.0
    end
   
    def self.penalty(id)
      return 24
    end
   
    def self.charge(id)
      return [0, 0]
    end
   
    def self.trap(id)
      return 10
    end
   
  end



An example would be nice so that I could see how I should set things up, for example a classic magic missile that basically just shoots in the direction your looking.
2
RPG Maker Scripts / Re: Permadeath?
September 02, 2008, 04:53:04 pm
The point is that when the character dies he is dead. And the player will have to make a new one. It's a basic feature of any roguelike. And a part of the charm that keeps the player coming back for more, trying to stay alive, wanting to see what lies on the bottom of the dungeon.


Never heard of roguelikes? You must be an odd one:
http://en.wikipedia.org/wiki/Roguelike




Starrodkirby86:
Yes, that's called savescumming. Noobs do it, but most hardcore roguelike players don't since it ruins the fun.
3
Resource Requests / Help resizing image.
September 01, 2008, 03:15:45 pm
I've tried to resize this 21x43 image so it could fit in a 32x32 field with no success. I'm not great at pixel graphics so I was hoping that someone with time could take a look and see if they could pull it off. When I do it it gets all destorted^^

Image:
4
Event Systems / Re: Random treasure chest event.
August 30, 2008, 01:53:00 pm
Haha, yeah I know it's not very pretty nor effective. I'm still learning.

And thanks for the better event! =D
5
I'm having trouble with my random treasure chest event. I want it to be a random event that determines if the chest will appear or not, and a random event to determine what is in the chest.

This is my Chest event:
Page 1:
@>Control variables:[001:Chest Appear] = Random NO. (0...1)
@>
Page 2:
Variable>0001:Chest Appear is 1 or above
@>Conditional Branch: Variable:[001:Chest Appear] ==0
@>Erase Event
@>
Branch End
@>Conditional Branch:Variable [0001: Chest Appear ==1
@>Control Variables: [0002: Chest Loot] = Random No. (0...3)
@>Conditional Branch:Variable [0002: Chest Loot ==0
@>Change Items: [Red Potion], +1
@>Erase Event
@>
Branch End
@>Conditional Branch: Variable:[001:Chest Appear] ==0
@>Erase Event
@>
Branch End
@>Conditional Branch:Variable [0001: Chest Appear ==1
@>Control Variables: [0002: Chest Loot] = Random No. (0...3)
@>Conditional Branch:Variable [0002: Chest Loot ==1
@>Change Items: [Sword], +1
@>Erase Event
@>
Branch End

(Repeat 2 with changed item name and Chest Loot number.)

What happens is that it's always visible and it deals out items depending on where I stand relative to the chest. If I stand to the right I get the Sword, if I stand to the left I get the potion. And so on and so on. Any tip on what I've done wrong?
6
RMXP Script Database / Re: [XP] Blizz-ABS
August 29, 2008, 04:53:15 pm
Humm, odd.


Edit:
I downloaded the scripts again, got rid of mine and now it works..How very odd.
7
RMXP Script Database / Re: [XP] Blizz-ABS
August 29, 2008, 03:44:20 pm
Hm, I'm getting an error at line 3611 in part 3. Code:
      @id = $game_map.events.keys.max + 1

Saying: NoMethodError occured. Undefined method + for NilClass.

Could it be that one of my other scripts are messing something up?

Visible equipment script:
#==============================================================================
# ? Visual_Equipment
# Written by Rataime
#
# Edit below
#
# Note : If you have a custom Window_SaveFile, check the one at the end of the scrîpt,
# add the added lines to yours, and delete the whole Window_SaveFile class here
#==============================================================================
def equip_update(light=false)

$visual_equipment=Array.new
$visual_equipment[0]=light
for i in 0..3
  $visual_equipment[i+1]=[]
end

#===================================================
# ? EDIT HERE !
#===================================================   

#If weapon n°33 is equiped, add the charset tpl_helmet_1.png (I don't have a weapon charset ><)
#add_weapon_sprite(33,"tpl_helmet_1")

#If weapon n°6 is equiped, add the charset tpl_helmet_1.png
add_armor_sprite(1,"roguelike Skullcap")

add_armor_sprite(2,"roguelike Vikinghelmet")
add_armor_sprite(3,"roguelike chainmail")
add_armor_sprite(4,"roguelike bluecape")
add_armor_sprite(5,"rogue woodenbuckler")
add_armor_sprite(6,"roguelike steelshield")
add_armor_sprite(7,"rogue studdedbuckler")
add_armor_sprite(8,"roguelike templarshield")
add_armor_sprite(9,"rogue beholdershield")
add_weapon_sprite(1,"roguelike sword")
add_armor_sprite(10,"roguelike redgreenshhield")
add_armor_sprite(11,"rogue goldenshield")
add_armor_sprite(12,"roguelike skullshield")
add_armor_sprite(13,"roguelike dragonscaleshield")
add_armor_sprite(14,"rogue demonshield")
add_armor_sprite(15,"rogue vampireshield")
add_armor_sprite(16,"roguelike mysticshield")
add_armor_sprite(17,"rogue steelbuckler")
add_armor_sprite(18,"rogue orcshield")
add_weapon_sprite(2,"roguelike sabre")
add_weapon_sprite(3,"roguelike bone")
add_weapon_sprite(4,"roguelike mace")
add_weapon_sprite(5,"roguelike axe")
add_weapon_sprite(6,"roguelike waraxe")

#===================================================
# ? Visual_equip functions
#===================================================
RPG::Cache.clear
@game_party = $game_party
@game_party = $game_party2 if $visual_equipment[0]
for i in 0...@game_party.actors.size
  for img in $visual_equipment[i+1]
bitmap = RPG::Cache.character(@game_party.actors[i].character_name, @game_party.actors[i].character_hue)
if img!=true and img!=false
  add_equip(bitmap,img,i)
end
  end
end
end

  def add_equip(sprite,to_add,character)
  @game_party = $game_party
  @game_party = $game_party2 if $visual_equipment[0]
  bmp = Sprite.new
  bmp.visible =false
  bmp.bitmap = RPG::Cache.character(to_add,@game_party.actors[character].character_hue)
  color = bmp.bitmap.get_pixel(0, 0)
  x=sprite.width
  y=sprite.height
  if $visual_equipment[0]
x=x/4
y=y/4
  end
  for i in 0..x
for j in 0..y
  color_get=bmp.bitmap.get_pixel(i, j)
  if color_get!=color
sprite.set_pixel(i, j ,color_get)
  end
end
  end

  bmp=nil

  end

  def add_weapon_sprite(id,sprite)
@game_party = $game_party
@game_party = $game_party2 if $visual_equipment[0]
for i in 0...@game_party.actors.size
  if @game_party.actors[i].weapon_id==id
$visual_equipment[i+1].push(sprite)
  end
end
  end

  def add_armor_sprite(id,sprite)
@game_party = $game_party
@game_party = $game_party2 if $visual_equipment[0]
for i in 0...@game_party.actors.size
  if @game_party.actors[i].armor1_id==id or @game_party.actors[i].armor2_id==id or @game_party.actors[i].armor3_id==id or @game_party.actors[i].armor4_id==id
$visual_equipment[i+1].push(sprite)
  end
end
  end

#===================================================
# ? CLASS Scene_Equip edit
#===================================================

class Scene_Equip

  alias visual_update_right update_right

  def update_right
if Input.trigger?(Input::B)
  equip_update
  $game_system.se_play($data_system.cancel_se)
  $scene = Scene_Menu.new(2)
  return
end
visual_update_right
  end

end

class Interpreter

  alias visual_command_319 command_319

  def command_319
actor = $game_actors[@parameters[0]]
if actor != nil
  actor.equip(@parameters[1], @parameters[2])
end
equip_update
return true
  end

end

class Game_Character
  attr_accessor :character_hue
end

class Game_Actor < Game_Battler
alias visual_setup setup
  def setup(actor_id)
visual_setup(actor_id)
@character_hue = (@character_hue+1)%256
  end
end

class Scene_Load
  alias visual_read_save_data read_save_data
  alias visual_on_cancel on_cancel

  def on_cancel
equip_update
visual_on_cancel
  end

  def read_save_data(file)
visual_read_save_data(file)
equip_update
  end
end

class Scene_Save
  alias visual_on_decision on_decision
  alias visual_on_cancel on_cancel

  def on_cancel
equip_update
visual_on_cancel
  end

  def on_decision(file)
equip_update
visual_on_decision(file)
  end
end

class Scene_Title
  alias visual_command_new_game command_new_game

  def command_new_game
visual_command_new_game
equip_update
  end

end

class Window_SaveFile < Window_Base

  def initialize(file_index, filename)
super(0, 64 + file_index % 4 * 104, 640, 104)
self.contents = Bitmap.new(width - 32, height - 32)
self.contents.font.name = $fontface
self.contents.font.size = $fontsize
@file_index = file_index
@filename = "Save#{@file_index + 1}.rxdata"
@time_stamp = Time.at(0)
@file_exist = FileTest.exist?(@filename)
if @file_exist
  file = File.open(@filename, "r")
  @time_stamp = file.mtime
  @characters = Marshal.load(file)
  @frame_count = Marshal.load(file)
  @game_system = Marshal.load(file)
  @game_switches = Marshal.load(file)
  @game_variables = Marshal.load(file)
  @self_variables = Marshal.load(file)#added
  @game_screen = Marshal.load(file)#added
  @game_actors = Marshal.load(file)#added
  $game_party2=@game_party= Marshal.load(file)#added
  @total_sec = @frame_count / Graphics.frame_rate
  file.close
end
equip_update(true)#added
refresh
@selected = false
  end

end



Fog of War
#==============================================================================
# ** Fog of War
#------------------------------------------------------------------------------
# Version 2.0, 2005-11-21
# by Wachunga
#==============================================================================
=begin
0.8 - original release
0.85
- added colour parameter to map names
- fixed bug where map grids overlapped
0.9
- switched over to a tilemap (from a sprite)
- now more compatible with minimap scripts (but they'll have to take
extra tilemap into account)
1.0
- switched over to an autotile instead of using a custom tileset
* edges looks nicer, but gradual fading had to be removed
* colour parameter no longer possible (set by autotile)
- move event (including jumping and speed changes) bug fixed
- teleportation bug fixed
- some optimization
- made compatible with Cogwheel's Pixel Movement script
(see http://www.rmxp.net/forums/index.php?showtopic=24716 for details)
1.01
- fixed bug when teleporting from map without fow to a map with fow
2.0
- now two independent types of fog of war:
* static, which never returns (i.e. typical RTS "terrain" fog)
* dynamic, which returns once out of visual range and can optionally
hide map events (i.e. typical RTS "unit" fog)
- now using a compact version of Near's Dynamic Maps script
- fog of war is now above weather and normal fog
- added support for much larger visual ranges (0 - 9)
- added support for option to set up fog of war from a call script event
command
- optimization

A map specified as having "fog of war" (fow) has tiles that are (fully or
partially) obscured until the player gets within visual range. The amount of
fow to disappear as the player moves depends on the visual range specified.
Gamers with experience playing Real Time Strategy games like Warcraft, Age of
Empires, etc. should be quite familiar with the concept.

This script supports two kinds of fog of war: static and dynamic.

Static fow is the kind that typically hides terrain in RTS games. It covers
the entire map until the player explores the area, discovering the underlying
terrain. Once static fow disappears from an area of the map, it stays gone
indefinitely (even if loading a saved game, leaving the map and returning
later, going to the menu, etc).

Dynamic fow is identical to the static kind except that it doesn't stay gone
forever: as soon as the player leaves visual range of an explored tile,
dynamic fow covers it again. This kind of fow is typically used to hide enemy
units in RTS games.

SETUP:

There's no need to add the autotile via the database. Just place the
file in the autotile folder, import it, and change the FOW_AT_NAME constant
to the appropriate filename. To change the colour of the fog of war you must
create a new autotile. (However, opacity is customizable by constants below.)

To indicate a map is to have either (or both) of these kinds of fog of war,
include <fow> in its name (via "Map properties"). To enable both static and
dynamic fow, you can either add nothing more (since it's the default), or
add <s><d> (or <d><s>). To enable one or the other, just add the appropriate
one (e.g. <s> for static, <d> for dynamic). You may also optionally specify a
visual range between 0 and 9 in the map name (e.g. <5>), noting that 3 is
the default. Here are some example map names:
"your-map-name <fow><2>" (defaults to static&dynamic on; range specified as 2)
"your-map-name <fow><s>" (only static fow is on; range defaults to 3)
"your-map-name <fow><d><8>" (only dynamic fow is on; range specified as 8)

Alternatively, fog of war can be setup via a call script event command using
the fog_of_war global method. Detailed instructions are just before
the method itself.

Finally, an edited version of Near Fantastica's Dynamic Maps script needs
to be below this one. You may find it at the following URL:
http://www.rmxp.net/forums/index.php?showtopic=24716

The ranges work as follows:
range = 0 reveals just the square on which the player stands

range = 1 is the same as range 0 plus four adjacent tiles
i.e. @
@P@
@

range = 2 is the same as range 1 plus eight additional tiles
i.e. @
@@@
@@P@@
@@@
@

range = 3 (default) is the same as range 2 plus twelve additional tiles
i.e. @
@@@
@@@@@
@@@P@@@
@@@@@
@@@
@

etc.

Note: I've taken great pains to optimize this script as much as possible
(which unfortunately reduces the readability of the code). There shouldn't be
much visible effect on frame rate.

=end

#------------------------------------------------------------------------------
# filename of the fog of war autotile (used for both):
FOW_AT_NAME = 'FOG'
# the opacity of static (non-returning) and dynamic (returning) fog of war
# (value between 0 and 255)
# note that static fow appears on top of its dynamic counterpart (if both on)
FOW_STATIC_OPACITY = 255
FOW_DYNAMIC_OPACITY = 100
# whether or not dynamic fow hides map events
FOW_DYNAMIC_HIDES_EVENTS = true
# default range of fog of war (if not specified in map name)
FOW_RANGE_DEFAULT = 3
#------------------------------------------------------------------------------
# internal constants - no need to edit
FOW = 0b00
REVEALED = 0b01
# tiles with no surrounding fog are flagged "SKIP" for efficiency
SKIP = 0b10
#------------------------------------------------------------------------------

=begin
Setup fog of war.

This method is an alternative to using the default map name method, and
is designed to be called from a call script event command. This allows
fog of war to be dynamically enabled or disabled during gameplay.

Parameters:
static - if true, static fow enabled
dynamic - if true, dynamic fow enabled
(if both of the above are false, fow is totally disabled)
range (optional) - the visual range of the player
* default is FOW_RANGE_DEFAULT
reset (optional) - if true, fow for this map resets entirely (i.e. previously
explored areas are covered again)
* default is false

Sample calls:
fog_of_war(true,true,5) - enable both static and dynamic fow with range of 5
fog_of_war(false,false,3,true) - disable and reset both types of fow
=end
def fog_of_war(static, dynamic, range = FOW_RANGE_DEFAULT, reset = false)
if static == nil or dynamic == nil
print 'Two true/false parameters are required in call to fog_of_war.'
exit
elsif range < 0 or range > 9
print 'Invalid range in call to fog_of_war (only 0-9 is valid).'
exit
end
$game_map.fow_static = static
$game_map.fow_dynamic = dynamic
$game_map.fow_range = range
if reset
$game_map.fow_grid = nil
end
if not $game_map.fow_static and not $game_map.fow_dynamic
$game_map.fow = false
$scene.spriteset.fow_tilemap.dispose
# set all events back to visible
for i in $game_map.events.keys
$game_map.events[i].transparent = false
end
else
# static or dynamic fow (or both) are on
$game_map.fow = true
if $game_map.fow_grid == nil # only if not already defined
$game_map.fow_grid = Table.new($game_map.width, $game_map.height, 2)
for i in 0...$game_map.fow_grid.xsize
for j in 0...$game_map.fow_grid.ysize
$game_map.fow_grid[i,j,1] = $game_map.fow_grid[i,j,0] = FOW
end
end
end
if $game_map.fow_dynamic
$game_map.fow_revealed = $game_map.fow_last_revealed = []
end
$scene.spriteset.initialize_fow
end
end

class Game_Map
attr_accessor :fow
attr_accessor :fow_static
attr_accessor :fow_dynamic
attr_accessor :fow_grid
attr_accessor :fow_range
attr_accessor :fow_revealed
attr_accessor :fow_last_revealed

alias wachunga_fow_gm_setup setup
def setup(map_id)
wachunga_fow_gm_setup(map_id)
@fow = false
@fow_dynamic = false
@fow_static = false
@fow_grid = nil
@fow_range = nil
# get any tags from the map name
tags = $game_map.map_name.delete(' ').scan(/<[A-Za-z0-9_.,]+>/)
if not tags.empty? and tags[0].upcase == ('<FOW>')
tags.shift # remove FOW tag
@fow = true
if @fow_grid == nil # only if not already defined
@fow_grid = Table.new(@map.width, @map.height, 2)
for i in 0...@fow_grid.xsize
for j in 0...@fow_grid.ysize
@fow_grid[i,j,1] = @fow_grid[i,j,0] = FOW
end
end
end
# check if types of fog of war specified
while not tags.empty?
case tags[0].upcase
when '<S>'
@fow_static = true
when '<D>'
@fow_dynamic = true
else
x = tags[0].delete('<>').to_i
@fow_range = x if x >= 0 and x <= 9
end
tags.shift
end
# if <FOW> tag found but neither static nor dynamic specified, assume both
if @fow and not @fow_static and not @fow_dynamic
@fow_static = true
@fow_dynamic = true
end
# if no range specified, set to default
if @fow_range == nil
@fow_range = FOW_RANGE_DEFAULT
end
@fow_revealed = @fow_last_revealed = [] if @fow_dynamic
end
end

def map_name
return load_data('Data/MapInfos.rxdata')[@map_id].name
end

=begin
Updates the map's grid which keeps track of one or both of the following
(depending on what is enabled for the current map):
1) which tiles have been "discovered" (i.e. no static fog of war) based on
where the player has already explored
2) which tiles are currently not covered by dynamic fog of war (i.e. not in
visual range)
=end
def update_fow_grid
px = $game_player.x
py = $game_player.y
x = px - @fow_range
start_y = py
y = start_y
count = 1
mod = 1
# loop through all tiles in visible range
until x == (px + @fow_range+1)
i = count
while i > 0
if valid?(x,y)
if @fow_static
@fow_grid[x,y,1] |= REVEALED
end
if @fow_dynamic
@fow_grid[x,y,0] = REVEALED if @fow_grid[x,y,0] == FOW
@fow_revealed.push([x,y])
end
end
y -= 1
i -= 1
end
if x == px
mod = -1
end
x += 1
start_y += 1*mod
y = start_y
count += 2*mod
end
if @fow_dynamic
if @fow_last_revealed != []
# make dynamic fog return once out of visual range
for t in @fow_last_revealed - @fow_revealed
@fow_grid[t[0],t[1],0] = FOW
end
end
@fow_last_revealed = @fow_revealed
@fow_revealed = []
end
end

end

#------------------------------------------------------------------------------

class Spriteset_Map

attr_reader :fow_tilemap

alias wachunga_fow_ssm_initialize initialize
def initialize
initialize_fow if $game_map.fow
wachunga_fow_ssm_initialize
end

=begin
Initializes fog of war.
=end
def initialize_fow
@fow_tilemap = Tilemap.new
@fow_tilemap.map_data = Table.new($game_map.width, $game_map.height, 3)
@fow_tilemap.priorities = Table.new(144)
@fow_autotiles = Hash.new(0)
j = 48 # starting autotile index
for i in Autotile_Keys
@fow_autotiles[i] = j
j += 1
end
# add duplicates
for i in Duplicate_Keys.keys
@fow_autotiles[i] = @fow_autotiles[Duplicate_Keys[i]]
end
if $game_map.fow_static
for m in 0...$game_map.fow_grid.xsize
for n in 0...$game_map.fow_grid.ysize
# reset SKIP flag
$game_map.fow_grid[m,n,1] &= ~SKIP
end
end
at = Bitmap.new(96,128)
at.blt(0,0,RPG::Cache.autotile(FOW_AT_NAME),\
Rect.new(0,0,96,128),FOW_STATIC_OPACITY)
@fow_tilemap.autotiles[0] = at
# set everything to fog
for x in 0...$game_map.width
for y in 0...$game_map.height
@fow_tilemap.map_data[x,y,2] = 48 # fog
end
end
# set to highest priority
for i in 48...96
@fow_tilemap.priorities[i] = 5
end
end
if $game_map.fow_dynamic
bm = Bitmap.new(96,128)
bm.blt(0,0,RPG::Cache.autotile(FOW_AT_NAME),\
Rect.new(0,0,96,128),FOW_DYNAMIC_OPACITY)
@fow_tilemap.autotiles[1] = bm
# unlike tilemap for static, set everything to clear
for x in 0...$game_map.width
for y in 0...$game_map.height
@fow_tilemap.map_data[x,y,1] = 0
end
end
# set to highest priority
for i in 96...144
@fow_tilemap.priorities[i] = 5
end
end
$game_map.update_fow_grid
update_fow_tilemap
update_event_transparency if $game_map.fow_dynamic
end


=begin
Updates the (static and/or dynamic) fog of war tilemap based on the map's
underlying grid.
=end
def update_fow_tilemap
if $game_map.fow_static
checked = Table.new($game_map.width,$game_map.height)
for j in 0...$game_map.width
for k in 0...$game_map.height
checked[j,k] = 0
end
end
end
dx = ($game_map.display_x/128).round
dy = ($game_map.display_y/128).round
# to increase performance, only process fow currently on the screen
for x in dx-1 .. dx+21
for y in dy-1 .. dy+16
# check boundaries
if not $game_map.valid?(x,y) then next end
if $game_map.fow_dynamic
if $game_map.fow_grid[x,y,0] == REVEALED
@fow_tilemap.map_data[x,y,1] = 0 if @fow_tilemap.map_data[x,y,1]!=0
else
@fow_tilemap.map_data[x,y,1]=96 if @fow_tilemap.map_data[x,y,1]!=96
end
end
if $game_map.fow_static
if $game_map.fow_grid[x,y,1] == REVEALED # (but not SKIP)
others = false;
@fow_tilemap.map_data[x,y,2] = 0 if @fow_tilemap.map_data[x,y,2]!=0
for i in x-1 .. x+1
for j in y-1 .. y+1
# check new boundaries
if not $game_map.valid?(i,j) then next end
if $game_map.fow_grid[i,j,1] == FOW
others = true # can't flag as SKIP because there's nearby fog
if checked[i,j] == 0
checked[i,j] = 1
# only fill if not already revealed
if @fow_tilemap.map_data[i,j,2] != 0
adj = check_adjacent(i,j,1,$game_map.fow_grid,REVEALED)
if adj != nil
@fow_tilemap.map_data[i,j,2] =
eval '@fow_autotiles[adj.to_i]'
end
end
end
end
end
end
if not others
# no adjacent static fog found, so flag tile to avoid reprocessing
$game_map.fow_grid[x,y,1] |= SKIP
end
end
end # fow_static
end # for
end # for
if $game_map.fow_dynamic
if $game_map.fow_static
for x in dx-1 .. dx+21
for y in dy-1 .. dy+16
# erase dynamic fow if static fow is above it anyway
if @fow_tilemap.map_data[x,y,2] == 48
@fow_tilemap.map_data[x,y,1]=0 if @fow_tilemap.map_data[x,y,1]!=0
end
end
end
end
# calculate autotiles for dynamic fow (around player)
px = $game_player.x
py = $game_player.y
tiles = []
x = px - ($game_map.fow_range+1)
y_top = py
mod_top = -1
y_bot = py
mod_bot = 1
until x == px + ($game_map.fow_range+2)
tiles.push([x,y_top]) if $game_map.valid?(x,y_top)
tiles.push([x,y_bot]) if $game_map.valid?(x,y_bot)
if x == px
mod_top = 1
mod_bot = -1
x+=1
next
end
y_top+=1*mod_top
y_bot+=1*mod_bot
tiles.push([x,y_top]) if $game_map.valid?(x,y_top)
tiles.push([x,y_bot]) if $game_map.valid?(x,y_bot)
x+=1
end
tiles.uniq.each do |t|
adj = check_adjacent(t[0],t[1],0,$game_map.fow_grid,REVEALED)
if adj != nil
@fow_tilemap.map_data[t[0],t[1],1] =
(eval '@fow_autotiles[adj.to_i]') + 48
end
end
end
end

=begin
Update event transparency based on dynamic fog.

Note that if a specific character is passed as a parameter then only
its transparency is updated; otherwise, all events are processed.
=end
def update_event_transparency(pChar = nil)
return if not FOW_DYNAMIC_HIDES_EVENTS
if pChar == nil
# check them all
for i in $game_map.events.keys
event = $game_map.events[i]
if $game_map.fow_grid[event.x,event.y,0] == FOW
event.transparent = true
else
event.transparent = false
end
end
else
# just check the one
pChar.transparent=($game_map.fow_grid[pChar.x,pChar.y,0]==FOW) ?true:false
end
end

# create a list of tiles adjacent to a specific tile that don't match a flag
# (used for calculating tiles within an autotile)
def check_adjacent(i,j,k,grid,flag)
return if not $game_map.valid?(i,j) or grid == nil or flag == nil
adj = ''
if (i == 0)
adj << '147'
else
if (j == 0) then adj << '1'
else
if (grid[i-1,j-1,k] != flag) then adj << '1' end
end
if (grid[i-1,j,k] != flag) then adj << '4' end
if (j == $game_map.height-1) then adj << '7'
else
if (grid[i-1,j+1,k] != flag) then adj << '7' end
end
end
if (i == $game_map.width-1)
adj << '369'
else
if (j == 0) then adj << '3'
else
if (grid[i+1,j-1,k] != flag) then adj << '3' end
end
if (grid[i+1,j,k] != flag) then adj << '6' end
if (j == $game_map.height-1) then adj << '9'
else
if (grid[i+1,j+1,k] != flag) then adj << '9' end
end
end
if (j == 0)
adj << '2'
else
if (grid[i,j-1,k] != flag) then adj << '2' end
end
if (j == $game_map.height-1)
adj << '8'
else
if (grid[i,j+1,k] != flag) then adj << '8' end
end
# if no adjacent fog, set it as 0
if (adj == '') then adj = '0' end
# convert to an array, sort, and then back to a string
return adj.split(//).sort.join
end

alias wachunga_fow_ssm_dispose dispose
def dispose
@fow_tilemap.dispose if @fow_tilemap != nil
wachunga_fow_ssm_dispose
end

alias wachunga_fow_ssm_update update
def update
if $game_map.fow
@fow_tilemap.ox = $game_map.display_x / 4
@fow_tilemap.oy = $game_map.display_y / 4
@fow_tilemap.update
end
wachunga_fow_ssm_update
end
end

#------------------------------------------------------------------------------

class Game_Character
alias wachunga_fow_gch_initialize initialize
def initialize
wachunga_fow_gch_initialize
@last_x = @x
@last_y = @y
end

alias wachunga_fow_gch_update_move update_move
def update_move
wachunga_fow_gch_update_move
if $game_map.fow
if $game_map.fow_dynamic and (@x != @last_x or @y != @last_y)\
and self != $game_player
# check if character entered/left player's visual range
$scene.spriteset.update_event_transparency(self)
end
end
@last_x = @x
@last_y = @y
end
end

#------------------------------------------------------------------------------

class Game_Player

def update_jump
super
# only update when about to land, not revealing anything jumped over
if $game_map.fow and @jump_count == 0
$game_map.update_fow_grid
$scene.spriteset.update_event_transparency if $game_map.fow_dynamic
$scene.spriteset.update_fow_tilemap
end
end

def update_move
if $game_map.fow and (@x != @last_x or @y != @last_y)
unless jumping?
$game_map.update_fow_grid
$scene.spriteset.update_event_transparency if $game_map.fow_dynamic
$scene.spriteset.update_fow_tilemap
end
end
super
end

end

#------------------------------------------------------------------------------

class Scene_Map
attr_reader :spriteset
end

=begin
Autotile in column 2:

row\col| 1 2 3 4 5 6 7 8
---------------------------
1 | 48 49 50 51 52 53 54 55
2 | 56 57 58 59 60 61 62 63
3 | 64 65 66 67 68 69 70 71
4 | 72 73 74 75 76 77 78 79
5 | 80 81 82 83 84 85 86 87
6 | 88 89 90 91 92 93 94 95

The function to return the index of a single tile within an autotile
(given by at_index) is (at_index-1)*48 + col-1 + (row-1)*8
(where row, col, and at_index are again NOT zero-indexed)
=end

=begin
The following array lists systematic keys which are based on adjacent
walls (where 'W' is the wall itself):
1 2 3
4 W 6
7 8 9
e.g. 268 is the key that will be used to refer to the autotile
which has adjacent walls north, east, and south. For the Castle Prison
tileset (autotile #1), this is 67.

(It's a bit unwieldy, but it works.)
=end

Autotile_Keys = [
12346789,
2346789,
1246789,
246789,
1234678,
234678,
124678,
24678,

1234689,
234689,
124689,
24689,
123468,
23468,
12468,
2468,

23689,
2689,
2368,
268,
46789,
4678,
4689,
468,

12478,
1248,
2478,
248,
12346,
2346,
1246,
246,

28,
46,
689,
68,
478,
48,
124,
24,

236,
26,
8,
6,
2,
4,
0 ]

# many autotiles handle multiple situations
# this hash keeps track of which keys are identical
# to ones already defined above
Duplicate_Keys = {
123689 => 23689,
236789 => 23689,
1236789 => 23689,
34689 => 4689,
14689 => 4689,
134689 => 4689,
14678 => 4678,
34678 => 4678,
134678 => 4678,
146789 => 46789,
346789 => 46789,
1346789 => 46789,
23467 => 2346,
23469 => 2346,
234679 => 2346,
123467 => 12346,
123469 => 12346,
1234679 => 12346,
12467 => 1246,
12469 => 1246,
124679 => 1246,
124789 => 12478,
123478 => 12478,
1234789 => 12478,
146 => 46,
346 => 46,
467 => 46,
469 => 46,
1346 => 46,
1467 => 46,
1469 => 46,
3467 => 46,
3469 => 46,
4679 => 46,
13467 => 46,
13469 => 46,
14679 => 46,
34679 => 46,
134679 => 46,
128 => 28,
238 => 28,
278 => 28,
289 => 28,
1238 => 28,
1278 => 28,
1289 => 28,
2378 => 28,
2389 => 28,
2789 => 28,
12378 => 28,
12389 => 28,
12789 => 28,
23789 => 28,
123789 => 28,

1247 => 124,
2369 => 236,
147 => 4,
247 => 24,
14 => 4,
47 => 4,
1478 => 478,
3478 => 478,
4789 => 478,
134789 => 478,
14789 => 478,
13478 => 478,
34789 => 478,
1234 => 124,
1247 => 124,
1249 => 124,
12347 => 124,
12349 => 124,
12479 => 124,
123479 => 124,
1236 => 236,
2367 => 236,
2369 => 236,
12367 => 236,
12369 => 236,
23679 => 236,
123679 => 236,
12368 => 2368,
23678 => 2368,
123678 => 2368,
12348 => 1248,
12489 => 1248,
123489 => 1248,
1689 => 689,
3689 => 689,
6789 => 689,
13689 => 689,
16789 => 689,
36789 => 689,
136789 => 689,
12689 => 2689,
26789 => 2689,
126789 => 2689,
23478 => 2478,
24789 => 2478,
234789 => 2478,

12 => 2,
23 => 2,
27 => 2,
29 => 2,
123 => 2,
127 => 2,
129 => 2,
237 => 2,
239 => 2,
279 => 2,
1237 => 2,
1239 => 2,
1279 => 2,
2379 => 2,
12379 => 2,


14 => 4,
47 => 4,
34 => 4,
49 => 4,
147 => 4,
134 => 4,
347 => 4,
349 => 4,
149 => 4,
479 => 4,
1347 => 4,
1479 => 4,
1349 => 4,
3479 => 4,
13479 => 4,

16 => 6,
36 => 6,
67 => 6,
69 => 6,
136 => 6,
167 => 6,
169 => 6,
367 => 6,
369 => 6,
679 => 6,
1369 => 6,
3679 => 6,
1367 => 6,
1679 => 6,
13679 => 6,

78 => 8,
89 => 8,
18 => 8,
38 => 8,
138 => 8,
789 => 8,
178 => 8,
189 => 8,
378 => 8,
389 => 8,
1789 => 8,
3789 => 8,
1378 => 8,
1389 => 8,
13789 => 8,

1468 => 468,
3468 => 468,
13468 => 468,

2467 => 246,
2469 => 246,
24679 => 246,

2348 => 248,
2489 => 248,
23489 => 248,

1268 => 268,
2678 => 268,
12678 => 268,

148 => 48,
348 => 48,
489 => 48,
1348 => 48,
1489 => 48,
3489 => 48,
13489 => 48,

168 => 68,
368 => 68,
678 => 68,
1368 => 68,
1678 => 68,
3678 => 68,
13678 => 68,

234 => 24,
247 => 24,
249 => 24,
2347 => 24,
2349 => 24,
2479 => 24,
23479 => 24,

126 => 26,
267 => 26,
269 => 26,
1267 => 26,
1269 => 26,
2679 => 26,
12679 => 26,
}



Dynamic Map
#================================
# ? Dynamic Maps
#================================
# ?By: Near Fantastica
# Date: 05.09.05
# Version: 1
#================================

# updated 2005-11-07 by Wachunga
# generalized to work for modified versions of Game_Map,
# e.g. even if more instance variables are added

module Map
#--------------------------------------------------------------
@map_data = {}
#--------------------------------------------------------------------------
def Map.set_map(map, map_id)
@map_data[map_id] = map
end
#--------------------------------------------------------------------------
def Map.data(map_id)
return @map_data[map_id]
end
end

class Game_Map
#--------------------------------------------------------------
alias dm_orig_setup setup
def setup(map_id)
save_map(@map_id)
if Map.data(map_id) == nil
dm_orig_setup(map_id)
else
load_map(map_id)
end
end
#-----------------------------------------------------------
def load_map(map_id)
$game_map = Map.data(map_id)
end
#--------------------------------------------------------------
def save_map(map_id)
return if map_id == 0
Map.set_map(self.dup, map_id)
end
end

8
RPG Maker Scripts / Re: Permadeath?
August 29, 2008, 07:03:59 am
Cheers, I'll give it a go.
9
Script Requests / Line of sight/fog of war? [RESOLVED]
August 28, 2008, 03:58:35 pm
I would like to ask for a line of sight script that limits the players view so that the player can only see what's infront of him.

And a fog of war script that covers the map with darkness that gradually dissapear as the player moves around and explores. Capable of concealing events if possible.


Edit:
I found this script. And it works with Blizz-ABS!

#==============================================================================
# ** Fog of War
#------------------------------------------------------------------------------
# Version 2.0, 2005-11-21
# by Wachunga
#==============================================================================
=begin
0.8 - original release
0.85
- added colour parameter to map names
- fixed bug where map grids overlapped
0.9
- switched over to a tilemap (from a sprite)
- now more compatible with minimap scripts (but they'll have to take
extra tilemap into account)
1.0
- switched over to an autotile instead of using a custom tileset
* edges looks nicer, but gradual fading had to be removed
* colour parameter no longer possible (set by autotile)
- move event (including jumping and speed changes) bug fixed
- teleportation bug fixed
- some optimization
- made compatible with Cogwheel's Pixel Movement script
(see http://www.rmxp.net/forums/index.php?showtopic=24716 for details)
1.01
- fixed bug when teleporting from map without fow to a map with fow
2.0
- now two independent types of fog of war:
* static, which never returns (i.e. typical RTS "terrain" fog)
* dynamic, which returns once out of visual range and can optionally
hide map events (i.e. typical RTS "unit" fog)
- now using a compact version of Near's Dynamic Maps script
- fog of war is now above weather and normal fog
- added support for much larger visual ranges (0 - 9)
- added support for option to set up fog of war from a call script event
command
- optimization

A map specified as having "fog of war" (fow) has tiles that are (fully or
partially) obscured until the player gets within visual range. The amount of
fow to disappear as the player moves depends on the visual range specified.
Gamers with experience playing Real Time Strategy games like Warcraft, Age of
Empires, etc. should be quite familiar with the concept.

This script supports two kinds of fog of war: static and dynamic.

Static fow is the kind that typically hides terrain in RTS games. It covers
the entire map until the player explores the area, discovering the underlying
terrain. Once static fow disappears from an area of the map, it stays gone
indefinitely (even if loading a saved game, leaving the map and returning
later, going to the menu, etc).

Dynamic fow is identical to the static kind except that it doesn't stay gone
forever: as soon as the player leaves visual range of an explored tile,
dynamic fow covers it again. This kind of fow is typically used to hide enemy
units in RTS games.

SETUP:

There's no need to add the autotile via the database. Just place the
file in the autotile folder, import it, and change the FOW_AT_NAME constant
to the appropriate filename. To change the colour of the fog of war you must
create a new autotile. (However, opacity is customizable by constants below.)

To indicate a map is to have either (or both) of these kinds of fog of war,
include <fow> in its name (via "Map properties"). To enable both static and
dynamic fow, you can either add nothing more (since it's the default), or
add <s><d> (or <d><s>). To enable one or the other, just add the appropriate
one (e.g. <s> for static, <d> for dynamic). You may also optionally specify a
visual range between 0 and 9 in the map name (e.g. <5>), noting that 3 is
the default. Here are some example map names:
"your-map-name <fow><2>" (defaults to static&dynamic on; range specified as 2)
"your-map-name <fow><s>" (only static fow is on; range defaults to 3)
"your-map-name <fow><d><8>" (only dynamic fow is on; range specified as 8)

Alternatively, fog of war can be setup via a call script event command using
the fog_of_war global method. Detailed instructions are just before
the method itself.

Finally, an edited version of Near Fantastica's Dynamic Maps script needs
to be below this one. You may find it at the following URL:
http://www.rmxp.net/forums/index.php?showtopic=24716

The ranges work as follows:
range = 0 reveals just the square on which the player stands

range = 1 is the same as range 0 plus four adjacent tiles
i.e. @
@P@
@

range = 2 is the same as range 1 plus eight additional tiles
i.e. @
@@@
@@P@@
@@@
@

range = 3 (default) is the same as range 2 plus twelve additional tiles
i.e. @
@@@
@@@@@
@@@P@@@
@@@@@
@@@
@

etc.

Note: I've taken great pains to optimize this script as much as possible
(which unfortunately reduces the readability of the code). There shouldn't be
much visible effect on frame rate.

=end

#------------------------------------------------------------------------------
# filename of the fog of war autotile (used for both):
FOW_AT_NAME = 'FOG'
# the opacity of static (non-returning) and dynamic (returning) fog of war
# (value between 0 and 255)
# note that static fow appears on top of its dynamic counterpart (if both on)
FOW_STATIC_OPACITY = 255
FOW_DYNAMIC_OPACITY = 100
# whether or not dynamic fow hides map events
FOW_DYNAMIC_HIDES_EVENTS = true
# default range of fog of war (if not specified in map name)
FOW_RANGE_DEFAULT = 3
#------------------------------------------------------------------------------
# internal constants - no need to edit
FOW = 0b00
REVEALED = 0b01
# tiles with no surrounding fog are flagged "SKIP" for efficiency
SKIP = 0b10
#------------------------------------------------------------------------------

=begin
Setup fog of war.

This method is an alternative to using the default map name method, and
is designed to be called from a call script event command. This allows
fog of war to be dynamically enabled or disabled during gameplay.

Parameters:
static - if true, static fow enabled
dynamic - if true, dynamic fow enabled
(if both of the above are false, fow is totally disabled)
range (optional) - the visual range of the player
* default is FOW_RANGE_DEFAULT
reset (optional) - if true, fow for this map resets entirely (i.e. previously
explored areas are covered again)
* default is false

Sample calls:
fog_of_war(true,true,5) - enable both static and dynamic fow with range of 5
fog_of_war(false,false,3,true) - disable and reset both types of fow
=end
def fog_of_war(static, dynamic, range = FOW_RANGE_DEFAULT, reset = false)
if static == nil or dynamic == nil
print 'Two true/false parameters are required in call to fog_of_war.'
exit
elsif range < 0 or range > 9
print 'Invalid range in call to fog_of_war (only 0-9 is valid).'
exit
end
$game_map.fow_static = static
$game_map.fow_dynamic = dynamic
$game_map.fow_range = range
if reset
$game_map.fow_grid = nil
end
if not $game_map.fow_static and not $game_map.fow_dynamic
$game_map.fow = false
$scene.spriteset.fow_tilemap.dispose
# set all events back to visible
for i in $game_map.events.keys
$game_map.events[i].transparent = false
end
else
# static or dynamic fow (or both) are on
$game_map.fow = true
if $game_map.fow_grid == nil # only if not already defined
$game_map.fow_grid = Table.new($game_map.width, $game_map.height, 2)
for i in 0...$game_map.fow_grid.xsize
for j in 0...$game_map.fow_grid.ysize
$game_map.fow_grid[i,j,1] = $game_map.fow_grid[i,j,0] = FOW
end
end
end
if $game_map.fow_dynamic
$game_map.fow_revealed = $game_map.fow_last_revealed = []
end
$scene.spriteset.initialize_fow
end
end

class Game_Map
attr_accessor :fow
attr_accessor :fow_static
attr_accessor :fow_dynamic
attr_accessor :fow_grid
attr_accessor :fow_range
attr_accessor :fow_revealed
attr_accessor :fow_last_revealed

alias wachunga_fow_gm_setup setup
def setup(map_id)
wachunga_fow_gm_setup(map_id)
@fow = false
@fow_dynamic = false
@fow_static = false
@fow_grid = nil
@fow_range = nil
# get any tags from the map name
tags = $game_map.map_name.delete(' ').scan(/<[A-Za-z0-9_.,]+>/)
if not tags.empty? and tags[0].upcase == ('<FOW>')
tags.shift # remove FOW tag
@fow = true
if @fow_grid == nil # only if not already defined
@fow_grid = Table.new(@map.width, @map.height, 2)
for i in 0...@fow_grid.xsize
for j in 0...@fow_grid.ysize
@fow_grid[i,j,1] = @fow_grid[i,j,0] = FOW
end
end
end
# check if types of fog of war specified
while not tags.empty?
case tags[0].upcase
when '<S>'
@fow_static = true
when '<D>'
@fow_dynamic = true
else
x = tags[0].delete('<>').to_i
@fow_range = x if x >= 0 and x <= 9
end
tags.shift
end
# if <FOW> tag found but neither static nor dynamic specified, assume both
if @fow and not @fow_static and not @fow_dynamic
@fow_static = true
@fow_dynamic = true
end
# if no range specified, set to default
if @fow_range == nil
@fow_range = FOW_RANGE_DEFAULT
end
@fow_revealed = @fow_last_revealed = [] if @fow_dynamic
end
end

def map_name
return load_data('Data/MapInfos.rxdata')[@map_id].name
end

=begin
Updates the map's grid which keeps track of one or both of the following
(depending on what is enabled for the current map):
1) which tiles have been "discovered" (i.e. no static fog of war) based on
where the player has already explored
2) which tiles are currently not covered by dynamic fog of war (i.e. not in
visual range)
=end
def update_fow_grid
px = $game_player.x
py = $game_player.y
x = px - @fow_range
start_y = py
y = start_y
count = 1
mod = 1
# loop through all tiles in visible range
until x == (px + @fow_range+1)
i = count
while i > 0
if valid?(x,y)
if @fow_static
@fow_grid[x,y,1] |= REVEALED
end
if @fow_dynamic
@fow_grid[x,y,0] = REVEALED if @fow_grid[x,y,0] == FOW
@fow_revealed.push([x,y])
end
end
y -= 1
i -= 1
end
if x == px
mod = -1
end
x += 1
start_y += 1*mod
y = start_y
count += 2*mod
end
if @fow_dynamic
if @fow_last_revealed != []
# make dynamic fog return once out of visual range
for t in @fow_last_revealed - @fow_revealed
@fow_grid[t[0],t[1],0] = FOW
end
end
@fow_last_revealed = @fow_revealed
@fow_revealed = []
end
end

end

#------------------------------------------------------------------------------

class Spriteset_Map

attr_reader :fow_tilemap

alias wachunga_fow_ssm_initialize initialize
def initialize
initialize_fow if $game_map.fow
wachunga_fow_ssm_initialize
end

=begin
Initializes fog of war.
=end
def initialize_fow
@fow_tilemap = Tilemap.new
@fow_tilemap.map_data = Table.new($game_map.width, $game_map.height, 3)
@fow_tilemap.priorities = Table.new(144)
@fow_autotiles = Hash.new(0)
j = 48 # starting autotile index
for i in Autotile_Keys
@fow_autotiles[i] = j
j += 1
end
# add duplicates
for i in Duplicate_Keys.keys
@fow_autotiles[i] = @fow_autotiles[Duplicate_Keys[i]]
end
if $game_map.fow_static
for m in 0...$game_map.fow_grid.xsize
for n in 0...$game_map.fow_grid.ysize
# reset SKIP flag
$game_map.fow_grid[m,n,1] &= ~SKIP
end
end
at = Bitmap.new(96,128)
at.blt(0,0,RPG::Cache.autotile(FOW_AT_NAME),\
Rect.new(0,0,96,128),FOW_STATIC_OPACITY)
@fow_tilemap.autotiles[0] = at
# set everything to fog
for x in 0...$game_map.width
for y in 0...$game_map.height
@fow_tilemap.map_data[x,y,2] = 48 # fog
end
end
# set to highest priority
for i in 48...96
@fow_tilemap.priorities[i] = 5
end
end
if $game_map.fow_dynamic
bm = Bitmap.new(96,128)
bm.blt(0,0,RPG::Cache.autotile(FOW_AT_NAME),\
Rect.new(0,0,96,128),FOW_DYNAMIC_OPACITY)
@fow_tilemap.autotiles[1] = bm
# unlike tilemap for static, set everything to clear
for x in 0...$game_map.width
for y in 0...$game_map.height
@fow_tilemap.map_data[x,y,1] = 0
end
end
# set to highest priority
for i in 96...144
@fow_tilemap.priorities[i] = 5
end
end
$game_map.update_fow_grid
update_fow_tilemap
update_event_transparency if $game_map.fow_dynamic
end


=begin
Updates the (static and/or dynamic) fog of war tilemap based on the map's
underlying grid.
=end
def update_fow_tilemap
if $game_map.fow_static
checked = Table.new($game_map.width,$game_map.height)
for j in 0...$game_map.width
for k in 0...$game_map.height
checked[j,k] = 0
end
end
end
dx = ($game_map.display_x/128).round
dy = ($game_map.display_y/128).round
# to increase performance, only process fow currently on the screen
for x in dx-1 .. dx+21
for y in dy-1 .. dy+16
# check boundaries
if not $game_map.valid?(x,y) then next end
if $game_map.fow_dynamic
if $game_map.fow_grid[x,y,0] == REVEALED
@fow_tilemap.map_data[x,y,1] = 0 if @fow_tilemap.map_data[x,y,1]!=0
else
@fow_tilemap.map_data[x,y,1]=96 if @fow_tilemap.map_data[x,y,1]!=96
end
end
if $game_map.fow_static
if $game_map.fow_grid[x,y,1] == REVEALED # (but not SKIP)
others = false;
@fow_tilemap.map_data[x,y,2] = 0 if @fow_tilemap.map_data[x,y,2]!=0
for i in x-1 .. x+1
for j in y-1 .. y+1
# check new boundaries
if not $game_map.valid?(i,j) then next end
if $game_map.fow_grid[i,j,1] == FOW
others = true # can't flag as SKIP because there's nearby fog
if checked[i,j] == 0
checked[i,j] = 1
# only fill if not already revealed
if @fow_tilemap.map_data[i,j,2] != 0
adj = check_adjacent(i,j,1,$game_map.fow_grid,REVEALED)
if adj != nil
@fow_tilemap.map_data[i,j,2] =
eval '@fow_autotiles[adj.to_i]'
end
end
end
end
end
end
if not others
# no adjacent static fog found, so flag tile to avoid reprocessing
$game_map.fow_grid[x,y,1] |= SKIP
end
end
end # fow_static
end # for
end # for
if $game_map.fow_dynamic
if $game_map.fow_static
for x in dx-1 .. dx+21
for y in dy-1 .. dy+16
# erase dynamic fow if static fow is above it anyway
if @fow_tilemap.map_data[x,y,2] == 48
@fow_tilemap.map_data[x,y,1]=0 if @fow_tilemap.map_data[x,y,1]!=0
end
end
end
end
# calculate autotiles for dynamic fow (around player)
px = $game_player.x
py = $game_player.y
tiles = []
x = px - ($game_map.fow_range+1)
y_top = py
mod_top = -1
y_bot = py
mod_bot = 1
until x == px + ($game_map.fow_range+2)
tiles.push([x,y_top]) if $game_map.valid?(x,y_top)
tiles.push([x,y_bot]) if $game_map.valid?(x,y_bot)
if x == px
mod_top = 1
mod_bot = -1
x+=1
next
end
y_top+=1*mod_top
y_bot+=1*mod_bot
tiles.push([x,y_top]) if $game_map.valid?(x,y_top)
tiles.push([x,y_bot]) if $game_map.valid?(x,y_bot)
x+=1
end
tiles.uniq.each do |t|
adj = check_adjacent(t[0],t[1],0,$game_map.fow_grid,REVEALED)
if adj != nil
@fow_tilemap.map_data[t[0],t[1],1] =
(eval '@fow_autotiles[adj.to_i]') + 48
end
end
end
end

=begin
Update event transparency based on dynamic fog.

Note that if a specific character is passed as a parameter then only
its transparency is updated; otherwise, all events are processed.
=end
def update_event_transparency(pChar = nil)
return if not FOW_DYNAMIC_HIDES_EVENTS
if pChar == nil
# check them all
for i in $game_map.events.keys
event = $game_map.events[i]
if $game_map.fow_grid[event.x,event.y,0] == FOW
event.transparent = true
else
event.transparent = false
end
end
else
# just check the one
pChar.transparent=($game_map.fow_grid[pChar.x,pChar.y,0]==FOW) ?true:false
end
end

# create a list of tiles adjacent to a specific tile that don't match a flag
# (used for calculating tiles within an autotile)
def check_adjacent(i,j,k,grid,flag)
return if not $game_map.valid?(i,j) or grid == nil or flag == nil
adj = ''
if (i == 0)
adj << '147'
else
if (j == 0) then adj << '1'
else
if (grid[i-1,j-1,k] != flag) then adj << '1' end
end
if (grid[i-1,j,k] != flag) then adj << '4' end
if (j == $game_map.height-1) then adj << '7'
else
if (grid[i-1,j+1,k] != flag) then adj << '7' end
end
end
if (i == $game_map.width-1)
adj << '369'
else
if (j == 0) then adj << '3'
else
if (grid[i+1,j-1,k] != flag) then adj << '3' end
end
if (grid[i+1,j,k] != flag) then adj << '6' end
if (j == $game_map.height-1) then adj << '9'
else
if (grid[i+1,j+1,k] != flag) then adj << '9' end
end
end
if (j == 0)
adj << '2'
else
if (grid[i,j-1,k] != flag) then adj << '2' end
end
if (j == $game_map.height-1)
adj << '8'
else
if (grid[i,j+1,k] != flag) then adj << '8' end
end
# if no adjacent fog, set it as 0
if (adj == '') then adj = '0' end
# convert to an array, sort, and then back to a string
return adj.split(//).sort.join
end

alias wachunga_fow_ssm_dispose dispose
def dispose
@fow_tilemap.dispose if @fow_tilemap != nil
wachunga_fow_ssm_dispose
end

alias wachunga_fow_ssm_update update
def update
if $game_map.fow
@fow_tilemap.ox = $game_map.display_x / 4
@fow_tilemap.oy = $game_map.display_y / 4
@fow_tilemap.update
end
wachunga_fow_ssm_update
end
end

#------------------------------------------------------------------------------

class Game_Character
alias wachunga_fow_gch_initialize initialize
def initialize
wachunga_fow_gch_initialize
@last_x = @x
@last_y = @y
end

alias wachunga_fow_gch_update_move update_move
def update_move
wachunga_fow_gch_update_move
if $game_map.fow
if $game_map.fow_dynamic and (@x != @last_x or @y != @last_y)\
and self != $game_player
# check if character entered/left player's visual range
$scene.spriteset.update_event_transparency(self)
end
end
@last_x = @x
@last_y = @y
end
end

#------------------------------------------------------------------------------

class Game_Player

def update_jump
super
# only update when about to land, not revealing anything jumped over
if $game_map.fow and @jump_count == 0
$game_map.update_fow_grid
$scene.spriteset.update_event_transparency if $game_map.fow_dynamic
$scene.spriteset.update_fow_tilemap
end
end

def update_move
if $game_map.fow and (@x != @last_x or @y != @last_y)
unless jumping?
$game_map.update_fow_grid
$scene.spriteset.update_event_transparency if $game_map.fow_dynamic
$scene.spriteset.update_fow_tilemap
end
end
super
end

end

#------------------------------------------------------------------------------

class Scene_Map
attr_reader :spriteset
end

=begin
Autotile in column 2:

row\col| 1 2 3 4 5 6 7 8
---------------------------
1 | 48 49 50 51 52 53 54 55
2 | 56 57 58 59 60 61 62 63
3 | 64 65 66 67 68 69 70 71
4 | 72 73 74 75 76 77 78 79
5 | 80 81 82 83 84 85 86 87
6 | 88 89 90 91 92 93 94 95

The function to return the index of a single tile within an autotile
(given by at_index) is (at_index-1)*48 + col-1 + (row-1)*8
(where row, col, and at_index are again NOT zero-indexed)
=end

=begin
The following array lists systematic keys which are based on adjacent
walls (where 'W' is the wall itself):
1 2 3
4 W 6
7 8 9
e.g. 268 is the key that will be used to refer to the autotile
which has adjacent walls north, east, and south. For the Castle Prison
tileset (autotile #1), this is 67.

(It's a bit unwieldy, but it works.)
=end

Autotile_Keys = [
12346789,
2346789,
1246789,
246789,
1234678,
234678,
124678,
24678,

1234689,
234689,
124689,
24689,
123468,
23468,
12468,
2468,

23689,
2689,
2368,
268,
46789,
4678,
4689,
468,

12478,
1248,
2478,
248,
12346,
2346,
1246,
246,

28,
46,
689,
68,
478,
48,
124,
24,

236,
26,
8,
6,
2,
4,
0 ]

# many autotiles handle multiple situations
# this hash keeps track of which keys are identical
# to ones already defined above
Duplicate_Keys = {
123689 => 23689,
236789 => 23689,
1236789 => 23689,
34689 => 4689,
14689 => 4689,
134689 => 4689,
14678 => 4678,
34678 => 4678,
134678 => 4678,
146789 => 46789,
346789 => 46789,
1346789 => 46789,
23467 => 2346,
23469 => 2346,
234679 => 2346,
123467 => 12346,
123469 => 12346,
1234679 => 12346,
12467 => 1246,
12469 => 1246,
124679 => 1246,
124789 => 12478,
123478 => 12478,
1234789 => 12478,
146 => 46,
346 => 46,
467 => 46,
469 => 46,
1346 => 46,
1467 => 46,
1469 => 46,
3467 => 46,
3469 => 46,
4679 => 46,
13467 => 46,
13469 => 46,
14679 => 46,
34679 => 46,
134679 => 46,
128 => 28,
238 => 28,
278 => 28,
289 => 28,
1238 => 28,
1278 => 28,
1289 => 28,
2378 => 28,
2389 => 28,
2789 => 28,
12378 => 28,
12389 => 28,
12789 => 28,
23789 => 28,
123789 => 28,

1247 => 124,
2369 => 236,
147 => 4,
247 => 24,
14 => 4,
47 => 4,
1478 => 478,
3478 => 478,
4789 => 478,
134789 => 478,
14789 => 478,
13478 => 478,
34789 => 478,
1234 => 124,
1247 => 124,
1249 => 124,
12347 => 124,
12349 => 124,
12479 => 124,
123479 => 124,
1236 => 236,
2367 => 236,
2369 => 236,
12367 => 236,
12369 => 236,
23679 => 236,
123679 => 236,
12368 => 2368,
23678 => 2368,
123678 => 2368,
12348 => 1248,
12489 => 1248,
123489 => 1248,
1689 => 689,
3689 => 689,
6789 => 689,
13689 => 689,
16789 => 689,
36789 => 689,
136789 => 689,
12689 => 2689,
26789 => 2689,
126789 => 2689,
23478 => 2478,
24789 => 2478,
234789 => 2478,

12 => 2,
23 => 2,
27 => 2,
29 => 2,
123 => 2,
127 => 2,
129 => 2,
237 => 2,
239 => 2,
279 => 2,
1237 => 2,
1239 => 2,
1279 => 2,
2379 => 2,
12379 => 2,


14 => 4,
47 => 4,
34 => 4,
49 => 4,
147 => 4,
134 => 4,
347 => 4,
349 => 4,
149 => 4,
479 => 4,
1347 => 4,
1479 => 4,
1349 => 4,
3479 => 4,
13479 => 4,

16 => 6,
36 => 6,
67 => 6,
69 => 6,
136 => 6,
167 => 6,
169 => 6,
367 => 6,
369 => 6,
679 => 6,
1369 => 6,
3679 => 6,
1367 => 6,
1679 => 6,
13679 => 6,

78 => 8,
89 => 8,
18 => 8,
38 => 8,
138 => 8,
789 => 8,
178 => 8,
189 => 8,
378 => 8,
389 => 8,
1789 => 8,
3789 => 8,
1378 => 8,
1389 => 8,
13789 => 8,

1468 => 468,
3468 => 468,
13468 => 468,

2467 => 246,
2469 => 246,
24679 => 246,

2348 => 248,
2489 => 248,
23489 => 248,

1268 => 268,
2678 => 268,
12678 => 268,

148 => 48,
348 => 48,
489 => 48,
1348 => 48,
1489 => 48,
3489 => 48,
13489 => 48,

168 => 68,
368 => 68,
678 => 68,
1368 => 68,
1678 => 68,
3678 => 68,
13678 => 68,

234 => 24,
247 => 24,
249 => 24,
2347 => 24,
2349 => 24,
2479 => 24,
23479 => 24,

126 => 26,
267 => 26,
269 => 26,
1267 => 26,
1269 => 26,
2679 => 26,
12679 => 26,
}


#================================
# ? Dynamic Maps
#================================
# ?By: Near Fantastica
# Date: 05.09.05
# Version: 1
#================================

# updated 2005-11-07 by Wachunga
# generalized to work for modified versions of Game_Map,
# e.g. even if more instance variables are added

module Map
#--------------------------------------------------------------
@map_data = {}
#--------------------------------------------------------------------------
def Map.set_map(map, map_id)
@map_data[map_id] = map
end
#--------------------------------------------------------------------------
def Map.data(map_id)
return @map_data[map_id]
end
end

class Game_Map
#--------------------------------------------------------------
alias dm_orig_setup setup
def setup(map_id)
save_map(@map_id)
if Map.data(map_id) == nil
dm_orig_setup(map_id)
else
load_map(map_id)
end
end
#-----------------------------------------------------------
def load_map(map_id)
$game_map = Map.data(map_id)
end
#--------------------------------------------------------------
def save_map(map_id)
return if map_id == 0
Map.set_map(self.dup, map_id)
end
end
10
RPG Maker Scripts / Permadeath?
August 28, 2008, 01:53:13 pm
Is it possible to make permadeath? That is, when the player dies the savefile he uses gets deleted and he is forced to make a new character.
11
General Discussion / Porting RMXP games to consoles?
August 28, 2008, 06:19:48 am
Is it possible to port games made in RMXP to consoles by using scripts or by editing something else?
12
Resources / Re: Rymdpotatis Roguelike graphics.
August 25, 2008, 04:08:07 pm
Update:





Here are my latest works, this time in 32x32.



13
I'm not sure if anyone here is playing around with RM2K3 but this is the only forum I know off with people that actually knows what they are talking about so I figured I would try asking.
I've been experimenting with RM2K3 for a while and I actually found it to be a bit easier then RMXP.
Anyway, this is the bit I'm having trouble with. I'm experimenting with a custom inventory system by using a map, there are 40 invisible events on that map, and as the player pick things up they check to see if the player has an item in the inventory, if he does one of them changes charset to match that item, when the player moves over the item in the inventory map he can choose to equip, discard or read about the item. However I've only managed to get it to work with 1 item, I'm not sure how to make the conditional branches and all the variables so they check if an inventory slot is taken so the item ends up next to it.
14
Resources / Rymdpotatis Roguelike graphics.
August 20, 2008, 05:26:53 am
I've recently been experimenting with making my roguelike with other engines then RMXP. RM2K3 seemed more then capable of producing adequate results. Although I would have to skip some features if I where to use it. I even tried learning C# that was very hard but quite alot of fun actually. Anyway, I drew up a couple of 16*16 sprites so I could test things out. I don't know if they are any good or if anyone would want them. But I'll upload  a small showcase with them anyway. If nothing else, it's nice to see what people think. If it turns out that someone likes them and would want more I would be happy to share them.

15
I got my hands on a japanese dungeon generating script for RMVX that generates dungeons each time you enter a map instead of having a static and boring dungeon. However there are some bugs in it, like the stairs or the player ending up in walls etc.  I will post it incase someone wants to tinker with it and use it for them selves. I'm using it myself and it's quite nice. Hope you enjoy my find.^^

Original link is http://racanhack.sourceforge.jp/rhdoc/index.html

#-------------------------------------------------------------------------------
# ??????????????

# roguelike??????????????????????Game_Map????
# ??????
# ????????????????
# ??????????????????????????????
# ?????????????????????????????????????
#
# ?????????
#   Racanhack ????? [ http://racanhack.sourceforge.jp/rhdoc/index.html ]
#     ????????????????????

# ????
# ???ROGUELIKE_MAP_ID???????ID??? or
# ????????????????$game_map.make_dungeon?????
#
#----------------------------------------------------------------------------
# ??
#----------------------------------------------------------------------------
module ROGUELIKE_MAP
  # ?????????ID???
  # ?.???ID003?005???????? ? ROGUELIKE_MAP_ID = [3,5]
  ROGUELIKE_MAP_ID = []
  # VX????ID????????????????????
  # ????????ID
  SPACE_TILE_ID = 5888
  # ?????ID
  FLOOR_TILE_ID = 1552
  # ?????ID
  WALL_TILE_ID = 6280
  # ???????????(??????64, 1/????????????)
  # ??????????????????????1????
  # ??????????????????????????(nil???)
  BIG_ROOM = 64
  BIG_ROOM_SWITCH = nil
  # ??????????(??????96, 1/????????)
  ADD_COUPLE = 96
  # ?????????
  MIN_ROOM_SIZE = 2
  # ????????(3??????????????)
  MIN_BTWN_RECT_ROOM = 3
  # ?????????(??????2 + 3 * 2 = 8)
  MIN_RECT_SIZE = MIN_ROOM_SIZE + (MIN_BTWN_RECT_ROOM * 2)
  #--------------------------------------------------------------------------
  R_VERTICAL = 0
  R_HORIZONAL = 1
  # ?????????
  # min??max??????int??????
  def rand_range(min, max)
    return((min + rand(max - min)).round)
  end
#-------------------------------------------------------------------------------
  #R_Couple??? ????????
  class R_Couple
    attr_accessor :v_or_h
    attr_accessor :rect0
    attr_accessor :rect1
    def initialize(v_or_h, rect0, rect1)
      @v_or_h = v_or_h
      @rect0 = rect0
      @rect1 = rect1
    end
  end
  #R_Room??? ????????
  class R_Room
    attr_accessor :lx
    attr_accessor :ly
    attr_accessor :hx
    attr_accessor :hy
    def initialize(lx, ly, hx, hy)
      @lx = lx
      @ly = ly
      @hx = hx
      @hy = hy
    end
  end
  #R_Rect??? ????????
  class R_Rect < R_Room
    attr_accessor :done_v
    attr_accessor :done_h
    attr_accessor :room
    def initialize(lx, ly, hx, hy, done_v = false, done_h = false, room = nil)
      super(lx, ly, hx, hy)
      @done_v = done_v
      @done_h = done_h
      @room = room
    end
  end
end
#-------------------------------------------------------------------------------
# ? Game_Map
#-------------------------------------------------------------------------------
# ??????????????????????????????????????
# ????????????? $game_map ????????
#-------------------------------------------------------------------------------
class Game_Map
  include ROGUELIKE_MAP
  #--------------------------------------------------------------------------
  # ? ??????
  #     map_id : ??? ID
  #--------------------------------------------------------------------------
  alias randmap_setup setup
  def setup(map_id)
    #????
    randmap_setup(map_id)
    #???ID?????????ID?????????????????
    make_dungeon if(ROGUELIKE_MAP_ID.include?(map_id))
  end
  #--------------------------------------------------------------------------
  # ? ??????????????????
  #    ???????$game_map.make_dungeon??????setup???????
  #--------------------------------------------------------------------------
  def make_dungeon
    @rect_list = []   # ?????
    @room_list = []   # ?????
    @couple_list = [] # ??????
    # ???????????????????
    for i in 0...@map.width
      for j in 0...@map.height
        @map.data[i,j,0] = SPACE_TILE_ID
      end
    end
    # ?????(split_rect????????????)
    split_rect(add_rect(0,0,@map.width - 1, @map.height - 1), true)
    # ?????
    make_room
    # ???????
    for n in 0...@room_list.size
      for i in @room_list[n].lx..@room_list[n].hx
        for j in @room_list[n].ly..@room_list[n].hy
          @map.data[i,j,0] = FLOOR_TILE_ID
        end
      end
    end
    # ????????????????????
    rect_map = Array.new(@map.width)
    for i in 0...rect_map.size
      rect_map[i] = Array.new(@map.height)
    end
    for i in 0...@rect_list.size
      for j in @rect_list[i].lx..@rect_list[i].hx
        for k in @rect_list[i].ly..@rect_list[i].hy
          rect_map[j][k] = @rect_list[i]
        end
      end
    end
    for i in 0...(@map.width - 1)
      for j in 0...(@map.height - 1)
        break unless(rect_map[i][j] != nil)
        break unless(rect_map[i + 1][j] != nil)
        break unless(rect_map[i][j + 1] != nil)
        if(rect_map[i][j] != rect_map[i][j + 1])
          add_couple(R_VERTICAL, rect_map[i][j], rect_map[i][j + 1]) if (rand(ADD_COUPLE) == 0)
        end
        if(rect_map[i][j] != rect_map[i + 1][j])
          add_couple(R_HORIZONAL, rect_map[i][j], rect_map[i + 1][j]) if (rand(ADD_COUPLE) == 0)
        end
      end
    end
    # ????????????????
    for i in 0...@couple_list.size
      # ???????????
      if(@couple_list[i].v_or_h == R_HORIZONAL)
        break unless(@couple_list[i].rect0.hx == @couple_list[i].rect1.lx)
        c0x = @couple_list[i].rect0.hx
        c0y = rand_range(@couple_list[i].rect0.room.ly + 1,
                @couple_list[i].rect0.room.hy)
        c1x = @couple_list[i].rect1.lx
        c1y = rand_range(@couple_list[i].rect1.room.ly + 1,
                @couple_list[i].rect1.room.hy)
        make_line(c0x, c0y, c1x, c1y)
        make_line(@couple_list[i].rect0.room.hx, c0y, c0x, c0y)
        make_line(@couple_list[i].rect1.room.lx, c1y, c1x, c1y)
      # ???????????
      elsif(@couple_list[i].v_or_h == R_VERTICAL)
        break unless(@couple_list[i].rect0.hy == @couple_list[i].rect1.ly)
        c0x = rand_range(@couple_list[i].rect0.room.lx + 1,
                @couple_list[i].rect0.room.hx)
        c0y = @couple_list[i].rect0.hy
        c1x = rand_range(@couple_list[i].rect1.room.lx + 1,
                @couple_list[i].rect1.room.hx)
        c1y = @couple_list[i].rect1.ly
        make_line(c0x, c0y, c1x, c1y)
        make_line(c0x, @couple_list[i].rect0.room.hy, c0x, c0y)
        make_line(c1x, @couple_list[i].rect1.room.ly, c1x, c1y)
      end
    end
    # ???(????????????????????????????????)
    for i in 0...@map.width
      for j in 1...@map.height
        if(@map.data[i, j, 0] == FLOOR_TILE_ID &&
          @map.data[i, j - 1, 0] == SPACE_TILE_ID)
          @map.data[i, j - 1, 0] = WALL_TILE_ID
        end
      end
    end
    # ??
  end
  # ????????????????????
  def add_rect(lx, ly, hx, hy)
    @rect_list.push(R_Rect.new(lx, ly, hx, hy))
    return(@rect_list.last)
  end
  # ???????????(??)
  def split_rect(rect_par, flag = false)
    # ?????????????????????????????????
    if(rect_par.hx - rect_par.lx <= MIN_RECT_SIZE * 2)
rect_par.done_v = true
end
if(rect_par.hy - rect_par.ly <= MIN_RECT_SIZE * 2)
rect_par.done_h = true
end
    # ?????????(?????????????????)
    if (rand(BIG_ROOM) == 0 && flag == true)
      rect_par.done_v = true
      rect_par.done_h = true
    end
    # ????????????????
if((rect_par.done_v == true) && (rect_par.done_h == true))
return
end
    # ?????
    rect_child = add_rect(rect_par.lx, rect_par.ly, rect_par.hx, rect_par.hy)
    # ?????????????
if(rect_par.done_v == false)
split_coord_y = rand_range(rect_par.ly + MIN_RECT_SIZE,
                        rect_par.hy - MIN_RECT_SIZE)
rect_par.hy = split_coord_y;
rect_child.ly = split_coord_y;
      # ???????
rect_par.done_v = true
rect_child.done_v = true
      # ???????
      add_couple(R_VERTICAL, rect_par, rect_child);
      # ??
split_rect(rect_par)
split_rect(rect_child)
return
end
    # ?????????????
if(rect_par.done_h == false)
split_coord_x = rand_range(rect_par.lx + MIN_RECT_SIZE,
                        rect_par.hx - MIN_RECT_SIZE)
rect_par.hx = split_coord_x;
rect_child.lx = split_coord_x;
      # ???????
rect_par.done_h = true
rect_child.done_h = true
      # ???????
      add_couple(R_HORIZONAL, rect_par, rect_child);
      # ??
split_rect(rect_par)
split_rect(rect_child)
return
end
  end
  # ????????????????????
  def add_room(lx, ly, hx, hy)
    @room_list.push(R_Room.new(lx, ly, hx, hy))
    return(@room_list.last)
  end
  # ???????????
  def make_room()
    for i in 0...@rect_list.size
      #?????????X
w = rand_range(MIN_ROOM_SIZE,
            (@rect_list[i].hx - @rect_list[i].lx - (MIN_BTWN_RECT_ROOM * 2) + 1))
      #?????????Y
h = rand_range(MIN_ROOM_SIZE,
            (@rect_list[i].hy - @rect_list[i].ly - (MIN_BTWN_RECT_ROOM * 2) + 1))
      #?????
x = rand_range(@rect_list[i].lx + MIN_BTWN_RECT_ROOM,
            @rect_list[i].hx - MIN_BTWN_RECT_ROOM - w + 1)
      #?????
y = rand_range(@rect_list[i].ly + MIN_BTWN_RECT_ROOM,
            @rect_list[i].hy - MIN_BTWN_RECT_ROOM - h + 1)
      #?????????????
@rect_list[i].room = add_room(x, y, x + w, y + h)
end
  end
  #--------------------------------------------------------------------------
  # ? split_rect?????????????????????????
  #    ??split_rect???????????????
  #     v_or_h : ????????
  #     rect0  : ??1
  #     rect1  : ??2
  #--------------------------------------------------------------------------
  def add_couple(v_or_h, rect0, rect1)
    @couple_list.push(R_Couple.new(v_or_h, rect0, rect1))
    return(@couple_list.last)
  end
  #--------------------------------------------------------------------------
  # ? ??????????????????????
  #     x0     : ?1?X??
  #     y0     : ?1?Y??
  #     x1     : ?2?X??
  #     y1     : ?2?Y??
  #--------------------------------------------------------------------------
  def make_line(x0, y0, x1, y1)
    min_x = [x0, x1].min
    max_x = [x0, x1].max
    min_y = [y0, y1].min
    max_y = [y0, y1].max
    unless((min_x >= 0) && (max_x < @map.width) &&
      (min_y >= 0) && (max_y < @map.height))
      return
    end
    if((x0 <= x1) && (y0 >= y1))
      for i in min_x..max_x
        @map.data[i, max_y, 0] = FLOOR_TILE_ID
      end
      for j in min_y..max_y
        @map.data[max_x, j, 0] = FLOOR_TILE_ID
      end
      return
    end
    if((x0 > x1) && (y0 > y1))
      for i in min_x..max_x
        @map.data[i, min_y, 0] = FLOOR_TILE_ID
      end
      for j in min_y..max_y
        @map.data[max_x, j, 0] = FLOOR_TILE_ID
      end
      return
    end
    if((x0 > x1) && (y0 <= y1))
      for i in min_x..max_x
        @map.data[i, min_y, 0] = FLOOR_TILE_ID
      end
      for j in min_y..max_y
        @map.data[min_x, j, 0] = FLOOR_TILE_ID
      end
      return
    end
    if((x0 <= x1) && (y0 < y1))
      for i in min_x..max_x
        @map.data[i, max_y, 0] = FLOOR_TILE_ID
      end
      for j in min_y..max_y
        @map.data[min_x, j, 0] = FLOOR_TILE_ID
      end
      return
    end
  end
end
#-------------------------------------------------------------------------------
# ? Game_Interpreter
#-------------------------------------------------------------------------------
# ????????????????????????????? Game_Map ????
# Game_Troop ????Game_Event ??????????????
#-------------------------------------------------------------------------------
class Game_Interpreter
  #--------------------------------------------------------------------------
  # ? ???????
  #    $game_map.make_dungeon??????????
  #--------------------------------------------------------------------------
  def make_dungeon
    $game_map.make_dungeon
  end
end
16
New Projects / Re: Dungeon of Destiny.
August 19, 2008, 05:41:41 pm
 guess it's time to post about my progress.
Basically I have everything done, all the codes are working, I got two levels of the dungeon done that are roamable with random loot and monsters. However I'm not to happy about having 4 pre-set varieties of each dungeon that are randomly chosen so I have decided to take a little pause and search for ways to create randomized dungeons. So it might be quite a while untill I release this game, but something tells me it will definetly be worth the wait.
17
RMXP Script Database / Re: [XP] Blizz-ABS
August 08, 2008, 08:34:56 am
Perhaps it's just me, but as the monsters respawn everything pauses for a second.
18
New Projects / Re: Dungeon of Destiny.
August 07, 2008, 02:05:09 pm
QuoteRPG Maker XP can fit up to a total of 999 maps. The lag factor isn't really determined from the quantity you have, it determines within the map data itself and how much RMXP has to load...

Give some originality and interactivity. If the game is dungeon crawler like, give the player a lot of freedom like a sandbox game, but don't make it too easy when you grind levels. You can have monsters if you want, but note that sometimes players can get frustrated by monsters appearing in their dire need. It can get cruel and amusing though. Tongue



That's good to hear.


Hm, yes. You are absolutely right, it would not be fun to be killed while being on ones last leg, bashing a crate open and instead of finding that lifesaving potion a Goblin pops out and bonks one on the noggin'. *Crosses that idea*




QuoteYou want randomness? Don't forget the random function in Variable Operation event command! It's kind of easy.

Use a variable to store a random number. Whenever you need a random number, you can find the random option in 'Variable Operation' event command. Simply make conditional branches for the possible outcomes of the variables.

So, to transfer to random maps for example, your eventing looks something like this:

@> Variable Operation Variable006 Random b/w 0-3
@>Conditional Branch Variable006 is 0
@>   Transfer to map 1
@> else
@>   Transfer to map 2

God luck Happy



Cheers for the tip, mate, but I already learned how to work with random maps and items. :haha:
19
New Projects / Re: Dungeon of Destiny.
August 07, 2008, 11:14:01 am
Yeah, it might look a bit strange if you've never seen anything like it before, but personally I absolutely love the style^^


I've been thinking about the randomness of the game. 4 variations of each map will make 400 maps. x_x
Before I continue making the maps I would like to know if RMXP can handle up to 400 maps and if it will cause alot of lag?

Another thing I've been thinking of: Even if there are 400 maps people are bound to learn the patterns and the treasure chest locations of the maps as they play. To prevent boredom by going through the same maps I had an idea: Why not stuff monsters in the chests so that there is a slight chance that something nasty pops up. Ghouls from coffins, goblins from boxes etc, any points of view on that?
20
Many thanks for explaining. :)