proc
get_closest_objects(center, oftype=/atom/movable, list/group=world.contents, num_return=1, dist_method) var/closest_objects[] = list() for (var/cycle in 1 to ((group.len < num_return) ? group.len : num_return)) var/closest_object var/closest_dist for (var/object in group) if (oftype && !istype(object,oftype)) continue if (object in closest_objects) continue var/dist_to = (dist_method ? call(dist_method)(center,object) : get_dist(center,object)) if(!closest_object || dist_to < closest_dist) closest_object = object closest_dist = dist_to if(!closest_object) break closest_objects += closest_object return closest_objects
world maxx = 15 maxy = 15 maxz = 1 New() . = ..() Populate() proc Populate() var/amount = 20 var/populate[] = list(/obj/red,/obj/green,/obj/blue) for (var/obj in 1 to amount) var/obj_type = pick(populate) var/obj/new_obj = new obj_type() do var/coord_x = rand(1,world.maxx) var/coord_y = rand(1,world.maxy) var/coord_z = rand(1,world.maxz) var/new_loc = locate(coord_x,coord_y,coord_z) new_obj.Move(new_loc) while(!new_obj.loc) obj density = 1 var/font_color proc/Mark() var/init_text = "[initial(text)]" text = "<font color=[font_color]>[text]</font>" spawn(20) text = "[init_text]"
red text = "R" font_color = "red" green text = "G" font_color = "green" blue text = "B" font_color = "blue"
mob/verb mark_objects() var/center = usr var/oftype = input(usr,"Which type of object?") as anything in list(/obj/red,/obj/green,/obj/blue,/obj) var/group[] = input(usr,"What maximum range?") as anything in list("1","5","8","any range") switch(group) if("1") group = orange(1,usr) if("5") group = orange(5,usr) if("8") group = orange(8,usr) if("any range") group = world.contents - center var/num_return = input(usr,"How many objects at most should be marked?") as num var/dist_method = input(usr,"Which proc to measure distance?") as anything in list(/proc/normal_dist,/proc/random_dist) var/objects[] = get_closest_objects(center,oftype,group,num_return,dist_method) for (var/obj/mark in objects) world << "object found at [mark.x], [mark.y], [mark.z]" mark.Mark() mark_objects_quick() set desc = "Searches for objects of type /obj/red, in group setting \"any range,\" num_return 3 and dist_method /proc/normal_dist" var/center = usr var/oftype = /obj/red var/group[] = world.contents - center var/num_return = 3 var/dist_method = /proc/normal_dist var/objects[] = get_closest_objects(center,oftype,group,num_return,dist_method) for (var/obj/mark in objects) world << "object found at [mark.x], [mark.y], [mark.z]" mark.Mark() proc/normal_dist(atom/A,atom/B) var/dx = A.x - B.x var/dy = A.y - B.y return sqrt(dx*dx + dy*dy) proc/random_dist(atom/A,atom/B) return rand(1,sqrt(world.maxx*world.maxy))
|