From 7562db8c3d84518223fc32f5c8209e2424db54b8 Mon Sep 17 00:00:00 2001 From: Charlie Nolan Date: Thu, 18 Apr 2024 14:16:07 -0700 Subject: [PATCH 01/65] recieve -> receive (#25123) * recieve -> receive * Unfix. --------- Co-authored-by: FunnyMan3595 (Charlie Nolan) Co-authored-by: S34N <12197162+S34NW@users.noreply.github.com> --- code/__DEFINES/radio_defines.dm | 2 +- code/_onclick/drag_drop.dm | 2 +- code/datums/components/_component.dm | 2 +- code/datums/components/boss_music.dm | 2 +- code/datums/components/proximity_monitor.dm | 6 ++-- code/datums/components/slippery.dm | 2 +- code/game/machinery/tcomms/tcomms_base.dm | 2 +- .../items/devices/radio/radio_objects.dm | 2 +- .../objects/items/robot/robot_upgrades.dm | 2 +- .../objects/items/weapons/storage/bags.dm | 2 +- code/modules/admin/banjob.dm | 2 +- code/modules/admin/verbs/adminpm.dm | 34 +++++++++---------- .../antagonists/_common/antag_datum.dm | 2 +- code/modules/economy/money_account.dm | 2 +- code/modules/events/money_spam.dm | 1 + .../mob/living/silicon/robot/robot_defense.dm | 2 +- .../mob/living/simple_animal/bot/floorbot.dm | 2 +- code/modules/pda/messenger.dm | 4 +-- code/modules/power/apc/apc.dm | 4 +-- code/modules/power/generators/solar.dm | 2 +- .../modules/power/powernets/local_powernet.dm | 2 +- code/modules/redis/redis_callback.dm | 2 +- .../surgery/organs/subtypes/tajaran_organs.dm | 2 +- .../organs/subtypes/vulpkanin_organs.dm | 2 +- code/modules/tgui/tgui_panel/README.md | 4 +-- tools/githubChangelogProcessor.php | 2 +- 26 files changed, 47 insertions(+), 46 deletions(-) diff --git a/code/__DEFINES/radio_defines.dm b/code/__DEFINES/radio_defines.dm index 386b64ad749d..bfe3f26259ba 100644 --- a/code/__DEFINES/radio_defines.dm +++ b/code/__DEFINES/radio_defines.dm @@ -41,7 +41,7 @@ #define TRANSMISSION_WIRE 0 #define TRANSMISSION_RADIO 1 -//This filter is special because devices belonging to default also recieve signals sent to any other filter. +//This filter is special because devices belonging to default also receive signals sent to any other filter. #define RADIO_DEFAULT "radio_default" #define RADIO_TO_AIRALARM "radio_airalarm" //air alarms #define RADIO_FROM_AIRALARM "radio_airalarm_rcvr" //devices interested in recieving signals from air alarms diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index 420e9d4d9fa7..84f87e5bfd5c 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -40,7 +40,7 @@ FALSE if not usr.ClickOn(src, params) // if not, we click object /* -recieve a mousedrop +receive a mousedrop called on object which was under the object you dragged and dropped return TRUE if you want to prevent us click the object actually if you do something in that proc like changing user location or whatever, you expected to return TRUE diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 4c4ea93241a2..5b3cd3a53dbe 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -163,7 +163,7 @@ * Register to listen for a signal from the passed in target * * This sets up a listening relationship such that when the target object emits a signal - * the source datum this proc is called upon, will recieve a callback to the given proctype + * the source datum this proc is called upon, will receive a callback to the given proctype * Return values from procs registered must be a bitfield * * Arguments: diff --git a/code/datums/components/boss_music.dm b/code/datums/components/boss_music.dm index 85af91c4d5e1..5805052b9b55 100644 --- a/code/datums/components/boss_music.dm +++ b/code/datums/components/boss_music.dm @@ -37,7 +37,7 @@ UnregisterSignal(parent, COMSIG_HOSTILE_FOUND_TARGET) return ..() -///Handles giving the boss music to a new target the fauna has recieved. +///Handles giving the boss music to a new target the fauna has received. ///Keeps track of them to not repeatedly overwrite its own track. /datum/component/boss_music/proc/on_target_found(atom/source, mob/new_target) SIGNAL_HANDLER diff --git a/code/datums/components/proximity_monitor.dm b/code/datums/components/proximity_monitor.dm index e4a3112f8606..b37712b9d1f7 100644 --- a/code/datums/components/proximity_monitor.dm +++ b/code/datums/components/proximity_monitor.dm @@ -68,7 +68,7 @@ * Arguments: * * datum/source - this will be the `hasprox_receiver` * * atom/old_loc - the location the receiver just moved from - * * dir - the direction the reciever just moved in + * * dir - the direction the receiver just moved in */ /datum/component/proximity_monitor/proc/on_receiver_move(datum/source, atom/old_loc, dir) SIGNAL_HANDLER @@ -120,7 +120,7 @@ /** * Called when the receiver or an atom in the `nested_receiver_locs` list moves into a disposals holder object. * - * This proc recieves arguments, but they aren't needed. + * This proc receives arguments, but they aren't needed. */ /datum/component/proximity_monitor/proc/on_disposal_enter(datum/source) SIGNAL_HANDLER @@ -130,7 +130,7 @@ /** * Called when the receiver or an atom in the `nested_receiver_locs` list moves out of a disposals holder object. * - * This proc recieves arguments, but they aren't needed. + * This proc receives arguments, but they aren't needed. */ /datum/component/proximity_monitor/proc/on_disposal_exit(datum/source) SIGNAL_HANDLER diff --git a/code/datums/components/slippery.dm b/code/datums/components/slippery.dm index 4b79900cd439..4488c8dcb838 100644 --- a/code/datums/components/slippery.dm +++ b/code/datums/components/slippery.dm @@ -45,7 +45,7 @@ UnregisterSignal(parent, list(COMSIG_MOVABLE_CROSSED, COMSIG_ATOM_ENTERED)) /** - Called whenever the parent recieves either the `MOVABLE_CROSSED` signal or the `ATOM_ENTERED` signal. + Called whenever the parent receives either the `MOVABLE_CROSSED` signal or the `ATOM_ENTERED` signal. Calls the `victim`'s `slip()` proc with the component's variables as arguments. Additionally calls the parent's `after_slip()` proc on the `victim`. diff --git a/code/game/machinery/tcomms/tcomms_base.dm b/code/game/machinery/tcomms/tcomms_base.dm index beb0bb442330..2517ac6cacd9 100644 --- a/code/game/machinery/tcomms/tcomms_base.dm +++ b/code/game/machinery/tcomms/tcomms_base.dm @@ -206,7 +206,7 @@ GLOBAL_LIST_EMPTY(tcomms_machines) var/vname /// sender_name before modify_message modifies it, because it introduces html tags. var/pre_modify_name - /// List of all channels this can be sent or recieved on + /// List of all channels this can be sent or received on var/list/zlevels = list() /// Should this signal be re-broadcasted (Can be modified by NTTC, defaults to TRUE) var/pass = TRUE diff --git a/code/game/objects/items/devices/radio/radio_objects.dm b/code/game/objects/items/devices/radio/radio_objects.dm index 2f7f5e4f1845..50118af000bc 100644 --- a/code/game/objects/items/devices/radio/radio_objects.dm +++ b/code/game/objects/items/devices/radio/radio_objects.dm @@ -527,7 +527,7 @@ GLOBAL_LIST_EMPTY(deadsay_radio_systems) if(freq in SSradio.ANTAG_FREQS) if(!(syndiekey))//Checks to see if it's allowed on that frequency, based on the encryption keys return -1 - if(!freq) //recieved on main frequency + if(!freq) //received on main frequency if(!listening) return -1 else diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index e5986a9833c9..ddfcceac5a60 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -7,7 +7,7 @@ icon = 'icons/obj/module.dmi' icon_state = "cyborg_upgrade" origin_tech = "programming=2" - /// Whether or not the cyborg needs to have a chosen module before they can recieve this upgrade. + /// Whether or not the cyborg needs to have a chosen module before they can receive this upgrade. var/require_module = FALSE /// The type of module this upgrade is compatible with: Engineering, Medical, etc. var/module_type = null diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 052d4ac74c52..d7904f08627c 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -377,7 +377,7 @@ if(!istype(S)) return 0 //I would prefer to drop a new stack, but the item/attack_hand code - // that calls this can't recieve a different object than you clicked on. + // that calls this can't receive a different object than you clicked on. //Therefore, make a new stack internally that has the remainder. // -Sayu diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index 384fef47a086..86718b4b6737 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -35,7 +35,7 @@ /** * Lists all active jobbans for src client * - * from_client_connection - If true, user will not recieve any info in chat if they have no job bans, used when a player loads into to the lobby. + * from_client_connection - If true, user will not receive any info in chat if they have no job bans, used when a player loads into to the lobby. */ /client/proc/display_job_bans(from_client_connection = FALSE) if(!from_client_connection) // Only reload if this is being checked by a user manually, as we load job bans at client new anyway diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index c55322a17c1a..6d8ad1481780 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -78,7 +78,7 @@ adminhelp(msg) //admin we are replying to left. adminhelp instead return - /*if(C && C.last_pm_recieved + config.simultaneous_pm_warning_timeout > world.time && holder) + /*if(C && C.last_pm_received + config.simultaneous_pm_warning_timeout > world.time && holder) //send a warning to admins, but have a delay popup for mods if(holder.rights & R_ADMIN) to_chat(src, "Simultaneous PMs warning: that player has been PM'd in the last [config.simultaneous_pm_warning_timeout / 10] seconds by: [C.ckey_last_pm]") @@ -113,21 +113,21 @@ msg = admin_pencode_to_html(msg) var/send_span - var/recieve_span + var/receive_span var/send_pm_type = " " - var/recieve_pm_type = "Player" + var/receive_pm_type = "Player" var/message_type var/datum/controller/subsystem/tickets/tickets_system // We treat PMs as mentorhelps if we were explicitly so, or if neither // party is an admin. if(type == "Mentorhelp" || !(check_rights(R_ADMIN|R_MOD, 0, C.mob) || check_rights(R_ADMIN|R_MOD, 0, mob))) send_span = "mentorhelp" - recieve_span = "mentorhelp" + receive_span = "mentorhelp" message_type = MESSAGE_TYPE_MENTORPM tickets_system = SSmentor_tickets else send_span = "adminhelp" - recieve_span = "adminhelp" + receive_span = "adminhelp" message_type = MESSAGE_TYPE_ADMINPM tickets_system = SStickets @@ -135,22 +135,22 @@ if(holder) //PMs sent from admins and mods display their rank send_pm_type = holder.rank + " " - recieve_pm_type = holder.rank + receive_pm_type = holder.rank else if(!C.holder) to_chat(src, "Error: Admin-PM: Non-admin to non-admin PM communication is forbidden.") return - var/recieve_message = "" + var/receive_message = "" pm_tracker.add_message(C, src, msg, mob) C.pm_tracker.add_message(src, src, msg, C.mob) if(holder && !C.holder) - recieve_message = "-- Click the [recieve_pm_type]'s name to reply --\n" + receive_message = "-- Click the [receive_pm_type]'s name to reply --\n" if(C.adminhelped) window_flash(C) - to_chat(C, recieve_message) + to_chat(C, receive_message) C.adminhelped = 0 //AdminPM popup for ApocStation and anybody else who wants to use it. Set it with POPUP_ADMIN_PM in config.txt ~Carn @@ -158,7 +158,7 @@ spawn(0) //so we don't hold the caller proc up var/sender = src var/sendername = key - var/reply = clean_input(msg,"[recieve_pm_type] [type] from-[sendername]", "", C) //show message and await a reply + var/reply = clean_input(msg,"[receive_pm_type] [type] from-[sendername]", "", C) //show message and await a reply if(C && reply) if(sender) C.cmd_admin_pm(sender,reply) //sender is still about, let's reply to them @@ -176,17 +176,17 @@ ticket_link = "(TICKET)" var/emoji_msg = "[msg]" - var/recieve_window_link = "(WINDOW)" + var/receive_window_link = "(WINDOW)" if(message_type == MESSAGE_TYPE_MENTORPM && check_rights(R_ADMIN|R_MENTOR, 0, C.mob)) - recieve_window_link = ticket_link + receive_window_link = ticket_link else if(message_type == MESSAGE_TYPE_ADMINPM && check_rights(R_ADMIN, 0, C.mob)) - recieve_window_link = ticket_link - recieve_message = "[type] from-[recieve_pm_type] [C.holder ? key_name(src, TRUE, type, ticket_id = ticket_id) : key_name_hidden(src, TRUE, type, ticket_id = ticket_id)]:

[emoji_msg][C.holder ? "
[ping_link] [recieve_window_link] [alert_link]" : ""]
" + receive_window_link = ticket_link + receive_message = "[type] from-[receive_pm_type] [C.holder ? key_name(src, TRUE, type, ticket_id = ticket_id) : key_name_hidden(src, TRUE, type, ticket_id = ticket_id)]:

[emoji_msg][C.holder ? "
[ping_link] [receive_window_link] [alert_link]" : ""]
" if(message_type == MESSAGE_TYPE_MENTORPM) - recieve_message = chat_box_mhelp(recieve_message) + receive_message = chat_box_mhelp(receive_message) else - recieve_message = chat_box_ahelp(recieve_message) - to_chat(C, recieve_message) + receive_message = chat_box_ahelp(receive_message) + to_chat(C, receive_message) var/send_window_link = "(WINDOW)" if(message_type == MESSAGE_TYPE_MENTORPM && check_rights(R_ADMIN|R_MENTOR, 0, mob)) send_window_link = ticket_link diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index 41813bd2e718..653295489883 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -314,7 +314,7 @@ GLOBAL_LIST_EMPTY(antagonists) owner.special_role = A.special_role /** - * Checks if the person trying to recieve this datum is role banned from it. + * Checks if the person trying to receive this datum is role banned from it. */ /datum/antagonist/proc/is_banned(mob/M) if(!M) diff --git a/code/modules/economy/money_account.dm b/code/modules/economy/money_account.dm index 4ce226fff006..2202838ac06c 100644 --- a/code/modules/economy/money_account.dm +++ b/code/modules/economy/money_account.dm @@ -27,7 +27,7 @@ var/suspended = FALSE ///Type of account this is var/account_type = ACCOUNT_TYPE_PERSONAL - ///the amount this account recieves every payday + ///the amount this account receives every payday var/payday_amount = CREW_BASE_PAY_LOW ///The nanobank programs associated with this account, used for notifying crew members through PDA, this is a lazy list diff --git a/code/modules/events/money_spam.dm b/code/modules/events/money_spam.dm index e9f398377e37..12d870cbf31c 100644 --- a/code/modules/events/money_spam.dm +++ b/code/modules/events/money_spam.dm @@ -78,6 +78,7 @@ "We are happy to inform you that due to the delay, we have been instructed to IMMEDIATELY deposit all funds into your account",\ "Dear fund beneficiary, We have please to inform you that overdue funds payment has finally been approved and released for payment",\ "Due to my lack of agents I require an off-world financial account to immediately deposit the sum of 1 POINT FIVE MILLION credits.",\ + // Intentional errors here, please do not fix. "Greetings sir, I regretfully to inform you that as I lay dying here due to my lack ofheirs I have chosen you to recieve the full sum of my lifetime savings of 1.5 billion credits") if(6) sender = pick("Nanotrasen Morale Divison","Feeling Lonely?","Bored?","www.wetskrell.nt") diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index b6d53e6875dd..b397601193be 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -30,7 +30,7 @@ damage = rand(20, 40) else damage = rand(5, 35) - damage = round(damage / 2) // borgs recieve half damage + damage = round(damage / 2) // borgs receive half damage adjustBruteLoss(damage) return diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index 1f2e59041776..f7188f1a3be3 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -17,7 +17,7 @@ req_access = list(ACCESS_CONSTRUCTION, ACCESS_ROBOTICS) window_id = "autofloor" window_name = "Automatic Station Floor Repairer v1.1" - /// Determines what to do when process_scan() recieves a target. See process_scan() for details. + /// Determines what to do when process_scan() receives a target. See process_scan() for details. var/process_type /// Tiles in inventory var/amount = 10 diff --git a/code/modules/pda/messenger.dm b/code/modules/pda/messenger.dm index c83d85355848..5057c5ef8384 100644 --- a/code/modules/pda/messenger.dm +++ b/code/modules/pda/messenger.dm @@ -167,13 +167,13 @@ if(sendable && receivable) break - if(!sendable) // Are we in the range of a reciever? + if(!sendable) // Are we in the range of a receiver? to_chat(U, "ERROR: No connection to server.") if(!pda.silent) playsound(pda, 'sound/machines/terminal_error.ogg', 15, TRUE) return - if(!receivable) // Is our recipient in the range of a reciever? + if(!receivable) // Is our recipient in the range of a receiver? to_chat(U, "ERROR: No connection to recipient.") if(!pda.silent) playsound(pda, 'sound/machines/terminal_error.ogg', 15, TRUE) diff --git a/code/modules/power/apc/apc.dm b/code/modules/power/apc/apc.dm index fe4b65e06c20..c61b5e28a1b4 100644 --- a/code/modules/power/apc/apc.dm +++ b/code/modules/power/apc/apc.dm @@ -52,7 +52,7 @@ /*** APC Status Vars ***/ /// The wire panel associated with this APC var/datum/wires/apc/wires = null - /// Can the APC recieve/transmit power? Determined by the condition of the 2 Main Power Wires + /// Can the APC receive/transmit power? Determined by the condition of the 2 Main Power Wires var/shorted = FALSE /// Is the APC on and transmitting power to enabled breakers? Think of this var as the master breaker for the APC var/operating = TRUE @@ -79,7 +79,7 @@ var/locked = TRUE /// If TRUE, the APC will automatically draw power from connect terminal, if FALSE it will not charge var/chargemode = TRUE - /// Counter var, ticks up when the APC recieves power from terminal and resets to 0 when not charging, used for the `var/charging` var + /// Counter var, ticks up when the APC receives power from terminal and resets to 0 when not charging, used for the `var/charging` var var/chargecount = 0 var/report_power_alarm = TRUE diff --git a/code/modules/power/generators/solar.dm b/code/modules/power/generators/solar.dm index 7a9aa7eb9bb5..c7f4bd613fba 100644 --- a/code/modules/power/generators/solar.dm +++ b/code/modules/power/generators/solar.dm @@ -102,7 +102,7 @@ panel.transform = M . += panel -//calculates the fraction of the sunlight that the panel recieves +//calculates the fraction of the sunlight that the panel receives /obj/machinery/power/solar/proc/update_solar_exposure() if(obscured) sunfrac = 0 diff --git a/code/modules/power/powernets/local_powernet.dm b/code/modules/power/powernets/local_powernet.dm index cad1158a1aac..1e9ce8f34b92 100644 --- a/code/modules/power/powernets/local_powernet.dm +++ b/code/modules/power/powernets/local_powernet.dm @@ -2,7 +2,7 @@ * # local_powernet * * Manages all power related mechanics for a single /area - * Machines in areas will directly register to this datum in order to recieve power + * Machines in areas will directly register to this datum in order to receive power * * Machine/Turf/Item -> Local Powernet -> APC -> Terminal -> Wirenet * diff --git a/code/modules/redis/redis_callback.dm b/code/modules/redis/redis_callback.dm index 5288a5b99590..db41707895ca 100644 --- a/code/modules/redis/redis_callback.dm +++ b/code/modules/redis/redis_callback.dm @@ -14,7 +14,7 @@ /** * Message handler callback * - * This callback is ran when a message is recieved on the assigned channel. + * This callback is ran when a message is received on the assigned channel. * Make sure you override it on subtypes or it wont work. * * Arguments: diff --git a/code/modules/surgery/organs/subtypes/tajaran_organs.dm b/code/modules/surgery/organs/subtypes/tajaran_organs.dm index 0615bf28c8e3..2f83bad01b69 100644 --- a/code/modules/surgery/organs/subtypes/tajaran_organs.dm +++ b/code/modules/surgery/organs/subtypes/tajaran_organs.dm @@ -6,7 +6,7 @@ /obj/item/organ/internal/eyes/tajaran icon = 'icons/obj/species_organs/tajaran.dmi' name = "tajaran eyeballs" - colourblind_matrix = MATRIX_TAJ_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability. + colourblind_matrix = MATRIX_TAJ_CBLIND //The colour matrix and darksight parameters that the mob will receive when they get the disability. replace_colours = TRITANOPIA_COLOR_REPLACE see_in_dark = 4 diff --git a/code/modules/surgery/organs/subtypes/vulpkanin_organs.dm b/code/modules/surgery/organs/subtypes/vulpkanin_organs.dm index 326996284c34..92af49afb253 100644 --- a/code/modules/surgery/organs/subtypes/vulpkanin_organs.dm +++ b/code/modules/surgery/organs/subtypes/vulpkanin_organs.dm @@ -6,7 +6,7 @@ /obj/item/organ/internal/eyes/vulpkanin name = "vulpkanin eyeballs" icon = 'icons/obj/species_organs/vulpkanin.dmi' - colourblind_matrix = MATRIX_VULP_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability. + colourblind_matrix = MATRIX_VULP_CBLIND //The colour matrix and darksight parameters that the mob will receive when they get the disability. replace_colours = PROTANOPIA_COLOR_REPLACE see_in_dark = 4 diff --git a/code/modules/tgui/tgui_panel/README.md b/code/modules/tgui/tgui_panel/README.md index 95f28ae0e8cf..71acb47c458a 100644 --- a/code/modules/tgui/tgui_panel/README.md +++ b/code/modules/tgui/tgui_panel/README.md @@ -19,11 +19,11 @@ TgChat handles sending messages from the server to the client through the use of ### Reliability -In the past there have been issues where BYOND will silently and without reason lose a message we sent to the client, to detect this and recover from it seamlessly TgChat also has a baked in reliability layer. This reliability layer is very primitive, and simply keeps track of recieved sequence numbers. Should the client recieve an unexpected sequence number TgChat asks the server to resend any missing packets. +In the past there have been issues where BYOND will silently and without reason lose a message we sent to the client, to detect this and recover from it seamlessly TgChat also has a baked in reliability layer. This reliability layer is very primitive, and simply keeps track of received sequence numbers. Should the client receive an unexpected sequence number TgChat asks the server to resend any missing packets. ### Ping System -TgChat supports a round trip time ping measurement, which is displayed to the client so they can know how long it takes for their commands and inputs to reach the server. This is done by sending the client a ping request, `ping/soft`, which tells the client to send a ping to the server. When the server recieves said ping it sends a reply, `ping/reply`, to the client with a payload containing the current DateTime which the client can reference against the initial ping request. +TgChat supports a round trip time ping measurement, which is displayed to the client so they can know how long it takes for their commands and inputs to reach the server. This is done by sending the client a ping request, `ping/soft`, which tells the client to send a ping to the server. When the server receives said ping it sends a reply, `ping/reply`, to the client with a payload containing the current DateTime which the client can reference against the initial ping request. ### Chat Tabs, Local Storage, and Highlighting diff --git a/tools/githubChangelogProcessor.php b/tools/githubChangelogProcessor.php index a88cd99580c1..3436e567587f 100644 --- a/tools/githubChangelogProcessor.php +++ b/tools/githubChangelogProcessor.php @@ -317,7 +317,7 @@ function export($addr, $port, $str) { $bytessent += $result; } - /* --- Idle for a while until recieved bytes from game server --- */ + /* --- Idle for a while until received bytes from game server --- */ $result = socket_read($server, 10000, PHP_BINARY_READ); socket_close($server); // we don't need this anymore From dc877787b454e43d67b4d174df8eb3f2edc9c3c8 Mon Sep 17 00:00:00 2001 From: AffectedArc07 <25063394+AffectedArc07@users.noreply.github.com> Date: Fri, 19 Apr 2024 12:37:42 +0100 Subject: [PATCH 02/65] New tracy DLL (#25185) --- prof.dll | Bin 118272 -> 129024 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/prof.dll b/prof.dll index c0bc34532e4c7b2e18fe2760ff18375d8b4cf087..279f16de36108b2877a1537dcc2456a12e76e019 100644 GIT binary patch literal 129024 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 From 43337171df88cb0965730bb4fa84cfd7fa818105 Mon Sep 17 00:00:00 2001 From: DGamerL <108773801+DGamerL@users.noreply.github.com> Date: Fri, 19 Apr 2024 16:03:10 +0200 Subject: [PATCH 03/65] Adds an underscore to the slaughter demon folder (#25200) --- .../demons/{slaughter demon => slaughter_demon}/slaughter.dm | 0 paradise.dme | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename code/game/gamemodes/miniantags/demons/{slaughter demon => slaughter_demon}/slaughter.dm (100%) diff --git a/code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm b/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter.dm similarity index 100% rename from code/game/gamemodes/miniantags/demons/slaughter demon/slaughter.dm rename to code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter.dm diff --git a/paradise.dme b/paradise.dme index f232da7df0cb..e45f422f3cbb 100644 --- a/paradise.dme +++ b/paradise.dme @@ -711,7 +711,7 @@ #include "code\game\gamemodes\miniantags\abduction\machinery\pad.dm" #include "code\game\gamemodes\miniantags\demons\demon.dm" #include "code\game\gamemodes\miniantags\demons\shadow_demon\shadow_demon.dm" -#include "code\game\gamemodes\miniantags\demons\slaughter demon\slaughter.dm" +#include "code\game\gamemodes\miniantags\demons\slaughter_demon\slaughter.dm" #include "code\game\gamemodes\miniantags\guardian\guardian.dm" #include "code\game\gamemodes\miniantags\guardian\host_actions.dm" #include "code\game\gamemodes\miniantags\guardian\types\assassin.dm" From f64fb4b973384b9db2d3b4e5961bf0af4d66c29e Mon Sep 17 00:00:00 2001 From: DGamerL <108773801+DGamerL@users.noreply.github.com> Date: Fri, 19 Apr 2024 16:12:15 +0200 Subject: [PATCH 04/65] Removes a span from an admin log (#25199) * Easy span removal * Fix accidental reverts * Removes a missing span --- code/game/machinery/cryopod.dm | 2 +- code/modules/shuttle/shuttle_manipulator.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 8df74ed68eef..220b290e3a32 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -592,7 +592,7 @@ if(Gh.key == FT) if(Gh.client && Gh.client.holder) //just in case someone has a byond name with @ at the start, which I don't think is even possible but whatever to_chat(Gh, "Warning: Your body has entered cryostorage.") - log_admin("[key_name(E)] entered a stasis pod.") + log_admin("[key_name(E)] entered a stasis pod.") if(SSticker.mode.tdm_gamemode) SSblackbox.record_feedback("nested tally", "TDM_quitouts", 1, list(SSticker.mode.name, "TDM Cryopods")) message_admins("[key_name_admin(E)] entered a stasis pod. (JMP)") diff --git a/code/modules/shuttle/shuttle_manipulator.dm b/code/modules/shuttle/shuttle_manipulator.dm index 2103fed8513f..c8417758b619 100644 --- a/code/modules/shuttle/shuttle_manipulator.dm +++ b/code/modules/shuttle/shuttle_manipulator.dm @@ -198,7 +198,7 @@ if(mdp) usr.forceMove(get_turf(mdp)) message_admins("[key_name_admin(usr)] loaded [mdp] with the shuttle manipulator.") - log_admin("[key_name(usr)] loaded [mdp] with the shuttle manipulator.") + log_admin("[key_name(usr)] loaded [mdp] with the shuttle manipulator.") /obj/machinery/shuttle_manipulator/proc/action_load(datum/map_template/shuttle/loading_template) if(isnull(loading_template)) From 02716044ba41fbf9d7ea7acdafce7c53da838bc6 Mon Sep 17 00:00:00 2001 From: Mikhail Dzianishchyts Date: Fri, 19 Apr 2024 17:12:52 +0300 Subject: [PATCH 05/65] [s] Encryption key trick no more (#25137) * Encryption key trick no more * Update code/game/objects/items/devices/radio/headset.dm Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Update code/game/objects/items/devices/radio/headset.dm Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> --------- Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> --- .../game/objects/items/devices/radio/headset.dm | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index f04502612d6f..c268ee73404a 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -387,21 +387,22 @@ return FALSE return ..() -/obj/item/radio/headset/attackby(obj/item/W as obj, mob/user as mob) - if(istype(W, /obj/item/encryptionkey/)) +/obj/item/radio/headset/attackby(obj/item/key, mob/user) + if(istype(key, /obj/item/encryptionkey/)) if(keyslot1 && keyslot2) to_chat(user, "The headset can't hold another key!") return + if(!user.unEquip(key)) + to_chat(user, "[key] is stuck to your hand, you can't insert it in [src].") + return + + key.forceMove(src) if(!keyslot1) - user.drop_item() - W.loc = src - keyslot1 = W + keyslot1 = key else - user.drop_item() - W.loc = src - keyslot2 = W + keyslot2 = key recalculateChannels() return From 0541588e82531d32c123c87efbd6c2f925ee0ec2 Mon Sep 17 00:00:00 2001 From: BiancaWilkson <42818125+BiancaWilkson@users.noreply.github.com> Date: Fri, 19 Apr 2024 10:13:10 -0400 Subject: [PATCH 06/65] the swapper (2013) (#25139) --- code/modules/mob/living/brain/robotic_brain.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/brain/robotic_brain.dm b/code/modules/mob/living/brain/robotic_brain.dm index 3771163bc087..9829ffa0aec5 100644 --- a/code/modules/mob/living/brain/robotic_brain.dm +++ b/code/modules/mob/living/brain/robotic_brain.dm @@ -137,8 +137,8 @@ return FALSE /obj/item/mmi/robotic_brain/examine(mob/user) - . += "Its speaker is turned [silenced ? "off" : "on"]." . = ..() + . += "Its speaker is turned [silenced ? "off" : "on"]." var/list/msg = list("") From 8500df223dd6d6e3e6310bc65433fcdd2f70d488 Mon Sep 17 00:00:00 2001 From: Luc <89928798+lewcc@users.noreply.github.com> Date: Fri, 19 Apr 2024 10:19:51 -0400 Subject: [PATCH 07/65] cleans up some span mishaps (#25106) --- code/game/machinery/vendors/tilt_crits.dm | 2 +- code/game/objects/items/weapons/storage/bible.dm | 2 +- code/modules/clothing/spacesuits/alien_suits.dm | 2 +- code/modules/mob/living/living_emote.dm | 2 +- code/modules/mob/living/silicon/pai/pai_death.dm | 2 +- code/modules/mob/living/simple_animal/hide_action.dm | 4 ++-- code/modules/mod/modules/module_pathfinder.dm | 4 ++-- code/modules/reagents/chemistry/reagents/medicine.dm | 2 +- code/modules/surgery/organs/brain.dm | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/code/game/machinery/vendors/tilt_crits.dm b/code/game/machinery/vendors/tilt_crits.dm index f4421707641c..f2eaf0a9befa 100644 --- a/code/game/machinery/vendors/tilt_crits.dm +++ b/code/game/machinery/vendors/tilt_crits.dm @@ -96,7 +96,7 @@ /datum/tilt_crit/vendor/embed/tip_crit_effect(obj/machinery/economy/vending/machine, mob/living/carbon/victim, incoming_damage) victim.visible_message( "[machine]'s panel shatters against [victim]!", - "[machine] lands on you, its panel shattering!" ) for(var/i in 1 to machine.num_shards) diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm index e4bafc9d70f5..dd88e73e6148 100644 --- a/code/game/objects/items/weapons/storage/bible.dm +++ b/code/game/objects/items/weapons/storage/bible.dm @@ -99,7 +99,7 @@ var/mob/living/carbon/human/H = M if(prob(60)) bless(H) - H.visible_message("[user] heals [H == user ? "[user.p_themselves()]" : "[H]"] with the power of [deity_name]!", "May the power of [deity_name] compel you to be healed!") playsound(loc, "punch", 25, 1, -1) else diff --git a/code/modules/clothing/spacesuits/alien_suits.dm b/code/modules/clothing/spacesuits/alien_suits.dm index 5713d1ff5fd5..748427fd9a68 100644 --- a/code/modules/clothing/spacesuits/alien_suits.dm +++ b/code/modules/clothing/spacesuits/alien_suits.dm @@ -219,7 +219,7 @@ return var/mob/living/carbon/human/H = user if(H.shoes != src) - to_chat(user, "You will have to put on [src] before you can do that.") return flags |= NODROP //kinda hard to take off magclaws when you are gripping them tightly. to_chat(user, "You dig your claws deeply into the flooring, bracing yourself.") diff --git a/code/modules/mob/living/living_emote.dm b/code/modules/mob/living/living_emote.dm index dbcb4c4add63..dc75d8cf9dfd 100644 --- a/code/modules/mob/living/living_emote.dm +++ b/code/modules/mob/living/living_emote.dm @@ -208,7 +208,7 @@ message_param = "tries to point at %t with a leg." else // nugget - message_param = "bumps [user.p_their()] head on the ground trying to motion towards %t." return ..() diff --git a/code/modules/mob/living/silicon/pai/pai_death.dm b/code/modules/mob/living/silicon/pai/pai_death.dm index 281fc25d2793..e7f041de10c1 100644 --- a/code/modules/mob/living/silicon/pai/pai_death.dm +++ b/code/modules/mob/living/silicon/pai/pai_death.dm @@ -3,7 +3,7 @@ if(!cleanWipe) force_fold_out() - visible_message("[src] emits a dull beep before it loses power and collapses.", "You hear a dull beep followed by the sound of glass crunching.") + visible_message("[src] emits a dull beep before it loses power and collapses.", "You hear a dull beep followed by the sound of glass crunching.") name = "pAI debris" desc = "The unfortunate remains of some poor personal AI device." icon_state = "[chassis]_dead" diff --git a/code/modules/mob/living/simple_animal/hide_action.dm b/code/modules/mob/living/simple_animal/hide_action.dm index 90a189590419..c3835690b65c 100644 --- a/code/modules/mob/living/simple_animal/hide_action.dm +++ b/code/modules/mob/living/simple_animal/hide_action.dm @@ -11,13 +11,13 @@ if(owner.layer != layer_to_change_to) owner.layer = layer_to_change_to - owner.visible_message("[owner] scurries to the ground!", "You are now hiding.") + owner.visible_message("[owner] scurries to the ground!", "You are now hiding.") if(istype(simplemob) && simplemob.pass_door_while_hidden || isdrone(simplemob)) simplemob.pass_flags |= PASSDOOR return simplemob.layer = layer_to_change_from - owner.visible_message("[owner] slowly peeks up from the ground...", "You have stopped hiding.") + owner.visible_message("[owner] slowly peeks up from the ground...", "You have stopped hiding.") if(istype(simplemob) && simplemob.pass_door_while_hidden || isdrone(simplemob)) simplemob.pass_flags &= ~PASSDOOR diff --git a/code/modules/mod/modules/module_pathfinder.dm b/code/modules/mod/modules/module_pathfinder.dm index 2b9a95508d99..b0f89fd2bea3 100644 --- a/code/modules/mod/modules/module_pathfinder.dm +++ b/code/modules/mod/modules/module_pathfinder.dm @@ -40,7 +40,7 @@ to_chat(user, "Unable to implant [target]!") return if(target == user) - to_chat(user, "") + to_chat(user, "You implant yourself with [implant].") else target.visible_message("[user] implants [target].", "[user] implants you with [implant].") playsound(src, 'sound/effects/spray.ogg', 30, TRUE, -6) @@ -119,7 +119,7 @@ if(!length(path)) //Cannot reach target. Give up and announce the issue. to_chat(H, "No viable path found!") return FALSE - to_chat(H, "Suit on route!") animate(module.mod, 0.2 SECONDS, pixel_x = 0, pixel_y = 0) module.mod.add_overlay(jet_icon) RegisterSignal(module.mod, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index 5e779a760704..fbda929a5999 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -979,7 +979,7 @@ var/mob/living/carbon/human/H = M if(volume < 20) if(prob(10)) - to_chat(H, "You cough up some congealed blood.") H.vomit(blood = TRUE, should_confuse = FALSE) //mostly visual else if(prob(10)) var/overdose_message = pick("Your vision is tinted red for a moment.", "You can hear your heart beating.") diff --git a/code/modules/surgery/organs/brain.dm b/code/modules/surgery/organs/brain.dm index e3eab10548cd..d91a66d17daa 100644 --- a/code/modules/surgery/organs/brain.dm +++ b/code/modules/surgery/organs/brain.dm @@ -148,7 +148,7 @@ to_chat(owner, "Your head feels foggy.") else if(prob(4)) owner.vomit() - to_chat(owner, "") + to_chat(owner, "'You feel nauseous.") /obj/item/organ/internal/brain/proc/handle_moderate_brain_damage() if(prob(4)) From 60811a191f5bb65e47dc45fbb1b121f9846ee34c Mon Sep 17 00:00:00 2001 From: Social-Moth <117739059+Social-Moth@users.noreply.github.com> Date: Fri, 19 Apr 2024 09:22:07 -0500 Subject: [PATCH 08/65] Removes floor from flip message when falling over in space (#25136) * Adds a special message for falling over in space * adds message when falling over in space * Update code/modules/mob/mob_emote.dm Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Update code/modules/mob/mob_emote.dm Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Update code/modules/mob/mob_emote.dm Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Update code/modules/mob/mob_emote.dm Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> * Update code/modules/mob/mob_emote.dm Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> * Update code/modules/mob/mob_emote.dm Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> * space fall special text now with gooder code --------- Co-authored-by: Contrabang <91113370+Contrabang@users.noreply.github.com> Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com> Co-authored-by: DGamerL <108773801+DGamerL@users.noreply.github.com> --- code/modules/mob/mob_emote.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/modules/mob/mob_emote.dm b/code/modules/mob/mob_emote.dm index 497031a8d657..28ad98a0d3b6 100644 --- a/code/modules/mob/mob_emote.dm +++ b/code/modules/mob/mob_emote.dm @@ -134,7 +134,8 @@ var/mob/living/L = user if(IS_HORIZONTAL(L)) - message = "flops and flails around on the floor." + var/turf = get_turf(L) + message = "flops and flails around [isspaceturf(turf) ? "in space" : "on the floor"]." return ..() else if(params) message_param = "flips in %t's general direction." @@ -166,10 +167,10 @@ "As you flip your hat falls off!") if(prob(5) && ishuman(user)) - message = "attempts a flip and crashes to the floor!" - sleep(0.3 SECONDS) + var/turf = get_turf(L) + message = "attempts a flip and [isspaceturf(turf) ? "loses balance" : "crashes to the floor"]!" if(istype(L)) - L.Weaken(4 SECONDS) + addtimer(CALLBACK(L, TYPE_PROC_REF(/mob/living, Weaken), 4 SECONDS), 0.3 SECONDS) return ..() . = ..() From 324d9142b9923414c88b952424e930ea8dc21885 Mon Sep 17 00:00:00 2001 From: GDN <96800819+GDNgit@users.noreply.github.com> Date: Fri, 19 Apr 2024 09:29:43 -0500 Subject: [PATCH 09/65] makes the choose random item button work (#25133) --- code/game/objects/items/devices/uplinks.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index 522ee656d724..ca039e8b86c1 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -88,10 +88,10 @@ GLOBAL_LIST_EMPTY(world_uplinks) var/list/random_items = list() - for(var/IR in uplink_items) - var/datum/uplink_item/UI = uplink_items[IR] - if(UI.cost <= uses && UI.limited_stock != 0) - random_items += UI + for(var/uplink_section in uplink_items) + for(var/datum/uplink_item/UI in uplink_items[uplink_section]) + if(UI.cost <= uses && UI.limited_stock != 0) + random_items += UI return pick(random_items) From bdd417ada0d09c19b53ec0d8fa98798849789517 Mon Sep 17 00:00:00 2001 From: Code-Lyoko0 Date: Fri, 19 Apr 2024 12:07:23 -0500 Subject: [PATCH 10/65] blob now plays the biohazard alarm like other biohazards (#25118) --- code/modules/events/blob_spawn.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/blob_spawn.dm b/code/modules/events/blob_spawn.dm index 544d9ac1e96a..1fbc9a4a0b94 100644 --- a/code/modules/events/blob_spawn.dm +++ b/code/modules/events/blob_spawn.dm @@ -5,7 +5,7 @@ /datum/event/blob/announce(false_alarm) if(successSpawn || false_alarm) - GLOB.major_announcement.Announce("Unknown biological growth detected aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/AI/outbreak_blob.ogg') + GLOB.major_announcement.Announce("Unknown biological growth detected aboard [station_name()]. All personnel must contain the outbreak.", "Biohazard Alert", 'sound/effects/siren-spooky.ogg', new_sound2 = 'sound/AI/outbreak_blob.ogg') else log_and_message_admins("Warning: Could not spawn any mobs for event Blob") From bad8b31afa88f846ebb72ff1820f07e1ba85e7b6 Mon Sep 17 00:00:00 2001 From: DGamerL <108773801+DGamerL@users.noreply.github.com> Date: Fri, 19 Apr 2024 19:32:09 +0200 Subject: [PATCH 11/65] Changes all .len to length() where applicable (#25174) * Globals work * Double access works * All other things * Revert "All other things" This reverts commit 6574442eb651a79ec87c63b37034b2a70e693a79. * More changes that compile and work * IT WORKS AAAAAA * Changes even more .len to length() * Apply suggestions from code review * Update code/datums/mind.dm * Update code/__HELPERS/sorts/InsertSort.dm Co-authored-by: Deniz <66401072+Oyu07@users.noreply.github.com> * Update code/__HELPERS/sanitize_values.dm Co-authored-by: Deniz <66401072+Oyu07@users.noreply.github.com> --------- Co-authored-by: FunnyMan3595 (Charlie Nolan) Co-authored-by: Deniz <66401072+Oyu07@users.noreply.github.com> --- code/__HELPERS/colour_helpers.dm | 6 +- code/__HELPERS/game.dm | 10 +- code/__HELPERS/heap.dm | 14 +- code/__HELPERS/icon_helpers.dm | 6 +- code/__HELPERS/icon_smoothing.dm | 2 +- code/__HELPERS/lists.dm | 124 +++++++++--------- code/__HELPERS/mob_helpers.dm | 12 +- code/__HELPERS/sanitize_values.dm | 2 +- code/__HELPERS/sorts/InsertSort.dm | 10 +- code/__HELPERS/sorts/MergeSort.dm | 10 +- code/__HELPERS/sorts/TimSort.dm | 10 +- code/__HELPERS/sorts/__main.dm | 22 ++-- code/__HELPERS/text.dm | 4 +- code/__HELPERS/type2type.dm | 2 +- code/_onclick/hud/alert.dm | 4 +- code/_onclick/hud/radial.dm | 24 ++-- code/_onclick/hud/robot_hud.dm | 2 +- code/_onclick/hud/screen_objects.dm | 2 +- code/_onclick/item_attack.dm | 2 +- code/controllers/globals.dm | 8 +- code/controllers/master.dm | 4 +- code/controllers/subsystem/SSacid.dm | 4 +- code/controllers/subsystem/SSafk.dm | 2 +- code/controllers/subsystem/SSair.dm | 46 +++---- code/controllers/subsystem/SSblackbox.dm | 10 +- code/controllers/subsystem/SSfires.dm | 4 +- code/controllers/subsystem/SSgarbage.dm | 2 +- code/controllers/subsystem/SSicon_smooth.dm | 6 +- code/controllers/subsystem/SSidlenpcpool.dm | 4 +- code/controllers/subsystem/SSjobs.dm | 18 +-- code/controllers/subsystem/SSmachinery.dm | 14 +- code/controllers/subsystem/SSmobs.dm | 4 +- .../subsystem/SSnano_mob_hunter.dm | 8 +- code/controllers/subsystem/SSnpcpool.dm | 4 +- code/controllers/subsystem/SSoverlays.dm | 24 ++-- code/controllers/subsystem/SSparallax.dm | 2 +- code/controllers/subsystem/SSping.dm | 2 +- code/controllers/subsystem/SSshuttles.dm | 6 +- code/controllers/subsystem/SSspacedrift.dm | 4 +- code/controllers/subsystem/SStgui.dm | 4 +- code/controllers/subsystem/SSthrowing.dm | 2 +- code/controllers/subsystem/SSticker.dm | 8 +- .../subsystem/non_firing/SSatoms.dm | 4 +- .../subsystem/non_firing/SSmapping.dm | 6 +- .../subsystem/non_firing/SSradio.dm | 2 +- .../subsystem/non_firing/SStitlescreen.dm | 6 +- .../subsystem/processing/processing.dm | 4 +- code/controllers/subsystem/tickets/tickets.dm | 2 +- code/datums/ai_laws_datums.dm | 26 ++-- code/datums/components/_component.dm | 8 +- code/datums/components/material_container.dm | 4 +- code/datums/components/spawner.dm | 2 +- code/datums/components/swarming.dm | 6 +- code/datums/datacore.dm | 34 ++--- code/datums/datumvars.dm | 18 +-- code/datums/diseases/advance/advance.dm | 34 ++--- .../advance/symptoms/damage_converter.dm | 2 +- code/datums/diseases/advance/symptoms/heal.dm | 2 +- .../diseases/advance/symptoms/symptoms.dm | 2 +- code/datums/helper_datums/async_input.dm | 6 +- .../helper_datums/construction_datum.dm | 16 +-- code/datums/helper_datums/teleport.dm | 2 +- code/datums/holocall.dm | 4 +- code/datums/mind.dm | 16 +-- code/datums/outfits/vv_outfit.dm | 2 +- code/datums/progressbar.dm | 4 +- code/datums/radiation_wave.dm | 2 +- code/datums/radio_frequency.dm | 8 +- code/datums/recipe.dm | 16 +-- code/datums/spells/area_teleport.dm | 4 +- code/datums/spells/charge.dm | 2 +- code/datums/spells/conjure.dm | 2 +- code/datums/spells/horsemask.dm | 2 +- code/datums/spells/mind_transfer.dm | 8 +- code/datums/spells/turf_teleport.dm | 2 +- code/datums/uplink_items/uplink_general.dm | 2 +- .../datums/weather/weather_types/ash_storm.dm | 2 +- code/game/alternate_appearance.dm | 6 +- code/game/area/areas/depot-areas.dm | 10 +- code/game/atoms.dm | 20 +-- code/game/dna/dna2.dm | 8 +- code/game/dna/dna2_helpers.dm | 24 ++-- code/game/dna/dna_modifier.dm | 4 +- code/game/dna/mutations/disabilities.dm | 2 +- code/game/dna/mutations/mutation_powers.dm | 14 +- .../game/gamemodes/autotraitor/autotraitor.dm | 6 +- code/game/gamemodes/game_mode.dm | 2 +- code/game/gamemodes/intercept_report.dm | 4 +- .../abduction/abductee_objectives.dm | 2 +- .../miniantags/abduction/abduction.dm | 6 +- .../demons/slaughter_demon/slaughter.dm | 4 +- .../gamemodes/miniantags/guardian/guardian.dm | 2 +- .../guardian/types/lightning_guardian.dm | 8 +- .../gamemodes/miniantags/morph/morph_event.dm | 2 +- .../gamemodes/miniantags/revenant/revenant.dm | 2 +- .../revenant/revenant_spawn_event.dm | 2 +- code/game/gamemodes/nuclear/nuclear.dm | 10 +- .../gamemodes/nuclear/nuclear_challenge.dm | 6 +- code/game/gamemodes/nuclear/pinpointer.dm | 2 +- code/game/gamemodes/objective.dm | 2 +- code/game/gamemodes/setupgame.dm | 4 +- code/game/gamemodes/vampire/traitor_vamp.dm | 2 +- code/game/gamemodes/wizard/artefact.dm | 4 +- code/game/gamemodes/wizard/raginmages.dm | 2 +- code/game/gamemodes/wizard/spellbook.dm | 6 +- code/game/gamemodes/wizard/wizard.dm | 2 +- code/game/jobs/access.dm | 2 +- code/game/jobs/job/job.dm | 2 +- code/game/jobs/job/silicon_jobs.dm | 2 +- code/game/jobs/job_exp.dm | 6 +- code/game/machinery/adv_med.dm | 4 +- code/game/machinery/autolathe.dm | 22 ++-- code/game/machinery/camera/camera_assembly.dm | 4 +- code/game/machinery/camera/tracking.dm | 4 +- code/game/machinery/computer/ai_core.dm | 2 +- code/game/machinery/computer/arcade.dm | 11 +- .../machinery/computer/camera_advanced.dm | 2 +- .../game/machinery/computer/camera_console.dm | 2 +- code/game/machinery/computer/card.dm | 4 +- .../game/machinery/computer/communications.dm | 2 +- .../machinery/computer/message_monitor.dm | 2 +- code/game/machinery/constructable_frame.dm | 8 +- code/game/machinery/cryopod.dm | 6 +- code/game/machinery/doors/airlock.dm | 4 +- code/game/machinery/doors/windowdoor.dm | 6 +- code/game/machinery/doppler_array.dm | 2 +- code/game/machinery/hologram.dm | 4 +- code/game/machinery/machinery.dm | 2 +- code/game/machinery/magnetic_module.dm | 6 +- code/game/machinery/poolcontroller.dm | 2 +- code/game/machinery/portable_turret.dm | 12 +- code/game/machinery/syndicatebomb.dm | 8 +- code/game/machinery/teleporter.dm | 4 +- code/game/mecha/combat/honker.dm | 2 +- code/game/mecha/combat/marauder.dm | 2 +- code/game/mecha/equipment/mecha_equipment.dm | 2 +- .../mecha/equipment/tools/medical_tools.dm | 18 +-- code/game/mecha/equipment/tools/work_tools.dm | 4 +- code/game/mecha/equipment/weapons/weapons.dm | 2 +- code/game/mecha/mecha.dm | 4 +- code/game/mecha/mecha_topic.dm | 12 +- code/game/mecha/mecha_wreckage.dm | 4 +- code/game/mecha/working/ripley.dm | 4 +- .../effects/decals/Cleanable/humans.dm | 2 +- code/game/objects/effects/decals/cleanable.dm | 2 +- code/game/objects/effects/glowshroom.dm | 2 +- code/game/objects/effects/landmarks.dm | 4 +- code/game/objects/effects/spiders.dm | 2 +- code/game/objects/items.dm | 2 +- code/game/objects/items/ashtray.dm | 12 +- code/game/objects/items/blueprints.dm | 6 +- code/game/objects/items/devices/autopsy.dm | 8 +- .../objects/items/devices/enginepicker.dm | 4 +- .../objects/items/devices/radio/headset.dm | 4 +- .../items/devices/radio/radio_objects.dm | 4 +- code/game/objects/items/devices/scanners.dm | 6 +- .../objects/items/devices/taperecorder.dm | 2 +- .../objects/items/devices/traitordevices.dm | 2 +- code/game/objects/items/devices/uplinks.dm | 4 +- code/game/objects/items/mixing_bowl.dm | 4 +- code/game/objects/items/stacks/stack.dm | 2 +- code/game/objects/items/tools/multitool.dm | 2 +- code/game/objects/items/weapons/cigs.dm | 2 +- .../items/weapons/grenades/chem_grenade.dm | 6 +- .../items/weapons/holosign_projector.dm | 14 +- .../weapons/melee/energy_melee_weapons.dm | 8 +- .../objects/items/weapons/storage/bags.dm | 4 +- .../objects/items/weapons/storage/boxes.dm | 4 +- .../objects/items/weapons/storage/fancy.dm | 8 +- .../objects/items/weapons/storage/firstaid.dm | 4 +- .../items/weapons/storage/storage_base.dm | 2 +- .../items/weapons/storage/surgical_tray.dm | 2 +- .../objects/items/weapons/teleportation.dm | 2 +- code/game/objects/structures/bedsheet_bin.dm | 8 +- code/game/objects/structures/displaycase.dm | 2 +- .../structures/stool_bed_chair_nest/bed.dm | 2 +- code/game/objects/structures/watercloset.dm | 2 +- code/game/turfs/simulated/river.dm | 2 +- code/game/turfs/simulated/walls.dm | 10 +- code/game/turfs/simulated/walls_mineral.dm | 4 +- code/game/turfs/space/space_turf.dm | 8 +- code/game/verbs/randomtip.dm | 4 +- code/game/world.dm | 2 +- code/modules/admin/admin_memo.dm | 2 +- code/modules/admin/admin_verbs.dm | 2 +- code/modules/admin/misc_admin_procs.dm | 8 +- code/modules/admin/player_panel.dm | 40 +++--- code/modules/admin/topic.dm | 20 +-- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 20 +-- .../admin/verbs/SDQL2/SDQL_2_parser.dm | 6 +- code/modules/admin/verbs/atmosdebug.dm | 8 +- code/modules/admin/verbs/debug.dm | 12 +- code/modules/admin/verbs/diagnostics.dm | 2 +- code/modules/admin/verbs/gimmick_team.dm | 4 +- .../admin/verbs/infiltratorteam_syndicate.dm | 8 +- code/modules/admin/verbs/logging_view.dm | 2 +- code/modules/admin/verbs/massmodvar.dm | 10 +- code/modules/admin/verbs/modifyvariables.dm | 8 +- code/modules/admin/verbs/one_click_antag.dm | 18 +-- code/modules/admin/verbs/randomverbs.dm | 6 +- .../antagonists/_common/antag_spawner.dm | 4 +- .../antagonists/changeling/powers/absorb.dm | 4 +- code/modules/arcade/mob_hunt/mob_datums.dm | 6 +- code/modules/asset_cache/asset_list.dm | 2 +- .../atmospherics/environmental/LINDA_fire.dm | 2 +- .../environmental/LINDA_turf_tile.dm | 2 +- .../atmospherics/machinery/airalarm.dm | 24 ++-- .../components/unary_devices/cryo.dm | 2 +- .../atmospherics/machinery/datum_pipeline.dm | 6 +- .../atmospherics/machinery/pipes/pipe.dm | 2 +- code/modules/awaymissions/loot.dm | 4 +- code/modules/awaymissions/maploader/reader.dm | 16 +-- code/modules/buildmode/submodes/link.dm | 4 +- .../client/preference/link_processing.dm | 4 +- .../client/preference/loadout/gear_tweaks.dm | 10 +- code/modules/clothing/clothing.dm | 2 +- .../clothing/under/accessories/accessory.dm | 4 +- code/modules/crafting/craft.dm | 20 +-- code/modules/detective_work/evidence.dm | 4 +- .../economy/economy_events/economy_events.dm | 2 +- .../economy_events/economy_events_mundane.dm | 2 +- code/modules/error_handler/error_handler.dm | 2 +- code/modules/events/abductor_event.dm | 2 +- code/modules/events/blob/blob_powers.dm | 6 +- .../events/blob/blob_structures/factory.dm | 2 +- code/modules/events/blob/theblob.dm | 2 +- code/modules/events/carp_migration.dm | 4 +- code/modules/events/electrical_storm.dm | 4 +- code/modules/events/event_container.dm | 6 +- code/modules/events/event_procs.dm | 2 +- code/modules/events/ion_storm.dm | 2 +- code/modules/events/money_spam.dm | 2 +- code/modules/events/prison_break.dm | 4 +- code/modules/events/rogue_drones.dm | 2 +- code/modules/events/spacevine.dm | 12 +- code/modules/events/traders.dm | 4 +- code/modules/events/undead_event.dm | 6 +- code/modules/events/vent_clog.dm | 2 +- code/modules/events/wormholes.dm | 2 +- code/modules/flufftext/Dreaming.dm | 6 +- .../food_and_drinks/drinks/bottler/bottler.dm | 12 +- .../drinks/drinks/drinkingglass.dm | 2 +- .../modules/food_and_drinks/food/condiment.dm | 8 +- .../food_and_drinks/food/customizables.dm | 14 +- .../food_and_drinks/food/foods/pizza.dm | 24 ++-- code/modules/food_and_drinks/food/snacks.dm | 2 +- .../kitchen_machinery/gibber.dm | 4 +- .../kitchen_machinery/kitchen_machine.dm | 4 +- .../kitchen_machinery/processor.dm | 2 +- code/modules/games/tarot.dm | 2 +- code/modules/hydroponics/beekeeping/beebox.dm | 22 ++-- code/modules/hydroponics/grown/kudzu.dm | 6 +- .../mining/equipment/wormhole_jaunter.dm | 2 +- code/modules/mining/fulton.dm | 2 +- .../mining/lavaland/loot/colossus_loot.dm | 2 +- code/modules/mining/machine_processing.dm | 2 +- code/modules/mining/minebot.dm | 2 +- code/modules/mob/hear_say.dm | 4 +- code/modules/mob/language.dm | 8 +- .../carbon/alien/special/alien_embryo.dm | 2 +- code/modules/mob/living/carbon/carbon_life.dm | 2 +- .../modules/mob/living/carbon/carbon_procs.dm | 2 +- .../mob/living/carbon/human/appearance.dm | 14 +- .../living/carbon/human/body_accessories.dm | 2 +- .../mob/living/carbon/human/human_damage.dm | 12 +- .../mob/living/carbon/human/human_examine.dm | 2 +- .../living/carbon/human/human_inventory.dm | 4 +- .../mob/living/carbon/human/human_life.dm | 2 +- .../mob/living/carbon/human/human_mob.dm | 4 +- .../mob/living/carbon/human/human_organs.dm | 2 +- .../mob/living/carbon/human/human_say.dm | 2 +- .../living/carbon/human/human_update_icons.dm | 2 +- .../living/carbon/human/species/_species.dm | 4 +- .../mob/living/carbon/human/species/golem.dm | 6 +- .../carbon/human/species/slimepeople.dm | 2 +- code/modules/mob/living/carbon/superheroes.dm | 4 +- code/modules/mob/living/living.dm | 2 +- code/modules/mob/living/living_say.dm | 6 +- code/modules/mob/living/silicon/ai/ai_mob.dm | 18 +-- .../modules/mob/living/silicon/ai/latejoin.dm | 2 +- .../living/silicon/robot/drone/drone_items.dm | 4 +- .../mob/living/silicon/robot/robot_mob.dm | 2 +- .../modules/mob/living/silicon/silicon_mob.dm | 8 +- .../simple_animal/bot/bot_construction.dm | 6 +- .../mob/living/simple_animal/bot/ed209bot.dm | 4 +- .../mob/living/simple_animal/bot/mulebot.dm | 2 +- .../simple_animal/friendly/diona_nymph.dm | 8 +- .../simple_animal/friendly/farm_animals.dm | 4 +- .../mob/living/simple_animal/hostile/bees.dm | 2 +- .../simple_animal/hostile/floorcluwne.dm | 2 +- .../living/simple_animal/hostile/hostile.dm | 6 +- .../hostile/megafauna/bubblegum.dm | 16 +-- .../hostile/megafauna/hierophant.dm | 6 +- .../simple_animal/hostile/mimic_mobs.dm | 4 +- .../simple_animal/hostile/mining/goldgrub.dm | 2 +- .../hostile/retaliate/retaliate.dm | 2 +- .../simple_animal/hostile/syndicate_mobs.dm | 4 +- .../hostile/terror_spiders/reproduction.dm | 2 +- .../hostile/terror_spiders/terror_ai.dm | 6 +- .../hostile/terror_spiders/terror_spiders.dm | 2 +- .../simple_animal/hostile/venus_human_trap.dm | 2 +- .../mob/living/simple_animal/parrot.dm | 4 +- .../mob/living/simple_animal/simple_animal.dm | 32 ++--- .../living/simple_animal/slime/slime_life.dm | 4 +- .../living/simple_animal/slime/slime_mob.dm | 4 +- code/modules/mob/mob.dm | 8 +- code/modules/mob/mob_holder.dm | 2 +- code/modules/mob/mob_login_base.dm | 2 +- code/modules/mob/mob_movement.dm | 2 +- code/modules/mob/new_player/new_player.dm | 4 +- code/modules/paperwork/folders.dm | 2 +- code/modules/paperwork/paperbin.dm | 8 +- code/modules/paperwork/photocopier.dm | 4 +- code/modules/paperwork/photography.dm | 10 +- code/modules/paperwork/silicon_photography.dm | 2 +- code/modules/pda/app.dm | 2 +- code/modules/pda/cart_apps.dm | 16 +-- code/modules/pda/mob_hunt_game_app.dm | 18 +-- code/modules/pda/utilities.dm | 4 +- .../engines/singularity/field_generator.dm | 8 +- code/modules/power/generators/solar.dm | 4 +- .../power/powernets/powernet_helpers.dm | 2 +- .../procedural_mapping/mapGenerator.dm | 4 +- code/modules/projectiles/gun.dm | 2 +- .../guns/energy/kinetic_accelerator.dm | 2 +- code/modules/projectiles/guns/energy_guns.dm | 6 +- .../projectiles/guns/grenade_launcher.dm | 8 +- .../projectiles/guns/projectile/shotgun.dm | 2 +- .../projectiles/guns/projectile/sniper.dm | 2 +- code/modules/projectiles/guns/syringe_gun.dm | 2 +- code/modules/projectiles/guns/throw.dm | 4 +- code/modules/projectiles/projectile_base.dm | 4 +- code/modules/reagents/chem_splash.dm | 6 +- .../chemistry/machinery/chem_dispenser.dm | 2 +- .../chemistry/machinery/chem_master.dm | 2 +- .../reagents/chemistry/machinery/pandemic.dm | 12 +- .../reagents/chemistry/reagents/alcohol.dm | 6 +- .../chemistry/reagents/food_reagents.dm | 2 +- .../reagents/reagent_containers/hypospray.dm | 2 +- .../reagents/reagent_containers/spray.dm | 4 +- code/modules/recycling/disposal.dm | 10 +- code/modules/research/destructive_analyzer.dm | 2 +- code/modules/research/experimentor.dm | 6 +- code/modules/research/rdconsole.dm | 2 +- code/modules/research/research.dm | 4 +- code/modules/research/server.dm | 4 +- .../research/xenobiology/xenobiology.dm | 2 +- code/modules/response_team/ert.dm | 6 +- .../modules/ruins/lavalandruin_code/puzzle.dm | 6 +- code/modules/shuttle/emergency.dm | 12 +- code/modules/shuttle/navigation_computer.dm | 8 +- code/modules/shuttle/shuttle.dm | 30 ++--- code/modules/space_management/space_level.dm | 6 +- .../space_management/space_transition.dm | 6 +- .../space_management/zlevel_manager.dm | 8 +- code/modules/station_goals/dna_vault.dm | 4 +- code/modules/station_goals/shield.dm | 2 +- code/modules/surgery/organs/augments_arms.dm | 4 +- code/modules/surgery/organs/blood.dm | 6 +- code/modules/surgery/organs/organ_external.dm | 8 +- code/modules/surgery/organs/organ_icon.dm | 2 +- code/modules/surgery/organs/vocal_cords.dm | 6 +- code/modules/telesci/gps.dm | 2 +- code/modules/telesci/telesci_computer.dm | 2 +- code/modules/tgs/core/tgs_version.dm | 6 +- code/modules/tgs/v3210/v3_api.dm | 12 +- code/modules/tgui/modules/ert_manager.dm | 2 +- code/modules/tgui/modules/law_manager.dm | 2 +- code/modules/tgui/tgui_panel/telemetry.dm | 2 +- 369 files changed, 1162 insertions(+), 1163 deletions(-) diff --git a/code/__HELPERS/colour_helpers.dm b/code/__HELPERS/colour_helpers.dm index b9853409725d..2c8668fd400e 100644 --- a/code/__HELPERS/colour_helpers.dm +++ b/code/__HELPERS/colour_helpers.dm @@ -3,9 +3,9 @@ var/list/RGB2 = rgb2num(rgb2) // add missing alpha if needed - if(RGB1.len < RGB2.len) RGB1 += 255 - else if(RGB2.len < RGB1.len) RGB2 += 255 - var/usealpha = RGB1.len > 3 + if(length(RGB1) < length(RGB2)) RGB1 += 255 + else if(length(RGB2) < length(RGB1)) RGB2 += 255 + var/usealpha = length(RGB1) > 3 var/r = round(RGB1[1] + (RGB2[1] - RGB1[1]) * amount, 1) var/g = round(RGB1[2] + (RGB2[2] - RGB1[2]) * amount, 1) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 1bba4042d0cc..c30ca477cae4 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -314,7 +314,7 @@ var/roletext = get_roletext(be_special_type) var/list/candidates = list() // Keep looping until we find a non-afk candidate within the time bracket (we limit the bracket to 10 minutes (6000)) - while(!candidates.len && afk_bracket < 6000) + while(!length(candidates) && afk_bracket < 6000) for(var/mob/dead/observer/G in GLOB.player_list) if(G.client != null) if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) @@ -330,7 +330,7 @@ var/roletext = get_roletext(be_special_type) var/list/candidates = list() // Keep looping until we find a non-afk candidate within the time bracket (we limit the bracket to 10 minutes (6000)) - while(!candidates.len && afk_bracket < 6000) + while(!length(candidates) && afk_bracket < 6000) for(var/mob/dead/observer/G in GLOB.player_list) if(G.client != null) if(!(G.mind && G.mind.current && G.mind.current.stat != DEAD)) @@ -362,7 +362,7 @@ /proc/get_active_player_count() // Get active players who are playing in the round var/active_players = 0 - for(var/i = 1; i <= GLOB.player_list.len; i++) + for(var/i = 1; i <= length(GLOB.player_list); i++) var/mob/M = GLOB.player_list[i] if(M && M.client) if(isnewplayer(M)) // exclude people in the lobby @@ -447,7 +447,7 @@ /proc/pollCandidatesWithVeto(adminclient, adminusr, max_slots, Question, be_special_type, antag_age_check = FALSE, poll_time = 300, ignore_respawnability = FALSE, min_hours = FALSE, flashwindow = TRUE, check_antaghud = TRUE, source, role_cleanname) var/list/willing_ghosts = SSghost_spawns.poll_candidates(Question, be_special_type, antag_age_check, poll_time, ignore_respawnability, min_hours, flashwindow, check_antaghud, source, role_cleanname) var/list/selected_ghosts = list() - if(!willing_ghosts.len) + if(!length(willing_ghosts)) return selected_ghosts var/list/candidate_ghosts = willing_ghosts.Copy() @@ -459,7 +459,7 @@ else candidate_ghosts -= G - for(var/i = max_slots, (i > 0 && candidate_ghosts.len), i--) + for(var/i = max_slots, (i > 0 && length(candidate_ghosts)), i--) var/this_ghost = input("Pick players. This will go on until there either no more ghosts to pick from or the [i] remaining slot(s) are full.", "Candidates") as null|anything in candidate_ghosts candidate_ghosts -= this_ghost selected_ghosts += this_ghost diff --git a/code/__HELPERS/heap.dm b/code/__HELPERS/heap.dm index c9ad037755f0..3d827dda0cfb 100644 --- a/code/__HELPERS/heap.dm +++ b/code/__HELPERS/heap.dm @@ -12,23 +12,23 @@ cmp = compare /datum/heap/proc/IsEmpty() - return !L.len + return !length(L) //Insert and place at its position a new node in the heap /datum/heap/proc/Insert(atom/A) L.Add(A) - Swim(L.len) + Swim(length(L)) //removes and returns the first element of the heap //(i.e the max or the min dependant on the comparison function) /datum/heap/proc/Pop() - if(!L.len) + if(!length(L)) return null . = L[1] - L[1] = L[L.len] - L.Cut(L.len) + L[1] = L[length(L)] + L.Cut(length(L)) Sink(1) @@ -53,10 +53,10 @@ //Returns the greater (relative to the comparison proc) of a node children //or 0 if there's no child /datum/heap/proc/GetGreaterChild(index) - if(index * 2 > L.len) + if(index * 2 > length(L)) return 0 - if(index * 2 + 1 > L.len) + if(index * 2 + 1 > length(L)) return index * 2 if(call(cmp)(L[index * 2], L[index * 2 + 1]) < 0) diff --git a/code/__HELPERS/icon_helpers.dm b/code/__HELPERS/icon_helpers.dm index da7a0cfb9be5..f51269e72b1b 100644 --- a/code/__HELPERS/icon_helpers.dm +++ b/code/__HELPERS/icon_helpers.dm @@ -86,7 +86,7 @@ var/curblend = A.blend_mode || defblend - if(A.overlays.len || A.underlays.len) + if(length(A.overlays) || length(A.underlays)) var/icon/flat = BLANK // Layers will be a sorted list of icons/overlays, based on the order in which they are displayed var/list/layers = list() @@ -102,7 +102,7 @@ // Loop through the underlays, then overlays, sorting them into the layers list for(var/process_set in 0 to 1) var/list/process = process_set? A.overlays : A.underlays - for(var/i in 1 to process.len) + for(var/i in 1 to length(process)) var/image/current = process[i] if(!current) continue @@ -114,7 +114,7 @@ return flat current_layer = process_set + A.layer + current_layer / 1000 - for(var/p in 1 to layers.len) + for(var/p in 1 to length(layers)) var/image/cmp = layers[p] if(current_layer < layers[cmp]) layers.Insert(p, current) diff --git a/code/__HELPERS/icon_smoothing.dm b/code/__HELPERS/icon_smoothing.dm index 025be39f3b4f..affda69950a6 100644 --- a/code/__HELPERS/icon_smoothing.dm +++ b/code/__HELPERS/icon_smoothing.dm @@ -266,7 +266,7 @@ DEFINE_BITFIELD(smoothing_junction, list( A.bottom_left_corner = se new_overlays += se - if(new_overlays.len) + if(length(new_overlays)) A.add_overlay(new_overlays) ///Scans direction to find targets to smooth with. diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 7a90a0543e5f..cd6d5d8820b2 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -101,9 +101,9 @@ //Returns list element or null. Should prevent "index out of bounds" error. /proc/listgetindex(list/list, index) - if(istype(list) && list.len) + if(istype(list) && length(list)) if(isnum(index)) - if(InRange(index,1,list.len)) + if(InRange(index,1,length(list))) return list[index] else if(index in list) return list[index] @@ -111,13 +111,13 @@ //Return either pick(list) or null if list is not of type /list or is empty /proc/safepick(list/list) - if(!islist(list) || !list.len) + if(!islist(list) || !length(list)) return return pick(list) //Checks if the list is empty /proc/isemptylist(list/list) - if(!list.len) + if(!length(list)) return 1 return 0 @@ -132,7 +132,7 @@ //Checks for specific types in specifically structured (Assoc "type" = TRUE) lists ('typecaches') /proc/is_type_in_typecache(atom/A, list/L) - if(!L || !L.len || !A) + if(!L || !length(L) || !A) return 0 return L[A.type] @@ -250,7 +250,7 @@ //Pick a random element from the list and remove it from the list. /proc/pick_n_take(list/listfrom) - if(listfrom.len > 0) + if(length(listfrom) > 0) var/picked = pick(listfrom) listfrom -= picked return picked @@ -275,12 +275,12 @@ //Returns the top(last) element from the list and removes it from the list (typical stack function) /proc/pop(list/L) - if(L.len) - . = L[L.len] + if(length(L)) + . = L[length(L)] L.len-- /proc/popleft(list/L) - if(L.len) + if(length(L)) . = L[1] L.Cut(1,2) @@ -293,7 +293,7 @@ /proc/reverselist(list/L) var/list/output = list() if(L) - for(var/i = L.len; i >= 1; i--) + for(var/i = length(L); i >= 1; i--) output += L[i] return output @@ -303,8 +303,8 @@ return L = L.Copy() - for(var/i=1, i sorted_text.len) + if(insert_index > length(sorted_text)) sorted_text += current_sort_text continue @@ -673,13 +673,13 @@ #define LAZYINITLIST(L) if(!L) { L = list() } -#define UNSETEMPTY(L) if(L && !L.len) L = null -#define LAZYREMOVE(L, I) if(L) { L -= I; if(!L.len) { L = null; } } +#define UNSETEMPTY(L) if(L && !length(L)) L = null +#define LAZYREMOVE(L, I) if(L) { L -= I; if(!length(L)) { L = null; } } #define LAZYADD(L, I) if(!L) { L = list(); } L += I; #define LAZYOR(L, I) if(!L) { L = list(); } L |= I; /// Adds I to L, initializing L if necessary, if I is not already in L #define LAZYDISTINCTADD(L, I) if(!L) { L = list(); } L |= I; -#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= L.len ? L[I] : null) : L[I]) : null) +#define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= length(L) ? L[I] : null) : L[I]) : null) #define LAZYLEN(L) length(L) // Despite how pointless this looks, it's still needed in order to convey that the list is specificially a 'Lazy' list. #define LAZYCLEARLIST(L) if(L) L.Cut() @@ -707,8 +707,8 @@ if(!L) return - for(var/i=1, i= 2) - fromIndex = fromIndex % L.len - toIndex = toIndex % (L.len + 1) + if(length(L) >= 2) + fromIndex = fromIndex % length(L) + toIndex = toIndex % (length(L) + 1) if(fromIndex <= 0) - fromIndex += L.len + fromIndex += length(L) if(toIndex <= 0) - toIndex += L.len + 1 + toIndex += length(L) + 1 var/datum/sortInstance/SI = GLOB.sortInstance if(!SI) diff --git a/code/__HELPERS/sorts/MergeSort.dm b/code/__HELPERS/sorts/MergeSort.dm index b6072842b682..0ce79909b5cd 100644 --- a/code/__HELPERS/sorts/MergeSort.dm +++ b/code/__HELPERS/sorts/MergeSort.dm @@ -1,12 +1,12 @@ //merge-sort - gernerally faster than insert sort, for runs of 7 or larger /proc/sortMerge(list/L, cmp = GLOBAL_PROC_REF(cmp_numeric_asc), associative, fromIndex = 1, toIndex) - if(L && L.len >= 2) - fromIndex = fromIndex % L.len - toIndex = toIndex % (L.len + 1) + if(L && length(L) >= 2) + fromIndex = fromIndex % length(L) + toIndex = toIndex % (length(L) + 1) if(fromIndex <= 0) - fromIndex += L.len + fromIndex += length(L) if(toIndex <= 0) - toIndex += L.len + 1 + toIndex += length(L) + 1 var/datum/sortInstance/SI = GLOB.sortInstance if(!SI) diff --git a/code/__HELPERS/sorts/TimSort.dm b/code/__HELPERS/sorts/TimSort.dm index f71cb05b0669..faf3e74aa7df 100644 --- a/code/__HELPERS/sorts/TimSort.dm +++ b/code/__HELPERS/sorts/TimSort.dm @@ -1,12 +1,12 @@ //TimSort interface /proc/sortTim(list/L, cmp = GLOBAL_PROC_REF(cmp_numeric_asc), associative, fromIndex = 1, toIndex = 0) - if(L && L.len >= 2) - fromIndex = fromIndex % L.len - toIndex = toIndex % (L.len + 1) + if(L && length(L) >= 2) + fromIndex = fromIndex % length(L) + toIndex = toIndex % (length(L) + 1) if(fromIndex <= 0) - fromIndex += L.len + fromIndex += length(L) if(toIndex <= 0) - toIndex += L.len + 1 + toIndex += length(L) + 1 var/datum/sortInstance/SI = GLOB.sortInstance if(!SI) diff --git a/code/__HELPERS/sorts/__main.dm b/code/__HELPERS/sorts/__main.dm index b5368330d59b..6da4fc6e8784 100644 --- a/code/__HELPERS/sorts/__main.dm +++ b/code/__HELPERS/sorts/__main.dm @@ -75,7 +75,7 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) //Merge all remaining runs to complete sort //ASSERT(start == end) mergeForceCollapse(); - //ASSERT(runBases.len == 1) + //ASSERT(length(runBases) == 1) //reset minGallop, for successive calls minGallop = MIN_GALLOP @@ -177,8 +177,8 @@ reverse a descending sequence without violating stability. //This method is called each time a new run is pushed onto the stack. //So the invariants are guaranteed to hold for i= 2) - var/n = runBases.len - 1 + while(length(runBases) >= 2) + var/n = length(runBases) - 1 if(n > 1 && runLens[n - 1] <= runLens[n] + runLens[n + 1]) if(runLens[n - 1] < runLens[n + 1]) --n @@ -192,8 +192,8 @@ reverse a descending sequence without violating stability. //Merges all runs on the stack until only one remains. //Called only once, to finalise the sort /datum/sortInstance/proc/mergeForceCollapse() - while(runBases.len >= 2) - var/n = runBases.len - 1 + while(length(runBases) >= 2) + var/n = length(runBases) - 1 if(n > 1 && runLens[n - 1] < runLens[n + 1]) --n mergeAt(n) @@ -203,9 +203,9 @@ reverse a descending sequence without violating stability. //Run i must be the penultimate or antepenultimate run on the stack //In other words, i must be equal to stackSize-2 or stackSize-3 /datum/sortInstance/proc/mergeAt(i) - //ASSERT(runBases.len >= 2) + //ASSERT(length(runBases) >= 2) //ASSERT(i >= 1) - //ASSERT(i == runBases.len - 1 || i == runBases.len - 2) + //ASSERT(i == length(runBases) - 1 || i == length(runBases) - 2) var/base1 = runBases[i] var/base2 = runBases[i + 1] @@ -590,8 +590,8 @@ reverse a descending sequence without violating stability. while(remaining > 0) - while(runBases.len >= 2) - var/n = runBases.len - 1 + while(length(runBases) >= 2) + var/n = length(runBases) - 1 if(n > 1 && runLens[n - 1] <= runLens[n] + runLens[n + 1]) if(runLens[n - 1] < runLens[n + 1]) --n @@ -601,8 +601,8 @@ reverse a descending sequence without violating stability. else break //Invariant is established - while(runBases.len >= 2) - var/n = runBases.len - 1 + while(length(runBases) >= 2) + var/n = length(runBases) - 1 if(n > 1 && runLens[n - 1] < runLens[n + 1]) --n mergeAt2(n) diff --git a/code/__HELPERS/text.dm b/code/__HELPERS/text.dm index 9f8eb3e977fb..1b20fdc1a890 100644 --- a/code/__HELPERS/text.dm +++ b/code/__HELPERS/text.dm @@ -553,9 +553,9 @@ if(tag == "img") var/list/img_props = splittext(arg, ";") - if(img_props.len == 3) + if(length(img_props) == 3) return "" - if(img_props.len == 2) + if(length(img_props) == 2) return "" return "" diff --git a/code/__HELPERS/type2type.dm b/code/__HELPERS/type2type.dm index b0aee0b08a42..f118fab395ff 100644 --- a/code/__HELPERS/type2type.dm +++ b/code/__HELPERS/type2type.dm @@ -313,7 +313,7 @@ if(entry == null) return null matrix_list += entry - if(matrix_list.len < 6) + if(length(matrix_list) < 6) return null var/a = matrix_list[1] var/b = matrix_list[2] diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 6cf0868dd45f..8af3de91da03 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -776,10 +776,10 @@ so as to remain in compliance with the most up-to-date laws." return FALSE var/icon_pref if(!hud_shown) - for(var/i in 1 to alerts.len) + for(var/i in 1 to length(alerts)) mymob.client.screen -= alerts[alerts[i]] return TRUE - for(var/i in 1 to alerts.len) + for(var/i in 1 to length(alerts)) var/atom/movable/screen/alert/alert = alerts[alerts[i]] if(alert.icon_state == "template") if(!icon_pref) diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index e52f6476cebe..501de75891e1 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -90,9 +90,9 @@ GLOBAL_LIST_EMPTY(radial_menus) zone = 360 - starting_angle + ending_angle max_elements = round(zone / min_angle) - var/paged = max_elements < choices.len - if(elements.len < max_elements) - var/elements_to_add = max_elements - elements.len + var/paged = max_elements < length(choices) + if(length(elements) < max_elements) + var/elements_to_add = max_elements - length(elements) for(var/i in 1 to elements_to_add) //Create all elements var/atom/movable/screen/radial/new_element = new /atom/movable/screen/radial/slice new_element.parent = src @@ -102,18 +102,18 @@ GLOBAL_LIST_EMPTY(radial_menus) page_data = list(null) var/list/current = list() var/list/choices_left = choices.Copy() - while(choices_left.len) - if(current.len == max_elements) + while(length(choices_left)) + if(length(current) == max_elements) page_data[page] = current page++ page_data.len++ current = list() - if(paged && current.len == max_elements - 1) + if(paged && length(current) == max_elements - 1) current += NEXT_PAGE_ID continue else current += popleft(choices_left) - if(paged && current.len < max_elements) + if(paged && length(current) < max_elements) current += NEXT_PAGE_ID page_data[page] = current @@ -123,14 +123,14 @@ GLOBAL_LIST_EMPTY(radial_menus) /datum/radial_menu/proc/update_screen_objects() var/list/page_choices = page_data[current_page] - var/angle_per_element = round(zone / page_choices.len) + var/angle_per_element = round(zone / length(page_choices)) if(current_user.mob.z && anchor.z) pixel_x_difference = ((world.icon_size * anchor.x) + anchor.step_x + anchor.pixel_x) - ((world.icon_size * current_user.mob.x) + current_user.mob.step_x + current_user.mob.pixel_x) pixel_y_difference = ((world.icon_size * anchor.y) + anchor.step_y + anchor.pixel_y) - ((world.icon_size * current_user.mob.y) + current_user.mob.step_y + current_user.mob.pixel_y) - for(var/i in 1 to elements.len) + for(var/i in 1 to length(elements)) var/atom/movable/screen/radial/E = elements[i] var/angle = WRAP(starting_angle + (i - 1) * angle_per_element, 0, 360) - if(i > page_choices.len) + if(i > length(page_choices)) HideElement(E) else SetElement(E,page_choices[i], angle) @@ -187,10 +187,10 @@ GLOBAL_LIST_EMPTY(radial_menus) selected_choice = choices_values[choice_id] /datum/radial_menu/proc/get_next_id() - return "c_[choices.len]" + return "c_[length(choices)]" /datum/radial_menu/proc/set_choices(list/new_choices) - if(choices.len) + if(length(choices)) Reset() for(var/E in new_choices) var/id = get_next_id() diff --git a/code/_onclick/hud/robot_hud.dm b/code/_onclick/hud/robot_hud.dm index ae1e54f9fe2b..b2c692dfc320 100644 --- a/code/_onclick/hud/robot_hud.dm +++ b/code/_onclick/hud/robot_hud.dm @@ -216,7 +216,7 @@ if(!R.robot_modules_background) return - var/display_rows = CEILING(R.module.modules.len / 8, 1) + var/display_rows = CEILING(length(R.module.modules) / 8, 1) R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7" R.client.screen += R.robot_modules_background diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 48c0664d7405..bb0413235279 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -204,7 +204,7 @@ return if(I in S.contents) // If the item is already in the storage, move them to the end of the list - if(S.contents[S.contents.len] == I) // No point moving them at the end if they're already there! + if(S.contents[length(S.contents)] == I) // No point moving them at the end if they're already there! return var/list/new_contents = S.contents.Copy() diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 0e789eacb89c..17d9c8c54e46 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -145,7 +145,7 @@ if(I.discrete) return var/message_verb = "attacked" - if(I.attack_verb && I.attack_verb.len) + if(I.attack_verb && length(I.attack_verb)) message_verb = "[pick(I.attack_verb)]" else if(!I.force) return diff --git a/code/controllers/globals.dm b/code/controllers/globals.dm index 3b448d91462c..a10701fa5389 100644 --- a/code/controllers/globals.dm +++ b/code/controllers/globals.dm @@ -52,10 +52,10 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) gvars_datum_init_order = list() gvars_datum_protected_varlist = list("gvars_datum_protected_varlist" = TRUE) var/list/global_procs = typesof(/datum/controller/global_vars/proc) - var/expected_len = vars.len - gvars_datum_in_built_vars.len - if(global_procs.len != expected_len) - warning("Unable to detect all global initialization procs! Expected [expected_len] got [global_procs.len]!") - if(global_procs.len) + var/expected_len = length(vars) - length(gvars_datum_in_built_vars) + if(length(global_procs) != expected_len) + warning("Unable to detect all global initialization procs! Expected [expected_len] got [length(global_procs)]!") + if(length(global_procs)) var/list/expected_global_procs = vars - gvars_datum_in_built_vars for(var/I in global_procs) expected_global_procs -= replacetext("[I]", "InitGlobal", "") diff --git a/code/controllers/master.dm b/code/controllers/master.dm index 4ecc06b54d3c..5593027e4822 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -332,9 +332,9 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/ss_runlevels = SS.runlevels var/added_to_any = FALSE - for(var/I in 1 to GLOB.bitflags.len) + for(var/I in 1 to length(GLOB.bitflags)) if(ss_runlevels & GLOB.bitflags[I]) - while(runlevel_sorted_subsystems.len < I) + while(length(runlevel_sorted_subsystems) < I) runlevel_sorted_subsystems += list(list()) runlevel_sorted_subsystems[I] += SS added_to_any = TRUE diff --git a/code/controllers/subsystem/SSacid.dm b/code/controllers/subsystem/SSacid.dm index 469cd7d06fcb..6f470b451bcf 100644 --- a/code/controllers/subsystem/SSacid.dm +++ b/code/controllers/subsystem/SSacid.dm @@ -25,8 +25,8 @@ SUBSYSTEM_DEF(acid) //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/obj/O = currentrun[currentrun.len] + while(length(currentrun)) + var/obj/O = currentrun[length(currentrun)] currentrun.len-- if(!O || QDELETED(O)) processing -= O diff --git a/code/controllers/subsystem/SSafk.dm b/code/controllers/subsystem/SSafk.dm index b83f7d05d73e..6bf0e99629e3 100644 --- a/code/controllers/subsystem/SSafk.dm +++ b/code/controllers/subsystem/SSafk.dm @@ -86,7 +86,7 @@ SUBSYSTEM_DEF(afk) /datum/controller/subsystem/afk/proc/removeFromWatchList(list/toRemove) for(var/C in toRemove) - for(var/i in 1 to afk_players.len) + for(var/i in 1 to length(afk_players)) if(afk_players[i] == C) afk_players.Cut(i, i + 1) break diff --git a/code/controllers/subsystem/SSair.dm b/code/controllers/subsystem/SSair.dm index d5901824dc91..832b52cb5717 100644 --- a/code/controllers/subsystem/SSair.dm +++ b/code/controllers/subsystem/SSair.dm @@ -59,13 +59,13 @@ SUBSYSTEM_DEF(air) msg += "DPN:[round(cost_deferred_pipenets,1)]|" msg += "AM:[round(cost_atmos_machinery,1)]" msg += "} " - msg += "AT:[active_turfs.len]|" - msg += "EG:[excited_groups.len]|" - msg += "HS:[hotspots.len]|" - msg += "PN:[networks.len]|" - msg += "HP:[high_pressure_delta.len]|" - msg += "AS:[active_super_conductivity.len]|" - msg += "AT/MS:[round((cost ? active_turfs.len/cost : 0),0.1)]" + msg += "AT:[length(active_turfs)]|" + msg += "EG:[length(excited_groups)]|" + msg += "HS:[length(hotspots)]|" + msg += "PN:[length(networks)]|" + msg += "HP:[length(high_pressure_delta)]|" + msg += "AS:[length(active_super_conductivity)]|" + msg += "AT/MS:[round((cost ? length(active_turfs)/cost : 0),0.1)]" return msg.Join("") /datum/controller/subsystem/air/get_metrics() @@ -179,8 +179,8 @@ SUBSYSTEM_DEF(air) src.currentrun = deferred_pipenet_rebuilds.Copy() //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/obj/machinery/atmospherics/A = currentrun[currentrun.len] + while(length(currentrun)) + var/obj/machinery/atmospherics/A = currentrun[length(currentrun)] currentrun.len-- if(A) A.build_network(remove_deferral = TRUE) @@ -194,8 +194,8 @@ SUBSYSTEM_DEF(air) src.currentrun = networks.Copy() //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/datum/pipeline/thing = currentrun[currentrun.len] + while(length(currentrun)) + var/datum/pipeline/thing = currentrun[length(currentrun)] currentrun.len-- if(thing) thing.process() @@ -210,8 +210,8 @@ SUBSYSTEM_DEF(air) src.currentrun = atmos_machinery.Copy() //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/obj/machinery/atmospherics/M = currentrun[currentrun.len] + while(length(currentrun)) + var/obj/machinery/atmospherics/M = currentrun[length(currentrun)] currentrun.len-- if(!M || (M.process_atmos(seconds) == PROCESS_KILL)) atmos_machinery.Remove(M) @@ -223,8 +223,8 @@ SUBSYSTEM_DEF(air) src.currentrun = active_super_conductivity.Copy() //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/turf/simulated/T = currentrun[currentrun.len] + while(length(currentrun)) + var/turf/simulated/T = currentrun[length(currentrun)] currentrun.len-- T.super_conduct() if(MC_TICK_CHECK) @@ -235,8 +235,8 @@ SUBSYSTEM_DEF(air) src.currentrun = hotspots.Copy() //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/obj/effect/hotspot/H = currentrun[currentrun.len] + while(length(currentrun)) + var/obj/effect/hotspot/H = currentrun[length(currentrun)] currentrun.len-- if(H) H.process() @@ -246,8 +246,8 @@ SUBSYSTEM_DEF(air) return /datum/controller/subsystem/air/proc/process_high_pressure_delta(resumed = 0) - while(high_pressure_delta.len) - var/turf/simulated/T = high_pressure_delta[high_pressure_delta.len] + while(length(high_pressure_delta)) + var/turf/simulated/T = high_pressure_delta[length(high_pressure_delta)] high_pressure_delta.len-- T.high_pressure_movements() T.pressure_difference = 0 @@ -261,8 +261,8 @@ SUBSYSTEM_DEF(air) src.currentrun = active_turfs.Copy() //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/turf/simulated/T = currentrun[currentrun.len] + while(length(currentrun)) + var/turf/simulated/T = currentrun[length(currentrun)] currentrun.len-- if(T) T.process_cell(fire_count) @@ -274,8 +274,8 @@ SUBSYSTEM_DEF(air) src.currentrun = excited_groups.Copy() //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/datum/excited_group/EG = currentrun[currentrun.len] + while(length(currentrun)) + var/datum/excited_group/EG = currentrun[length(currentrun)] currentrun.len-- EG.breakdown_cooldown++ if(EG.breakdown_cooldown == 10) diff --git a/code/controllers/subsystem/SSblackbox.dm b/code/controllers/subsystem/SSblackbox.dm index 6cc8f9c71415..cdd10077d26b 100644 --- a/code/controllers/subsystem/SSblackbox.dm +++ b/code/controllers/subsystem/SSblackbox.dm @@ -68,10 +68,10 @@ SUBSYSTEM_DEF(blackbox) /datum/controller/subsystem/blackbox/Shutdown() sealed = FALSE for(var/obj/machinery/message_server/MS in GLOB.message_servers) - if(MS.pda_msgs.len) - record_feedback("tally", "radio_usage", MS.pda_msgs.len, "PDA") - if(MS.rc_msgs.len) - record_feedback("tally", "radio_usage", MS.rc_msgs.len, "request console") + if(length(MS.pda_msgs)) + record_feedback("tally", "radio_usage", length(MS.pda_msgs), "PDA") + if(length(MS.rc_msgs)) + record_feedback("tally", "radio_usage", length(MS.rc_msgs), "request console") if(length(research_levels)) record_feedback("associative", "high_research_level", 1, research_levels) @@ -248,7 +248,7 @@ SUBSYSTEM_DEF(blackbox) * * depth - Depth to use */ /datum/controller/subsystem/blackbox/proc/record_feedback_recurse_list(list/L, list/key_list, increment, depth = 1) - if(depth == key_list.len) + if(depth == length(key_list)) if(L.Find(key_list[depth])) L["[key_list[depth]]"] += increment else diff --git a/code/controllers/subsystem/SSfires.dm b/code/controllers/subsystem/SSfires.dm index f811713e6321..c98d7f01d5df 100644 --- a/code/controllers/subsystem/SSfires.dm +++ b/code/controllers/subsystem/SSfires.dm @@ -26,8 +26,8 @@ SUBSYSTEM_DEF(fires) //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/obj/O = currentrun[currentrun.len] + while(length(currentrun)) + var/obj/O = currentrun[length(currentrun)] currentrun.len-- if(!O || QDELETED(O)) processing -= O diff --git a/code/controllers/subsystem/SSgarbage.dm b/code/controllers/subsystem/SSgarbage.dm index f567255f7038..638baeae543a 100644 --- a/code/controllers/subsystem/SSgarbage.dm +++ b/code/controllers/subsystem/SSgarbage.dm @@ -275,7 +275,7 @@ SUBSYSTEM_DEF(garbage) /datum/controller/subsystem/garbage/Recover() InitQueues() //We first need to create the queues before recovering data if(istype(SSgarbage.queues)) - for(var/i in 1 to SSgarbage.queues.len) + for(var/i in 1 to length(SSgarbage.queues)) queues[i] |= SSgarbage.queues[i] diff --git a/code/controllers/subsystem/SSicon_smooth.dm b/code/controllers/subsystem/SSicon_smooth.dm index 5513d9152d89..1b33f458dadf 100644 --- a/code/controllers/subsystem/SSicon_smooth.dm +++ b/code/controllers/subsystem/SSicon_smooth.dm @@ -10,13 +10,13 @@ SUBSYSTEM_DEF(icon_smooth) var/list/smooth_queue = list() /datum/controller/subsystem/icon_smooth/fire() - while(smooth_queue.len) - var/atom/A = smooth_queue[smooth_queue.len] + while(length(smooth_queue)) + var/atom/A = smooth_queue[length(smooth_queue)] smooth_queue.len-- A.smooth_icon() if(MC_TICK_CHECK) return - if(!smooth_queue.len) + if(!length(smooth_queue)) can_fire = 0 /datum/controller/subsystem/icon_smooth/Initialize() diff --git a/code/controllers/subsystem/SSidlenpcpool.dm b/code/controllers/subsystem/SSidlenpcpool.dm index b5c52f23ae6a..c424950791ed 100644 --- a/code/controllers/subsystem/SSidlenpcpool.dm +++ b/code/controllers/subsystem/SSidlenpcpool.dm @@ -24,8 +24,8 @@ SUBSYSTEM_DEF(idlenpcpool) //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/mob/living/simple_animal/SA = currentrun[currentrun.len] + while(length(currentrun)) + var/mob/living/simple_animal/SA = currentrun[length(currentrun)] --currentrun.len if(!SA) log_debug("idlenpcpool encountered an invalid entry, resumed: [resumed], SA [SA], type of SA [SA?.type], null [SA == null], qdelled [QDELETED(SA)], SA in AI_IDLE list: [SA in GLOB.simple_animals[AI_IDLE]]") diff --git a/code/controllers/subsystem/SSjobs.dm b/code/controllers/subsystem/SSjobs.dm index 5b2d10876b0f..5996c84737e4 100644 --- a/code/controllers/subsystem/SSjobs.dm +++ b/code/controllers/subsystem/SSjobs.dm @@ -44,7 +44,7 @@ SUBSYSTEM_DEF(jobs) /datum/controller/subsystem/jobs/proc/SetupOccupations(list/faction = list("Station")) occupations = list() var/list/all_jobs = subtypesof(/datum/job) - if(!all_jobs.len) + if(!length(all_jobs)) to_chat(world, "Error setting up jobs, no job datums found.") return 0 @@ -63,12 +63,12 @@ SUBSYSTEM_DEF(jobs) job_debug.Add(text) /datum/controller/subsystem/jobs/proc/GetJob(rank) - if(!occupations.len) + if(!length(occupations)) SetupOccupations() return name_occupations[rank] /datum/controller/subsystem/jobs/proc/GetJobType(jobtype) - if(!occupations.len) + if(!length(occupations)) SetupOccupations() return type_occupations[jobtype] @@ -235,7 +235,7 @@ SUBSYSTEM_DEF(jobs) if(!job) continue var/list/candidates = FindOccupationCandidates(job, level) - if(!candidates.len) + if(!length(candidates)) continue var/list/filteredCandidates = list() @@ -246,7 +246,7 @@ SUBSYSTEM_DEF(jobs) continue filteredCandidates += V - if(!filteredCandidates.len) + if(!length(filteredCandidates)) continue var/mob/new_player/candidate = pick(filteredCandidates) @@ -263,7 +263,7 @@ SUBSYSTEM_DEF(jobs) if(!job) continue var/list/candidates = FindOccupationCandidates(job, level) - if(!candidates.len) + if(!length(candidates)) continue var/mob/new_player/candidate = pick(candidates) AssignRole(candidate, command_position) @@ -282,7 +282,7 @@ SUBSYSTEM_DEF(jobs) for(var/level = 1 to 3) var/list/candidates = list() candidates = FindOccupationCandidates(job, level) - if(candidates.len) + if(length(candidates)) var/mob/new_player/candidate = pick(candidates) if(AssignRole(candidate, "AI")) ai_selected++ @@ -317,7 +317,7 @@ SUBSYSTEM_DEF(jobs) if(player.ready && player.mind && !player.mind.assigned_role) unassigned += player - Debug("DO, Len: [unassigned.len]") + Debug("DO, Len: [length(unassigned)]") if(!length(unassigned)) return FALSE @@ -330,7 +330,7 @@ SUBSYSTEM_DEF(jobs) Debug("DO, Running Assistant Check 1") var/datum/job/ast = new /datum/job/assistant() var/list/assistant_candidates = FindOccupationCandidates(ast, 3) - Debug("AC1, Candidates: [assistant_candidates.len]") + Debug("AC1, Candidates: [length(assistant_candidates)]") for(var/mob/new_player/player in assistant_candidates) Debug("AC1 pass, Player: [player]") AssignRole(player, "Assistant") diff --git a/code/controllers/subsystem/SSmachinery.dm b/code/controllers/subsystem/SSmachinery.dm index b625979eae5c..e17cf6ec8d66 100644 --- a/code/controllers/subsystem/SSmachinery.dm +++ b/code/controllers/subsystem/SSmachinery.dm @@ -39,15 +39,15 @@ SUBSYSTEM_DEF(machines) propagate_network(PC, PC.powernet) /datum/controller/subsystem/machines/get_stat_details() - return "Machines: [processing.len] | Powernets: [powernets.len] | Deferred: [deferred_powernet_rebuilds.len]" + return "Machines: [length(processing)] | Powernets: [length(powernets)] | Deferred: [length(deferred_powernet_rebuilds)]" /datum/controller/subsystem/machines/proc/process_defered_powernets(resumed = 0) if(!resumed) src.currentrun = deferred_powernet_rebuilds.Copy() //cache for sanid speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/obj/O = currentrun[currentrun.len] + while(length(currentrun)) + var/obj/O = currentrun[length(currentrun)] currentrun.len-- if(O && !QDELETED(O)) var/datum/regional_powernet/newPN = new() // create a new powernet... @@ -62,8 +62,8 @@ SUBSYSTEM_DEF(machines) src.currentrun = powernets.Copy() //cache for sanid speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/datum/regional_powernet/P = currentrun[currentrun.len] + while(length(currentrun)) + var/datum/regional_powernet/P = currentrun[length(currentrun)] currentrun.len-- if(P) P.process_power() // reset the power state @@ -78,8 +78,8 @@ SUBSYSTEM_DEF(machines) src.currentrun = processing.Copy() //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/obj/machinery/thing = currentrun[currentrun.len] + while(length(currentrun)) + var/obj/machinery/thing = currentrun[length(currentrun)] currentrun.len-- if(!QDELETED(thing) && thing.process(seconds) != PROCESS_KILL) if(prob(MACHINE_FLICKER_CHANCE)) diff --git a/code/controllers/subsystem/SSmobs.dm b/code/controllers/subsystem/SSmobs.dm index 537683f1d608..1a3683937b39 100644 --- a/code/controllers/subsystem/SSmobs.dm +++ b/code/controllers/subsystem/SSmobs.dm @@ -35,8 +35,8 @@ SUBSYSTEM_DEF(mobs) //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun var/times_fired = src.times_fired - while(currentrun.len) - var/mob/living/L = currentrun[currentrun.len] + while(length(currentrun)) + var/mob/living/L = currentrun[length(currentrun)] currentrun.len-- if(L) L.Life(seconds, times_fired) diff --git a/code/controllers/subsystem/SSnano_mob_hunter.dm b/code/controllers/subsystem/SSnano_mob_hunter.dm index 49b433ca6b0c..93e622f3ae1b 100644 --- a/code/controllers/subsystem/SSnano_mob_hunter.dm +++ b/code/controllers/subsystem/SSnano_mob_hunter.dm @@ -21,7 +21,7 @@ SUBSYSTEM_DEF(mob_hunt) if(!server_status) return client_mob_update() - if(normal_spawns.len < max_normal_spawns) + if(length(normal_spawns) < max_normal_spawns) spawn_mob() //leaving this here in case admins want to use it for a random mini-event or something @@ -51,7 +51,7 @@ SUBSYSTEM_DEF(mob_hunt) if(!H || H != connected_clients[client]) ex_players |= connected_clients[client] connected_clients[client] = H - if(ex_players.len) //to make sure we don't do this if we didn't lose any player since the last update + if(length(ex_players)) //to make sure we don't do this if we didn't lose any player since the last update for(var/obj/effect/nanomob/N in (normal_spawns + trap_spawns)) N.conceal(ex_players) @@ -59,7 +59,7 @@ SUBSYSTEM_DEF(mob_hunt) if(server_status != 0) return server_status = 1 - while(normal_spawns.len < max_normal_spawns) //repopulate the server's spawns completely if we auto-recover from crash + while(length(normal_spawns) < max_normal_spawns) //repopulate the server's spawns completely if we auto-recover from crash spawn_mob() /datum/controller/subsystem/mob_hunt/proc/manual_reboot() @@ -94,7 +94,7 @@ SUBSYSTEM_DEF(mob_hunt) var/obj/effect/nanomob/new_mob = new /obj/effect/nanomob(mob_info.spawn_point, mob_info) trap_spawns += new_mob new_mob.reveal() - if(trap_spawns.len > max_trap_spawns) + if(length(trap_spawns) > max_trap_spawns) var/obj/effect/nanomob/old_trap = trap_spawns[1] old_trap.despawn() return 1 diff --git a/code/controllers/subsystem/SSnpcpool.dm b/code/controllers/subsystem/SSnpcpool.dm index ca9c3befbeed..8e17b860ac7b 100644 --- a/code/controllers/subsystem/SSnpcpool.dm +++ b/code/controllers/subsystem/SSnpcpool.dm @@ -18,8 +18,8 @@ SUBSYSTEM_DEF(npcpool) var/list/currentrun = src.currentrun - while(currentrun.len) - var/mob/living/simple_animal/SA = currentrun[currentrun.len] + while(length(currentrun)) + var/mob/living/simple_animal/SA = currentrun[length(currentrun)] --currentrun.len if(!SA) log_debug("npcpool encountered an invalid entry, resumed: [resumed], SA [SA], type of SA [SA?.type], null [SA == null], qdelled [QDELETED(SA)], SA in AI_ON list: [SA in GLOB.simple_animals[AI_ON]]") diff --git a/code/controllers/subsystem/SSoverlays.dm b/code/controllers/subsystem/SSoverlays.dm index dad9c3683cf5..ed3382382c96 100644 --- a/code/controllers/subsystem/SSoverlays.dm +++ b/code/controllers/subsystem/SSoverlays.dm @@ -113,7 +113,7 @@ SUBSYSTEM_DEF(overlays) priority_overlays.Cut() //If not already queued for work and there are overlays to remove - if(NOT_QUEUED_ALREADY && remove_overlays.len) + if(NOT_QUEUED_ALREADY && length(remove_overlays)) QUEUE_FOR_COMPILE /atom/proc/cut_overlay(list/overlays, priority) @@ -123,9 +123,9 @@ SUBSYSTEM_DEF(overlays) LAZYINITLIST(add_overlays) //always initialized after this point LAZYINITLIST(priority_overlays) LAZYINITLIST(remove_overlays) - var/a_len = add_overlays.len - var/r_len = remove_overlays.len - var/p_len = priority_overlays.len + var/a_len = length(add_overlays) + var/r_len = length(remove_overlays) + var/p_len = length(priority_overlays) remove_overlays += overlays add_overlays -= overlays @@ -133,9 +133,9 @@ SUBSYSTEM_DEF(overlays) var/list/cached_priority = priority_overlays LAZYREMOVE(cached_priority, overlays) - var/fa_len = add_overlays.len - var/fr_len = remove_overlays.len - var/fp_len = priority_overlays.len + var/fa_len = length(add_overlays) + var/fr_len = length(remove_overlays) + var/fp_len = length(priority_overlays) //If not already queued and there is work to be done if(NOT_QUEUED_ALREADY && (fa_len != a_len || fr_len != r_len || fp_len != p_len)) @@ -149,17 +149,17 @@ SUBSYSTEM_DEF(overlays) LAZYINITLIST(add_overlays) //always initialized after this point LAZYINITLIST(priority_overlays) - var/a_len = add_overlays.len - var/p_len = priority_overlays.len + var/a_len = length(add_overlays) + var/p_len = length(priority_overlays) if(priority) priority_overlays += overlays //or in the image. Can we use [image] = image? - var/fp_len = priority_overlays.len + var/fp_len = length(priority_overlays) if(NOT_QUEUED_ALREADY && fp_len != p_len) QUEUE_FOR_COMPILE else add_overlays += overlays - var/fa_len = add_overlays.len + var/fa_len = length(add_overlays) if(NOT_QUEUED_ALREADY && fa_len != a_len) QUEUE_FOR_COMPILE @@ -200,7 +200,7 @@ SUBSYSTEM_DEF(overlays) var/list/cached_other = other.overlays.Copy() if(cached_other) - if(cut_old || !overlays.len) + if(cut_old || !length(overlays)) overlays = cached_other else overlays |= cached_other diff --git a/code/controllers/subsystem/SSparallax.dm b/code/controllers/subsystem/SSparallax.dm index 99024fd0d1e9..60637955cdf4 100644 --- a/code/controllers/subsystem/SSparallax.dm +++ b/code/controllers/subsystem/SSparallax.dm @@ -31,7 +31,7 @@ SUBSYSTEM_DEF(parallax) var/list/currentrun = src.currentrun while(length(currentrun)) - var/client/C = currentrun[currentrun.len] + var/client/C = currentrun[length(currentrun)] currentrun.len-- if(!C || !C.eye) if(MC_TICK_CHECK) diff --git a/code/controllers/subsystem/SSping.dm b/code/controllers/subsystem/SSping.dm index 42df890f9b7d..5e95309b8e3d 100644 --- a/code/controllers/subsystem/SSping.dm +++ b/code/controllers/subsystem/SSping.dm @@ -27,7 +27,7 @@ SUBSYSTEM_DEF(ping) var/list/current_run = src.current_run while(length(current_run)) - var/client/client = current_run[current_run.len] + var/client/client = current_run[length(current_run)] current_run.len-- if(client?.tgui_panel?.is_ready()) diff --git a/code/controllers/subsystem/SSshuttles.dm b/code/controllers/subsystem/SSshuttles.dm index d4b921f36eb7..5e5a92bdb05a 100644 --- a/code/controllers/subsystem/SSshuttles.dm +++ b/code/controllers/subsystem/SSshuttles.dm @@ -246,7 +246,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/get_dock_overlap(x0, y0, x1, y1, z) . = list() var/list/stationary_cache = stationary - for(var/i in 1 to stationary_cache.len) + for(var/i in 1 to length(stationary_cache)) var/obj/docking_port/port = stationary_cache[i] if(!port || port.z != z) continue @@ -254,7 +254,7 @@ SUBSYSTEM_DEF(shuttle) var/list/overlap = get_overlap(x0, y0, x1, y1, bounds[1], bounds[2], bounds[3], bounds[4]) var/list/xs = overlap[1] var/list/ys = overlap[2] - if(xs.len && ys.len) + if(length(xs) && length(ys)) .[port] = overlap /datum/controller/subsystem/shuttle/proc/update_hidden_docking_ports(list/remove_turfs, list/add_turfs) @@ -272,7 +272,7 @@ SUBSYSTEM_DEF(shuttle) for(var/V in add_turfs) var/turf/T = V var/image/I - if(remove_images.len) + if(length(remove_images)) //we can just reuse any images we are about to delete instead of making new ones I = remove_images[1] remove_images.Cut(1, 2) diff --git a/code/controllers/subsystem/SSspacedrift.dm b/code/controllers/subsystem/SSspacedrift.dm index 96aa68a8e2a8..cb489b55c2ab 100644 --- a/code/controllers/subsystem/SSspacedrift.dm +++ b/code/controllers/subsystem/SSspacedrift.dm @@ -26,8 +26,8 @@ SUBSYSTEM_DEF(spacedrift) //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/atom/movable/AM = currentrun[currentrun.len] + while(length(currentrun)) + var/atom/movable/AM = currentrun[length(currentrun)] currentrun.len-- if(!AM) processing -= AM diff --git a/code/controllers/subsystem/SStgui.dm b/code/controllers/subsystem/SStgui.dm index 924a5f02919b..d84c486c6159 100644 --- a/code/controllers/subsystem/SStgui.dm +++ b/code/controllers/subsystem/SStgui.dm @@ -42,8 +42,8 @@ SUBSYSTEM_DEF(tgui) src.current_run = open_uis.Copy() // Cache for sanic speed (lists are references anyways) var/list/current_run = src.current_run - while(current_run.len) - var/datum/tgui/ui = current_run[current_run.len] + while(length(current_run)) + var/datum/tgui/ui = current_run[length(current_run)] current_run.len-- // TODO: Move user/src_object check to process() if(ui && ui.user && ui.src_object) diff --git a/code/controllers/subsystem/SSthrowing.dm b/code/controllers/subsystem/SSthrowing.dm index 621c5020028c..3e4bc1536ff0 100644 --- a/code/controllers/subsystem/SSthrowing.dm +++ b/code/controllers/subsystem/SSthrowing.dm @@ -30,7 +30,7 @@ SUBSYSTEM_DEF(throwing) var/list/currentrun = src.currentrun while(length(currentrun)) - var/atom/movable/AM = currentrun[currentrun.len] + var/atom/movable/AM = currentrun[length(currentrun)] var/datum/thrownthing/TT = currentrun[AM] currentrun.len-- if(!AM || !TT) diff --git a/code/controllers/subsystem/SSticker.dm b/code/controllers/subsystem/SSticker.dm index 91c37f28a0c1..6a9bd55d6883 100644 --- a/code/controllers/subsystem/SSticker.dm +++ b/code/controllers/subsystem/SSticker.dm @@ -529,9 +529,9 @@ SUBSYSTEM_DEF(ticker) else var/list/randomtips = file2list("strings/tips.txt") var/list/memetips = file2list("strings/sillytips.txt") - if(randomtips.len && prob(95)) + if(length(randomtips) && prob(95)) m = pick(randomtips) - else if(memetips.len) + else if(length(memetips)) m = pick(memetips) if(m) @@ -706,8 +706,8 @@ SUBSYSTEM_DEF(ticker) for(var/loc_type in subtypesof(/datum/trade_destination)) var/datum/trade_destination/D = new loc_type - GLOB.weighted_randomevent_locations[D] = D.viable_random_events.len - GLOB.weighted_mundaneevent_locations[D] = D.viable_mundane_events.len + GLOB.weighted_randomevent_locations[D] = length(D.viable_random_events) + GLOB.weighted_mundaneevent_locations[D] = length(D.viable_mundane_events) // Easy handler to make rebooting the world not a massive sleep in world/Reboot() /datum/controller/subsystem/ticker/proc/reboot_helper(reason, end_string, delay) diff --git a/code/controllers/subsystem/non_firing/SSatoms.dm b/code/controllers/subsystem/non_firing/SSatoms.dm index 4226c93f98dd..a1c515fdb80d 100644 --- a/code/controllers/subsystem/non_firing/SSatoms.dm +++ b/code/controllers/subsystem/non_firing/SSatoms.dm @@ -36,7 +36,7 @@ SUBSYSTEM_DEF(atoms) var/count var/list/mapload_arg = list(TRUE) if(atoms) - count = atoms.len + count = length(atoms) for(var/I in atoms) var/atom/A = I if(A && !A.initialized) @@ -58,7 +58,7 @@ SUBSYSTEM_DEF(atoms) initialized = INITIALIZATION_INNEW_REGULAR - if(late_loaders.len) + if(length(late_loaders)) watch = start_watch() if(noisy) log_startup_progress("Late-initializing atoms...") diff --git a/code/controllers/subsystem/non_firing/SSmapping.dm b/code/controllers/subsystem/non_firing/SSmapping.dm index c73d53da322c..348702422840 100644 --- a/code/controllers/subsystem/non_firing/SSmapping.dm +++ b/code/controllers/subsystem/non_firing/SSmapping.dm @@ -203,7 +203,7 @@ SUBSYSTEM_DEF(mapping) log_startup_progress("Loaded Lavaland in [stop_watch(watch)]s") /datum/controller/subsystem/mapping/proc/seedRuins(list/z_levels = null, budget = 0, whitelist = /area/space, list/potentialRuins) - if(!z_levels || !z_levels.len) + if(!z_levels || !length(z_levels)) WARNING("No Z levels provided - Not generating ruins") return @@ -230,10 +230,10 @@ SUBSYSTEM_DEF(mapping) continue ruins_availible[R] = R.placement_weight - while(budget > 0 && (ruins_availible.len || forced_ruins.len)) + while(budget > 0 && (length(ruins_availible) || length(forced_ruins))) var/datum/map_template/ruin/current_pick var/forced = FALSE - if(forced_ruins.len) //We have something we need to load right now, so just pick it + if(length(forced_ruins)) //We have something we need to load right now, so just pick it for(var/ruin in forced_ruins) current_pick = ruin if(forced_ruins[ruin] > 0) //Load into designated z diff --git a/code/controllers/subsystem/non_firing/SSradio.dm b/code/controllers/subsystem/non_firing/SSradio.dm index 402fc3375c63..e17bc1e42d10 100644 --- a/code/controllers/subsystem/non_firing/SSradio.dm +++ b/code/controllers/subsystem/non_firing/SSradio.dm @@ -85,7 +85,7 @@ SUBSYSTEM_DEF(radio) if(frequency) frequency.remove_listener(device) - if(frequency.devices.len == 0) + if(length(frequency.devices) == 0) qdel(frequency) frequencies -= f_text diff --git a/code/controllers/subsystem/non_firing/SStitlescreen.dm b/code/controllers/subsystem/non_firing/SStitlescreen.dm index 100dff90cda2..6591e67dd4f0 100644 --- a/code/controllers/subsystem/non_firing/SStitlescreen.dm +++ b/code/controllers/subsystem/non_firing/SStitlescreen.dm @@ -10,10 +10,10 @@ SUBSYSTEM_DEF(title) for(var/S in provisional_title_screens) var/list/L = splittext(S,"+") - if(L.len == 1 && L[1] != "blank.png") + if(length(L) == 1 && L[1] != "blank.png") title_screens += S - else if(L.len > 1) + else if(length(L) > 1) if(use_rare_screens && lowertext(L[1]) == "rare") title_screens += S @@ -21,7 +21,7 @@ SUBSYSTEM_DEF(title) if(length(title_screens) > 1) for(var/S in title_screens) var/list/L = splittext(S,".") - if(L.len != 2 || L[1] != "default") + if(length(L) != 2 || L[1] != "default") continue title_screens -= S break diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm index 14ab39fdcdfc..1abc4b89116a 100644 --- a/code/controllers/subsystem/processing/processing.dm +++ b/code/controllers/subsystem/processing/processing.dm @@ -26,8 +26,8 @@ SUBSYSTEM_DEF(processing) //cache for sanic speed (lists are references anyways) var/list/current_run = currentrun - while(current_run.len) - var/datum/thing = current_run[current_run.len] + while(length(current_run)) + var/datum/thing = current_run[length(current_run)] current_run.len-- if(QDELETED(thing)) processing -= thing diff --git a/code/controllers/subsystem/tickets/tickets.dm b/code/controllers/subsystem/tickets/tickets.dm index 444ca63d0633..7cf79bae0062 100644 --- a/code/controllers/subsystem/tickets/tickets.dm +++ b/code/controllers/subsystem/tickets/tickets.dm @@ -334,7 +334,7 @@ SUBSYSTEM_DEF(tickets) for(var/datum/ticket/T in allTickets) if(T.client_ckey == C.ckey && (T.ticketState == TICKET_OPEN || T.ticketState == TICKET_STALE)) tickets += T - if(tickets.len) + if(length(tickets)) return tickets return FALSE diff --git a/code/datums/ai_laws_datums.dm b/code/datums/ai_laws_datums.dm index c844b72657dd..dd9e29fbb939 100644 --- a/code/datums/ai_laws_datums.dm +++ b/code/datums/ai_laws_datums.dm @@ -53,7 +53,7 @@ return statements /datum/ai_laws/proc/sort_laws() - if(sorted_laws.len) + if(length(sorted_laws)) return if(zeroth_law) @@ -65,7 +65,7 @@ var/index = 1 for(var/datum/ai_law/inherent_law in inherent_laws) inherent_law.index = index++ - if(supplied_laws.len < inherent_law.index || !istype(supplied_laws[inherent_law.index], /datum/ai_law)) + if(length(supplied_laws) < inherent_law.index || !istype(supplied_laws[inherent_law.index], /datum/ai_law)) sorted_laws += inherent_law for(var/datum/ai_law/AL in supplied_laws) @@ -77,11 +77,11 @@ if(change_zeroth) S.sync_zeroth(zeroth_law, zeroth_law_borg) - if(full_sync || ion_laws.len) + if(full_sync || length(ion_laws)) S.laws.clear_ion_laws() - if(full_sync || inherent_laws.len) + if(full_sync || length(inherent_laws)) S.laws.clear_inherent_laws() - if(full_sync || supplied_laws.len) + if(full_sync || length(supplied_laws)) S.laws.clear_supplied_laws() for(var/datum/ai_law/law in ion_laws) @@ -130,7 +130,7 @@ var/new_law = new/datum/ai_law/ion(law) ion_laws += new_law - if(state_ion.len < ion_laws.len) + if(length(state_ion) < length(ion_laws)) state_ion += 1 sorted_laws.Cut() @@ -145,7 +145,7 @@ var/new_law = new/datum/ai_law/inherent(law) inherent_laws += new_law - if(state_inherent.len < inherent_laws.len) + if(length(state_inherent) < length(inherent_laws)) state_inherent += 1 sorted_laws.Cut() @@ -154,22 +154,22 @@ if(!law) return - if(supplied_laws.len >= number) + if(length(supplied_laws) >= number) var/datum/ai_law/existing_law = supplied_laws[number] if(existing_law && existing_law.law == law) return - if(supplied_laws.len >= number && supplied_laws[number]) + if(length(supplied_laws) >= number && supplied_laws[number]) delete_law(supplied_laws[number]) - while(src.supplied_laws.len < number) + while(length(src.supplied_laws) < number) src.supplied_laws += "" - if(state_supplied.len < supplied_laws.len) + if(length(state_supplied) < length(supplied_laws)) state_supplied += 1 var/new_law = new/datum/ai_law/supplied(law, number) supplied_laws[number] = new_law - if(state_supplied.len < supplied_laws.len) + if(length(state_supplied) < length(supplied_laws)) state_supplied += 1 sorted_laws.Cut() @@ -203,7 +203,7 @@ var/index = laws.Find(law) if(index) laws -= law - for(index, index < state.len, index++) + for(index, index < length(state), index++) state[index] = state[index+1] sorted_laws.Cut() diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 5b3cd3a53dbe..fffa11ef74d3 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -102,7 +102,7 @@ components_of_type = test if(I == our_type) //exact match, take priority var/inserted = FALSE - for(var/J in 1 to components_of_type.len) + for(var/J in 1 to length(components_of_type)) var/datum/component/C = components_of_type[J] if(C.type != our_type) //but not over other exact matches components_of_type.Insert(J, I) @@ -127,13 +127,13 @@ var/list/components_of_type = dc[I] if(length(components_of_type)) // var/list/subtracted = components_of_type - src - if(subtracted.len == 1) //only 1 guy left + if(length(subtracted) == 1) //only 1 guy left dc[I] = subtracted[1] //make him special else dc[I] = subtracted else //just us dc -= I - if(!dc.len) + if(!length(dc)) P.datum_components = null UnregisterFromParent() @@ -241,7 +241,7 @@ lookup[sig] -= src signal_procs[target] -= sig_type_or_types - if(!signal_procs[target].len) + if(!length(signal_procs[target])) signal_procs -= target /// Registers multiple signals to the same proc. diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index 42d9731dbc0d..6041460d068c 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -184,7 +184,7 @@ //For consuming material //mats is a list of types of material to use and the corresponding amounts, example: list(MAT_METAL=100, MAT_GLASS=200) /datum/component/material_container/proc/use_amount(list/mats, multiplier=1) - if(!mats || !mats.len) + if(!mats || !length(mats)) return FALSE var/datum/material/M @@ -292,7 +292,7 @@ return (total_amount + amt) <= max_amount /datum/component/material_container/proc/has_materials(list/mats, multiplier=1) - if(!mats || !mats.len) + if(!mats || !length(mats)) return FALSE var/datum/material/M diff --git a/code/datums/components/spawner.dm b/code/datums/components/spawner.dm index 9780db16407b..b1d6e8679759 100644 --- a/code/datums/components/spawner.dm +++ b/code/datums/components/spawner.dm @@ -39,7 +39,7 @@ /datum/component/spawner/proc/try_spawn_mob() var/atom/P = parent - if(spawned_mobs.len >= max_mobs) + if(length(spawned_mobs) >= max_mobs) return 0 if(spawn_delay > world.time) return 0 diff --git a/code/datums/components/swarming.dm b/code/datums/components/swarming.dm index ac81ea6aefa3..928589fbaaa8 100644 --- a/code/datums/components/swarming.dm +++ b/code/datums/components/swarming.dm @@ -17,7 +17,7 @@ for(var/other in swarm_members) var/datum/component/swarming/other_swarm = other other_swarm.swarm_members -= src - if(!other_swarm.swarm_members.len) + if(!length(other_swarm.swarm_members)) other_swarm.unswarm() swarm_members = null return ..() @@ -36,10 +36,10 @@ if(!other_swarm || !(other_swarm in swarm_members)) return swarm_members -= other_swarm - if(!swarm_members.len) + if(!length(swarm_members)) unswarm() other_swarm.swarm_members -= src - if(!other_swarm.swarm_members.len) + if(!length(other_swarm.swarm_members)) other_swarm.unswarm() /datum/component/swarming/proc/swarm() diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index e74385de46c0..c56c4a1e2755 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -15,7 +15,7 @@ using /datum/datacore/proc/manifest_inject(), or manifest_insert() GLOBAL_LIST_EMPTY(PDA_Manifest) /datum/datacore/proc/get_manifest_json() - if(GLOB.PDA_Manifest.len) + if(length(GLOB.PDA_Manifest)) return var/heads[0] var/sec[0] @@ -38,44 +38,44 @@ GLOBAL_LIST_EMPTY(PDA_Manifest) heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 depthead = 1 - if(rank == "Captain" && heads.len != 1) - heads.Swap(1, heads.len) + if(rank == "Captain" && length(heads) != 1) + heads.Swap(1, length(heads)) if(real_rank in GLOB.active_security_positions) sec[++sec.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 - if(depthead && sec.len != 1) - sec.Swap(1, sec.len) + if(depthead && length(sec) != 1) + sec.Swap(1, length(sec)) if(real_rank in GLOB.engineering_positions) eng[++eng.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 - if(depthead && eng.len != 1) - eng.Swap(1, eng.len) + if(depthead && length(eng) != 1) + eng.Swap(1, length(eng)) if(real_rank in GLOB.medical_positions) med[++med.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 - if(depthead && med.len != 1) - med.Swap(1, med.len) + if(depthead && length(med) != 1) + med.Swap(1, length(med)) if(real_rank in GLOB.science_positions) sci[++sci.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 - if(depthead && sci.len != 1) - sci.Swap(1, sci.len) + if(depthead && length(sci) != 1) + sci.Swap(1, length(sci)) if(real_rank in GLOB.service_positions) ser[++ser.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 - if(depthead && ser.len != 1) - ser.Swap(1, ser.len) + if(depthead && length(ser) != 1) + ser.Swap(1, length(ser)) if(real_rank in GLOB.supply_positions) sup[++sup.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 - if(depthead && sup.len != 1) - sup.Swap(1, sup.len) + if(depthead && length(sup) != 1) + sup.Swap(1, length(sup)) if(real_rank in GLOB.nonhuman_positions) bot[++bot.len] = list("name" = name, "rank" = rank, "active" = isactive) @@ -105,7 +105,7 @@ GLOBAL_LIST_EMPTY(PDA_Manifest) manifest_inject(H) /datum/datacore/proc/manifest_modify(name, assignment) - if(GLOB.PDA_Manifest.len) + if(length(GLOB.PDA_Manifest)) GLOB.PDA_Manifest.Cut() var/datum/data/record/foundrecord var/real_title = assignment @@ -137,7 +137,7 @@ GLOBAL_LIST_EMPTY(PDA_Manifest) GLOBAL_VAR_INIT(record_id_num, 1001) /datum/datacore/proc/manifest_inject(mob/living/carbon/human/H) - if(GLOB.PDA_Manifest.len) + if(length(GLOB.PDA_Manifest)) GLOB.PDA_Manifest.Cut() if(H.mind && (H.mind.assigned_role != H.mind.special_role)) diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 5483b5a4c21b..9abedd63a0d4 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -225,7 +225,7 @@ var/list/variable_html = list() if(islist) var/list/L = D - for(var/i in 1 to L.len) + for(var/i in 1 to length(L)) var/key = L[i] var/value if(IS_NORMAL_LIST(L) && !isnum(key)) @@ -511,8 +511,8 @@ var/list/L = value var/list/items = list() - if(L.len > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || L.len > (IS_NORMAL_LIST(L) ? 250 : 300))) - for(var/i in 1 to L.len) + if(length(L) > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || length(L) > (IS_NORMAL_LIST(L) ? 250 : 300))) + for(var/i in 1 to length(L)) var/key = L[i] var/val if(IS_NORMAL_LIST(L) && !isnum(key)) @@ -523,10 +523,10 @@ items += debug_variable(key, val, level + 1, sanitize = sanitize) - item = "[VV_HTML_ENCODE(name)] = /list ([L.len])
    [items.Join()]
" + item = "[VV_HTML_ENCODE(name)] = /list ([length(L)])
    [items.Join()]
" else - item = "[VV_HTML_ENCODE(name)] = /list ([L.len])" + item = "[VV_HTML_ENCODE(name)] = /list ([length(L)])" else item = "[VV_HTML_ENCODE(name)] = [VV_HTML_ENCODE(value)]" @@ -1049,7 +1049,7 @@ to_chat(usr, "This can only be done to instances of type /mob") return - if(!H.languages.len) + if(!length(H.languages)) to_chat(usr, "This mob knows no languages.") return @@ -1400,9 +1400,9 @@ return TRUE L.len = value["value"] - log_world("### ListVarEdit by [src]: /list len: [L.len]") - log_admin("[key_name(src)] modified list's len: [L.len]") - message_admins("[key_name_admin(src)] modified list's len: [L.len]") + log_world("### ListVarEdit by [src]: /list len: [length(L)]") + log_admin("[key_name(src)] modified list's len: [length(L)]") + message_admins("[key_name_admin(src)] modified list's len: [length(L)]") return TRUE if(href_list["listshuffle"]) diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 0675cdf52bff..ccfabbd9a880 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -49,9 +49,9 @@ GLOBAL_LIST_INIT(advance_cures, list( D = null // Generate symptoms if we weren't given any. - if(!symptoms || !symptoms.len) + if(!symptoms || !length(symptoms)) - if(!D || !D.symptoms || !D.symptoms.len) + if(!D || !D.symptoms || !length(D.symptoms)) symptoms = GenerateSymptoms(0, 2) else for(var/datum/symptom/S in D.symptoms) @@ -71,7 +71,7 @@ GLOBAL_LIST_INIT(advance_cures, list( /datum/disease/advance/stage_act() if(!..()) return FALSE - if(symptoms && symptoms.len) + if(symptoms && length(symptoms)) if(!processing) processing = TRUE @@ -162,7 +162,7 @@ GLOBAL_LIST_INIT(advance_cures, list( if(!HasSymptom(S)) possible_symptoms += S - if(!possible_symptoms.len) + if(!length(possible_symptoms)) return generated // Random chance to get more than one symptom @@ -172,7 +172,7 @@ GLOBAL_LIST_INIT(advance_cures, list( while(prob(20)) number_of += 1 - for(var/i = 1; number_of >= i && possible_symptoms.len; i++) + for(var/i = 1; number_of >= i && length(possible_symptoms); i++) generated += pick_n_take(possible_symptoms) return generated @@ -194,7 +194,7 @@ GLOBAL_LIST_INIT(advance_cures, list( //Generate disease properties based on the effects. Returns an associated list. /datum/disease/advance/proc/GenerateProperties() - if(!symptoms || !symptoms.len) + if(!symptoms || !length(symptoms)) CRASH("We did not have any symptoms before generating properties.") var/list/properties = list("resistance" = 1, "stealth" = 0, "stage rate" = 1, "transmittable" = 1, "severity" = 0) @@ -212,7 +212,7 @@ GLOBAL_LIST_INIT(advance_cures, list( // Assign the properties that are in the list. /datum/disease/advance/proc/AssignProperties(list/properties = list()) - if(properties && properties.len) + if(properties && length(properties)) switch(properties["stealth"]) if(2) visibility_flags = HIDDEN_SCANNER @@ -220,7 +220,7 @@ GLOBAL_LIST_INIT(advance_cures, list( visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC // The more symptoms we have, the less transmittable it is but some symptoms can make up for it. - SetSpread(clamp(2 ** (properties["transmittable"] - symptoms.len), BLOOD, AIRBORNE)) + SetSpread(clamp(2 ** (properties["transmittable"] - length(symptoms)), BLOOD, AIRBORNE)) permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1) cure_chance = 15 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20 stage_prob = max(properties["stage rate"], 2) @@ -266,8 +266,8 @@ GLOBAL_LIST_INIT(advance_cures, list( // Will generate a random cure, the less resistance the symptoms have, the harder the cure. /datum/disease/advance/proc/GenerateCure(list/properties = list()) - if(properties && properties.len) - var/res = clamp(properties["resistance"] - (symptoms.len / 2), 1, GLOB.advance_cures.len) + if(properties && length(properties)) + var/res = clamp(properties["resistance"] - (length(symptoms) / 2), 1, length(GLOB.advance_cures)) // to_chat(world, "Res = [res]") cures = list(GLOB.advance_cures[res]) @@ -288,7 +288,7 @@ GLOBAL_LIST_INIT(advance_cures, list( // Randomly remove a symptom. /datum/disease/advance/proc/Devolve() - if(symptoms.len > 1) + if(length(symptoms) > 1) var/s = safepick(symptoms) if(s) RemoveSymptom(s) @@ -319,7 +319,7 @@ GLOBAL_LIST_INIT(advance_cures, list( if(HasSymptom(S)) return - if(symptoms.len < (VIRUS_SYMPTOM_LIMIT - 1) + rand(-1, 1)) + if(length(symptoms) < (VIRUS_SYMPTOM_LIMIT - 1) + rand(-1, 1)) symptoms += S else RemoveSymptom(pick(symptoms)) @@ -347,14 +347,14 @@ GLOBAL_LIST_INIT(advance_cures, list( for(var/datum/disease/advance/A in D_list) diseases += A.Copy() - if(!diseases.len) + if(!length(diseases)) return null - if(diseases.len <= 1) + if(length(diseases) <= 1) return pick(diseases) // Just return the only entry. var/i = 0 // Mix our diseases until we are left with only one result. - while(i < 20 && diseases.len > 1) + while(i < 20 && length(diseases) > 1) i++ @@ -377,7 +377,7 @@ GLOBAL_LIST_INIT(advance_cures, list( for(var/datum/disease/A in data["viruses"]) preserve += A.Copy() R.data = data.Copy() - if(preserve.len) + if(length(preserve)) R.data["viruses"] = preserve /proc/AdminCreateVirus(client/user) @@ -407,7 +407,7 @@ GLOBAL_LIST_INIT(advance_cures, list( i -= 1 while(i > 0) - if(D.symptoms.len > 0) + if(length(D.symptoms) > 0) var/new_name = stripped_input(user, "Name your new disease.", "New Name") if(!new_name) diff --git a/code/datums/diseases/advance/symptoms/damage_converter.dm b/code/datums/diseases/advance/symptoms/damage_converter.dm index 9b5fcf6981f8..9d8c47451f8a 100644 --- a/code/datums/diseases/advance/symptoms/damage_converter.dm +++ b/code/datums/diseases/advance/symptoms/damage_converter.dm @@ -42,7 +42,7 @@ Bonus var/list/parts = H.get_damaged_organs(TRUE, TRUE, AFFECT_ORGANIC_ORGAN) //1,1 because it needs inputs. - if(!parts.len) + if(!length(parts)) return var/healed = 0 for(var/obj/item/organ/external/E in parts) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index ddec1008c4c6..c6e68cd3f28e 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -82,7 +82,7 @@ Bonus // Remove all the diseases we cured. var/mob/living/M = A.affected_mob if(istype(M)) - if(cured_diseases.len) + if(length(cured_diseases)) for(var/res in M.resistances) if(res in cured_diseases) M.resistances -= res diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm index 8f72de7f5998..454f71fc8bfb 100644 --- a/code/datums/diseases/advance/symptoms/symptoms.dm +++ b/code/datums/diseases/advance/symptoms/symptoms.dm @@ -18,7 +18,7 @@ GLOBAL_LIST_INIT(list_symptoms, subtypesof(/datum/symptom)) /datum/symptom/New() var/list/S = GLOB.list_symptoms - for(var/i = 1; i <= S.len; i++) + for(var/i = 1; i <= length(S); i++) if(type == S[i]) id = "[i]" return diff --git a/code/datums/helper_datums/async_input.dm b/code/datums/helper_datums/async_input.dm index e25fd0ac3e05..35c9b715e41d 100644 --- a/code/datums/helper_datums/async_input.dm +++ b/code/datums/helper_datums/async_input.dm @@ -110,11 +110,11 @@ /datum/async_input/ranked/render_choices() var/dat = "
" dat += "" - for(var/i = 1, i <= choices.len, i++) + for(var/i = 1, i <= length(choices), i++) var/choice = choices[i] dat += "" dat += "" - dat += "" + dat += "" dat += "" dat += "" dat += "
[button("+", i != 1 ? "upvote=[i]" : "", null, i == 1)][button("-", i != choices.len ? "downvote=[i]" : "", null, i == choices.len)][button("-", i != length(choices) ? "downvote=[i]" : "", null, i == length(choices))][i]. [choice]
" @@ -157,7 +157,7 @@ ..() popup.add_script("autocomplete.js", 'html/browser/autocomplete.js') - for(var/i=1, i <= choices.len, i++) + for(var/i=1, i <= length(choices), i++) var/C = choices[choices[i]] choices[i] = url_encode(choices[i], TRUE) choices[choices[i]] = C diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm index 5b534b848b99..9d74a79bae2c 100644 --- a/code/datums/helper_datums/construction_datum.dm +++ b/code/datums/helper_datums/construction_datum.dm @@ -14,15 +14,15 @@ if(!holder) //don't want this without a holder spawn qdel(src) - set_desc(steps.len) + set_desc(length(steps)) return /datum/construction/proc/next_step(mob/user as mob) steps.len-- - if(!steps.len) + if(!length(steps)) spawn_result(user) else - set_desc(steps.len) + set_desc(length(steps)) return /datum/construction/proc/action(atom/used_atom,mob/user as mob) @@ -37,9 +37,9 @@ return 0 /datum/construction/proc/is_right_key(atom/used_atom) // returns current step num if used_atom is of the right type. - var/list/L = steps[steps.len] + var/list/L = steps[length(steps)] if(do_tool_or_atom_check(used_atom, L["key"])) - return steps.len + return length(steps) return 0 @@ -67,12 +67,12 @@ return 1 /datum/construction/proc/check_all_steps(atom/used_atom,mob/user as mob) //check all steps, remove matching one. - for(var/i=1;i<=steps.len;i++) + for(var/i=1;i<=length(steps);i++) var/list/L = steps[i] if(do_tool_or_atom_check(used_atom, L["key"]) && custom_action(i, used_atom, user)) steps[i]=null;//stupid byond list from list removal... listclearnulls(steps) - if(!steps.len) + if(!length(steps)) spawn_result(user) return 1 return 0 @@ -130,7 +130,7 @@ /datum/construction/reversible/New(atom) ..() - index = steps.len + index = length(steps) return /datum/construction/reversible/proc/update_index(diff as num, mob/user as mob) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index ec374b634e1b..e599974ad1a8 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -205,7 +205,7 @@ precision = rand(1, 100) var/list/bagholding = teleatom.search_contents_for(/obj/item/storage/backpack/holding) - if(bagholding.len) + if(length(bagholding)) if(safe_turf_first) //If this is true, this is already a random teleport. Make it unsafe but do not touch the precision. safe_turf_first = FALSE else diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index bf93b4039bee..e7fc3faef51b 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -34,7 +34,7 @@ LAZYADD(H.holo_calls, src) H.atom_say("[area] pad beeps: Incoming call from [caller]!") - if(!dialed_holopads.len) + if(!length(dialed_holopads)) calling_holopad.atom_say("Connection failure.") qdel(src) return @@ -105,7 +105,7 @@ LAZYREMOVE(H.holo_calls, src) dialed_holopads -= H - if(!dialed_holopads.len) + if(!length(dialed_holopads)) if(graceful) calling_holopad.atom_say("Call rejected.") qdel(src) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index f5d05098240e..73608ba323e3 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -485,12 +485,12 @@ if(istype(robot) && robot.emagged) . += "
Cyborg: Is emagged! Unemag!
0th law: [robot.laws.zeroth_law]" var/mob/living/silicon/ai/ai = current - if(istype(ai) && ai.connected_robots.len) + if(istype(ai) && length(ai.connected_robots)) var/n_e_robots = 0 for(var/mob/living/silicon/robot/R in ai.connected_robots) if(R.emagged) n_e_robots++ - . += "
[n_e_robots] of [ai.connected_robots.len] slaved cyborgs are emagged. Unemag" + . += "
[n_e_robots] of [length(ai.connected_robots)] slaved cyborgs are emagged. Unemag" /datum/mind/proc/memory_edit_uplink() . = "" @@ -685,7 +685,7 @@ if("destroy") var/list/possible_targets = active_ais(1) - if(possible_targets.len) + if(length(possible_targets)) var/mob/new_target = input("Select target:", "Objective target") as null|anything in possible_targets new_objective = new /datum/objective/destroy new_objective.target = new_target.mind @@ -1104,10 +1104,10 @@ if(!(src in SSticker.mode.syndicates)) SSticker.mode.syndicates += src SSticker.mode.update_synd_icons_added(src) - if(SSticker.mode.syndicates.len==1) + if(length(SSticker.mode.syndicates) == 1) SSticker.mode.prepare_syndicate_leader(src) else - current.real_name = "[syndicate_name()] Operative #[SSticker.mode.syndicates.len-1]" + current.real_name = "[syndicate_name()] Operative #[length(SSticker.mode.syndicates) - 1]" special_role = SPECIAL_ROLE_NUKEOPS to_chat(current, "You are a [syndicate_name()] agent!") SSticker.mode.forge_syndicate_objectives(src) @@ -1134,7 +1134,7 @@ if(!SSticker.mode.equip_syndicate(current)) to_chat(usr, "Equipping a syndicate failed!") return - SSticker.mode.update_syndicate_id(current.mind, SSticker.mode.syndicates.len == 1) + SSticker.mode.update_syndicate_id(current.mind, length(SSticker.mode.syndicates) == 1) log_admin("[key_name(usr)] has equipped [key_name(current)] as a nuclear operative") message_admins("[key_name_admin(usr)] has equipped [key_name_admin(current)] as a nuclear operative") @@ -1593,10 +1593,10 @@ if(!(src in SSticker.mode.syndicates)) SSticker.mode.syndicates += src SSticker.mode.update_synd_icons_added(src) - if(SSticker.mode.syndicates.len==1) + if(length(SSticker.mode.syndicates) == 1) SSticker.mode.prepare_syndicate_leader(src) else - current.real_name = "[syndicate_name()] Operative #[SSticker.mode.syndicates.len-1]" + current.real_name = "[syndicate_name()] Operative #[length(SSticker.mode.syndicates) - 1]" special_role = SPECIAL_ROLE_NUKEOPS assigned_role = SPECIAL_ROLE_NUKEOPS to_chat(current, "You are a [syndicate_name()] agent!") diff --git a/code/datums/outfits/vv_outfit.dm b/code/datums/outfits/vv_outfit.dm index c211e1001c13..36401cb41fd3 100644 --- a/code/datums/outfits/vv_outfit.dm +++ b/code/datums/outfits/vv_outfit.dm @@ -182,7 +182,7 @@ for(var/edit in vedits) if(istext(vedits[edit]) || isnum(vedits[edit]) || isnull(vedits[edit])) stripped_edits[edit] = vedits[edit] - if(stripped_edits.len) + if(length(stripped_edits)) stripped_vv[slot] = stripped_edits .["vv_values"] = stripped_vv diff --git a/code/datums/progressbar.dm b/code/datums/progressbar.dm index 3efc5b1e0948..aecbe44d2d2c 100644 --- a/code/datums/progressbar.dm +++ b/code/datums/progressbar.dm @@ -26,7 +26,7 @@ LAZYINITLIST(user.progressbars[bar.loc]) var/list/bars = user.progressbars[bar.loc] bars.Add(src) - listindex = bars.len + listindex = length(bars) animate(bar, pixel_y = 32 + (PROGRESSBAR_HEIGHT * (listindex - 1)), alpha = 255, time = 5, easing = SINE_EASING) /datum/progressbar/proc/update(progress) @@ -58,7 +58,7 @@ var/list/bars = user.progressbars[bar.loc] bars.Remove(src) - if(!bars.len) + if(!length(bars)) LAZYREMOVE(user.progressbars, bar.loc) animate(bar, alpha = 0, time = 5) spawn(5) diff --git a/code/datums/radiation_wave.dm b/code/datums/radiation_wave.dm index c7ff5d74af57..19533fd7ebbf 100644 --- a/code/datums/radiation_wave.dm +++ b/code/datums/radiation_wave.dm @@ -90,7 +90,7 @@ width-- width = 1 + (2 * width) - for(var/k in 1 to atoms.len) + for(var/k in 1 to length(atoms)) var/atom/thing = atoms[k] if(!thing) continue diff --git a/code/datums/radio_frequency.dm b/code/datums/radio_frequency.dm index 71e891ed3ce6..89ffaebf1bca 100644 --- a/code/datums/radio_frequency.dm +++ b/code/datums/radio_frequency.dm @@ -47,9 +47,9 @@ return devices_line += device // var/list/obj/devices_line___ = devices[filter_str] -// var/l = devices_line___.len - //log_admin("DEBUG: devices_line.len=[devices_line.len]") - //log_admin("DEBUG: devices(filter_str).len=[l]") +// var/l = length(devices_line___) + //log_admin("DEBUG: length(devices_line)=[length(devices_line)]") + //log_admin("DEBUG: length(devices(filter_str))=[l]") /datum/radio_frequency/proc/remove_listener(obj/device) for(var/devices_filter in devices) @@ -57,7 +57,7 @@ devices_line-=device while(null in devices_line) devices_line -= null - if(devices_line.len==0) + if(length(devices_line) == 0) devices -= devices_filter qdel(devices_line) diff --git a/code/datums/recipe.dm b/code/datums/recipe.dm index 3582772446ae..8fb79eed615d 100644 --- a/code/datums/recipe.dm +++ b/code/datums/recipe.dm @@ -51,7 +51,7 @@ . = -1 else return 0 - if((reagents?(reagents.len):(0)) < avail_reagents.reagent_list.len) + if((reagents?(length(reagents)):(0)) < length(avail_reagents.reagent_list)) return -1 return . @@ -71,7 +71,7 @@ break if(!found) . = -1 - if(checklist.len) + if(length(checklist)) return 0 return . @@ -103,17 +103,17 @@ for(var/datum/recipe/recipe in available_recipes) if(recipe.check_reagents(obj.reagents) == exact && recipe.check_items(obj, ignored_items) == exact) possible_recipes += recipe - if(possible_recipes.len == 0) + if(length(possible_recipes) == 0) return null - else if(possible_recipes.len == 1) + else if(length(possible_recipes) == 1) return possible_recipes[1] else //okay, let's select the most complicated recipe var/r_count = 0 var/i_count = 0 . = possible_recipes[1] for(var/datum/recipe/recipe in possible_recipes) - var/N_i = (recipe.items)?(recipe.items.len):0 - var/N_r = (recipe.reagents)?(recipe.reagents.len):0 + var/N_i = (recipe.items)?(length(recipe.items)):0 + var/N_r = (recipe.reagents)?(length(recipe.reagents)):0 if(N_i > i_count || (N_i== i_count && N_r > r_count)) r_count = N_r i_count = N_i @@ -128,6 +128,6 @@ /datum/recipe/proc/count_n_items() var/count = 0 - if(items && items.len) - count += items.len + if(items && length(items)) + count += length(items) return count diff --git a/code/datums/spells/area_teleport.dm b/code/datums/spells/area_teleport.dm index b7d349b5a32d..3cd160c1cc74 100644 --- a/code/datums/spells/area_teleport.dm +++ b/code/datums/spells/area_teleport.dm @@ -49,7 +49,7 @@ if(clear) L+=T - if(!L.len) + if(!length(L)) to_chat(usr, "The spell matrix was unable to locate a suitable teleport destination for an unknown reason. Sorry.") return @@ -62,7 +62,7 @@ var/list/tempL = L var/attempt = null var/success = 0 - while(tempL.len) + while(length(tempL)) attempt = pick(tempL) success = target.Move(attempt) if(!success) diff --git a/code/datums/spells/charge.dm b/code/datums/spells/charge.dm index be5c5a09b888..a35a923267bf 100644 --- a/code/datums/spells/charge.dm +++ b/code/datums/spells/charge.dm @@ -20,7 +20,7 @@ if(L.pulling && (isliving(L.pulling))) var/mob/living/M = L.pulling - if(M.mob_spell_list.len != 0 || (M.mind && M.mind.spell_list.len != 0)) + if(length(M.mob_spell_list) != 0 || (M.mind && length(M.mind.spell_list) != 0)) for(var/datum/spell/S in M.mob_spell_list) S.cooldown_handler.revert_cast() if(M.mind) diff --git a/code/datums/spells/conjure.dm b/code/datums/spells/conjure.dm index 74f4a885e4d8..048454fbbbfe 100644 --- a/code/datums/spells/conjure.dm +++ b/code/datums/spells/conjure.dm @@ -30,7 +30,7 @@ if(delay <= 0 || do_after(user, delay, target = user)) for(var/i=0,iNo target found in range.") return diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm index ffefd1534a17..b980233a9cb2 100644 --- a/code/datums/spells/mind_transfer.dm +++ b/code/datums/spells/mind_transfer.dm @@ -50,18 +50,18 @@ Also, you never added distance checking after target is selected. I've went ahea var/mob/living/caster = user//The wizard/whomever doing the body transferring. //MIND TRANSFER BEGIN - if(caster.mind.special_verbs.len)//If the caster had any special verbs, remove them from the mob verb list. + if(length(caster.mind.special_verbs))//If the caster had any special verbs, remove them from the mob verb list. for(var/V in caster.mind.special_verbs)//Since the caster is using an object spell system, this is mostly moot. remove_verb(caster, V) //But a safety nontheless. - if(victim.mind.special_verbs.len)//Now remove all of the victim's verbs. + if(length(victim.mind.special_verbs))//Now remove all of the victim's verbs. for(var/V in victim.mind.special_verbs) remove_verb(victim, V) var/mob/dead/observer/ghost = victim.ghostize(0) caster.mind.transfer_to(victim) - if(victim.mind.special_verbs.len)//To add all the special verbs for the original caster. + if(length(victim.mind.special_verbs))//To add all the special verbs for the original caster. for(var/V in caster.mind.special_verbs)//Not too important but could come into play. add_verb(caster, V) @@ -71,7 +71,7 @@ Also, you never added distance checking after target is selected. I've went ahea caster.key = ghost.key //have to transfer the key since the mind was not active qdel(ghost) - if(caster.mind.special_verbs.len)//If they had any special verbs, we add them here. + if(length(caster.mind.special_verbs))//If they had any special verbs, we add them here. for(var/V in caster.mind.special_verbs) add_verb(caster, V) //MIND TRANSFER END diff --git a/code/datums/spells/turf_teleport.dm b/code/datums/spells/turf_teleport.dm index 936d4c3fda9c..ac20dea2ae8a 100644 --- a/code/datums/spells/turf_teleport.dm +++ b/code/datums/spells/turf_teleport.dm @@ -35,7 +35,7 @@ continue turfs += T - if(!turfs.len) + if(!length(turfs)) var/list/turfs_to_pick_from = list() for(var/turf/T in orange(target,outer_tele_radius)) if(!(T in orange(target,inner_tele_radius))) diff --git a/code/datums/uplink_items/uplink_general.dm b/code/datums/uplink_items/uplink_general.dm index 7f36a7275447..21bea123b930 100644 --- a/code/datums/uplink_items/uplink_general.dm +++ b/code/datums/uplink_items/uplink_general.dm @@ -6,7 +6,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) var/list/uplink_items = list() var/list/sales_items = list() var/newreference = 1 - if(!uplink_items.len) + if(!length(uplink_items)) var/list/last = list() for(var/path in GLOB.uplink_items) diff --git a/code/datums/weather/weather_types/ash_storm.dm b/code/datums/weather/weather_types/ash_storm.dm index 0c1407e8aed8..636dbb3dc606 100644 --- a/code/datums/weather/weather_types/ash_storm.dm +++ b/code/datums/weather/weather_types/ash_storm.dm @@ -54,7 +54,7 @@ if(!golemShuttleOnPlanet) eligible_areas -= get_areas(/area/shuttle/freegolem) - for(var/i in 1 to eligible_areas.len) + for(var/i in 1 to length(eligible_areas)) var/area/place = eligible_areas[i] if(place.outdoors) outside_areas += place diff --git a/code/game/alternate_appearance.dm b/code/game/alternate_appearance.dm index 4e6c0b052de7..b7cdb4f8d558 100644 --- a/code/game/alternate_appearance.dm +++ b/code/game/alternate_appearance.dm @@ -23,7 +23,7 @@ displayTo - a list of MOBS to show this appearance to */ /datum/alternate_appearance/proc/display_to(list/displayTo) - if(!displayTo || !displayTo.len) + if(!displayTo || !length(displayTo)) return for(var/m in displayTo) var/mob/M = m @@ -47,7 +47,7 @@ var/mob/M = m if(M.client) M.client.images -= img - if(M.viewing_alternate_appearances && M.viewing_alternate_appearances.len) + if(M.viewing_alternate_appearances && length(M.viewing_alternate_appearances)) M.viewing_alternate_appearances -= src viewers -= M @@ -94,7 +94,7 @@ if(alternate_appearances[key]) qdel(alternate_appearances[key]) alternate_appearances[key] = AA - if(displayTo && displayTo.len) + if(displayTo && length(displayTo)) display_alt_appearance(key, displayTo) diff --git a/code/game/area/areas/depot-areas.dm b/code/game/area/areas/depot-areas.dm index 8831d8089810..b9e045e1d456 100644 --- a/code/game/area/areas/depot-areas.dm +++ b/code/game/area/areas/depot-areas.dm @@ -133,7 +133,7 @@ /area/syndicate_depot/core/proc/armory_locker_looted() if(!run_finished && !used_self_destruct) - if(shield_list.len) + if(length(shield_list)) activate_self_destruct("Armory compromised despite armory shield being online.", FALSE) return declare_finished() @@ -221,7 +221,7 @@ var/obj/effect/landmark/L = thing if(L.name == "syndi_depot_bot") possible_bot_spawns |= L - if(possible_bot_spawns.len) + if(length(possible_bot_spawns)) var/obj/effect/landmark/S = pick(possible_bot_spawns) new /obj/effect/portal(get_turf(S)) var/mob/living/simple_animal/bot/ed209/syndicate/B = new /mob/living/simple_animal/bot/ed209/syndicate(get_turf(S)) @@ -345,7 +345,7 @@ SEND_SOUND(R, sound('sound/misc/notice1.ogg')) /area/syndicate_depot/core/proc/shields_up() - if(shield_list.len) + if(length(shield_list)) return for(var/thing in GLOB.landmarks_list) var/obj/effect/landmark/L = thing @@ -362,7 +362,7 @@ A.lock() /area/syndicate_depot/core/proc/shields_key_check() - if(!shield_list.len) + if(!length(shield_list)) return if(detected_mech || detected_pod || detected_double_agent) return @@ -485,7 +485,7 @@ var/list/shield_list = list() /area/syndicate_depot/perimeter/proc/perimeter_shields_up() - if(shield_list.len) + if(length(shield_list)) return for(var/turf/T in src) var/obj/machinery/shieldwall/syndicate/S = new /obj/machinery/shieldwall/syndicate(T) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c76d3d6d7f87..996ba8dd2f65 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -368,7 +368,7 @@ pass |= istype(A, type) if(!pass) continue - if(A.contents.len) + if(length(A.contents)) found += A.search_contents_for(path, filter_path) return found @@ -393,13 +393,13 @@ if(reagents) if(container_type & TRANSPARENT) . += "It contains:" - if(reagents.reagent_list.len) + if(length(reagents.reagent_list)) if(user.can_see_reagents()) //Show each individual reagent for(var/I in reagents.reagent_list) var/datum/reagent/R = I . += "[R.volume] units of [R.name]" else //Otherwise, just show the total volume - if(reagents && reagents.reagent_list.len) + if(reagents && length(reagents.reagent_list)) . += "[reagents.total_volume] units of various reagents." else . += "Nothing." @@ -845,9 +845,9 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons) /atom/proc/transfer_blood_dna(list/blood_dna) if(!blood_DNA) blood_DNA = list() - var/old_length = blood_DNA.len + var/old_length = length(blood_DNA) blood_DNA |= blood_dna - if(blood_DNA.len > old_length) + if(length(blood_DNA) > old_length) return TRUE//some new blood DNA was added //to add blood from a mob onto something, and transfer their dna info @@ -1027,7 +1027,7 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons) var/cur_x = null var/cur_y = null var/list/y_arr = null - for(cur_x in 1 to GLOB.global_map.len) + for(cur_x in 1 to length(GLOB.global_map)) y_arr = GLOB.global_map[cur_x] cur_y = y_arr.Find(src.z) if(cur_y) @@ -1155,12 +1155,12 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons) Adds an instance of colour_type to the atom's atom_colours list */ /atom/proc/add_atom_colour(coloration, colour_priority) - if(!atom_colours || !atom_colours.len) + if(!atom_colours || !length(atom_colours)) atom_colours = list() atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. if(!coloration) return - if(colour_priority > atom_colours.len) + if(colour_priority > length(atom_colours)) return atom_colours[colour_priority] = coloration update_atom_colour() @@ -1172,7 +1172,7 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons) if(!atom_colours) atom_colours = list() atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. - if(colour_priority > atom_colours.len) + if(colour_priority > length(atom_colours)) return if(coloration && atom_colours[colour_priority] != coloration) return //if we don't have the expected color (for a specific priority) to remove, do nothing @@ -1191,7 +1191,7 @@ GLOBAL_LIST_EMPTY(blood_splatter_icons) for(var/C in atom_colours) if(islist(C)) var/list/L = C - if(L.len) + if(length(L)) color = L return else if(C) diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm index 090aa51320fa..86d0448bbac7 100644 --- a/code/game/dna/dna2.dm +++ b/code/game/dna/dna2.dm @@ -126,9 +126,9 @@ GLOBAL_LIST_EMPTY(bad_blocks) SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.s_tone, 220, 1) // Value can be negative. - SetUIValueRange(DNA_UI_HEAD_MARK_STYLE, head_marks, GLOB.marking_styles_list.len, 1) - SetUIValueRange(DNA_UI_BODY_MARK_STYLE, body_marks, GLOB.marking_styles_list.len, 1) - SetUIValueRange(DNA_UI_TAIL_MARK_STYLE, tail_marks, GLOB.marking_styles_list.len, 1) + SetUIValueRange(DNA_UI_HEAD_MARK_STYLE, head_marks, length(GLOB.marking_styles_list), 1) + SetUIValueRange(DNA_UI_BODY_MARK_STYLE, body_marks, length(GLOB.marking_styles_list), 1) + SetUIValueRange(DNA_UI_TAIL_MARK_STYLE, tail_marks, length(GLOB.marking_styles_list), 1) SetUIValueRange(DNA_UI_PHYSIQUE, GLOB.character_physiques.Find(character.physique), length(GLOB.character_physiques), 1) SetUIValueRange(DNA_UI_HEIGHT, GLOB.character_heights.Find(character.height), length(GLOB.character_heights), 1) @@ -393,7 +393,7 @@ GLOBAL_LIST_EMPTY(bad_blocks) // Just checks our character has all the crap it needs. /datum/dna/proc/check_integrity(mob/living/carbon/human/character) if(character) - if(UI.len != DNA_UI_LENGTH) + if(length(UI) != DNA_UI_LENGTH) ResetUIFrom(character) if(length(struc_enzymes)!= 3 * DNA_SE_LENGTH) diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm index e8008e25ba92..b3de3a92f381 100644 --- a/code/game/dna/dna2_helpers.dm +++ b/code/game/dna/dna2_helpers.dm @@ -163,16 +163,16 @@ H.change_gender(PLURAL, FALSE) //Head Markings - var/head_marks = dna.GetUIValueRange(DNA_UI_HEAD_MARK_STYLE, GLOB.marking_styles_list.len) - if((head_marks > 0) && (head_marks <= GLOB.marking_styles_list.len)) + var/head_marks = dna.GetUIValueRange(DNA_UI_HEAD_MARK_STYLE, length(GLOB.marking_styles_list)) + if((head_marks > 0) && (head_marks <= length(GLOB.marking_styles_list))) H.m_styles["head"] = GLOB.marking_styles_list[head_marks] //Body Markings - var/body_marks = dna.GetUIValueRange(DNA_UI_BODY_MARK_STYLE, GLOB.marking_styles_list.len) - if((body_marks > 0) && (body_marks <= GLOB.marking_styles_list.len)) + var/body_marks = dna.GetUIValueRange(DNA_UI_BODY_MARK_STYLE, length(GLOB.marking_styles_list)) + if((body_marks > 0) && (body_marks <= length(GLOB.marking_styles_list))) H.m_styles["body"] = GLOB.marking_styles_list[body_marks] //Tail Markings - var/tail_marks = dna.GetUIValueRange(DNA_UI_TAIL_MARK_STYLE, GLOB.marking_styles_list.len) - if((tail_marks > 0) && (tail_marks <= GLOB.marking_styles_list.len)) + var/tail_marks = dna.GetUIValueRange(DNA_UI_TAIL_MARK_STYLE, length(GLOB.marking_styles_list)) + if((tail_marks > 0) && (tail_marks <= length(GLOB.marking_styles_list))) H.m_styles["tail"] = GLOB.marking_styles_list[tail_marks] // Physique (examine fluff) @@ -207,8 +207,8 @@ /datum/dna/proc/write_head_attributes(obj/item/organ/external/head/head_organ) //Hair - var/hair = GetUIValueRange(DNA_UI_HAIR_STYLE,GLOB.hair_styles_full_list.len) - if((hair > 0) && (hair <= GLOB.hair_styles_full_list.len)) + var/hair = GetUIValueRange(DNA_UI_HAIR_STYLE,length(GLOB.hair_styles_full_list)) + if((hair > 0) && (hair <= length(GLOB.hair_styles_full_list))) head_organ.h_style = GLOB.hair_styles_full_list[hair] head_organ.hair_colour = rgb(head_organ.dna.GetUIValueRange(DNA_UI_HAIR_R, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR_G, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR_B, 255)) @@ -223,8 +223,8 @@ head_organ.h_grad_colour = rgb(head_organ.dna.GetUIValueRange(DNA_UI_HAIR_GRADIENT_R, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR_GRADIENT_G, 255), head_organ.dna.GetUIValueRange(DNA_UI_HAIR_GRADIENT_B, 255)) //Facial Hair - var/beard = GetUIValueRange(DNA_UI_BEARD_STYLE,GLOB.facial_hair_styles_list.len) - if((beard > 0) && (beard <= GLOB.facial_hair_styles_list.len)) + var/beard = GetUIValueRange(DNA_UI_BEARD_STYLE,length(GLOB.facial_hair_styles_list)) + if((beard > 0) && (beard <= length(GLOB.facial_hair_styles_list))) head_organ.f_style = GLOB.facial_hair_styles_list[beard] head_organ.facial_colour = rgb(head_organ.dna.GetUIValueRange(DNA_UI_BEARD_R, 255), head_organ.dna.GetUIValueRange(DNA_UI_BEARD_G, 255), head_organ.dna.GetUIValueRange(DNA_UI_BEARD_B, 255)) @@ -308,8 +308,8 @@ SetUIValueRange(DNA_UI_HAIR_GRADIENT_X, head_organ.h_grad_offset_x + 16, 32, 1) SetUIValueRange(DNA_UI_HAIR_GRADIENT_Y, head_organ.h_grad_offset_y + 16, 32, 1) - SetUIValueRange(DNA_UI_HAIR_STYLE, hair, GLOB.hair_styles_full_list.len, 1) - SetUIValueRange(DNA_UI_BEARD_STYLE, beard, GLOB.facial_hair_styles_list.len, 1) + SetUIValueRange(DNA_UI_HAIR_STYLE, hair, length(GLOB.hair_styles_full_list), 1) + SetUIValueRange(DNA_UI_BEARD_STYLE, beard, length(GLOB.facial_hair_styles_list), 1) SetUIValueRange(DNA_UI_HAIR_GRADIENT_STYLE, gradient, length(GLOB.hair_gradients_list), 1) var/list/available = character.generate_valid_head_accessories() diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index cfb8f17e08a7..89b670b09756 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -351,7 +351,7 @@ /obj/machinery/computer/scan_consolenew/proc/all_dna_blocks(list/buffer) var/list/arr = list() - for(var/i = 1, i <= buffer.len, i++) + for(var/i = 1, i <= length(buffer), i++) arr += "[i]:[EncodeDNABlock(buffer[i])]" return arr @@ -468,7 +468,7 @@ data["beakerVolume"] = 0 if(connected.beaker) data["beakerLabel"] = connected.beaker.label_text ? connected.beaker.label_text : null - if(connected.beaker.reagents && connected.beaker.reagents.reagent_list.len) + if(length(connected.beaker.reagents.reagent_list)) for(var/datum/reagent/R in connected.beaker.reagents.reagent_list) data["beakerVolume"] += R.volume diff --git a/code/game/dna/mutations/disabilities.dm b/code/game/dna/mutations/disabilities.dm index f6b570d6f4db..c0140fcb7cac 100644 --- a/code/game/dna/mutations/disabilities.dm +++ b/code/game/dna/mutations/disabilities.dm @@ -435,7 +435,7 @@ var/list/words = splittext(message," ") var/list/rearranged = list() - for(var/i=1;i<=words.len;i++) + for(var/i=1;i<=length(words);i++) var/cword = pick(words) words.Remove(cword) var/suffix = copytext(cword,length(cword)-1,length(cword)) diff --git a/code/game/dna/mutations/mutation_powers.dm b/code/game/dna/mutations/mutation_powers.dm index 58a538d19af5..463b32757867 100644 --- a/code/game/dna/mutations/mutation_powers.dm +++ b/code/game/dna/mutations/mutation_powers.dm @@ -391,7 +391,7 @@ /datum/spell/eat/cast(list/targets, mob/user = usr) - if(!targets.len) + if(!length(targets)) to_chat(user, "No target found in range.") return @@ -700,8 +700,8 @@ if(H.mind && H.mind.initial_account) numbers += H.mind.initial_account.account_number numbers += H.mind.initial_account.account_pin - if(numbers.len>0) - to_chat(user, "Numbers: You sense the number[numbers.len>1?"s":""] [english_list(numbers)] [numbers.len>1?"are":"is"] important to [M.name].") + if(length(numbers)>0) + to_chat(user, "Numbers: You sense the number[length(numbers)>1?"s":""] [english_list(numbers)] [length(numbers)>1?"are":"is"] important to [M.name].") to_chat(user, "Thoughts: [M.name] is currently [thoughts].") if(M.dna?.GetSEState(GLOB.empathblock)) @@ -867,10 +867,10 @@ M.change_skin_tone(new_tone) if(M.dna.species.bodyflags & HAS_ICON_SKIN_TONE) - var/prompt = "Please select skin tone: 1-[M.dna.species.icon_skin_tones.len] (" - for(var/i = 1 to M.dna.species.icon_skin_tones.len) + var/prompt = "Please select skin tone: 1-[length(M.dna.species.icon_skin_tones)] (" + for(var/i = 1 to length(M.dna.species.icon_skin_tones)) prompt += "[i] = [M.dna.species.icon_skin_tones[i]]" - if(i != M.dna.species.icon_skin_tones.len) + if(i != length(M.dna.species.icon_skin_tones)) prompt += ", " prompt += ")" @@ -878,7 +878,7 @@ if(!new_tone) new_tone = 0 else - new_tone = max(min(round(text2num(new_tone)), M.dna.species.icon_skin_tones.len), 1) + new_tone = max(min(round(text2num(new_tone)), length(M.dna.species.icon_skin_tones)), 1) M.change_skin_tone(new_tone) //Skin colour. diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm index be7bf110aa3e..371a90bdfabb 100644 --- a/code/game/gamemodes/autotraitor/autotraitor.dm +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -32,7 +32,7 @@ traitor_prob = (num_players - (max_traitors - 1) * 10) * 10 // Stop setup if no possible traitors - if(!possible_traitors.len) + if(!length(possible_traitors)) return 0 if(GLOB.configuration.gamemode.traitor_scaling) @@ -56,7 +56,7 @@ traitor.special_role = SPECIAL_ROLE_TRAITOR traitor.restricted_roles = restricted_jobs -// if(!traitors.len) +// if(!length(traitors)) // return 0 return 1 @@ -120,7 +120,7 @@ if(prob(traitor_prob)) message_admins("Making a new Traitor.") - if(!possible_traitors.len) + if(!length(possible_traitors)) message_admins("No potential traitors. Cancelling new traitor.") traitorcheckloop() return diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index ae13b97766d6..67eb21a8aae1 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -481,7 +481,7 @@ goal_weights += initial(picked.weight) station_goals += new picked - if(station_goals.len) + if(length(station_goals)) send_station_goals_message() /datum/game_mode/proc/send_station_goals_message() diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm index 61a3e9458245..15aa4bd2ffd8 100644 --- a/code/game/gamemodes/intercept_report.dm +++ b/code/game/gamemodes/intercept_report.dm @@ -93,7 +93,7 @@ if(!man.mind) continue if(man.mind.assigned_role == man.mind.special_role) continue dudes += man - if(dudes.len==0) + if(length(dudes)==0) return null return pick(dudes) @@ -119,7 +119,7 @@ if(man.dna.species.name in SSticker.mode.protected_species) return dudes += man - for(var/i = 0, i < max(GLOB.player_list.len/10,2), i++) + for(var/i = 0, i < max(length(GLOB.player_list)/10,2), i++) dudes += pick(GLOB.player_list) return pick(dudes) diff --git a/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm index e567f5e0d52f..2502eb3e08d5 100644 --- a/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm +++ b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm @@ -35,7 +35,7 @@ for(var/datum/job/J in jobs) if(J.current_positions < 1) jobs -= J - if(jobs.len > 0) + if(length(jobs) > 0) var/datum/job/target = pick(jobs) explanation_text += " a [target.title]." else diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm index 9dc28ac372b1..f5a56423451b 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction.dm @@ -27,11 +27,11 @@ /datum/game_mode/abduction/pre_setup() possible_abductors = get_players_for_role(ROLE_ABDUCTOR) - if(!possible_abductors.len) + if(!length(possible_abductors)) return 0 abductor_teams = max(1, min(max_teams,round(num_players()/15))) - var/possible_teams = max(1,round(possible_abductors.len / 2)) + var/possible_teams = max(1,round(length(possible_abductors) / 2)) abductor_teams = min(abductor_teams,possible_teams) abductors.len = 2*abductor_teams @@ -56,7 +56,7 @@ //Team Members if(!preset_agent || !preset_scientist) - if(possible_abductors.len <=2) + if(length(possible_abductors) <=2) return 0 var/datum/mind/scientist diff --git a/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter.dm b/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter.dm index 1dce1c415ff7..3812df84a3ab 100644 --- a/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter.dm +++ b/code/game/gamemodes/miniantags/demons/slaughter_demon/slaughter.dm @@ -133,7 +133,7 @@ ..() spawn(5) var/list/demon_candidates = SSghost_spawns.poll_candidates("Do you want to play as a slaughter demon?", ROLE_DEMON, TRUE, 10 SECONDS, source = /mob/living/simple_animal/demon/slaughter/cult) - if(!demon_candidates.len) + if(!length(demon_candidates)) visible_message("[src] disappears in a flash of red light!") qdel(src) return @@ -182,7 +182,7 @@ validtargets += M - if(!validtargets.len) + if(!length(validtargets)) to_chat(usr, "There are no valid targets!") return diff --git a/code/game/gamemodes/miniantags/guardian/guardian.dm b/code/game/gamemodes/miniantags/guardian/guardian.dm index e56038057e28..0f2e2f4efaa1 100644 --- a/code/game/gamemodes/miniantags/guardian/guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/guardian.dm @@ -305,7 +305,7 @@ var/list/mob/dead/observer/candidates = SSghost_spawns.poll_candidates("Do you want to play as the [mob_name] ([guardian_type]) of [user.real_name]?", ROLE_GUARDIAN, FALSE, 10 SECONDS, source = src, role_cleanname = "[mob_name] ([guardian_type])") var/mob/dead/observer/theghost = null - if(candidates.len) + if(length(candidates)) theghost = pick(candidates) if(has_guardian(user)) to_chat(user, "You already have a [mob_name]!") diff --git a/code/game/gamemodes/miniantags/guardian/types/lightning_guardian.dm b/code/game/gamemodes/miniantags/guardian/types/lightning_guardian.dm index 34e8dd2195bc..98a0b706413f 100644 --- a/code/game/gamemodes/miniantags/guardian/types/lightning_guardian.dm +++ b/code/game/gamemodes/miniantags/guardian/types/lightning_guardian.dm @@ -35,7 +35,7 @@ var/datum/beam/B = chain if(B.target == target) return //oh this guy already HAS a chain, let's not chain again - if(enemychains.len > 2) + if(length(enemychains) > 2) var/datum/beam/C = pick(enemychains) qdel(C) enemychains -= C @@ -64,7 +64,7 @@ /mob/living/simple_animal/hostile/guardian/beam/proc/cleardeletedchains() if(summonerchain && QDELETED(summonerchain)) summonerchain = null - if(enemychains.len) + if(length(enemychains)) for(var/chain in enemychains) var/datum/cd = chain if(!chain || QDELETED(cd)) @@ -77,14 +77,14 @@ if(!summonerchain) summonerchain = Beam(summoner, "lightning[rand(1,12)]", 'icons/effects/effects.dmi', time=INFINITY, maxdistance=INFINITY, beam_type=/obj/effect/ebeam/chain) . += chainshock(summonerchain) - if(enemychains.len) + if(length(enemychains)) for(var/chain in enemychains) . += chainshock(chain) /mob/living/simple_animal/hostile/guardian/beam/proc/removechains() if(summonerchain) QDEL_NULL(summonerchain) - if(enemychains.len) + if(length(enemychains)) for(var/chain in enemychains) qdel(chain) enemychains = list() diff --git a/code/game/gamemodes/miniantags/morph/morph_event.dm b/code/game/gamemodes/miniantags/morph/morph_event.dm index 070f4a8bb1e9..4367557e3893 100644 --- a/code/game/gamemodes/miniantags/morph/morph_event.dm +++ b/code/game/gamemodes/miniantags/morph/morph_event.dm @@ -4,7 +4,7 @@ /datum/event/spawn_morph/proc/get_morph() spawn() var/list/candidates = SSghost_spawns.poll_candidates("Do you want to play as a morph?", ROLE_MORPH, TRUE, source = /mob/living/simple_animal/hostile/morph) - if(!candidates.len) + if(!length(candidates)) key_of_morph = null kill() return diff --git a/code/game/gamemodes/miniantags/revenant/revenant.dm b/code/game/gamemodes/miniantags/revenant/revenant.dm index 790fa4ee4478..ef28580d6753 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant.dm @@ -162,7 +162,7 @@ else var/list/mob/dead/observer/candidates = SSghost_spawns.poll_candidates("Do you want to play as a revenant?", poll_time = 15 SECONDS, source = /mob/living/simple_animal/revenant) var/mob/dead/observer/theghost = null - if(candidates.len) + if(length(candidates)) theghost = pick(candidates) message_admins("[key_name_admin(theghost)] has taken control of a revenant created without a mind") key = theghost.key diff --git a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm index 4eb77abb5320..227d89666dff 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_spawn_event.dm @@ -14,7 +14,7 @@ spawn() var/list/candidates = SSghost_spawns.poll_candidates("Do you want to play as a revenant?", ROLE_REVENANT, TRUE, source = /mob/living/simple_animal/revenant) - if(!candidates.len) + if(!length(candidates)) key_of_revenant = null kill() return diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 10161f7d0bff..791be28f86ce 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -34,13 +34,13 @@ var/list/possible_syndicates = get_players_for_role(ROLE_OPERATIVE) var/agent_number = 0 - if(possible_syndicates.len < 1) + if(length(possible_syndicates) < 1) return 0 if(LAZYLEN(possible_syndicates) > agents_possible) agent_number = agents_possible else - agent_number = possible_syndicates.len + agent_number = length(possible_syndicates) var/n_players = num_players() if(agent_number > n_players) @@ -115,7 +115,7 @@ break for(var/datum/mind/synd_mind in syndicates) - if(spawnpos > synd_spawn.len) + if(spawnpos > length(synd_spawn)) spawnpos = 2 synd_mind.current.loc = synd_spawn[spawnpos] synd_mind.offstation_role = TRUE @@ -151,8 +151,8 @@ var/player_tc var/remainder - player_tc = round(total_tc / GLOB.nuclear_uplink_list.len) //round to get an integer and not floating point - remainder = total_tc % GLOB.nuclear_uplink_list.len + player_tc = round(total_tc / length(GLOB.nuclear_uplink_list)) //round to get an integer and not floating point + remainder = total_tc % length(GLOB.nuclear_uplink_list) for(var/obj/item/radio/uplink/nuclear/U in GLOB.nuclear_uplink_list) U.hidden_uplink.uses += player_tc diff --git a/code/game/gamemodes/nuclear/nuclear_challenge.dm b/code/game/gamemodes/nuclear/nuclear_challenge.dm index 178399588d9b..7acb04f54727 100644 --- a/code/game/gamemodes/nuclear/nuclear_challenge.dm +++ b/code/game/gamemodes/nuclear/nuclear_challenge.dm @@ -68,8 +68,8 @@ var/player_tc var/remainder - player_tc = round(total_tc / GLOB.nuclear_uplink_list.len) //round to get an integer and not floating point - remainder = total_tc % GLOB.nuclear_uplink_list.len + player_tc = round(total_tc / length(GLOB.nuclear_uplink_list)) //round to get an integer and not floating point + remainder = total_tc % length(GLOB.nuclear_uplink_list) for(var/obj/item/radio/uplink/nuclear/U in GLOB.nuclear_uplink_list) U.hidden_uplink.uses += player_tc @@ -84,7 +84,7 @@ if(declaring_war) to_chat(user, "You are already in the process of declaring war! Make your mind up.") return FALSE - if(GLOB.player_list.len < CHALLENGE_MIN_PLAYERS) + if(length(GLOB.player_list) < CHALLENGE_MIN_PLAYERS) to_chat(user, "The enemy crew is too small to be worth declaring war on.") return FALSE if(!is_admin_level(user.z)) diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 4860096946fd..6ed2761e5c43 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -488,7 +488,7 @@ names[name] = H name_counts[name] = 1 - if(!names.len) + if(!length(names)) user.visible_message("[user]'s pinpointer fails to detect a signal.", "Your pinpointer fails to detect a signal.") return diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index 320c2578cdd6..222ff61365bb 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -121,7 +121,7 @@ GLOBAL_LIST_INIT(potential_theft_objectives, (subtypesof(/datum/theft_objective) possible_targets += possible_target - if(possible_targets.len > 0) + if(length(possible_targets) > 0) target = pick(possible_targets) SEND_SIGNAL(src, COMSIG_OBJECTIVE_TARGET_FOUND, target) diff --git a/code/game/gamemodes/setupgame.dm b/code/game/gamemodes/setupgame.dm index 66cd614b9660..f65680cad613 100644 --- a/code/game/gamemodes/setupgame.dm +++ b/code/game/gamemodes/setupgame.dm @@ -1,5 +1,5 @@ /proc/getAssignedBlock(name, list/blocksLeft, activity_bounds=DNA_DEFAULT_BOUNDS, good=0) - if(blocksLeft.len==0) + if(!length(blocksLeft)) warning("[name]: No more blocks left to assign!") return 0 var/assigned = pick(blocksLeft) @@ -129,4 +129,4 @@ warning("DNA2: Mutation [mutation.name] trying to add to already assigned gene block list (used by [english_list(GLOB.assigned_mutation_blocks[block])])") GLOB.assigned_mutation_blocks[block] = mutation - //testing("DNA2: [numsToAssign.len] blocks are unused: [english_list(numsToAssign)]") + //testing("DNA2: [length(numsToAssign)] blocks are unused: [english_list(numsToAssign)]") diff --git a/code/game/gamemodes/vampire/traitor_vamp.dm b/code/game/gamemodes/vampire/traitor_vamp.dm index 960112084045..cdb9fa1036ed 100644 --- a/code/game/gamemodes/vampire/traitor_vamp.dm +++ b/code/game/gamemodes/vampire/traitor_vamp.dm @@ -28,7 +28,7 @@ if((player.mind in possible_vampires) && (player.client.prefs.active_character.species in secondary_protected_species)) possible_vampires -= player.mind - if(possible_vampires.len > 0) + if(length(possible_vampires) > 0) for(var/I in possible_vampires) if(length(pre_vampires) >= secondary_enemies) break diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm index 3074242b50a8..a20b8d70f051 100644 --- a/code/game/gamemodes/wizard/artefact.dm +++ b/code/game/gamemodes/wizard/artefact.dm @@ -677,7 +677,7 @@ GLOBAL_LIST_EMPTY(multiverse) check_spooky()//clean out/refresh the list - if(spooky_scaries.len >= 3 && !unlimited) + if(length(spooky_scaries) >= 3 && !unlimited) to_chat(user, "This artifact can only affect three undead at a time!") return if(heresy) @@ -691,7 +691,7 @@ GLOBAL_LIST_EMPTY(multiverse) spooky_scaries |= M to_chat(M, "You have been revived by [user.real_name]!") to_chat(M, "[user.p_theyre(TRUE)] your master now, assist them even if it costs you your new life!") - desc = "A shard capable of resurrecting humans as skeleton thralls[unlimited ? "." : ", [spooky_scaries.len]/3 active thralls."]" + desc = "A shard capable of resurrecting humans as skeleton thralls[unlimited ? "." : ", [length(spooky_scaries)]/3 active thralls."]" /obj/item/necromantic_stone/proc/check_spooky() if(unlimited) //no point, the list isn't used. diff --git a/code/game/gamemodes/wizard/raginmages.dm b/code/game/gamemodes/wizard/raginmages.dm index a524a17e5bf2..f312d1f4de09 100644 --- a/code/game/gamemodes/wizard/raginmages.dm +++ b/code/game/gamemodes/wizard/raginmages.dm @@ -105,7 +105,7 @@ var/mob/dead/observer/harry = null message_admins("SWF is still pissed, sending another wizard - [max_mages - mages_made] left.") - if(!candidates.len) + if(!length(candidates)) message_admins("This is awkward, sleeping until another mage check..") making_mage = FALSE sleep(300) diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index ccff189cb7c3..f53d3f7ba96e 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -668,14 +668,14 @@ return FALSE to_chat(user, "[book] crumbles to ashes as you acquire its knowledge.") qdel(book) - else if(items_path.len) + else if(length(items_path)) var/response = tgui_alert(user, "The [src] loadout contains items that will not be refundable if bought. Are you sure this is what you want?", "No refunds!", list("No", "Yes")) if(response != "Yes") return FALSE if(!CanBuy(user, book)) to_chat(user, "You can't afford that anymore!") return FALSE - if(items_path.len) + if(length(items_path)) var/obj/item/storage/box/wizard/B = new(src) for(var/path in items_path) new path(B) @@ -881,7 +881,7 @@ dat += "" var/datum/spellbook_entry/E - for(var/i=1,i<=entries.len,i++) + for(var/i=1,i<=length(entries),i++) var/spell_info = "" E = entries[i] spell_info += E.GetInfo() diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index c0aacd4cf8ef..3bdd8468ded6 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -67,7 +67,7 @@ /datum/game_mode/wizard/declare_completion(ragin = 0) if(finished && !ragin) SSticker.mode_result = "wizard loss - wizard killed" - to_chat(world, " The wizard[(wizards.len>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!") + to_chat(world, " The wizard[(length(wizards)>1)?"s":""] has been killed by the crew! The Space Wizards Federation has been taught a lesson they will not soon forget!") ..() return TRUE diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 560c136d45e3..01d85316fb74 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -56,7 +56,7 @@ for(var/req in req_access) if(!(req in accesses)) //doesn't have this access return 0 - if(req_one_access.len) + if(length(req_one_access)) for(var/req in req_one_access) if(req in accesses) //has an access from the single access list return 1 diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 305d5f1d3792..925e8e6f4642 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -225,7 +225,7 @@ imprint_pda(H) - if(gear_leftovers.len) + if(length(gear_leftovers)) for(var/datum/gear/G in gear_leftovers) var/atom/placed_in = H.equip_or_collect(G.spawn_item(null, H.client.prefs.active_character.loadout_gear[G.display_name])) if(istype(placed_in)) diff --git a/code/game/jobs/job/silicon_jobs.dm b/code/game/jobs/job/silicon_jobs.dm index a1ab1e683ec8..9fdfc71b5f70 100644 --- a/code/game/jobs/job/silicon_jobs.dm +++ b/code/game/jobs/job/silicon_jobs.dm @@ -17,7 +17,7 @@ return FALSE /datum/job/ai/is_position_available() - return (GLOB.empty_playable_ai_cores.len != 0) + return (length(GLOB.empty_playable_ai_cores) != 0) /datum/job/cyborg title = "Cyborg" diff --git a/code/game/jobs/job_exp.dm b/code/game/jobs/job_exp.dm index ae9667593de4..d60339f08e69 100644 --- a/code/game/jobs/job_exp.dm +++ b/code/game/jobs/job_exp.dm @@ -176,7 +176,7 @@ GLOBAL_LIST_INIT(role_playtime_requirements, list( if(!GLOB.configuration.jobs.enable_exp_tracking) return "Tracking is disabled in the server configuration file." var/list/play_records = params2list(prefs.exp) - if(!play_records.len) + if(!length(play_records)) return "[key] has no records." var/return_text = "