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 - Poe

1
RPG Maker Scripts / Re: a couple questions
August 08, 2012, 04:21:40 pm
i tried to snap back the layers after movement to original position, and blit the whole thing 32 pixels off + refresh one row/column of blocks, turns out that's even slower than refreshing all the tiles.o_O

any help/examples are welcome as always. how is this being done in ARC? spanks in advance.
2
RPG Maker Scripts / Re: a couple questions
August 01, 2012, 10:04:12 am
so i started first to try and recreate the tilemap as it normally works in rmxp.

i tried three systems:
a) ForeverZer0's Custom Resolution: one sprite with bitmap for each priority, the size of the entire map.
performance on this was great except for two things: it takes a long time to create the bitmaps for big maps (which is a priority), and the Game.exe process becomes gigantic (~1GB at 200x200) without any other sprites, events, added scripts. maps bigger than 200x200 fail to be created at all.

b) one tile-one sprite (per priority): based on Blizzard's view, only on the current screen plus one extra row and column. the idea was that when player "moves", all these tile sprites move the opposite way and the outermost (out of view) jump to the other way and get the next line of tiles blitted onto them.
in this way performance was off, dropping to 25 FPS right away and farther down when moving. as Blizzard suggested, it probably needs lightweight sprites to function this way (which i have no idea how to create).

c) hybrid: one sprite per priority, blits instead of sprites. this shows the best promise, but i can't get it to work.XD
the problem is the movement. it takes too much to be constantly refreshing all the tiles, so i want to move the whole sprites and refresh only the appriopriate one-tile lines.

well in short i don't know how to pull this off, i tried for a while with resizing the bitmap rect, but it's read only so i tried making it an accessor...errors unsued. i just don't know enough about bitmaps and frankly i can't find any online sources for it, it's all FreeImage and RMagick stuff and i'm like wut o_O is that.

so if any of you can help, or if there's anywhere i can read up on how this is done commonly?
3
RPG Maker Scripts / Re: a couple questions
June 18, 2012, 04:41:04 am
Quote from: Blizzard on June 17, 2012, 06:11:25 pm
:facepalm: Can you tell me what is so very wrong with this line, F0?

Code: original script
ini.call('Game', 'Title', '', game_name, 255, '.\Game.ini')


I guess I found the cause of the original crash after all. xD

it still crashes though even if i change that:p besides, it seems to work for other people?


ForeverZer0, i'm looking through your custom resolution tilemap class, it uses one sprite per priority, so 6 sprites all with a bitmap the size of the entire map, isn't that a huge drain on memory (going by Blizzard's argument)? i'm just trying to understand, i'd like to make extra basement and ceiling layer groups (for caves and bridges, 2nd floor,...) but then there would be 18 giant bitmaps.X_X
4
RPG Maker Scripts / Re: a couple questions
June 17, 2012, 05:19:12 pm
i didn't rename anything, removing the extension didn't work either. but this new script work great! much appreciated.
5
RPG Maker Scripts / Re: a couple questions
June 17, 2012, 01:31:13 pm
Quote from: ForeverZer0 on June 12, 2012, 06:18:18 pm
What are the arguments you are using for the Win32API call?

nothing i made myself, i tried game_guy's snapshot script, tried yours as well Blizzard and then some combination of various things i found, all of them make it crash on my end. getting snapshot.dll from another source didn't help.

i pasted the script here anyway if it helps:
Spoiler: ShowHide
module GameGuy
  SnapShot_Key = Input::A # Shift Key
  def self.snap
    snp = Win32API.new('screenshot.dll', 'Screenshot', %w(l l l l p l l), '')
    window = Win32API.new('user32', 'FindWindowA', %w(p p), 'l')
    ini = (Win32API.new 'kernel32', 'GetPrivateProfileStringA', %w(p p p p l p),
      'l')
    game_name = "\0" * 256
    ini.call('Game', 'Title', '', game_name, 255, '.\Game.ini')
    game_name.delete!('\0')
    win = window.call('RGSS Player', game_name)
    dir = Dir.new("Snapshots/")
    count = 0
    dir.entries.each {|i| count += 1}
    file_name = "Snapshots/snap_#{count}.png"
    snp.call(0, 0, 640, 480, file_name, win, 2)
  end
end
module Input
  class << self
    alias gg_update_input_snapshot_lat update
  end
  def self.update
    if Input.trigger?(GameGuy::SnapShot_Key)
      GameGuy.snap
    end
    gg_update_input_snapshot_lat
  end
end




Quote from: Blizzard on June 12, 2012, 06:52:30 pm
My custom input module crashes RMXP that uses RGSS100J.dll. Try to find another DLL if you are using this one.

i'm not using either of those, the snapshot demo crashes as well.:/
6
RPG Maker Scripts / Re: a couple questions
June 12, 2012, 05:47:58 pm
hm, so i guess both methods work. that script helps a lot ForeverZer0, thanks. so, you rewrote the Tilemap class from how you think it works/should work, without knowing the original?

that's weird though, the DLL i was talking about is screenshot.dll, but in the Custom Resolution script it works fine and in the snapshot scripts (any of them) it crashes my game.
7
RPG Maker Scripts / a couple questions
June 09, 2012, 06:27:09 pm
1)does the tilemap create a sprite for every tile you place on the map? or is it one very large sprite that bitmaps get blitted onto? or, what lol? which brings me to the next question:

