///draw_cast_supercover(origin_x, origin_y, direction, distance)
//
//Find our start and end cells
var lyte_x = floor((argument0) / cell_size) * cell_size + cell_size / 2 ;
var lyte_y = floor((argument1) / cell_size) * cell_size + cell_size / 2 ;
var lyte_end_x = floor((lyte_x + lengthdir_x(argument3, argument2)) / cell_size) * cell_size + cell_size / 2 ;
var lyte_end_y = floor((lyte_y + lengthdir_y(argument3, argument2)) / cell_size) * cell_size + cell_size / 2 ;
//Draw actual cast line
draw_line_colour(lyte_x, lyte_y, lyte_end_x, lyte_end_y, c_white, c_white) ;
draw_circle_colour(lyte_x, lyte_y, 3, c_white, c_white, false) ;
draw_circle_colour(lyte_end_x, lyte_end_y, 3, c_white, c_white, false) ;
//Set travel variables
var lyte_dir = point_direction(lyte_x, lyte_y, lyte_end_x, lyte_end_y) ;
var lyte_rad = point_distance(lyte_x, lyte_y, lyte_end_x, lyte_end_y) ;
var list_cells = ds_priority_create() ;
var delta_x = lyte_end_x - lyte_x ;
var delta_y = lyte_end_y - lyte_y ;
var x_cells_traveled = floor(delta_x / cell_size) ;
var y_cells_traveled = floor(delta_y / cell_size) ;
var xdir = sign(x_cells_traveled) ;
var ydir = sign(y_cells_traveled) ;
//Travel
var denominator = abs(x_cells_traveled * 2) ;
for(var i = 1 ; i < denominator ; i += 2 ;)
{
//Show grid intersections, and "travel" the intersected cells
var xx = lyte_x + lengthdir_x(lyte_rad * (i / denominator), lyte_dir) ;
var yy = lyte_y + lengthdir_y(lyte_rad * (i / denominator), lyte_dir) ;
draw_circle_colour(xx, yy, 3, c_blue, c_blue, false) ;
ds_priority_add(list_cells, 2 + (xdir > 0), i / denominator) ;
}
var denominator = abs(y_cells_traveled * 2) ;
for(var i = 1 ; i < denominator ; i += 2 ;)
{
//Show grid intersections, and "travel" the intersected cells
var xx = lyte_x + lengthdir_x(lyte_rad * (i / denominator), lyte_dir) ;
var yy = lyte_y + lengthdir_y(lyte_rad * (i / denominator), lyte_dir) ;
draw_circle_colour(xx, yy, 3, c_blue, c_blue, false) ;
ds_priority_add(list_cells, (ydir > 0), i / denominator) ;
}
//Draw start cell
draw_set_alpha(.5) ;
var current_cell_x = floor(lyte_x / cell_size) ;
var current_cell_y = floor(lyte_y / cell_size) ;
draw_rectangle_colour(current_cell_x * cell_size, current_cell_y * cell_size,
current_cell_x * cell_size + cell_size, current_cell_y * cell_size + cell_size,
c_lime, c_lime, c_lime, c_lime, false) ;
var q_length = ds_priority_size(list_cells) ;
//Draw traveled cells up to terminal cell in order
for(var i = 0 ; i < q_length ; i ++ ;)
{
var temp_list = ds_priority_find_min(list_cells) ;
current_cell_x += parse_cast_x(temp_list) ;
current_cell_y += parse_cast_y(temp_list) ;
ds_priority_delete_min(list_cells) ;
if grid_empty(current_cell_x, current_cell_y)
{
draw_rectangle_colour(current_cell_x * cell_size, current_cell_y * cell_size,
current_cell_x * cell_size + cell_size, current_cell_y * cell_size + cell_size,
c_lime, c_lime, c_lime, c_lime, false) ;
//here you could light up a cell, change its value, or even save the list as another list of move-coordinates, or simply return false for collision
}
else
{
draw_rectangle_colour(current_cell_x * cell_size, current_cell_y * cell_size,
current_cell_x * cell_size + cell_size, current_cell_y * cell_size + cell_size,
c_red, c_red, c_red, c_red, false) ;
//here you could do nothing, or if for collision checks you could return a collision true (and then do some line slope checks or something based on the type of tile for more precision)
break ;
}
}
draw_set_alpha(1) ;
//All done
ds_priority_destroy(list_cells) ; //free list