Save-Point
Veiw Range Script - Printable Version

+- Save-Point (https://www.save-point.org)
+-- Forum: Material Development (https://www.save-point.org/forum-8.html)
+--- Forum: Scripts Database (https://www.save-point.org/forum-39.html)
+---- Forum: RPGMaker XP (RGSS) Engine (https://www.save-point.org/forum-116.html)
+---- Thread: Veiw Range Script (/thread-2771.html)

Pages: 1 2 3


RE: Veiw Range Script - deus69xxx - 08-13-2013

tried three blocks thick, and 1st, second and third layer (just in case), and putting the player ON an impassable, and dude just runs himself into the wall repeatedly. Sarcasm


RE: Veiw Range Script - MechanicalPen - 08-13-2013

perhaps then you have done something wrong? Try putting the player, a wall, and the enemy in a straight line and see what happens.


RE: Veiw Range Script - deus69xxx - 08-13-2013

oh my, it IS peeking diagonally.
did the single box in front, and it didn't register, but tried

C = character
B = impassable object
E = event

C
.....B
..........E
and it found me.

edit: this set up doesn't like spaces.
edit again: nope, that wasn't the cause either.
seems to just plain act weirdly. character encased in a square of impassable blocks 7x7 with an open center, or a single square diagonally, it'll see it. but with a single line of blockes, it won't, until the y axis is next to each other. say at the end of a wall 7 long, when...
C
..BBBBBBB
..................E
it won't see, but

CBBBBBBB
...................E

it will.


RE: Veiw Range Script - MechanicalPen - 08-13-2013

I knew it! See, what is happening is this:
[Image: vfaEb.png]

when it should be doing this:
[Image: XB639.png]
Once I get home from work I'll show you the algorithm that checks for blocked tiles, instead of checking if a direct line is blocked.


RE: Veiw Range Script - deus69xxx - 08-13-2013

again, you have to remember the part that's really messed up, is it's also detecting like...

*******
*******
***C***
*******
*******

where * = impassable block. and that shouldn't happen. at all.


RE: Veiw Range Script - MechanicalPen - 08-13-2013

Does this help any?

Code:
#----------------------------------------------------------------------------
  # * Get line of sight
  #----------------------------------------------------------------------------
  def line_of_sight?(xa, ya, xb, yb)
    dx = (xa - xb).abs
    dy = (ya - yb).abs
    x = xa
    y = ya
    n = 1 + dx + dy
    x_inc = (xb > xa) ? 1 : -1
    y_inc = (yb > ya) ? 1 : -1
    error = dx - dy;
    dx = dx*2 #do this to
    dy = dy*2 #get rid of fractions

    n.downto(0){ |i|
      if !$game_map.passable?(x, y, 0) #$game_map.terrain_tag(x, y) == 5
        return false
      end

      if (error > 0)
        x = x + x_inc
        error = error - dy
      else
        y = y + y_inc
        error = error + dx
      end
    }
    return true
  end



RE: Veiw Range Script - deus69xxx - 08-14-2013

makes sense, up until i'm not sure what to do with it. do I form a class for it, and a branch call if true, is it supposed to plug into the script this forum regards? i'm working on the first idea until I know lol


RE: Veiw Range Script - MechanicalPen - 08-14-2013

sorry, I didn't know you weren't as script-savy as I am (actually I was just too lazy after work and hoped you would just magically know what to do)

Try replacing vr_in_range? with this:
Code:
#--------------------------------------------------------------------------
  # * In Range?
  #     element     : either player or other event
  #     object      : event looking for element
  #     range       : range in tiles
  #     pass_block  : if terrain tiles can block view
  #--------------------------------------------------------------------------

  def vr_in_range?(element, object, range, pass_block = false)
    # Obtain Range
    dx = (element.x - object.x).abs
    dy = (element.y - object.y).abs
    # Obtain values to loop and counter value
    x = xa
    y = ya
    n = 1 + dx + dy
    x_inc = (xb > xa) ? 1 : -1
    y_inc = (yb > ya) ? 1 : -1
    error = dx - dy;
    dx = dx*2 #do this to
    dy = dy*2 #get rid of fractions
    #check range
    r = dx + dy
    if r <= (range * range)
      # If tiles can block view
      if pass_block
        n.downto(0){ |i|
          if !$game_map.passable?(x, y, element.direction)
              return false
          end

          if (error > 0)
              x = x + x_inc
              error = error - dy
          else
              y = y + y_inc
              error = error + dx
          end
        }                  
      end
      # Return system-determined flag      
      return true
    else
      # Return default flag
      return false
    end
  end



RE: Veiw Range Script - deus69xxx - 08-14-2013

sorry x.x

all self taught on this so far, most of my strength lies in rewriting from a base, and then modifying it. very few things have I actually scripted from scratch.

that makes much more sense now xD


RE: Veiw Range Script - MechanicalPen - 08-14-2013

I still do that a lot, if only because it is easier. It's why I like to hang out here; Save-Point has the highest number of bug free scripts out of all of the RPG Maker communities I've seen on the internet.

Lemme know if that edit works for you.