2)is there a way to see/alter the code of the standard rgss methods and classes? for example Sprite's bush_depth makes part of the sprite transparent, could one make it be partially blended instead?

3)if anyone knows cos i can't find anything about this on google, if i try to use scripts that use DLL's i get "rgss player stopped working" notice and it crashes. my OS is vista, is there something else i need to do with these DLL's to make them work?

thanks.
8
Script Troubleshooting / Re: scripted bridges
June 06, 2012, 06:05:52 am
really, no one? well turns out it wasn't that hard once i got started.

if anyone's interested:
i used terrain tags for setting a bridge, then made Game_Character's and Game_Map's passable methods check only the 3rd layer if on a bridge (which makes it the bridge layer i guess) and otherwise ignore the 3rd layer's passabilities, and Sprite_Character z + 100 if on a bridge. i'll probably expand on that to have a seperate passability table for bridges/layered floors cos xp has got little enough layers as it is.

not for everyone but it might give someone an idea if they're looking.
9
Script Troubleshooting / scripted bridges
June 04, 2012, 09:32:03 am
i'm entertaining the idea for a bridge that must do these things:

* not only player can use but any characters.
* characters can go under it, over it, and stand still on top of it (so it can't be just auto move over it to the next area).

though i'm not really sure where to begin with this. if i think about how passability is handled, that leads me to making seperate tables for anything on a bridge and flipping the character into "bridge mode" when walking onto it. but i may be overcomplicating things, i'm really looking for some insight from someone with experience in bridge stuff.
10
Script Troubleshooting / Re: Shadow script
April 04, 2012, 01:51:46 pm
it works with whatever settings you make in ATES so you don't need to change anything in it. i just made sun_angle and sun_opacity into a global variable so you can set them from anywhere, and some small changes to how the shadows (sprite_sun) are set to facilitate the rotation, and finally added a method in spriteset_map update to change the angle.

Spoiler: ShowHide

#==============================================================================
# ** Sprite Sun
#------------------------------------------------------------------------------
#    Based on Sprite Shadow
#    modified by Rataime
#    New Edits by DerVVulfman
#    February 12, 2008
#------------------------------------------------------------------------------
#
# Introduction:
#
#  This system allows you and all 'prepared' events to generate shadows while
#  on the field map. The player can move around while a programmed 'sun' will
#  display a shadow.   Likewise,  events with a special comment  within their
#  event list can also generate shadows.
#
#------------------------------------------------------------------------------
#
# Instructions:
#
#  -- The Sun
#     To create a sun effect, you'll need to create a map event that's to be
#     used 'as' the sun itself.   Under most circumstances,  this will be an
#     event without a characterset graphic. You don't want to 'SEE' the sun,
#     do you?
#
#     To make one of these events a 'sun,  you'll need to insert a couple of
#     things into that event's  "List of Event Commands".   These things are
#     nothing more than comments. 
#
#     The first comment  to add is "begin Sun" (without quotes).  It informs
#     the system that this map  has a sun effect in use.   The remaining two
#     values  are optional  and have  default values  in  the  configuration
#     section  (only just added  into the script).   They too  are added  as
#     comments.
#
#     self_angle  'number'  --- How much of an angle each shadow will have.
#     self_opacity 'number' --- How dark the shadow will be.
#
#     After that, your characters can now move about and generate shadows.
#
#  -- Other Events
#     Events do not know that they can generate shadows.   To let them gene-
#     rate a shadow,  all you need to do is add a special comment into their
#     "List of Event Commands".   This comment needed  is merely  the phrase
#     'begin Shadow' (again, without quotes).
#
#
#------------------------------------------------------------------------------
#
# Revisions to note:
#
#  1) Added formatted headers and comments throughout the script.
#  2) Encapsulated a comment/parameter code in an XPML module.
#  3) Set the sun shadow array into an instance value to lower resource costs.
#  4) Compatability with Near Fantastica's Squad Movement systems.
#  5) Compatability with Ccoa's Caterpillar system.
#  6) Compatability with Trickster's Caterpillar system.
#  7) Added default shadow settings into the configuration section.
#
#==============================================================================



   #========================================================================
   #  **  C  O  N  F  I  G  U  R  A  T  I  O  N      S  Y  S  T  E  M  **  #
   #========================================================================
    # Caterpillar Systems
    CATERPILLAR_COMPATIBLE      = true    # Toggle for Fukuyama's original 
    SQUAD_MOVE_COMPATIBLE       = false   # Toggle for Near Fantastica's SBABS
    CCOA_CATER_COMPATIBLE       = false   # Toggle for Ccoa's Caterpillar
    TRICKSTER_CATER_COMPATIBLE  = false   # Toggle for Trickster's Caterpillar
   
    # Sun Specific Systems
    SUN_WARN                    = true    # Checks for older sun systems
    $SUN_ANGLE                   = 45      # Angle for sun-generated shadow
    $SUN_OPACITY                 = 0     # Darkness setting for sun shadow

   
   #========================================================================
   #  ****   E N D   O F   C O N F I G U R A T I O N   S Y S T E M   ****  #
   #========================================================================
   
   

#==============================================================================
# ** Game_Temp
#------------------------------------------------------------------------------
#  This class handles temporary data that is not included with save data.
#  Refer to "$game_temp" for the instance of this class.
#==============================================================================

class Game_Temp
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :sun_spriteset            # holds spritesets for 'sun' shadows
end



#==============================================================================
# ** Game_Party
#------------------------------------------------------------------------------
#  This class handles the party. It includes information on amount of gold
#  and items. Refer to "$game_party" for the instance of this class.
#==============================================================================

class Game_Party
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_reader :characters
end



#==============================================================================
# ** Sprite_Sun
#------------------------------------------------------------------------------
#  This sprite is used to position character shadows relative to map position.
#  It observes the Game_Character class and automatically changes sprite
#  conditions.
#==============================================================================

class Sprite_Sun < RPG::Sprite
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :character           
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     viewport  : viewport
  #     character : character (Game_Character)
  #     id        : id
  #--------------------------------------------------------------------------
  def initialize(viewport, character = nil, id=0)
    super(viewport)
    @character = character
    params=$game_temp.sun_spriteset.sun[id]
    self_angle    = $SUN_ANGLE
    self_opacity  = $SUN_OPACITY
    self_angle    = params[0]   if params.size > 0
    self_opacity  = params[1]   if params.size > 1
    @self_angle   = self_angle
    @self_opacity = self_opacity
    update
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #-------------------------------------------------------------------------- 
  def update
    super
    # If tile ID, file name, or hue are different from current ones
    if @tile_id != @character.tile_id or
       @character_name != @character.character_name or
       @character_hue != @character.character_hue
      # Remember tile ID, file name, and hue
      @tile_id = @character.tile_id
      @character_name = @character.character_name
      @character_hue = @character.character_hue
      # If tile ID value is valid     
      if @tile_id >= 384
        self.bitmap = RPG::Cache.tile($game_map.tileset_name,
          @tile_id, @character.character_hue)
        self.src_rect.set(0, 0, 32, 32)
        self.ox = 16
        self.oy = 32
      # If tile ID value is invalid       
      else
        self.bitmap = RPG::Cache.character(@character.character_name,
          @character.character_hue)
        @cw = bitmap.width / 4
        @ch = bitmap.height / 4
        self.ox = @cw / 2
        self.oy = @ch
      end
    end
    # Set visible situation
    self.visible = (not @character.transparent)
    # If graphic is character
    if @tile_id == 0
      # Set rectangular transfer   
      sx = @character.pattern * @cw
      @direct = @character.direction
      if self.angle > 90 or angle < -90
        sy = ( 4 - 2) / 2 * @ch                   if @direct == 6
        sy = ( 6 - 2) / 2 * @ch                   if @direct == 4
        sy = (@character.direction - 2) / 2 * @ch if @direct != 4 and @direct != 6
      else
        sy = (@character.direction - 2) / 2 * @ch
      end
      self.src_rect.set(sx, sy, @cw, @ch)
    end
    # Set sprite coordinates
    self.x = @character.screen_x
    self.y = @character.screen_y-5
    self.z = @character.screen_z(@ch) - 1
    # Set opacity level, blend method, and bush depth
    self.opacity = $SUN_OPACITY
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
    # Animation
    if @character.animation_id != 0
      animation = $data_animations[@character.animation_id]
      animation(animation, true)
      @character.animation_id = 0
    end
    self.angle = -$SUN_ANGLE - 180
    self.color = Color.new(0, 0, 0)
  end
end



#==============================================================================
# ** Sprite_Character
#------------------------------------------------------------------------------
#  This sprite is used to display the character.It observes the Game_Character
#  class and automatically changes sprite conditions.
#==============================================================================

class Sprite_Character < RPG::Sprite
  #--------------------------------------------------------------------------
  # * Alias Listings
  #-------------------------------------------------------------------------- 
  alias sun_initialize initialize
  alias sun_update update
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     viewport  : viewport
  #     character : character (Game_Character)
  #--------------------------------------------------------------------------
  def initialize(viewport, character = nil)
    @character = character
    super(viewport)
    @sunlist=[]
    if character.is_a?(Game_Event) and $game_temp.sun_spriteset.sun != []
      params = XPML.XPML_read("Shadow", @character.id, 2)
      if params != nil
        for i in 0...$game_temp.sun_spriteset.sun.size
          @sunlist.push(Sprite_Sun.new(viewport, @character, i))
        end
      end
    end
    if character.is_a?(Game_Player) and $game_temp.sun_spriteset.sun != []
      for i in 0...$game_temp.sun_spriteset.sun.size
        @sunlist.push(Sprite_Sun.new(viewport, $game_player, i))
      end
      #===================================================
      # * Compatibility with Caterpillar Functions
      #===================================================
      if CATERPILLAR_COMPATIBLE and $game_party.characters != nil
        for member in $game_party.characters
          for i in 0...$game_temp.sun_spriteset.sun.size
            @sunlist.push(Sprite_Sun.new(viewport, member, i))
          end
        end
      end
      if SQUAD_MOVE_COMPATIBLE and $game_allies.values != nil
        for member in $game_allies.values
          for i in 0...$game_temp.sun_spriteset.sun.size
            @sunlist.push(Sprite_Sun.new(viewport, member, i))
          end
        end
      end
      if CCOA_CATER_COMPATIBLE and $game_train.actors != nil
        for member in $game_train.actors
          for i in 0...$game_temp.sun_spriteset.sun.size
            @sunlist.push(Sprite_Sun.new(viewport, member, i))
          end
        end
      end
      if TRICKSTER_CATER_COMPATIBLE and $game_party.followers != nil
        for member in $game_party.followers
          for i in 0...$game_temp.sun_spriteset.sun.size
            @sunlist.push(Sprite_Sun.new(viewport, member, i))
          end
        end
      end
      #===================================================
      # ** End of the compatibility
      #===================================================       
    end
    # Perform the original call
    sun_initialize(viewport, @character)
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #-------------------------------------------------------------------------- 
  def update
    sun_update
    if @sunlist != []
      for i in 0...@sunlist.size
        @sunlist[i].update
      end
    end
  end 
end



#==============================================================================
# ** Game_Event
#------------------------------------------------------------------------------
#  This class deals with events. It handles functions including event page
#  switching via condition determinants, and running parallel process events.
#  It's used within the Game_Map class.
#==============================================================================

class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #--------------------------------------------------------------------------
  attr_accessor :id
end



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

class Spriteset_Map
  #--------------------------------------------------------------------------
  # * Public Instance Variables
  #-------------------------------------------------------------------------- 
  attr_accessor :sun
  #--------------------------------------------------------------------------
  # * Alias Listings
  #--------------------------------------------------------------------------   
  alias sun_initialize initialize
  alias angle_update update
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------   
  def initialize
    @sun = []
    per_hour = 225.to_f/(ATES::NIGHT_START - ATES::DAY_START)
    per_min = per_hour/60
    mpf = 1440.to_f/(ATES::LENGTH*40)
    @per_frame = mpf * per_min
    $game_temp.sun_spriteset = self
    warn = false
    for k in $game_map.events.keys.sort
      if ($game_map.events[k].list != nil and
          $game_map.events[k].list[0].code == 108 and
          ($game_map.events[k].list[0].parameters == ["sun"] or
          $game_map.events[k].list[0].parameters == ["o"]))
        warn = true
      end
      params = XPML.XPML_read("Sun", k, 2)
      $game_temp.sun_spriteset.sun.push(params) if params != nil
    end
    if warn == true and SUN_WARN
      p "Warning : At least one event on this map uses an obsolete way to add a sun effect"
    end
    # Perform the original call
    sun_initialize
  end
 
  def update
    angle_update
    return unless $game_system.ates.active
   
    h = $game_system.ates.time.hour
    m = $game_system.ates.time.min
    if h < (ATES::DAY_START-2) || h >= ATES::NIGHT_START
      $SUN_OPACITY = 0
    elsif h == (ATES::DAY_START-2)
      $SUN_ANGLE = 45 if m == 0
      $SUN_OPACITY = 32
    elsif h == (ATES::NIGHT_START-1)
      $SUN_OPACITY = 32
    elsif h == (ATES::DAY_START-1) || h == (ATES::NIGHT_START-2)
      $SUN_OPACITY = 64
    else
      $SUN_OPACITY = 128
    end
     
    $SUN_ANGLE += @per_frame

  end
end


#==============================================================================
# ** module XPML
#------------------------------------------------------------------------------
#  This module handles the reading and passing of 'comment' parameters
#
#  The main XPML method is used to check and read event comments.
#  * It returns 'nil' if the markup 'check' text isn't even present.
#  * It returns [] if no parameters are passed
#  * It returns a parameter list with "int" converted as int.
#       eg :
#       begin first
#       begin second
#       param1 1
#       param2 two
#       begin third
#       anything 3
#
#   p XPML_read("first", event_id) -> []
#   p XPML_read("second", event_id) -> [1,"two"]
#   p XPML_read("third", event_id) -> [3]
#   p XPML_read("forth", event_id) -> nil
#===================================================

module XPML
  module_function
  #--------------------------------------------------------------------------
  # * XPML_read
  #     markup           : text in event comment to check
  #     event_id         : event ID
  #     max_param_number : maximum number of parameter/comments to load
  #-------------------------------------------------------------------------- 
  def XPML_read(markup, event_id, max_param_number = 0)
    parameter_list = nil
    event = $game_map.events[event_id]
    return if event.list == nil
      for i in 0...event.list.size
        if event.list[i].code == 108 and
          event.list[i].parameters[0].downcase == "begin " + markup.downcase
          parameter_list = [] if parameter_list == nil
          for j in i + 1...event.list.size
            if event.list[j].code == 108
              parts = event.list[j].parameters[0].split
              if parts.size != 1 and parts[0].downcase != "begin"
                if parts[1].to_i != 0 or parts[1] == "0"
                  parameter_list.push(parts[1].to_i)
                else
                  parameter_list.push(parts[1])
                end
              else
                return parameter_list
              end
            else
              return parameter_list
            end
            if max_param_number != 0 and j == i + max_param_number
              return parameter_list
            end
          end
        end
      end
    return parameter_list
  end
end

11
Script Troubleshooting / speeding up event lookup
March 31, 2012, 09:22:32 am
this way that rmxp has to cycle through all events on the map, just to know if an event is even on a certain tile, it's seriously excessive. which quickly becomes apparent when you have several events doing this regularly. has anyone ever tried to speed this process up?

i was thinking with a hash or a table make a grid with all possible positions on the map as keys, the value being an array with all event id's currently on that position. then in game_character's moveto method, remove from current key and add to new. then one could simply call it like e = $game_map.event_positions[[x,y]], and cycle through e. what i don't understand is why they didn't make it like this in the first place, because they did with everything else. is there a reason for that?
12
Script Troubleshooting / Re: Shadow script
March 30, 2012, 08:58:37 pm
hey,

i put this demo together quickly to show you. i changed the sun script to respond specifically to ATES and rotate shadows automatically. i put something of a fade in too so shadows don't leap onto the screen too much but it's just a couple if cases, nothing fancy.

http://dl.dropbox.com/u/56282677/rmxp/ates%2Bshadows.rar
13
one of the problems i was having was that, if the weather changes, while the screen tone change from previous weather is not complete, the calculated change will bring it too far. i believe this was because the time between weather changes (weather_wait) was smaller than the transition lasted. i kicked it up a notch for debugging purposes, and caused a problem doing so, silly. but maybe you should put a warning for that or a minimal setting?

another problem that's now become clear is, if old weather is directly followed by new weather (without returning to 0 first), and then weather that does not change screen tone starts, it changes screen tone anyway (perhaps from previous values that didn't get cleared?) wrecking the system. i would appreciate any help on this, i feel like Krillin fighting Frieza here.:p
14
thanks, that was very clear.^^
15
i'm looking to use the least resources for determining in what "area" (house) an event is. the best i came up with is only to check entrances and exists of houses, while the event is moving.

