diff --git a/code/defines/procs/helper_list.dm b/code/defines/procs/helper_list.dm index 736605ca711..cfc9a6edefe 100644 --- a/code/defines/procs/helper_list.dm +++ b/code/defines/procs/helper_list.dm @@ -173,6 +173,29 @@ proc/listclearnulls(list/list) K += item return K +//Mergesort: divides up the list into halves to begin the sort +/proc/sortKey(var/list/client/L, var/order = 1) + if(isnull(L) || L.len < 2) + return L + var/middle = L.len / 2 + 1 + return mergeKey(sortKey(L.Copy(0,middle)), sortKey(L.Copy(middle)), order) + +//Mergsort: does the actual sorting and returns the results back to sortAtom +/proc/mergeKey(var/list/client/L, var/list/client/R, var/order = 1) + var/Li=1 + var/Ri=1 + var/list/result = new() + while(Li <= L.len && Ri <= R.len) + var/client/rL = L[Li] + var/client/rR = R[Ri] + if(sorttext(rL.ckey, rR.ckey) == order) + result += L[Li++] + else + result += R[Ri++] + + if(Li <= L.len) + return (result + L.Copy(Li, 0)) + return (result + R.Copy(Ri, 0)) //Mergesort: divides up the list into halves to begin the sort /proc/sortAtom(var/list/atom/L, var/order = 1) diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm index 352900fe04b..655bba34a79 100644 --- a/code/defines/procs/helpers.dm +++ b/code/defines/procs/helpers.dm @@ -403,30 +403,31 @@ Turf and target are seperate in case you want to teleport some distance from a t return creatures -//Orders mobs by type +//Orders mobs by type then by name /proc/sortmobs() var/list/moblist = list() - for(var/mob/living/silicon/ai/M in mob_list) + var/list/sortmob = sortAtom(mob_list) + for(var/mob/living/silicon/ai/M in sortmob) moblist.Add(M) - for(var/mob/living/silicon/pai/M in mob_list) + for(var/mob/living/silicon/pai/M in sortmob) moblist.Add(M) - for(var/mob/living/silicon/robot/M in mob_list) + for(var/mob/living/silicon/robot/M in sortmob) moblist.Add(M) - for(var/mob/living/carbon/human/M in mob_list) + for(var/mob/living/carbon/human/M in sortmob) moblist.Add(M) - for(var/mob/living/carbon/brain/M in mob_list) + for(var/mob/living/carbon/brain/M in sortmob) moblist.Add(M) - for(var/mob/living/carbon/alien/M in mob_list) + for(var/mob/living/carbon/alien/M in sortmob) moblist.Add(M) - for(var/mob/dead/observer/M in mob_list) + for(var/mob/dead/observer/M in sortmob) moblist.Add(M) - for(var/mob/new_player/M in mob_list) + for(var/mob/new_player/M in sortmob) moblist.Add(M) - for(var/mob/living/carbon/monkey/M in mob_list) + for(var/mob/living/carbon/monkey/M in sortmob) moblist.Add(M) - for(var/mob/living/carbon/metroid/M in mob_list) + for(var/mob/living/carbon/metroid/M in sortmob) moblist.Add(M) - for(var/mob/living/simple_animal/M in mob_list) + for(var/mob/living/simple_animal/M in sortmob) moblist.Add(M) // for(var/mob/living/silicon/hivebot/M in world) // mob_list.Add(M) @@ -766,6 +767,17 @@ proc/anim(turf/location as turf,target as mob|obj,a_icon,a_icon_state as text,fl if(A.vars.Find(lowertext(varname))) return 1 else return 0 +//Returns: all the areas in the world +/proc/return_areas() + var/list/area/areas = list() + for(var/area/A in world) + areas += A + return areas + +//Returns: all the areas in the world, sorted. +/proc/return_sorted_areas() + return sortAtom(return_areas()) + //Takes: Area type as text string or as typepath OR an instance of the area. //Returns: A list of all areas of that type in the world. /proc/get_areas(var/areatype) diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index 30705c12060..74fb96ba94b 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -276,6 +276,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid name = "Hidden Uplink." desc = "There is something wrong if you're examining this." var/active = 0 + var/list/purchase_log = list() // The hidden uplink MUST be inside an obj/item's contents. /obj/item/device/uplink/hidden/New() @@ -336,6 +337,7 @@ A list of items and costs is stored under the datum of every game mode, alongsid if(ishuman(usr)) var/mob/living/carbon/human/A = usr A.put_in_any_hand_if_possible(I) + purchase_log += "[usr] ([usr.ckey]) bought [I]." interact(usr) return diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 3b6dbceef8c..6498103be3b 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -36,6 +36,9 @@ del(src) return + Bumped(atom/user) + if(ismob(user)) shock(user, 70) + meteorhit(var/obj/M) if (M.icon_state == "flaming") diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index c474f1247d1..dc954c675c5 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -3009,7 +3009,7 @@ var/global/BSACooldown = 0 feedback_add_details("admin_verb","SA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! -/obj/admins/proc/show_traitor_panel(var/mob/M in mob_list) +/obj/admins/proc/show_traitor_panel(var/mob/M in sortmobs()) set category = "Admin" set desc = "Edit mobs's memory and role" set name = "Show Traitor Panel" diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index b5adf4391f3..052ade953e7 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -1,4 +1,4 @@ -/client/proc/Jump(var/area/A in world) +/client/proc/Jump(var/area/A in return_sorted_areas()) set name = "Jump to Area" set desc = "Area to jump to" set category = "Admin" @@ -30,7 +30,7 @@ alert("Admin jumping disabled") return -/client/proc/jumptomob(var/mob/M in mob_list) +/client/proc/jumptomob(var/mob/M in sortmobs()) set category = "Admin" set name = "Jump to Mob" @@ -84,7 +84,7 @@ var/list/keys = list() for(var/mob/M in player_list) keys += M.client - var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in keys + var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in sortKey(keys) if(!selection) return var/mob/M = selection:mob @@ -95,7 +95,7 @@ else alert("Admin jumping disabled") -/client/proc/Getmob(var/mob/M in mob_list) +/client/proc/Getmob(var/mob/M in sortmobs()) set category = "Admin" set name = "Get Mob" set desc = "Mob to teleport" @@ -123,7 +123,7 @@ var/list/keys = list() for(var/mob/M in player_list) keys += M.client - var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in keys + var/selection = input("Please, select a player!", "Admin Jumping", null, null) as null|anything in sortKey(keys) if(!selection) return var/mob/M = selection:mob @@ -138,7 +138,7 @@ else alert("Admin jumping disabled") -/client/proc/sendmob(var/mob/M in mob_list, var/area/A in world) +/client/proc/sendmob(var/mob/M in sortmobs(), var/area/A in return_sorted_areas()) set category = "Admin" set name = "Send Mob" if(!src.holder)