2013-07-11 22:55:45 +02:00
|
|
|
calculate_lightray = (x1, y1, x2, y2, type) =>
|
2013-06-13 21:15:18 +02:00
|
|
|
switch type
|
2013-07-11 22:55:45 +02:00
|
|
|
when 'enemy' then window.selected_layer = enemy_layer
|
|
|
|
else window.selected_layer = shadow_layer
|
2013-06-13 21:15:18 +02:00
|
|
|
|
|
|
|
pixel_x1 = x1*config.pixelsize + (config.pixelsize/2)
|
|
|
|
pixel_y1 = y1*config.pixelsize + (config.pixelsize/2)
|
|
|
|
pixel_x2 = x2*config.pixelsize + (config.pixelsize/2)
|
|
|
|
pixel_y2 = y2*config.pixelsize + (config.pixelsize/2)
|
|
|
|
|
|
|
|
dx = Math.abs(pixel_x1 - pixel_x2)
|
|
|
|
dy = Math.abs(pixel_y1 - pixel_y2)
|
|
|
|
|
|
|
|
s = 0.99 / (if dx>dy then dx else dy)
|
|
|
|
t = 0.0
|
|
|
|
|
|
|
|
# show me the rays
|
|
|
|
if config.debug
|
|
|
|
context.beginPath()
|
|
|
|
context.strokeStyle = 'blue'
|
|
|
|
context.moveTo(pixel_x1+config.map.origin.x,pixel_y1+config.map.origin.y)
|
|
|
|
context.lineTo(pixel_x2+config.map.origin.x,pixel_y2+config.map.origin.y)
|
|
|
|
context.stroke()
|
|
|
|
|
|
|
|
hit_wall = false
|
|
|
|
while t < 1.0
|
|
|
|
dx = Math.round((1.0-t)*pixel_x1 + t*pixel_x2)
|
|
|
|
dy = Math.round((1.0-t)*pixel_y1 + t*pixel_y2)
|
|
|
|
|
|
|
|
dx = Math.floor(dx/config.pixelsize)
|
|
|
|
dy = Math.floor(dy/config.pixelsize)
|
|
|
|
|
|
|
|
# FLOOR?
|
|
|
|
if level[dy*config.map.width + dx] is 0
|
|
|
|
break if hit_wall and !config.debug
|
|
|
|
|
|
|
|
if selected_layer[dy*config.map.width + dx] == 0
|
|
|
|
if t > 0.5
|
|
|
|
selected_layer[dy*config.map.width + dx] += map_range([0.5, 1], [1, 0], t)
|
|
|
|
else
|
|
|
|
selected_layer[dy*config.map.width + dx] += 1
|
|
|
|
# WALL?
|
|
|
|
else if level[dy*config.map.width + dx] is 3
|
|
|
|
break if type is 'enemy'
|
|
|
|
if t > 0.5
|
|
|
|
selected_layer[dy*config.map.width + dx] += map_range([0.5, 1], [1, 0], t)
|
|
|
|
else
|
|
|
|
selected_layer[dy*config.map.width + dx] += 1
|
|
|
|
|
|
|
|
hit_wall = true
|
|
|
|
# ENTITIY?
|
|
|
|
else if level[dy*config.map.width + dx] in blocks.entities
|
|
|
|
if t > 0.5
|
|
|
|
selected_layer[dy*config.map.width + dx] += map_range([0.5, 1], [1, 0], t)
|
|
|
|
else
|
|
|
|
selected_layer[dy*config.map.width + dx] += 1
|
|
|
|
break if !config.debug and level[dy*config.map.width + dx] isnt 1 and level[dy*config.map.width + dx] isnt 8
|
|
|
|
else
|
|
|
|
selected_layer[dy*config.map.width + dx] = .5
|
|
|
|
break if !config.debug
|
|
|
|
|
|
|
|
t += s
|
|
|
|
|
2013-07-11 22:55:45 +02:00
|
|
|
illuminate = (x1, y1, range, type = 'shadow') =>
|
2013-06-13 21:15:18 +02:00
|
|
|
r = 0
|
|
|
|
|
|
|
|
while r < Math.PI*2
|
|
|
|
x2 = range*Math.cos(r) + x1
|
|
|
|
y2 = range*Math.sin(r) + y1
|
|
|
|
|
|
|
|
# bug: edge blurry stuff
|
|
|
|
#x2 = config.map.width-1 if x2 > config.map.width-1
|
|
|
|
#y2 = config.map.height-1 if y2 > config.map.height-1
|
|
|
|
#
|
|
|
|
#x2 = 0 if x2 < 0
|
|
|
|
#y2 = 0 if y2 < 0
|
|
|
|
|
|
|
|
calculate_lightray(x1, y1, x2, y2, type)
|
|
|
|
r += 0.03
|
|
|
|
|
2013-07-11 22:55:45 +02:00
|
|
|
calculate_lights = () =>
|
2013-06-13 21:15:18 +02:00
|
|
|
#illuminate(8, 8, 5)
|
|
|
|
illuminate(toxy(player.position).x, toxy(player.position).y, player.lightrange)
|
|
|
|
|
|
|
|
for block, position in level
|
|
|
|
switch block
|
|
|
|
# 6 = LIGHT
|
|
|
|
# CAMERA
|
|
|
|
when 8
|
|
|
|
illuminate(toxy(position).x, toxy(position).y, 4, 'enemy')
|
|
|
|
|
2013-07-11 22:55:45 +02:00
|
|
|
draw_lights = (type) =>
|
2013-06-13 21:15:18 +02:00
|
|
|
switch type
|
|
|
|
when 'enemy'
|
|
|
|
color = '255, 0, 0'
|
2013-07-11 22:55:45 +02:00
|
|
|
window.selected_layer = enemy_layer
|
2013-06-13 21:15:18 +02:00
|
|
|
else
|
|
|
|
color = '0, 0, 0'
|
2013-07-11 22:55:45 +02:00
|
|
|
window.selected_layer = shadow_layer
|
2013-06-13 21:15:18 +02:00
|
|
|
|
|
|
|
for brightness, position in selected_layer
|
|
|
|
switch type
|
|
|
|
when 'enemy'
|
|
|
|
alpha = brightness*.5
|
|
|
|
else
|
|
|
|
alpha = 1-brightness
|
|
|
|
|
|
|
|
if level[position] in blocks.entities
|
|
|
|
if alpha < 0.4 then alpha = 0
|
|
|
|
|
|
|
|
pixel(position, config.pixelsize, config.pixelsize, 'rgba('+color+', '+alpha+')')
|