hash ENTRANCES holds all [x,y] of entrances as keys with the house number as value.
array EXITS holds only [x,y] of exits as its values.

now is there a speed/resource difference between:
1.for e in ENTRANCES.keys, if e == [x,y] HOME = ENTRANCES[e], then through EXIT hash setting value to 0 if found.
2.if ENTRANCE.include?([x,y]) HOUSE = ENTRANCE[x,y], elseif EXIT.include?([x,y]) HOUSE = 0.

my (fairly limited) understanding of hashes is telling me in method 2 it would determine the value same way as method 1 does. but i don't know if it really does. which might make the second slower because that would mean it checks it twice, once in include? and once in setting the value?

so is include? faster than the for loop?
is each faster than for?


also if there is a cleverer way anyone feels like sharing, i'm open to it.:p
16
Script Troubleshooting / Re: sprite.zoom_x,y
March 06, 2012, 05:21:27 am
how can you know the size of the bitmap before the sprite is initialized?O_O (short of making all bitmaps a standard size, but that's not very dynamic)

anyway i found a formula that works more or less well enough for what i need it for. it's not "clean" but ohwell. thanks for the trouble guys.
17
Script Troubleshooting / Re: Shadow script
March 05, 2012, 01:02:31 pm
definitely, big maps produce much more sprites (using shadows means double sprites). best to use anti lag lol.
18
Script Troubleshooting / Re: sprite.zoom_x,y
March 05, 2012, 07:47:28 am
sorry i really don't know what you mean. generate a new sprite to be zoomed inside Sprite_Character and set all its properties to self and erase the former sprite? or change the viewport set in Spriteset_Map? (but then i wouldn't know its width/height)
19
Script Troubleshooting / Re: Shadow script
March 05, 2012, 07:39:26 am
see if replacing the line 209 with this helps:

self.angle = $SUN_ANGLE if self.angle != $SUN_ANGLE

(don't really know what the -90 is for, seems to work just as well without it)
20
Script Troubleshooting / Re: Shadow script
March 05, 2012, 07:36:20 am
it doesn't lag on my end. what other scripts are you using?