Posts: 12
Threads: 1
Joined: Aug 2013
So I was gonna try and keep this from taking up a post slot, but apparently I can't message, send email or anything else as a member lol so...
I slapped in the script (ETA) and filled out the script $view_range.enemies_view(ev_id, v_range, sw_id, s_sw_id, block) with: (1, 8, 60, nil, true). when event 1 detects switch 60 is on, it goes nuts and chases the character, which is fine, but, it's refusing to have LOS blocked by non-passable objects.
I tried true and false, just to make sure there wasn't a typo, and even fully encased the character in impassable wall blocks. still the event goes nuts chasing the character. any input?
also, when trying to use a self switch "a" I get an error "undefined local variable or method for 'a' for #<Interpreter:0xa1a3118>" same with "A". (quotes not used)
idea of what i'm doing wrong? everything looks right, script looks right to my half trained eye...
Posts: 422
Threads: 23
Joined: Aug 2011
I spent about 5 hours working on a similar bug with my own "line of sight" code. Does it work when the walls are 3 tiles thick? if so, then you have the issue where the monsters are peeking through the diagonals of walls. I can give you an alternate algorithm if that turns out the be the problem.
Posts: 12
Threads: 1
Joined: Aug 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.
Posts: 422
Threads: 23
Joined: Aug 2011
perhaps then you have done something wrong? Try putting the player, a wall, and the enemy in a straight line and see what happens.
Posts: 12
Threads: 1
Joined: Aug 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.
Posts: 422
Threads: 23
Joined: Aug 2011
I knew it! See, what is happening is this:
when it should be doing this:
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.
Posts: 12
Threads: 1
Joined: Aug 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.
Posts: 422
Threads: 23
Joined: Aug 2011
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
Posts: 12
Threads: 1
Joined: Aug 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
Posts: 422
Threads: 23
Joined: Aug 2011
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