From b3b2da1bbdb25e8be69298dda62fc104e57912b7 Mon Sep 17 00:00:00 2001 From: ihatethisengine <115417687+ihatethisengine@users.noreply.github.com> Date: Sat, 22 Jun 2024 07:12:13 +0300 Subject: [PATCH 001/141] Simple animals don't block projectiles after death anymore (#6522) # About the pull request Simple animals don't block projectiles after death anymore # Explain why it's good for the game SADARing a rat corpse is fun but only a few times. # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: ihatethisengine2 fix: simple animals don't block projectiles after death anymore /:cl: --- code/__DEFINES/mobs.dm | 1 + code/modules/mob/living/simple_animal/friendly/mouse.dm | 1 + code/modules/mob/living/simple_animal/simple_animal.dm | 3 +++ 3 files changed, 5 insertions(+) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index dbd8dbe7ce41..77f2393e6542 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -380,5 +380,6 @@ GLOBAL_LIST_INIT(default_xeno_onmob_icons, list( #define MOBILITY_LIEDOWN (1<<8) #define MOBILITY_FLAGS_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND) +#define MOBILITY_FLAGS_LYING_CAPABLE_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND | MOBILITY_LIEDOWN) #define MOBILITY_FLAGS_CARBON_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND | MOBILITY_REST | MOBILITY_LIEDOWN) #define MOBILITY_FLAGS_REST_CAPABLE_DEFAULT (MOBILITY_MOVE | MOBILITY_STAND | MOBILITY_REST | MOBILITY_LIEDOWN) diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index b76935c4c158..182bc2525c17 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -77,6 +77,7 @@ src.icon_dead = "mouse_[body_color]_splat" src.icon_state = "mouse_[body_color]_splat" layer = ABOVE_LYING_MOB_LAYER + set_body_position(LYING_DOWN) if(client) client.time_died_as_mouse = world.time diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index caf47b2824bb..652ee4c44024 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -56,6 +56,8 @@ black_market_value = 25 dead_black_market_value = 0 + mobility_flags = MOBILITY_FLAGS_LYING_CAPABLE_DEFAULT + /mob/living/simple_animal/Initialize() . = ..() SSmob.living_misc_mobs += src @@ -210,6 +212,7 @@ SSmob.living_misc_mobs -= src icon_state = icon_dead black_market_value = dead_black_market_value + set_body_position(LYING_DOWN) /mob/living/simple_animal/gib(datum/cause_data/cause = create_cause_data("gibbing", src)) From 9cbd43e0b404d645d2b144726cb7b7a923c54f66 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 22 Jun 2024 05:16:58 +0100 Subject: [PATCH 002/141] Automatic changelog for PR #6522 [ci skip] --- html/changelogs/AutoChangeLog-pr-6522.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6522.yml diff --git a/html/changelogs/AutoChangeLog-pr-6522.yml b/html/changelogs/AutoChangeLog-pr-6522.yml new file mode 100644 index 000000000000..e7f1af56ac95 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6522.yml @@ -0,0 +1,4 @@ +author: "ihatethisengine2" +delete-after: True +changes: + - bugfix: "simple animals don't block projectiles after death anymore" \ No newline at end of file From c6e3e4132a3bdae7a81c9c8ea6a64cf27531aa8c Mon Sep 17 00:00:00 2001 From: iloveloopers <140007537+iloveloopers@users.noreply.github.com> Date: Sat, 22 Jun 2024 00:12:23 -0400 Subject: [PATCH 003/141] custom research chemicals with an intensityfire above or equal to 50 will now burn white (#6521) # About the pull request title # Explain why it's good for the game warns the player of the high damage flame super cool OB looking white flame very cool # Testing Photographs and Procedure https://github.com/cmss13-devs/cmss13/assets/140007537/484f7045-cd5e-45da-9822-b587cec7ea5d # Changelog :cl: balance: Custom research chemicals with an intensityfire above or equal to 50 will now burn white. /:cl: --- code/modules/projectiles/gun_attachables.dm | 2 +- code/modules/reagents/chemistry_properties/prop_positive.dm | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/code/modules/projectiles/gun_attachables.dm b/code/modules/projectiles/gun_attachables.dm index d1aff8a33969..92eabd62daa2 100644 --- a/code/modules/projectiles/gun_attachables.dm +++ b/code/modules/projectiles/gun_attachables.dm @@ -3235,7 +3235,7 @@ Defined in conflicts.dm of the #defines folder. ammo_datum.flamer_reagent_id = flamer_reagent.id P.generate_bullet(ammo_datum) P.icon_state = "naptha_ball" - P.color = flamer_reagent.color + P.color = flamer_reagent.burncolor P.hit_effect_color = flamer_reagent.burncolor P.fire_at(target, user, user, max_range, AMMO_SPEED_TIER_2, null) var/turf/user_turf = get_turf(user) diff --git a/code/modules/reagents/chemistry_properties/prop_positive.dm b/code/modules/reagents/chemistry_properties/prop_positive.dm index bbbb7f27639f..0f51b816d034 100644 --- a/code/modules/reagents/chemistry_properties/prop_positive.dm +++ b/code/modules/reagents/chemistry_properties/prop_positive.dm @@ -728,6 +728,11 @@ holder.durationfire = max(holder.durationfire, 1) holder.intensityfire = max(holder.intensityfire, 1) + if(holder.intensityfire >= 50 && istype(holder, /datum/reagent/generated)) + holder.burncolor = "#ffffff" + else + holder.burncolor = holder.color + /datum/chem_property/positive/fire/fueling name = PROPERTY_FUELING code = "FUL" From e907aed5d626a801aed80410e12ddbe044c7810f Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 22 Jun 2024 05:24:25 +0100 Subject: [PATCH 004/141] Automatic changelog for PR #6521 [ci skip] --- html/changelogs/AutoChangeLog-pr-6521.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6521.yml diff --git a/html/changelogs/AutoChangeLog-pr-6521.yml b/html/changelogs/AutoChangeLog-pr-6521.yml new file mode 100644 index 000000000000..9e951e645e8e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6521.yml @@ -0,0 +1,4 @@ +author: "iloveloopers" +delete-after: True +changes: + - balance: "Custom research chemicals with an intensityfire above or equal to 50 will now burn white." \ No newline at end of file From ec590dfac63fc55643def930600f9dd1e6f67a12 Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Sat, 22 Jun 2024 12:22:34 -0700 Subject: [PATCH 005/141] Fix hiding in the LZ walls (#6517) # About the pull request This PR is a follow up to #6363 extending gas into dense turfs if they aren't hull walls. # Explain why it's good for the game Fixes #6516 # Testing Photographs and Procedure
Screenshots & Videos ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/58f3d522-9763-4ad9-9e71-31bcd76d7d0e) ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/de09d9ac-f1ce-4d96-b9ba-d9d97c33d026)
# Changelog :cl: Drathek fix: Fixed LZ gas not penetrating destructible walls /:cl: --- code/game/gamemodes/colonialmarines/colonialmarines.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/game/gamemodes/colonialmarines/colonialmarines.dm b/code/game/gamemodes/colonialmarines/colonialmarines.dm index 526e4b4bc2b9..796bf71c3a8e 100644 --- a/code/game/gamemodes/colonialmarines/colonialmarines.dm +++ b/code/game/gamemodes/colonialmarines/colonialmarines.dm @@ -225,7 +225,11 @@ continue for(var/turf/turf in area) if(turf.density) - continue + if(!istype(turf, /turf/closed/wall)) + continue + var/turf/closed/wall/wall = turf + if(wall.hull) + continue lz_smoke += new /obj/effect/particle_effect/smoke/miasma(turf, null, new_cause_data) ///Clears miasma smoke in landing zones From 982e4feb1991fe47e64fed7d33ce05ac56729de6 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Sat, 22 Jun 2024 20:26:52 +0100 Subject: [PATCH 006/141] Automatic changelog for PR #6517 [ci skip] --- html/changelogs/AutoChangeLog-pr-6517.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6517.yml diff --git a/html/changelogs/AutoChangeLog-pr-6517.yml b/html/changelogs/AutoChangeLog-pr-6517.yml new file mode 100644 index 000000000000..e5f733bd2989 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6517.yml @@ -0,0 +1,4 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fixed LZ gas not penetrating destructible walls" \ No newline at end of file From 31e1ffbacbed8194287286d1092e16456592539b Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 23 Jun 2024 01:20:23 +0000 Subject: [PATCH 007/141] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-6517.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6521.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6522.yml | 4 ---- html/changelogs/archive/2024-06.yml | 8 ++++++++ 4 files changed, 8 insertions(+), 12 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-6517.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6521.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6522.yml diff --git a/html/changelogs/AutoChangeLog-pr-6517.yml b/html/changelogs/AutoChangeLog-pr-6517.yml deleted file mode 100644 index e5f733bd2989..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6517.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Fixed LZ gas not penetrating destructible walls" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6521.yml b/html/changelogs/AutoChangeLog-pr-6521.yml deleted file mode 100644 index 9e951e645e8e..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6521.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "iloveloopers" -delete-after: True -changes: - - balance: "Custom research chemicals with an intensityfire above or equal to 50 will now burn white." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6522.yml b/html/changelogs/AutoChangeLog-pr-6522.yml deleted file mode 100644 index e7f1af56ac95..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6522.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "ihatethisengine2" -delete-after: True -changes: - - bugfix: "simple animals don't block projectiles after death anymore" \ No newline at end of file diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml index fee8c5d01853..e43d1aa00938 100644 --- a/html/changelogs/archive/2024-06.yml +++ b/html/changelogs/archive/2024-06.yml @@ -232,3 +232,11 @@ - balance: Vampire tail jab now only stuns if you knockback an enemy into an obstacle. - spellcheck: Vampire lurkers no longer "throw it back" after hitting somebody with their Tail Jab +2024-06-23: + Drathek: + - bugfix: Fixed LZ gas not penetrating destructible walls + ihatethisengine2: + - bugfix: simple animals don't block projectiles after death anymore + iloveloopers: + - balance: Custom research chemicals with an intensityfire above or equal to 50 + will now burn white. From e3e59ff704dbda5812d64b9280f288014b69f4ac Mon Sep 17 00:00:00 2001 From: private-tristan <54422837+private-tristan@users.noreply.github.com> Date: Wed, 26 Jun 2024 22:59:28 -0400 Subject: [PATCH 008/141] removes facehugger plasma (#6558) # About the pull request Facehuggers have no plasma, their abilities don't use plasma, they don't have any reason to have plasma, just HUD clutter. # Explain why it's good for the game # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: qol: Facehuggers no longer show as having any plasma /:cl: --- code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm b/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm index b5f8bdd17213..9d42eb982d2e 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Facehugger.dm @@ -1,8 +1,8 @@ /datum/caste_datum/facehugger caste_type = XENO_CASTE_FACEHUGGER tier = 0 - plasma_gain = 0.1 - plasma_max = 10 + plasma_gain = XENO_PLASMA_GAIN_TIER_1 + plasma_max = XENO_NO_PLASMA melee_damage_lower = 5 melee_damage_upper = 5 max_health = XENO_HEALTH_LARVA From 0573603a11817e9db2ea0a2e946d22fe1f027051 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 27 Jun 2024 04:03:47 +0100 Subject: [PATCH 009/141] Automatic changelog for PR #6558 [ci skip] --- html/changelogs/AutoChangeLog-pr-6558.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6558.yml diff --git a/html/changelogs/AutoChangeLog-pr-6558.yml b/html/changelogs/AutoChangeLog-pr-6558.yml new file mode 100644 index 000000000000..bc921a138301 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6558.yml @@ -0,0 +1,4 @@ +author: "private-tristan" +delete-after: True +changes: + - qol: "Facehuggers no longer show as having any plasma" \ No newline at end of file From e9bd7872cbd02b97eff4d2e4dbff0d5cebc48f7a Mon Sep 17 00:00:00 2001 From: ColdIronWarrior Date: Wed, 26 Jun 2024 23:13:15 -0400 Subject: [PATCH 010/141] some grammar fixes on xeno bioscan announcement (#6555) # About the pull request removes a space, replaces a period with a colon since it's an address # Explain why it's good for the game formatting errors make me :( the spacing was right on the second half of the bioscan for xenos but not the first idk # Testing Photographs and Procedure how it is ![image](https://github.com/cmss13-devs/cmss13/assets/29965103/4bd02923-4851-4b44-b1d2-512d861b7a9f) how it could be ![image](https://github.com/cmss13-devs/cmss13/assets/29965103/73afb84a-2be6-48a8-bf04-a15cec70b97c) # Changelog :cl: spellcheck: fixed a few typos in the xeno bioscan announcement /:cl: Co-authored-by: nefarious <72267018+nefarious6th@users.noreply.github.com> --- code/game/bioscans.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/bioscans.dm b/code/game/bioscans.dm index 5be3c9fbe3fd..edd0b174212d 100644 --- a/code/game/bioscans.dm +++ b/code/game/bioscans.dm @@ -151,7 +151,7 @@ GLOBAL_DATUM_INIT(bioscan_data, /datum/bioscan_data, new) var/planet_location = "[marines_on_planet && marine_planet_location ? ", including one in [marine_planet_location]" : ""]" var/title = SPAN_XENOANNOUNCE("The Queen Mother reaches into your mind from worlds away.") - var/content = SPAN_XENOANNOUNCE("To my children and their Queen. I sense [metalhive_hosts] host[plural] in the metal hive [metalhive_location] and [planet_hosts] scattered elsewhere[planet_location].") + var/content = SPAN_XENOANNOUNCE("To my children and their Queen: I sense [metalhive_hosts] host[plural] in the metal hive[metalhive_location] and [planet_hosts] scattered elsewhere[planet_location].") log_game("BIOSCAN: Queen Mother bioscan completed. [content]") /// Shout it at everyone From 6402de8141aa1705e05535739f499e7cfaed630e Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 27 Jun 2024 04:18:07 +0100 Subject: [PATCH 011/141] Automatic changelog for PR #6555 [ci skip] --- html/changelogs/AutoChangeLog-pr-6555.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6555.yml diff --git a/html/changelogs/AutoChangeLog-pr-6555.yml b/html/changelogs/AutoChangeLog-pr-6555.yml new file mode 100644 index 000000000000..ed55fd0f3534 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6555.yml @@ -0,0 +1,4 @@ +author: "coldironwarrior" +delete-after: True +changes: + - spellcheck: "fixed a few typos in the xeno bioscan announcement" \ No newline at end of file From 4a68696367fba14282f0746a01c11380e237a8b7 Mon Sep 17 00:00:00 2001 From: Kozmos <31109792+HeresKozmos@users.noreply.github.com> Date: Thu, 27 Jun 2024 04:19:36 +0100 Subject: [PATCH 012/141] Trijent Mapping Fix (#6493) # About the pull request Fills in a random hole in the wall. # Explain why it's good for the game I think this was a map oversight or an unfinished easter egg? It's just a random hole in the wall with nothing in it - I'm mostly removing this because Burrowers can potentially burrow in and hide there, basically being impossible to find. It serves no purpose so I don't see why it should stay. # Changelog :cl: maptweak: Filled in a hole in the map. /:cl: --- maps/map_files/DesertDam/Desert_Dam.dmm | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/maps/map_files/DesertDam/Desert_Dam.dmm b/maps/map_files/DesertDam/Desert_Dam.dmm index ec598eebd59c..0c8e8c275bbe 100644 --- a/maps/map_files/DesertDam/Desert_Dam.dmm +++ b/maps/map_files/DesertDam/Desert_Dam.dmm @@ -421,9 +421,6 @@ dir = 8 }, /area/desert_dam/exterior/valley/valley_labs) -"abt" = ( -/turf/open/desert/rock, -/area/desert_dam/exterior/rock) "abu" = ( /obj/effect/blocker/toxic_water, /turf/open/gm/river/desert/shallow_edge{ @@ -57199,9 +57196,6 @@ }, /turf/open/asphalt, /area/desert_dam/exterior/river/riverside_south) -"dTI" = ( -/turf/open/desert/rock, -/area/desert_dam/building/hydroponics/hydroponics_breakroom) "dTK" = ( /obj/effect/decal/cleanable/dirt, /turf/open/asphalt/cement_sunbleached{ @@ -92967,8 +92961,8 @@ dTs dTs dTs dTs -dTI -dTI +dTs +dTs cPL cTk cTO @@ -93201,8 +93195,8 @@ dTs dTs dTs dTs -dTI -dTI +dTs +dTs cPL cTl cTO @@ -93436,7 +93430,7 @@ dTs dTs dTs dTs -abt +dTs cPL cTm cTO From 7d183f6af858846fd144c580be9de37135f1e9f8 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 27 Jun 2024 04:24:20 +0100 Subject: [PATCH 013/141] Automatic changelog for PR #6493 [ci skip] --- html/changelogs/AutoChangeLog-pr-6493.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6493.yml diff --git a/html/changelogs/AutoChangeLog-pr-6493.yml b/html/changelogs/AutoChangeLog-pr-6493.yml new file mode 100644 index 000000000000..57d67e75aca3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6493.yml @@ -0,0 +1,4 @@ +author: "HeresKozmos" +delete-after: True +changes: + - maptweak: "Filled in a hole in the map." \ No newline at end of file From 835ac351f7dd5c8b85cd1bf2c8baa6db453bb53b Mon Sep 17 00:00:00 2001 From: Kozmos <31109792+HeresKozmos@users.noreply.github.com> Date: Thu, 27 Jun 2024 04:21:19 +0100 Subject: [PATCH 014/141] Fixes Mapping Error on Sorokyne (#6494) # About the pull request Patches a hole in the area of the easter egg room. # Explain why it's good for the game It's another error in the map which Burrowers can use to hide OOB as you can burrow onto the one tile that has the wrong area applied. # Changelog :cl: maptweak: Fixed an area in the easter egg section of Sorokyne /:cl: --- maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm b/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm index db1f07a8b3b1..12b8bb793c40 100644 --- a/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm +++ b/maps/map_files/Sorokyne_Strata/Sorokyne_Strata.dmm @@ -30513,9 +30513,6 @@ icon_state = "darkyellowfull2" }, /area/strata/ag/exterior/research_decks) -"eqV" = ( -/turf/closed/wall/wood, -/area/strata/ag/interior/mountain) "era" = ( /obj/structure/machinery/power/apc{ dir = 1; @@ -30535,9 +30532,6 @@ /obj/structure/barricade/snow, /turf/open/auto_turf/ice/layer2, /area/strata/ag/exterior/north_lz_caves) -"esJ" = ( -/turf/open/auto_turf/snow/brown_base/layer4, -/area/strata/ag/interior/mountain) "euc" = ( /obj/structure/platform_decoration/strata{ dir = 4 @@ -46384,8 +46378,8 @@ aac aac aac aac -esJ -eqV +byi +lAc mhc qxi wfE From 44dfc7904ed47b07369809c9f248b4106e2edec5 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 27 Jun 2024 04:31:45 +0100 Subject: [PATCH 015/141] Automatic changelog for PR #6494 [ci skip] --- html/changelogs/AutoChangeLog-pr-6494.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6494.yml diff --git a/html/changelogs/AutoChangeLog-pr-6494.yml b/html/changelogs/AutoChangeLog-pr-6494.yml new file mode 100644 index 000000000000..cf50283ef6a2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6494.yml @@ -0,0 +1,4 @@ +author: "HeresKozmos" +delete-after: True +changes: + - maptweak: "Fixed an area in the easter egg section of Sorokyne" \ No newline at end of file From 9ecc2d503d35c75aa0d50f77f128691ae726a4e3 Mon Sep 17 00:00:00 2001 From: kiVts <48099872+kiVts@users.noreply.github.com> Date: Wed, 26 Jun 2024 23:32:45 -0400 Subject: [PATCH 016/141] splits the two vars in research datums (#6507) # About the pull request Splits the two vars of init argument and the behavior, should have been like that from the very start. # Explain why it's good for the game less potential runtimes # Testing Photographs and Procedure
Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
` tags.
# Changelog :cl: code: Prevented potential unintended behavior with research upgrade items on initialize /:cl: --- code/__DEFINES/misc.dm | 3 +- code/datums/research_upgrade_datum.dm | 51 ++++++++++++------- .../chemistry_machinery/xenomorph_analyzer.dm | 9 ++-- 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index bea1d7975688..cf6d6c64d9a9 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -163,9 +163,10 @@ #define MATRIX_NVG 1 #define MATRIX_WIDE 2 -#define RESEARCH_UPGRADE_NULL null +#define RESEARCH_UPGRADE_NOTHING_TO_PASS null #define RESEARCH_UPGRADE_EXCLUDE_BUY -2 #define RESEARCH_UPGRADE_CATEGORY -1 //lord forgive me +#define RESEARCH_UPGRADE_ITEM 1 #define RESEARCH_UPGRADE_TIER_1 1 #define RESEARCH_UPGRADE_TIER_2 2 #define RESEARCH_UPGRADE_TIER_3 3 diff --git a/code/datums/research_upgrade_datum.dm b/code/datums/research_upgrade_datum.dm index 8b19bafad1cd..fd571afdfcf0 100644 --- a/code/datums/research_upgrade_datum.dm +++ b/code/datums/research_upgrade_datum.dm @@ -3,8 +3,10 @@ var/name = "Upgrade." ///name of upgrades, not items. Items are at research_upgrades.dm somewhere in item folder. var/desc = "something is broken. yippee!!" - ///which behavior should this type follow. Should this be completely excluded from the buy menu? should it be one of the dropdown options? This is also what gets passed to the initizialize of an item, this can be any number *but* it cannot be -1 or -2, as it messes with the buy menu. + ///which behavior should this type follow. Should this be completely excluded from the buy menu? should it be one of the dropdown options? or a normal item? var/behavior = RESEARCH_UPGRADE_EXCLUDE_BUY // should this be on the list? + //This is what gets passed to the initizialize of an item, RESEARCH_UPGRADE_NOTHING_TO_PASS to not pass anything. + var/on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS /// the price of the upgrade, refer to this: 500 is a runner, 8k is queen. T3 is usually 3k, woyer is 2k. var/value_upgrade = 1000 /// actual path to the item.(upgrade) @@ -33,28 +35,32 @@ /datum/research_upgrades/machinery/autodoc/internal_bleed name = "AutoDoc Internal Bleeding Repair" desc = "A data and instruction set for the AutoDoc, making it capable of rapidly fixing internal bleeding." - behavior = RESEARCH_UPGRADE_TIER_1 + on_init_argument = RESEARCH_UPGRADE_TIER_1 + behavior = RESEARCH_UPGRADE_ITEM value_upgrade = 200 clearance_req = 1 /datum/research_upgrades/machinery/autodoc/broken_bone name = "AutoDoc Bone Fracture Repair" desc = "A data instruction set for the AutoDoc, making it capable of setting fractures and applying bonegel." - behavior = RESEARCH_UPGRADE_TIER_2 + on_init_argument = RESEARCH_UPGRADE_TIER_2 + behavior = RESEARCH_UPGRADE_ITEM value_upgrade = 2000 clearance_req = 3 /datum/research_upgrades/machinery/autodoc/organ_damage name = "AutoDoc Broken Organ Repair" desc = "A data and instruction set for the AutoDoc, making it capable of fixing organ damage." - behavior = RESEARCH_UPGRADE_TIER_3 + on_init_argument = RESEARCH_UPGRADE_TIER_3 + behavior = RESEARCH_UPGRADE_ITEM value_upgrade = 1500 clearance_req = 2 /datum/research_upgrades/machinery/autodoc/larva_removal name = "AutoDoc Embryo Removal" desc = "Data and instruction set for AutoDoc making it mildly proficient in removing parasites left by unknown organism." - behavior = RESEARCH_UPGRADE_TIER_4 + on_init_argument = RESEARCH_UPGRADE_TIER_4 + behavior = RESEARCH_UPGRADE_ITEM value_upgrade = 4000 clearance_req = 6 @@ -62,7 +68,8 @@ /datum/research_upgrades/machinery/sleeper name = "Sleeper Upgrade" desc = "Research upgrade for Sleeper system, technology on this disk is used on a sleeper to allow wider spectrum of chemicals to be administered, as well as upgrading dialysis software." - behavior = RESEARCH_UPGRADE_TIER_1 + on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS + behavior = RESEARCH_UPGRADE_ITEM value_upgrade = 500 item_reference = /obj/item/research_upgrades/sleeper upgrade_type = ITEM_MACHINERY_UPGRADE @@ -77,7 +84,8 @@ desc = "Sell the data acquired to the nearest Weyland-Yutani Science division team for 8 or 9 points." value_upgrade = 2000 item_reference = /obj/item/research_upgrades/credits - behavior = RESEARCH_UPGRADE_TIER_1 + on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS + behavior = RESEARCH_UPGRADE_ITEM upgrade_type = ITEM_ACCESSORY_UPGRADE change_purchase = 500 maximum_price = 5000 @@ -88,7 +96,8 @@ desc = "An advanced, robust version of the normal scalpel, allowing it to pierce through thick skin and chitin alike with extreme ease." value_upgrade = 3000 item_reference = /obj/item/tool/surgery/scalpel/laser/advanced - behavior = RESEARCH_UPGRADE_TIER_1 + on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS + behavior = RESEARCH_UPGRADE_ITEM upgrade_type = ITEM_ACCESSORY_UPGRADE clearance_req = 3 @@ -97,7 +106,8 @@ desc = "A true extension of the surgeon's body, this marvel instantly and completely prepares an incision, allowing for the immediate commencement of therapeutic steps." value_upgrade = 3000 item_reference = /obj/item/tool/surgery/scalpel/manager - behavior = RESEARCH_UPGRADE_TIER_1 + on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS + behavior = RESEARCH_UPGRADE_ITEM upgrade_type = ITEM_ACCESSORY_UPGRADE clearance_req = 4 @@ -109,7 +119,8 @@ change_purchase = -200 minimum_price = 200 item_reference = /obj/item/stack/medical/splint/nano/research - behavior = RESEARCH_UPGRADE_TIER_5 //adjust this to change amount of nanosplints in a stack, cant be higher than five, go change max_amount in the nanosplint itself, then change it. + on_init_argument = RESEARCH_UPGRADE_TIER_5 //adjust this to change amount of nanosplints in a stack, cant be higher than five, go change max_amount in the nanosplint itself, then change it. + behavior = RESEARCH_UPGRADE_ITEM upgrade_type = ITEM_ACCESSORY_UPGRADE /datum/research_upgrades/item/flamer_tank @@ -121,7 +132,8 @@ minimum_price = 100 maximum_price = 1000 item_reference = /obj/item/ammo_magazine/flamer_tank/custom/upgraded - behavior = RESEARCH_UPGRADE_NULL + on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS + behavior = RESEARCH_UPGRADE_ITEM upgrade_type = ITEM_ACCESSORY_UPGRADE /datum/research_upgrades/item/flamer_tank/smoke @@ -142,7 +154,8 @@ name = "Universal Translator Plate" desc = "A uniform-attachable plate capable of translating any unknown language heard by the wearer." value_upgrade = 2000 - behavior = RESEARCH_UPGRADE_TIER_1 + on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS + behavior = RESEARCH_UPGRADE_ITEM clearance_req = 6 upgrade_type = ITEM_ARMOR_UPGRADE item_reference = /obj/item/clothing/accessory/health/research_plate/translator @@ -152,7 +165,8 @@ name = "Active Blood Coagulator Plate" desc = "A uniform-attachable plate capable of coagulating any bleeding wounds the user possesses." value_upgrade = 1200 - behavior = RESEARCH_UPGRADE_TIER_1 + on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS + behavior = RESEARCH_UPGRADE_ITEM clearance_req = 2 change_purchase = -200 minimum_price = 200 @@ -164,7 +178,8 @@ desc = "A medical plate with two buttons on the sides and a hefty chemical tank. Attached to a uniform and on a simultaneous press, it injects an emergency dose of medical chemicals much larger than a normal emergency autoinjector. Single time use and is recycled in biomass printer. Features overdose protection." value_upgrade = 250 clearance_req = 1 - behavior = RESEARCH_UPGRADE_TIER_1 + on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS + behavior = RESEARCH_UPGRADE_ITEM change_purchase = -100 minimum_price = 100 upgrade_type = ITEM_ARMOR_UPGRADE @@ -175,7 +190,8 @@ desc = "A strong trauma plate, able to protect the user from a large amount of bullets. Completely useless against sharp objects." value_upgrade = 500 clearance_req = 4 - behavior = RESEARCH_UPGRADE_TIER_1 + on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS + behavior = RESEARCH_UPGRADE_ITEM upgrade_type = ITEM_ARMOR_UPGRADE change_purchase = -50 minimum_price = 200 @@ -183,10 +199,11 @@ /datum/research_upgrades/armor/preservation name = "Death Preservation Plate" - desc = "preservation plate which activates once the user is dead, uses variety of different substances and sensors to slow down the decay and increase the time before the user is permanently dead, due to small tank of preservatives, it needs to be replaced on each death. Extends time to permadeath by around four minutes." + desc = "Preservation plate which activates once the user is dead, uses variety of different substances and sensors to slow down the decay and increase the time before the user is permanently dead, due to small tank of preservatives, it needs to be replaced on each death. Extends time to permadeath by around four minutes." value_upgrade = 500 clearance_req = 4 - behavior = RESEARCH_UPGRADE_TIER_1 + on_init_argument = RESEARCH_UPGRADE_NOTHING_TO_PASS + behavior = RESEARCH_UPGRADE_ITEM upgrade_type = ITEM_ARMOR_UPGRADE change_purchase = -100 minimum_price = 100 diff --git a/code/modules/reagents/chemistry_machinery/xenomorph_analyzer.dm b/code/modules/reagents/chemistry_machinery/xenomorph_analyzer.dm index 5bf6561b28f4..62ceb37386ff 100644 --- a/code/modules/reagents/chemistry_machinery/xenomorph_analyzer.dm +++ b/code/modules/reagents/chemistry_machinery/xenomorph_analyzer.dm @@ -96,7 +96,7 @@ data["upgrades"] += list(list( "name" = capitalize_first_letters(upgrade.name), "desc" = upgrade.desc, - "vari" = upgrade.behavior, + "vari" = upgrade.on_init_argument, "cost" = price_adjustment, "ref" = upgrade.item_reference, "category" = upgrade.upgrade_type, @@ -158,7 +158,7 @@ upgrade = datum_upgrades if(upgrade.behavior == RESEARCH_UPGRADE_CATEGORY || upgrade.behavior == RESEARCH_UPGRADE_EXCLUDE_BUY) continue - if(produce_path == upgrade.item_reference && upgrade.behavior == variation) + if(produce_path == upgrade.item_reference && upgrade.on_init_argument == variation) path_exists = TRUE break if(!path_exists) @@ -178,5 +178,8 @@ /obj/structure/machinery/xenoanalyzer/proc/print_upgrade(produce_path, variation) busy = FALSE - new produce_path(get_turf(src), variation) + if(variation != RESEARCH_UPGRADE_NOTHING_TO_PASS) + new produce_path(get_turf(src), variation) + return + new produce_path(get_turf(src)) From 50a30bf765c9ead22049d8146faa9179aeb55078 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 27 Jun 2024 04:37:17 +0100 Subject: [PATCH 017/141] Automatic changelog for PR #6507 [ci skip] --- html/changelogs/AutoChangeLog-pr-6507.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6507.yml diff --git a/html/changelogs/AutoChangeLog-pr-6507.yml b/html/changelogs/AutoChangeLog-pr-6507.yml new file mode 100644 index 000000000000..7153d4e603a2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6507.yml @@ -0,0 +1,4 @@ +author: "kiVts" +delete-after: True +changes: + - code_imp: "Prevented potential unintended behavior with research upgrade items on initialize" \ No newline at end of file From efb085859757716b3670c0e3d5be66b890537a2b Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Thu, 27 Jun 2024 06:42:14 -0700 Subject: [PATCH 018/141] Fix OD lint errors (#6566) # About the pull request This PR fixes these messages for the OD lint: ``` Warning OD1002 at code/__pragmas.dm:15:26: Warning 'TooManyArguments' does not exist Error OD0000 at code/datums/global_variables.dm:127:30: attempt to reference r-value Error OD0000 at code/datums/global_variables.dm:369:44: attempt to reference r-value ``` `TooManyArguments` was replaced with `InvalidArgumentCount` which should already be an error. The other two errors are regarding initial not working on globals, which it does not appear to. # Explain why it's good for the game Passing checks is good. # Testing Photographs and Procedure
Screenshots & Videos ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/22a4520c-555d-4d03-971d-703b4bb6197e)
# Changelog No player facing changes. --- code/__pragmas.dm | 1 - code/datums/global_variables.dm | 10 ---------- 2 files changed, 11 deletions(-) diff --git a/code/__pragmas.dm b/code/__pragmas.dm index 39c14e1bbc95..84fcc0dfc307 100644 --- a/code/__pragmas.dm +++ b/code/__pragmas.dm @@ -12,7 +12,6 @@ #pragma SoftReservedKeyword error #pragma DuplicateVariable error #pragma DuplicateProcDefinition error -#pragma TooManyArguments error #pragma PointlessParentCall error #pragma PointlessBuiltinCall error #pragma SuspiciousMatrixCall error diff --git a/code/datums/global_variables.dm b/code/datums/global_variables.dm index 953f42f1723f..53e9c0391e17 100644 --- a/code/datums/global_variables.dm +++ b/code/datums/global_variables.dm @@ -118,15 +118,11 @@ /client/proc/debug_global_variable(name, value, level) var/html = "" - var/change = 0 //to make the value bold if changed if(!(admin_holder.rights & R_DEBUG)) return html html += "
  • EC " - if(value != initial(global.vars[name])) - html += "" - change = 1 if (isnull(value)) html += "[name] = null" @@ -175,8 +171,6 @@ else html += "[name] = [value]" - if(change) - html += "" html += "
  • " @@ -353,7 +347,6 @@ if(admin_holder && admin_holder.marked_datum) possible_classes += "marked datum" possible_classes += "edit referenced object" - possible_classes += "restore to default" class = tgui_input_list(usr, "What kind of variable?","Variable Type", possible_classes) if(!class) @@ -365,9 +358,6 @@ mod_list(global.vars[variable]) return - if("restore to default") - global.vars[variable] = initial(global.vars[variable]) - if("edit referenced object") return .(global.vars[variable]) From 6dfc611e0d9d494078df0aa7f60437631999b7af Mon Sep 17 00:00:00 2001 From: Drathek <76988376+Drulikar@users.noreply.github.com> Date: Thu, 27 Jun 2024 09:52:12 -0700 Subject: [PATCH 019/141] Fix hotkeys menu crash + New/Fixed keybind support (#6565) # About the pull request This PR fixes a crash when using the search by key feature in the Keybinds window when the panel is filtered, and maps a bunch of keys to byond bindings. Of note, there are three locations remapping keys: https://github.com/cmss13-devs/cmss13/blob/master/tgui/packages/tgui/interfaces/KeyBinds.jsx#L14-L26 https://github.com/cmss13-devs/cmss13/blob/master/tgui/packages/common/keys.ts#L20-L39 https://github.com/cmss13-devs/cmss13/blob/master/code/_globalvars/lists/client.dm#L7-L23 Since the first two are as they are on TG, I opted to update the third one which seems to be unique to our codebase # Explain why it's good for the game Fixes various keybinds (namely keypad stuff), adds a bunch of new keybinds (media keys), and fixes a tgui crash. Fixes: ![image](https://github.com/cmss13-devs/cmss13/assets/76988376/8c4dd0ba-7185-4f45-a089-c8ee6edf06b7) # Testing Photographs and Procedure
    Screenshots & Videos ![hotkeys](https://github.com/cmss13-devs/cmss13/assets/76988376/404483f5-9ea3-43e3-8c35-26e6e73d99fc)
    # Changelog :cl: Drathek fix: Fixed a crash in the Hotkey menu when searching by key when filtered fix: Fixed/Added support for various keys (e.g. keypad and media keys) /:cl: --------- Co-authored-by: harryob <55142896+harryob@users.noreply.github.com> --- code/_globalvars/lists/client.dm | 26 ++++++++++++++++++++-- tgui/packages/tgui/interfaces/KeyBinds.jsx | 14 ++++++++---- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/code/_globalvars/lists/client.dm b/code/_globalvars/lists/client.dm index 78f3a20da424..404e8a662e80 100644 --- a/code/_globalvars/lists/client.dm +++ b/code/_globalvars/lists/client.dm @@ -6,20 +6,42 @@ GLOBAL_LIST_EMPTY(keybindings_by_name) // This is a mapping from JS keys to Byond - ref: https://keycode.info/ GLOBAL_LIST_INIT(_kbMap, list( "UP" = "North", + "ARROWUP" = "North", "RIGHT" = "East", + "ARROWRIGHT" = "East", "DOWN" = "South", + "ARROWDOWN" = "South", "LEFT" = "West", + "ARROWLEFT" = "West", "INSERT" = "Insert", "HOME" = "Northwest", "PAGEUP" = "Northeast", - "DEL" = "Delete", + "DEL" = "Delete", // Unlikely this is correct now + "DELETE" = "Delete", "END" = "Southwest", "PAGEDOWN" = "Southeast", "SPACEBAR" = "Space", "ENTER" = "Return", "ALT" = "Alt", "SHIFT" = "Shift", - "CONTROL" = "Ctrl" + "CONTROL" = "Ctrl", + "MULTIPLY" = "Multiply", + "DIVIDE" = "Divide", + "SUBTRACT" = "Subtract", + "ADD" = "Add", + "DECIMAL" = "Decimal", + "CLEAR" = "Center", + "PAUSE" = "Pause", + "CONTEXTMENU" = "Apps", + "NUMLOCK" = "Numlock", + "SCROLLLOCK" = "Scroll", + "MEDIANEXTTRACK" = "MediaNext", + "MEDIAPLAYPAUSE" = "MediaPlayPause", + "MEDIASTOP" = "MediaStop", + "MEDIAPREVIOUSTRACK" = "MediaPrev", + "VOLUMEMUTE" = "VolumeMute", + "VOLUMEUP" = "VolumeUp", + "VOLUMEDOWN" = "VolumeDown", )) ///List of ckeys that have seen a blurb of a given key. diff --git a/tgui/packages/tgui/interfaces/KeyBinds.jsx b/tgui/packages/tgui/interfaces/KeyBinds.jsx index 3022d3077d3b..b09a36e67dae 100644 --- a/tgui/packages/tgui/interfaces/KeyBinds.jsx +++ b/tgui/packages/tgui/interfaces/KeyBinds.jsx @@ -92,10 +92,16 @@ export const KeyBinds = (props) => { if (!targetEntry) { return; } - // If a keybind was found, scroll to the first match. - document - .getElementById(targetEntry[0]) - .scrollIntoView(); + // If a keybind was found, scroll to the first match currently rendered. + for (let i = 0; i < targetEntry.length; i++) { + const element = document.getElementById( + targetEntry[i], + ); + if (element) { + element.scrollIntoView(); + break; + } + } }} /> From d303404af198c6e2625cda2e061adcd54fde9b71 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 27 Jun 2024 17:56:45 +0100 Subject: [PATCH 020/141] Automatic changelog for PR #6565 [ci skip] --- html/changelogs/AutoChangeLog-pr-6565.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6565.yml diff --git a/html/changelogs/AutoChangeLog-pr-6565.yml b/html/changelogs/AutoChangeLog-pr-6565.yml new file mode 100644 index 000000000000..26ed76a815cf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6565.yml @@ -0,0 +1,5 @@ +author: "Drathek" +delete-after: True +changes: + - bugfix: "Fixed a crash in the Hotkey menu when searching by key when filtered" + - bugfix: "Fixed/Added support for various keys (e.g. keypad and media keys)" \ No newline at end of file From d4a93eff3aea809084f02c949e231e8bdcea18b7 Mon Sep 17 00:00:00 2001 From: Git-Nivrak <59925169+Git-Nivrak@users.noreply.github.com> Date: Thu, 27 Jun 2024 20:06:56 +0300 Subject: [PATCH 021/141] Fixes drawing weapons when knocked down (#6569) # About the pull request Prevents you from drawing weapons when you are knocked down # Explain why it's good for the game When you draw a weapon and are knocked down it will simply drop the weapon since you can't hold it which is pretty annoying. # Testing Photographs and Procedure
    Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
    ` tags.
    # Changelog :cl: fix: Fixes being able to draw weapons when knocked down /:cl: Co-authored-by: harryob <55142896+harryob@users.noreply.github.com> --- code/modules/projectiles/gun_helpers.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/gun_helpers.dm b/code/modules/projectiles/gun_helpers.dm index c4cce7c5f996..9fe8c1ee46be 100644 --- a/code/modules/projectiles/gun_helpers.dm +++ b/code/modules/projectiles/gun_helpers.dm @@ -530,7 +530,7 @@ DEFINES in setup.dm, referenced here. /mob/living/carbon/human/verb/holster_verb(unholster_number_offset = 1 as num) set name = "holster" set hidden = TRUE - if(usr.is_mob_incapacitated(TRUE) || usr.is_mob_restrained()) + if(usr.is_mob_incapacitated(TRUE) || usr.is_mob_restrained() || IsKnockDown() || HAS_TRAIT_FROM(src, TRAIT_UNDENSE, LYING_DOWN_TRAIT)) to_chat(src, SPAN_WARNING("You can't draw a weapon in your current state.")) return From 4fff70a7c6e0d786dd86b6c3595ba5e9e60a3c2b Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Thu, 27 Jun 2024 18:11:36 +0100 Subject: [PATCH 022/141] Automatic changelog for PR #6569 [ci skip] --- html/changelogs/AutoChangeLog-pr-6569.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6569.yml diff --git a/html/changelogs/AutoChangeLog-pr-6569.yml b/html/changelogs/AutoChangeLog-pr-6569.yml new file mode 100644 index 000000000000..991b2ab3fadc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6569.yml @@ -0,0 +1,4 @@ +author: "Git-Nivrak" +delete-after: True +changes: + - bugfix: "Fixes being able to draw weapons when knocked down" \ No newline at end of file From 29d93a39ce7dfac85b33198bd9486688e85d72da Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 28 Jun 2024 01:16:19 +0000 Subject: [PATCH 023/141] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-6493.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6494.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6507.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6555.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6558.yml | 4 ---- html/changelogs/AutoChangeLog-pr-6565.yml | 5 ----- html/changelogs/AutoChangeLog-pr-6569.yml | 4 ---- html/changelogs/archive/2024-06.yml | 16 ++++++++++++++++ 8 files changed, 16 insertions(+), 29 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-6493.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6494.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6507.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6555.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6558.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6565.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-6569.yml diff --git a/html/changelogs/AutoChangeLog-pr-6493.yml b/html/changelogs/AutoChangeLog-pr-6493.yml deleted file mode 100644 index 57d67e75aca3..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6493.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "HeresKozmos" -delete-after: True -changes: - - maptweak: "Filled in a hole in the map." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6494.yml b/html/changelogs/AutoChangeLog-pr-6494.yml deleted file mode 100644 index cf50283ef6a2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6494.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "HeresKozmos" -delete-after: True -changes: - - maptweak: "Fixed an area in the easter egg section of Sorokyne" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6507.yml b/html/changelogs/AutoChangeLog-pr-6507.yml deleted file mode 100644 index 7153d4e603a2..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6507.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kiVts" -delete-after: True -changes: - - code_imp: "Prevented potential unintended behavior with research upgrade items on initialize" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6555.yml b/html/changelogs/AutoChangeLog-pr-6555.yml deleted file mode 100644 index ed55fd0f3534..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6555.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "coldironwarrior" -delete-after: True -changes: - - spellcheck: "fixed a few typos in the xeno bioscan announcement" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6558.yml b/html/changelogs/AutoChangeLog-pr-6558.yml deleted file mode 100644 index bc921a138301..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6558.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "private-tristan" -delete-after: True -changes: - - qol: "Facehuggers no longer show as having any plasma" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6565.yml b/html/changelogs/AutoChangeLog-pr-6565.yml deleted file mode 100644 index 26ed76a815cf..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6565.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Drathek" -delete-after: True -changes: - - bugfix: "Fixed a crash in the Hotkey menu when searching by key when filtered" - - bugfix: "Fixed/Added support for various keys (e.g. keypad and media keys)" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-6569.yml b/html/changelogs/AutoChangeLog-pr-6569.yml deleted file mode 100644 index 991b2ab3fadc..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6569.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Git-Nivrak" -delete-after: True -changes: - - bugfix: "Fixes being able to draw weapons when knocked down" \ No newline at end of file diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml index e43d1aa00938..4075db8b6a2c 100644 --- a/html/changelogs/archive/2024-06.yml +++ b/html/changelogs/archive/2024-06.yml @@ -240,3 +240,19 @@ iloveloopers: - balance: Custom research chemicals with an intensityfire above or equal to 50 will now burn white. +2024-06-28: + Drathek: + - bugfix: Fixed a crash in the Hotkey menu when searching by key when filtered + - bugfix: Fixed/Added support for various keys (e.g. keypad and media keys) + Git-Nivrak: + - bugfix: Fixes being able to draw weapons when knocked down + HeresKozmos: + - maptweak: Filled in a hole in the map. + - maptweak: Fixed an area in the easter egg section of Sorokyne + coldironwarrior: + - spellcheck: fixed a few typos in the xeno bioscan announcement + kiVts: + - code_imp: Prevented potential unintended behavior with research upgrade items + on initialize + private-tristan: + - qol: Facehuggers no longer show as having any plasma From a2b9cd73414cc0ff26254ae4c08b6ea402ca739f Mon Sep 17 00:00:00 2001 From: Blundir <100090741+Blundir@users.noreply.github.com> Date: Tue, 2 Jul 2024 10:07:44 +0300 Subject: [PATCH 024/141] Larva aesthetic update (#6439) # About the pull request Adds movement sprites to larva, tweaks some standing ones to fit better to the movement. Adds unique sound to larva talking. Sprites by mossymothling (discord tag) # Testing Photographs and Procedure
    Screenshots & Videos https://github.com/cmss13-devs/cmss13/assets/100090741/af0b0e14-de82-4102-a669-a7c822101428 ![dreamseeker_ZdgaRTIPF2](https://github.com/cmss13-devs/cmss13/assets/100090741/6ddf2080-36e7-4823-8be3-1a4f0023120a)
    # Changelog :cl: soundadd: larva talking sounds imageadd: larva moving sprites, tweak of standing ones /:cl: --- code/game/sound.dm | 2 ++ .../living/carbon/xenomorph/castes/Larva.dm | 1 + icons/mob/xenos/larva.dmi | Bin 4499 -> 17108 bytes sound/voice/larva_talk1.ogg | Bin 0 -> 38081 bytes sound/voice/larva_talk2.ogg | Bin 0 -> 31617 bytes sound/voice/larva_talk3.ogg | Bin 0 -> 44540 bytes sound/voice/larva_talk4.ogg | Bin 0 -> 49994 bytes 7 files changed, 3 insertions(+) create mode 100644 sound/voice/larva_talk1.ogg create mode 100644 sound/voice/larva_talk2.ogg create mode 100644 sound/voice/larva_talk3.ogg create mode 100644 sound/voice/larva_talk4.ogg diff --git a/code/game/sound.dm b/code/game/sound.dm index 29c471f06e9d..d63e4a1b0c18 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -324,6 +324,8 @@ S = pick('sound/effects/alien_resin_move1.ogg','sound/effects/alien_resin_move2.ogg') if("alien_talk") S = pick('sound/voice/alien_talk.ogg','sound/voice/alien_talk2.ogg','sound/voice/alien_talk3.ogg') + if("larva_talk") + S = pick('sound/voice/larva_talk1.ogg','sound/voice/larva_talk2.ogg','sound/voice/larva_talk3.ogg','sound/voice/larva_talk4.ogg') if("hiss_talk") S = pick('sound/voice/hiss2.ogg','sound/voice/hiss3.ogg','sound/voice/hiss4.ogg') if("alien_growl") diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm b/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm index a3e856c7fc67..8dc427e2c55e 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Larva.dm @@ -37,6 +37,7 @@ crit_health = -25 gib_chance = 25 mob_size = MOB_SIZE_SMALL + speaking_noise = "larva_talk" base_actions = list( /datum/action/xeno_action/onclick/xeno_resting, /datum/action/xeno_action/watch_xeno, diff --git a/icons/mob/xenos/larva.dmi b/icons/mob/xenos/larva.dmi index d07dad82ed297f620a485bd09f6559b1afc8f27f..72cfb7b4e318bc9d129e55ba7b228eea098d1ff3 100644 GIT binary patch literal 17108 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 IZ65yr0Lcuj`~Uy| literal 4499 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 A2><{9 literal 0 HcmV?d00001 diff --git a/sound/voice/larva_talk2.ogg b/sound/voice/larva_talk2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e59f0e693259a5b7c4e99f3c4e1ff24d9a698398 GIT binary patch literal 31617 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

    _e%BzGa_g)`kfp8&KesqCL z>5nodFvk;YI=F-|mUU}vexC3sZDW1Pgpgd2lrs(!rvj6nXs{}G?Ao=GQKllfXM-&z z&~B`~qgBd|9xfNzw1EM3b+^`e^z&17Mx7^zTwj{Z3rlW9}5=I$KCdsgn%JILaA-Hi0+E6wsqIOyW8Du-|Ox<@B7R-o-=-sj5Bxs_kVw1 zSH1hXlTEu#M!j<_dNIa4!W|o^*gaBU@W|wMVwPw(6f1Vsis+iBc2{kwyCZRycvN|^ zaEN8Pt08ko6lT&-Hw4M|U}sWbpDE8rruZD&IO?-mvF4HE`6E}2na(b8)>^Y2cK8iZ zR<~4%aMu!3QDu_@uBtO;NEsV6%02n&fVK}3H32exFxj$Pp!r_aAc%YWLHeQF8g9M6 z_XE>d0W&w{M)N`^@y>WHQ@5M1=cs`V09s>L;?P?NfLtZS0_~k|LrE!sW+25wtUdw} zqWiLJcxOc1gK3;rfPJW$#so(vOnNv`3Be`}xE>NAUc!`G$nI#0fsX>}+G&eCP!JMv zGXyiw5Xp=fP@O8yf=j9Uo#eyLB9dl8qQy@p!}Ll-7fs>0{S>7%t4tmR%2?zyrJs>^ zRI-nxM~75eUBolUU)3M3Bf`CCD-B6_3_209dnA51dH5h&Yrhhd-AYF<`X|Mq52h^< zGRQL7D{ewf8iO&@uZub9kb@dF=u{vP&^IYUghlm@c0@=({#gVGQ-LCSN)fFxbv8zb z<1jeUQiQCbUO~chU01FQjz?4du}V!&sV+3tKHjTeuGD08B59DdTAa4f+>-irm}*I> zeX%x_^n&!l94N783AIse$$rhIoPMBVi*feMF`Tkbd9W!RD?OTK#W!D58m#F>xBZ)~ zh?bS!)uKZq%Ck5`Qi(v3BeR4^OflWFvKqK7-Z8UG$=!gG8pMIL78XT2U1NK*(NKe} zkXAk2fBBE*Z$K3jN9s1iTpWWNC2p6{o>%6dpCc<`t-;rH_|>lav=1Zf9@Fma`}tj1m`^& z=u62Ao-kZ!%;t-vALPWIJ6}(PFwbl20;=xX=ekV`j>1n$vuE|hV9K3Qc{WrOxs7vy zxkK%nCt}JL*tO!AC@P;E35C$(cLV%c-o$7DZ`Qo4r|d42IuBTdA9Z&0tsg0vtLrgm z58@rHvINfT{P4)#aOY%v@NmLY5B#CM`<0vtan(p+%G5x2ZG_pFqK~zHWxcno2{;p2 zrnttRaM(-7+zWTzN4BlllASZnt65UcP@pgGqcshtIPwURjIF>JbEPH;zuVX(a23rM1DqaLb4#hz`S+4r1POIE@=!fvfr~RjQTEM0hRbbb_jighA zQZA!_U5*EO5wV57(tQw1er6Pqs$r;A%7%tPV9FL?$r|44J}9HI%Md0`Kci5gP#P#A zAWXgp+UYA|g5|6>#oD|oY4~EDQ7LYq>)+1uAt{iC!ijpuK`~m6ZDg@Dm>&qYLb&0+ zhfER`+3G3CfY(D`CDfWTRAxJ^1VC(pc891%5YB{N)#lEi$TQyDS=Z=6Xb{#Z%c)q$ zQnuLUC$oBkh9N+JQeLwBpqR0UK}mnHhxWpkA~}cXGuw7bTGGwU8FBuhEv^j6*arP`{fvRiQ#9#hp|dOF)tLHE`T|lz@=Qkx)1~KC?mC@Q6ZRL ztwt+=ekP@!h?2J`J9=g5L9!_S(6CuLqp{LD?jqx3T3p$W;&pJDx86c}duQDg*T8D= z#IHZ;i;t>d#jj^jmC7kQ@DGs-UHW5oRncuZGgoTQ%GufBEfzvKQoXz`gvZ)pvPx*v z%p;sYFfXig@X!?;i7~wDck8d@{7@IH_|SlImXg=n#uXRO1nA!=)mchLw1heYut0VGUYGsg2&C4C_(!ITqhIz^@F*L zw6&ZKJa7Eds|?!GcLL zsc(IS^TIxrU-~w*>8%exsg7OWUbOe?1o3b8z2mnfv1;Imxtcph@n=U*hX&R%FPF-P zYFC>Q{VvL60fR^8x);`V4>*?Zj8gfG1g8yl2rKXT!^O@0`bH>p#q9_rMnq;=dXIiN z-loOyCOlbh15lrFQxVZ150fD}l;uH64K{yvn^0@5wWQ8AH%M53KK%iR{p#APS2jeI z=;D_zRId5Omrpu6<+ohFt6E6$1&$q$N#v8WRfG007L*v037U!*CQYqFEO(4)UE9NHy2a57H3B?C(;6BL-bXE@= zt;tMwixu*c&}17i1?UJs?!yA>X+rDD@n;3gOC@F@tA#qA!wyLQ;V}>fz;P7&^n-Qn z{L}fub6f9jD~Vm3aaQ@}rP9NbWrxppi7zJd2bar=oP`BL3x&aVWUo3)$0m3ap<2H? zOLx2kWU8s4}`AB%{( zu~?3bsGktSnF6N_hE$(-(kWQ&1Y!H6KErnD{p_uPS z3h667M0o0V8gaeApOQl}DzK2GP=>O6jfxT=a2wWl&k~JxNKF$f@(w2yO)W0jfFB`ZDfiVrD)F7naJ()Cck{|^f1}E_FgbEuqVuwxB zWNbYY1Yi`S7zh+4+D`kGqVF&sY%V~O$|sT`Vm%$mi#c*r7-G|j57>sr`+^u~K9kEwp>D?OaYnH?@L3?=sc&6?*M?bwp-;A|gr)|I+( z+A;f7$<&Wc%#WJdMh9-Z9N19100Rm7YO8}GHG)i0e0ptlngdcO?W`!w7_>X;liv$_7jejacJ48&b$J z-%f`E^~Oe3vGd_imv=;@Z9D$owrT$FemZa?wc)Pu*yJ_6OWf9dCp9x~Y}R|LZfT&pxD++D=2!|*t5m5Xu#6o6OCIVWPq)1htFbI&ecAq+W&^u#-6KJWI?!`GHodu6 zs#>l=1vfH!U%zdSw>^gFa>^_<`&WpU z?%W#StK}SL=Bu&!v;A|9yRULdrzyPPs%?49e53I4kHdkOG$EKI8|WY}gxPgI7satf zEEVD_x&8|D8kzJEa2k=K&RQ8m%3(kBC5i3{sZ^OvD7CXWQPmoIvRIeQaYbA&2By&J z^ym&=&@EYYUl1((|FQCTv@a%-|9}v%n1Ytadk+dO_MPtQvO0VE+IxFiT8}m~x4h>% z1rdqFpMDyOWge)w)LQrP;Fh3WZ?eBx+Pj+j%gq-g^I!IyS9VFtb{#$vv(>PBZCSyc z56tdTecxT?pvz%h*uP4r$@686k%QM91$Xj!&Qi968$2?Qxgr0^8~nkqyva{h$_z~g zQz6a~uviBp)m|tHI_G8Bd??`ZvI5`H0>c7o0N$D_Ro=JC(N5y zl;y2jlL(dNzqo76Os>DC@_$lW8sV~4qb%#(@Nr|ha!4_<>Y^AI-+A-vtxxy~y5v+p z)B^=(c(MpzNs>_i#vRenqBFkcTPDPN4{E!F;xu!oLLP`KJqT3}HX=28PLuX@VH8uu zj=q@`r>TSwVENO6Hsi__DQP|I;ZN2(YDW(lcvrD&+cozKN&?Elg8$cfLffo-Z?;^iP!S{~^mXkV5#aF(*&%eGpy%B+&cJ zVIuOt!#ysSuf>ChM=3EIecaYcsW%-FSZEjolvFV#q$=5|JPsl>;uaz#I;%cod)#VC z9jRa}LEMWWZ}zvNoY0fWJp>LU|0*9T-E;r95C52bpz-;{WZ&44pH7`f`^sCjz}z~S zA6u5a%J)XBqp(Q6`^m6eIk#hfd|vYH;m>y`I&VbPGD%!Nb~h|63^IN^GCe%-aq>mZ z2{;_3^)(eZ3(mHIjG}S^iCiqCOwSa!wXhiKvLAMmB^p>uygf30BND`zg4+LF*%7GJ zKA9CKV=Nm|aR5ToRkyM$+~Pv1CSfB1{B z!H!xOSurZ)51wvog7>sswze;{&sZ4-@cHv2p)qb4tKwX}fILwKcPsA%BK>|SsJ>D} zVt#f)XB&Bdx3_j+n}DDxLT$BnNW?M>*a%$1K~{W61B8e+18&7ZKt7{rKPg(+Z-@W2 zA0C}M`a$aEo;W#`Gv{XW{`LLrCBOJrk1YmA{#3PjuY6PH>rn?&uKxC`wyoE1S2@C} z?31!RzA}e#tgUH_K69)pO%p7P1DvgG&y#l`<}o#9_Q-}%l)}`uXV}Ij+9X8zeWGr$ z3o8hMZgmj~3Wq_myiKDt+x!kvDI*6>noh=wb&8pYErU&q`D?udHVXtvWP$sSKmYpb zOx(BAbu+4jpZ=az+y37XP-QeRYV?iHmf=rJ+8jQ#mU-9rBC%VqAuB1hqvqwt3X zciu>wYI{s>?Txxp1!VkhK9f>pNRpfD4Z|E z8#?P9jdsCgAt}bxkP<{`LJqB@OL7cHfe=D{h>TS&G7C8z1}gOE*e6rU?eIhtpojF@}34TAr=FK0H8o8d~6-u7FGy>fP!-k9M6dmBcOd|*!R}Qe+vQEpS z23DN%CLsj(OdG?Mc)R^D&}iVbS9_$;dk&mELAn?*q2UaL3_tl?A8~BU=A9ks+BO8q z(JG-VB!;v0t^Ge%B`p2Ww);?M!6%RZ`LxXU{hH68k1{9B#@&WtXV}I3(U&x-A#-=T z?Z#2RIShE(*P^)nZlTqrQlbG@jyV6u`16J0g^RX3b_%R07N#ghS=z!J^pq?-2e@*noeZjO-i(U zF3vNAN)q0>ulmiYzo@T7?auj2!pputCH=f|_xRq;>e#Xcvs|}fsC#}Yt}%Pd>ZZw} zqT}6wHh)%$(*5Rz0^S@?!@Hcj0u@?HFBHgPLClgX>InoB&2^ZV?=qsN@Cls1ve>7{ zaP?uf;}ij{tGJ9cIS!OKvO-bP8G-U^^sNxlDp!eX5!e=s#L)7yC?KgK9~r}YL>54;7Xr2MUy!EGFfnHrX7at2*6(4^b!o*ZgbY3y@*v$KKz#O!(0YA-C<6E$Fwx+ib-_uC!I z>i>#}0MN!q)PdSMSv&2*_bqnP5Dk~4mS#)PKK({r2u*#D=!MFr67q8l0Oj)~#s`{mx*k^eIhj8)05+`t4nXGg6i zXeu8l+n`BoHR6FD-ARuThpA0ArHPYNGOgzU^(Kc%r4W>|S;l_HAieSqys=G1XnqCqF-|og;2|0zz z|9S`BBzQ$f$lFCPKmYZQ-%B12%2kK1*Mxue+fTNwEsKCuPkwFy#~$dnDk>4dosWEd zLLh8^IsgIhBPoQa{v@C$hPTY2#t?rRI+3hb7KJzg5bxVJ8%2LUk73i4+6;Rzn6?2R z*P1NkK&u)yiE{W1Mf4J;WdaWeji^V!yx~{Uom-}N&a8A`&k@0^=TZFxI{;1tHXXvW8TEEjLm3!z-} zUG%tI-`s_wXe=)iCWj@R3)s7R@zPTN2WK6fpRry^{BG+r!)N)c_*>;eiPp(^a{=$I zC!<{6hBeM0_Mj2+?f~oxsiMX9!U3++F&UINfG_ecS8tp1{23fg6LLIe6Xx~efi4Xc z_A7Bwxai95AgJxK;YD%)dHi`{w0mH=;Nz4l9aVOrHJ4mtx3m@bd(<-I=pum%#drhl6&>6tR2s`{ zSfpPlryVbpQLz?#giC>|C6D4+$?ABPS3_xorj#;UN}Xo94v|5*C(@)_-z@^B9m59W zd(W2vcD(KS`^PUOZaDs7^}eMGCqEl1{_)Ol#y-DwJ*<`c{?p&Q>7P>}Iab3SG47f4 z%nvUd7w3PmE45dbq8FTAu$T`QZcg!mcSzlYW6qH`>0mlVV%iuGy!D;gc%6E3Gyw|b z2~GBhBgS0Nx+;Wc<8@`^uW?*EFOE3h8ge-$c}~w@y1uwUixCF4=PidMv| zk*#gW(p~1BnEN2{1aqw5>EA&j`@)5*FTZ+bJSZ--@66l7F?1MwB>`9~KZU9@bTvWu zr|nv~hBlL82Vtl1>d6_fmgHAoxow)hDpNWpMFc-m2^|q8f6NZ<7xGr9;nK_-A>(lM zv3#{;oZ?O0{|;)VU0|hML92&x1cDTHyV)OjWLAr*m9=vi_3MwHG)AH(cwJxe{su*oc*V|*~-aPCWYIl0-WIy7C zb~odq(3WDMUv1~xW)I|IA9Su0F4CRQ!M^CTh(P&NQiLRn<6lQYJ8OkT3^M^RIOlY5 zOQw@x+~B@i1VL!1Y--T55ltr-kmY8j$4-+aSSQUT<&c~4LnSvuko(Y-y98BGKmobZ z3Nftqw{Q-HfNKBvs5TbHl(nS$xw6S4R=gSF2Ske()XT+SFn`5X`8n-A+mxe(|L)(1vN1{tJLKi;JQ)AGGX5+Hgi*_kk9`<;_m3R@fp4dh zUs1bB}3dXAg0VDHX+*$`H#UH z{gy2xiC?e(a4kR!zy;mJsIWUr5L*Q~5lw7jheImudk|l#kKwq5Rb!MGXxF%4Fejdc zUG6EmL?uESko$%#Ao&n#VA4-M;$>uSKjyEr`RN>drnBEI1vaS^0EJNOHwCEj)agbX zW_y7;Ihd+zE`RbaYP#y=g1yv z7Yj8+rA8dIQxcFZ^@Ir1G+DrgbtyJ-)JB_DLw3+5jU1h~61ZmMVOm-Z$fF*LCnQiW zoLf^n*Qqqc9!2y`1xf5f*SEOh9_i`{i!6YY%*c|vkQ$e~1FK0+ab9U58o9YkWUK>) zK#E;ycimo&_izvkCA$gxyjE74&N{QM;(k{3cIHM?fEdLkh7@ah9Jiky_-#YO2Muqg z3}9jY%vc=Eyh6HG5+uS&#)3>tNb^M+BWne-?Ozc{1FQ-?RBBCd_L)7Tnm~#xCuB zS5r>`9rh491LfUF4W>jBW22JDcQTr#);VP?3|sWw z!(kI`$|j&GR!p%Rt65usZ3P43CLQgW^2z!67^xU6ar_HcR8?I(F0X*(M6heF^)BKt0bz+0 zz;KrlAcCnwaf_XAv+9Ki)WH++F*Bu@Z3#kuSP{X4s_&x+g(aI}Sh^W#??v`$Bru_5 zvI}Q1>{6B=V0mEvSs<;c2lQ28h~!8u!T{;QSe8>=2iFKJ96?|XA_GeBBbS~X2 zAY!44@NaG)+dMCbwIX(#Kd&BgZrmmV1Vy_WJ1SHU?C>vM97-P*1Ys)asrF+VesS|j z|G~JPH%d*=bc2pu(+R?#gierS&9M|&Pre2-p_36 zp374L!UsQ54(L3q0S9YB8w3A6`vP+&-*-scGx1TQ6)7*-S#S%SVg<}UKf7@xNwuBR zn_Qjn&YIVEH|Rqcj3rZOelWtD@C}>po;7*n8%GL*Utsj&+B|3qvQCz%V~xA#y*_>R znt{H#9Tmfc)*A+=d$K!_L*;Ksyu8|MVyNYJMrp?+I-i}KsfXziBlgMKE@^)7U}-^V zz7HW2=6KnIlb*7cFEAj5!II*%;OyX(lijr)W_egFTFZc`(_3DmX{8JD`BI>5s=NAm z`{9Yvs$a_Q@b<^+7{1Ex)Ej*Rb7c!g!~iO0MMTZEx9uH1??mN`TMA_zH$y6x>bVcK z*mP2PEts}I^c3^qNuu&a$gjqMQ~^>4qYX(2cY`F9s7Uo$01;C0zy{MiP=+wIo(rW+ zmWUFd^bm>&V6Lac!szttuG`0SLbwuY!IqRTEi7&c!-VXyycoacVz5KVfl4U?>yvBI zod%ois;L>X;PC5F@l+jI(g|Di2y> zjEE>Ejy6?Bb#s+H&6tYDIwM4)Xr-?k5?m7m?GI5hrhQ83G0kXoC>)7!XoTU-SWFmI z8P%2rm69Al-Fo!mCP?biV}P->&Jpp_|0(`b#_=3(el=j|R>u5$bz6Q`njSNAtIXET zUXBB<&(gY>1weN9vLNlV#-Qt_Hn{W^D&NbRkl2}nDk%N1$LG<(UaRtYsBUOk+FW_e zn6Z}1$!$r7v@kH`y!bYN2Ennc&dp00dOXpE8?o#ma}i9(FfIJO zFL)#YChu^R9Q{_ghL8v3e(lL8U{rK%Db;b&Jd$7-${(3X4X7U(aF^zivpdLy%voYk zYAx`Y*FC5LVD=W4o2etQ(pxGzbim!;7oe+txlfdz%@}stHJ^QY-M<~CK4(6uiq3a- zciRu~S4HrL%rE7}X2B(ViXkjO{}P2xhkEFDDW1(kD2&Xf2x|vZh9` zpihbvmT+Kpf>w*`L01%iu~|OuWMYcP&ZTeBK0_NdOo|tI)VTnPY`ZjkPdOS7Q6nF4qBr>hV=W3;DFu{r0*3re^d~*<7{`H-L}_d@w_(EN*k4UzR0T*U*EnGC@BO& zs9hN;O2Rgd#$dQgG!KU4r+RCFn-a15D*3oxk$6+ZH;#vrAl-&;U0jSBgX`wp?(o}E($q+7j zv@(M+CseEogja)GDG1RgVtW|)K;)+t3A)TGg7eGDpSY%=>pO}bcR^CBw4{Ujt{bBhs(#(UcjgC$#a-4v9;x>!Wu-)RjM~a0)O)EZZ1o!I*K6FZE zpiBl)xhSC2LjUzOuG>;A1_>!411yyPA?-SnHsRksAdW0WpG!VXpWS=vYi`KLr;3wG z@80;!FU38V7D|tISLIEb{c8K?p&=`C*cm{#_4ItTH&k3!Y2=)M%+uN#bdX8-hZTl# zm_P{osHHjuj{vM14 zmT+7uiR@QJEOtzxcP zGxySJEpu1dND7&;hXY9U$5C@78!s?bnVP#s3oB4Nw8#H|Z$qx@0@$2yd{sBSsg<^Z%IK*sg=9vYMQ zbI1e6uX+~`WT-c2zAW6|V*Pq`z|*RZ{K1pv>e2$=%htI|j!A2sVfD)|N5nlfA9h=N zOD`BRWir^2NG}(hw0{-PY2gZN^%EE^3PM;YhOZpfKvsfRojd~fWl=F&dofB7o~oz3 zZ`XE;A_Rzs2&_RAB%@nKHg;qsW7R4`5_OCda}sq$9zm_23^Wikd6?kyjj5k~Tyh}w z%;tvO;XQx){e=xZvunP9UBCV8T$wy?w@wG4D}#RZ2Yu(I_qzBS2+Na+C0;OWY|2Ns z%z3AmKkE4XmOW)J<-PsG@`ECTgD4MDhpV$G7se4T!ouEepJ?LF1T{93DvbaYL6t^o zhl{Y+E8+sRwrOey3WZ_vzBqThu0$qQ71w7Kietj$rC4{4zvk|K#_ghYLH>_CzmV}N z+v)HVO%}>oMInI;Tfl#CTiP^ks*Jr!7Y~i1GYeU#I98)OF zd%4Jh?`qj^3P%!rzA}@m@A!bjQfdqyG|Jx`83`>bqVh*l0@QiPteI`^__J~M+J(}? zbNb!7HQlw7@mPXyfWLLkA7r<__om)0uhZ6?cPpl~&PgR_aL&BhdE-|3!8NsJcW4>A z&%U}FH#wyFzc)JyQub&vXU+D!*oA_C1PV_m8bvS-Jc8M)aWY!kTXD@iGO~XZ~Zyn*GT~w&5MoDzDj;g}ofLW9<_``p z4r7pTQE52gk&6IXalg(8Wdp5R028O_acrYUP4SMJ%fYxxBj%?8SE1GMNEgM@Od3Li zsraZV3eL~fsm(cDA~!e3+z-8F+SP7yNdrmD2$_(@Erb`1;fEv41nx{L+=xV>yu%`o z0&wBw1v;1f0SklZJKVJbW!r%Z!%~E%+dC^+E$KZ$l5xC))0{lvk;no%csiGns?~2q zRut+frc5SP#z}crkMj0vNlj{ze%a2#K#Qx{BP4}ZlTg>Q4p|3f#;#nlC1bmcGH~!F zUQnSB_x0ZDhi(7}mr+P`E$&OYZ?pSCh>9ta2m#R#G|(ZDgrXHL^rXog+Fhud!9!(J zihbCU$3lS!*wvKOS74fs)YG|-uqlHJhD#A`>CwmHLsjw6uv2&&syb3{)2TsNu>6>T zot$GykL=*Ygk>W#lZTe;wXB-)rgc-6ia@wba2u@frRt~*Wz1@Q5;A>8YQQQ(1LU+S zhv?41QK$qhHY*==l5hhDs5Vb4hB+t?I}wxaj5%tipUU;;P({s>N0Kn9U5KOhPyc|L zGMWvyH!C;K^%QpX{5;)@;qQFkc4+jYoHfrQWa-=Bs&6E1mnODXADq{uVn;>ESWK=? zHiiF3YJ+9}yUX~G)CTr9VCjd0ud$B8qkRy&3Jwh4{$zTPk}$sXX8c2ZZi&BP_uT05 zs)9Yq!RyW@R(L#peRmzI{=1GYQ%6igzMnx}2olNt3vyk;5t%^@XJAa1NSh%k0}ZEq z6gWjeAQ}^jF`E`htxI)ApbykeE6$)|H`a|XG!JM&QblnGqO)ETuExw}D_XCJ27PJG zfpUP|5VoHEY+d7@Rau0EHK*&)onP&9wMERQo%m+LH~7Q!ZO^)nIP zo&LfM`*E{05K5@eE_{Et-O)aoty3<5fB=7aaBu@L4$E~dsZp_%n5PL?M1-FTs%(Kw z(jXvcQN>j6x>8Cm*IP0~k6>8x1K;uARD9{4gp_Y*Ysa|!#_9j#$*lWm37$z zaht~t>2FtvCi)6r+HkfuFLP)hCiQO0WTi}iAtUNf9ahj+eS?>>=lc=IaTq6Ecqvk= z83)#9QV2_Pns5_(iuNT%->g$?v{n<~J9s_#3cHp=H*{d>(ZoZJ#SW?eV6Hv+w3%(v z^@y8Yac(=@(C`tn&;t4Fa2Fxi)=pkYEWh$`Mb#c%jTj5an*^h`UXlb z4fgXH@;v5jP}S_-Jbmy9u5WK%(a>D{Zg)qm`aRa=)zZYv$v_zE;rbgn(Sce`JrZ5q zNh_rqI5LosxKxiNB2AKfn+StSREiNAMs{H9k3hZyU53WKhn=G5%jgelu+<3o=XHsM zy83X&_Wm&&7V&q%@nN|A#lk|Uk=RNmTr{T4b@K-ofH)H7J+a*jx->FjYfFCc1WabR zU>u?66q-#^vE!aQ5%!Fq1AgRUHttf`@uG6T7(OU)mSAvj``>G--EtQav^!Y zE_gCJkp%-{UKoILM@SD8tHN zM#zb;ytj4)%a7<0`Pv2;GgIZPo38Tra0w3DB_*d|KxMcZf&>p>;7z2t5N2a!|R+UQE~}(>Jrg{{=4+fD-@! literal 0 HcmV?d00001 diff --git a/sound/voice/larva_talk3.ogg b/sound/voice/larva_talk3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c784490fffa9a346f1b8f8f02b426f3d04f4156c GIT binary patch literal 44540 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 literal 0 HcmV?d00001 diff --git a/sound/voice/larva_talk4.ogg b/sound/voice/larva_talk4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cbb9b01d24185aeab29613aa8ef07b21db56dce8 GIT binary patch literal 49994 zcmce-dt6gjzBjzG6T&8L=-v?04F)C&w}7FOaBD!?6Chj#Odw#yI+FxcK(wI9*q-T` zoe*LO0YTA5#7?*v!_9(%y*SeekRV#6B4DX)&mh`*sm`e#J9ExF=ghndZReSD-p}WG zKJP#8`t0niwf9zwBGL(}w(QW`+v6-hqNLtSq#0RRU;6CUk% zbZ2h#>CPVE8@A4zwVX%XZ0l_HkmXj%%#SBtLPa0|3_uBe+WNlEt)5HXMMkylvnN*- zO3(1TEy|T-pQ-O7%lA6Q9lQ6=MMt2%TfN}0fh>pL#4cJp>CAi+2~UT(`)2uPy7#eS zoOS~%ZkE@WANQdDXkp3&XJ1>&L*e-K^mVc0H}di&OQq#!f6Ltd%l&i7_qu;L`8*p3 z557w}GpGVjN7uSHM>}l$U{}wF#RC)^Cdlq!=Z>*I9^+n{58wQqNEwhgAD>yQDky>J z!1gT-J3ehV@M*(aTWw9--hXTB`%T-Ho3{VCNlTi3IR5>u-~V~-cs6t%4cNnykKc*z z6$JOLCil{freOqBtdWH0b3_n*q%YU8v-)h+$qSW37xsL7PW16P>{%5!sf@L^0rsjc z$N%ftx%K#t|N9}UoQ(l8NXtug+)H)gnML83_KCcoQFs=>Ih7TOJo^%|_a|K1p9+uc zdimwf{A*A1U-)qn)}|c*nS|@9<6ef;D2iR!m$+sBE1&K!_!N?2jUxZ&q<_XQa3K6s zJC9dWXnec&8CfXUE!l%+V9%cfE0}xk^17~f{qb6|U)NXm0rts-$!68bs1F8gC!ft= z&0NqOIG52^PI&Amu6OO9%f-4*KhM44f6{wo;0C-Fbg$cQCP)kGRo&?F9{5ZR+itzy z^|kW@Hq145o{XCKK=r)8AJ}5xXWes?$+uyP=36Isf8etn=KiCi`w!QA)~@|e_L0GP z(=L-UrwqKe+L$^v-@!i`T7TH@s9iD}-5=W8mX$Zqs3;1GI$dvgHgX;SM*JBU|9E=F z%FnsD|A-~#itzl^xQ|6^r{U?jly63-@eE7?xmc74xwv)W>v#5_P0rbUdg5l;hSQxz zdC{kzOB9?`UPXHvGw7L+m~8v5M4y3D@sAVtZTKfd$oxMXpFH6z{UhKp9~WC3|4NCf zWJ|-It#2Rr{Jo~_%Ljh{>07`5wDspNn*Jwa{atbZ6dL0*ne5bAC6~Gz3)6j`PwrdjW&IDyskEH2STjmTI7FpvFy>L+9E+uGry8Fu^W#YFWJ(sC<}YbS^TfWXKo~$tR1&> ztP^qRTc5nrVC5frg*=shKb#5G9s?)=VCD*P!!LiA+ME4U^vRv(RD!zuMndbo+;_77 zcrX;?K0O#(a5S~!-h2WyCNw|zv*O^olE9MUh7*o&;tD=JJ$QEAXMqJv$9^b&cy`?uCVcy6 ziE?(GyPB~5?Wzx7S~{@({j-&WKNhzfgGB%+nm3?8z!e!JA&n9O&;l8F#~Y!SplJLt z6>@IZ*KdShJ_pIE-P#ptxt;(CSlM;2S+HjL0E-L%YOZ&xx%M?CkmUf%Q@2+A+8^cf z2?a;*<{WXn@yH5N>T%@AMxK3)XQ8c)OloDR8R>=+voFQDD@*l zQ4+JnW7D$oq9YP4Y0(j#XnM{-e`jt^?8MDDVKh`&5vRvX%dYhI-z?gFqI0oq_Xq%^ zbZ_`u*Yj*#p#U_t7p*x9nK{uj9mhV;{(2oEq_Y$P@ z0vuz+r7;mC6eP;Wb)t`-5#s2MDoFJ;I(~d(Z4Mw29S@#S@ZpE5r8R1oEd2vjXkf+1 z56HZdhTCe35;*G0**w6b14_c=S77P0q;buyFyj6Ih*zMOq)87FCR9X#b{3G4eeCkN z+}we?~^;OO7g!j-DXP_ZQ9-6;(@SzV0qQJHaWx1|6{1cE`??tpl>k zS^zeVY7ZEX_KvyWbRpmk0NRTn0m<_G=+kSinWJ-!?zZAQNOwrjGm!3*ue+Z)Zu{q+ zd2h-0p1E+)2(A^OC0r{)Z)&X>bV`sl24A0<6h->Ptc?+eDubNv+z$s8ag4>E;nlB= zq6CGcF~awZg^nM}?}P)LhgHzEk+lpqDIo8hzFAfuTVIryJ1{}^bqb8|Jx3*@Z*GOHx%UWEu&)>+4(QQkcQhdgpE`QB^0qc4!V_sk`q`R5wRP4#YQvVXm; zWn_&E;x}pml{Z>vI@W)FYJTMz9X_A|D;)UOKbrR3(~!g9i#?mT&b+l7&!;e57zA&4 zKfhsAZ6Qd zD9n)L@Z?+cV{T+3EBg7hXEz4^UgcTw|NqmbH4^+d`u~qP+OpSrKWaW8%fDz>P-$@8 z9UoHA{)}O&Xi&N#!;tlO9+WT^AI^MXdd!H2Q*LaBydqp<$ri~$zcp&#D5{ans8iRt zW{q{pa_rn1i$hhYvrce6TblvM_L7@rjZpp|caJQo%ZEK=Kwb`{p6)9A{ceBX`4ZRQVwVHi~VatZETm!1n-{v08n3` z-oWh@<}+{}+tB*{69z`)^zerOMFNTsjJk7>3Q+L@TIuM9^W)Wh?++aP&HYAKRK0s= z#q4R-)w}ZRVTp^nh~=KZFIK!XYeo;m0pQ+xE%{RShP(X}%hjU5B0s3s8)kW5g?q~4 zD)7cd-9vVqIjwr29t&bb%&1bDu*TQQH}sVIl?{!Z_D_Lp4~hp|GUHVS;-%0)J?n@2 z_XBDQ$+%QY;O(1cg<>H$U@rHJFOcDac)36)$;o#zEtUsBQ>W+u1jHpI-FWFG`^VtL z`npf`xB)lvINk~w;#c_o?dF$LZ!@FrvyY{~#VkxHI0$`Z`JJc~(wd zexagB1&ts~ICvF+BY`|Y*NNmdzr!!I;~m5i|Dyq&Z0M%Ro-M%vE&~Vx1qP-yQ;HzZ zm+G?Tj{s{+^|iaove*4M!vkjroI`{CJp&!hEr0vlgL1>Xi%^&YMEtF^8p#Y2HMX2BW|z zZt)WP9a`~`bM*mrnr<4`b;k@oX_uG)+D-H48}+$j8$$+i>LVNNAUEliyI+X6+<#}D z|K+_OGp}pP4~5tqryOOIPLT!^V`mNGX8jihE15hGjRlRcm9G(_ z1mB;B$tgg!2i(@$s8yxN5VeW|4=-DuWn4w22q#0smuMv-}51N zJbJ{7Rc?`odtW%;I4<8#ba2%_?d-9?j}VEEMsGP%)Z9_&a>2$}bwTl#ZPN*gh3efp z$?(nE(K6o&lygS6>`BPO7F{ptZY`-6Moo>k0;hW&C42lzi|c<)0Ccu0TFf4&PzCye z*c#wHV+Lm61yw(4$TlAo&^A+qK;KTw7R>mx^E0#}Q;uBYhxw3r9FJ#Wn2oXss{d$y z(UwinGkh#9OP+Xs;tP)}$S5PI-&V#l|!x%BzTwbJ#N_$Cw5&MbV@f?eNMN zt~Xy22wBp7>2pDb8%K)gS8D4G;XW7}l+#RjLM#R)Xjhog^ z1%SGu1K-~tTKai*HdGl;AEB&n?Y@?fv0d4U73}D?N9Nzg^`}pr-^65Ir%I0S zR%oGz4mFdgcfb=d$D1I~mR_)#=O3-y7aWJ!JuYFoyL=Rd0#+;JAtGAiDj%cqBic}> z*&MHz3)wm zOZGfA-p5XQCU=s+s9qvk9^99oO1UM<+YsNYP`lq3#x|t$@uQRdlDkH8J1y~b?)C3vKOflg zt3aT7#liwlmleOxFM0XxU!6YiZs_`lM+Y8${oT9cf0$?uQP+rTMl^jo?;R61hx3%J zu-mDf_$*0W^JrA!)_DsAQ+ucPY63qmooHDaw*i5vwcs;t7%4C}YEx{E*3nWi0HKq& z35*9wo?P?}wNfWf^|NzHKBDuX%&WDaNddLck&JCU6$=U1n zS9H?_QL6x?Pb+eMN`J(zi%zV5<>JDMJAJqAjCs?5@|(|2F{3zT0k2q$EH5Q}sASK} z7=29QNhnZmxWTl)P>Xw2-&%Uf^nm+_*~@%O-r}pcUgY0*FvgWeG7hDSIi7L_V!3qZ zTcK-JY!+tT5FgFs69FsARHRQXFO+jBKXzneVeG7P)|ULO)-)+0iH9a0)87879Dr0w zdGdRbPeZO<_WjOn{pyRE*M5-@^|JZhhFeQB?BNqi>%I*abVNqM5KSPv>w`3SuV)E& zZ=(t5s@SA-@GTzdp(8A*DDgP5xp9RM&G`1EL9Am=?R$1 z&`|MHuD93kU8rqif#EHO9V)K`o=@dL7Sz^HQ?L0o-}p$Kx{v<-KV(IjnH6OP#qR37 zAX7-`MRn#Loy3bUr_%g^duJa4_~OSxmXaE*I)npm5UtJM!^8d7eJjQ$<UCO==AlIGI=uT9I!c{Evg=BlTMs8-6}XB&u^)JWEdRm z9klyVfpQPqQ?2w~n0)gEpm;6hG@xn=W!MR0*sCsrfFoOM`xCEjjNJ_ z+)zUun1lv~lUB=MH)hUBqh_dpa&9t3FdALBF&pIbR!2#JWr~rSC&N=Y8k9o6#g9{m zl+Y5obv*XrG!z`t!=5NUX1ugIiW(4`S*KxZo`}<38A88CIs<{N&`=M+LNlMJxh8X_ zk2ur?Oy8pUcU|oie;?CIiwmFYAZz6--2~f^HLZ$ibWxS{S1BB{$IJX&8D_Lc;p_~Y zPy};>f`T}kWCjnPn&jPcnFGW#=Js}q9;TU<^2@s=$V_rw_}y+g(q_h$SSV91qIi+9 zX`}7o5sarb67-#><|E!-8&lp)a(|Iq_xZ)`&>jMcU}mwt{K^7Ap%WS%9Cf=>`m+yn z{S=VZvME}VkQ9!|i<5T4S@fE~W7U?TngIlum_xQwA= z!8E{numj$VEMNj*JD|gEi3fZcY=P(GxnBKcG1%)2?$P^6&M$8GzWVg5;Z1GNJ!R=_ z)#Yd1zLQzA)BNDE*W*8u=YIN1_j&U*O!C{`+TRMz_|xe_f3#bcs?V28VtdV1iJrZ| z)m|4fM{eHS`uUF62XCdR@+H1eg;GbfGtjM4Bw}M51rE(Eg8sn3H`$XGEVi88yUO;x zZ9_{>_L@pcG7A=TV-q$+c)ejED_cTyvxmAk3zsDX+sjK8`*5*3Etb<#EJ{)p?Xe?f zK;eTdT?xK0c=K}_=$4kL*fJWg+Z<5DX2`MWy)U*ze)v+_xf=SRj9tnFv1hbwm>J`c z4)}@@6IC^FQfHqbT3V|%n4C7V#iE^n9ROLT26!#Q6;%$_Oz;3G?}iT6oS6i`I|a9; zXVypR{OeO_Iao51QIXS~1}5!do=XZl#LXB*)-q-&kW62dchl)}QsiiEW`d#LKm1fb z-(PaqO7l*a%hQoOAZ4^n+fj>`ymL~!fZ} zipj#mvrwa4hM^s#znC{8rNM5Xc+7RgwS3i;a#OiSS*(nWD3n>-@gOk*W`gQgxY9Ua zqH@!0dOTMrS2#&Ni-sysBm`ft!c4Or0W`60mSU<{X=yfhcnE$pyp6K9(}{al8s^gQ z7?FU1$PtYT?N}R3)-xsml%9d`pJ#mlo=&6#5Fc(!>k>7o5`QJV(4GA4>TFx^ru=-* z+upSMixMwDyH0NeeSUD8lmWS|GFbOh`wp5y^Cc#;q|7Q0tYU z$(zK`sFk(U!#BsN0<0zb>Fc{5|`PxSNUn)h5ESeBofjE}u{UUKc# z|B+G;S4$1r!JZgXl|WZAcGAyLb}6BzG!60~D@M>D!6ycse8Xp%OVC;-JdSZx9SsVa zzcr?dUrO+G@3nN9_?j~DqJSjNxmmg{q}PvAvatpWP>Dh2j7*;YD3ZrC^$1M*J}0WK zc;x8&QZcO0W8Ht(9Tewh-7iQtF&ML;napVO^pXPCDvxa% z6+`wQ{CWP_P#5CmvqVtcs+BGP_fXW`950il3kti#1V|H8rjhef(s;o>GU3kXZ&V|y z;qDF;@^Y);K0D^rRR2O1DV1or(tUm|Lcd=g9^RH?6+=l8(@YwQCJz1hFXuutf4==# zB5TMpxPi~;=N&VjU`vWR=KVpX`7`CJz9V3B>D~O-285p#$B*&9J*~65d$!E;2Qq*R z$PRzB4sy>-T@qvC=R3jymeURz50sSJ^)cfqAEpede5gEz&d1cr zz~kBCj677l?k1!n^jA&-O7T9BMNPI}mGf|Q@w<7V9{;ht;DLX#=QV``kdK`LQ;)Q; zvZ4eD2!QNl_W|jRw971Wea=tUrOCtDM;P009(tPh7F)L+eWh$N9|Pi)+n+%lyOz@5 zef2}+S?&k40rt6;*3gEvDoGzT{wCmWfBOxL3?SeSVhw-mfWO;+Eg6pfB<*#zQ|lcl zuKc;D>pSjKQ&Vt*g4UR1&h!Wzx5g~dk$$G=m`I2A7PbQ)>T1}qtXzyFImL@IE~6!r zJgF|Yc-uWWIXbw#;AEyGeQxVNLcDVv7 z^E+@I7$v|Za+w^^TKFz0HCcFa6c=Mmb*KoL>(%3_Z(z5X+=m_zRO&w!5~xE@gXeGUF7`Bxv8>a z2}L{pi=El`)7?-1DZXQLH8*3^WXC%1qQCyq_WqczA~WA@krm|S8jtwTq5ysI?)#6@ z@to0ciotf}7{)dYOjEt$1Y`ISjOt&c@(fL?w61oMG4D;1H9+x7?SbJXg4XLpM`F?j z+x(us_?M2sh@v!0-WrSAy)$TTR7`XCQ(j}8F~oKHc-D3ZGwFT8Rl@5_Z;vBI_i-S5 z$l`y0?9HbOKlcLdAK9yDuVyZ$gscAL+j8}92gHB9l6y)}9pWGJPya3%{#OoZf85=A_M7~ZF{bU0IbunLY-}*a*|-#`E@-i%N%U#< zhCj9OOud3?q9*HCytwb|gVkMw%gZ*CPIs#$Us4c|F?M*+>FYJkAUtf$Er(79@iEWj ziQ!~lWT}0l9BOg?n*QunFX&!Wl%&a4IDl9KLX!#>dJ$kxHwF%uW@l#)Evf3nHOE`? zhk^%9KE0r4iY6nb@x+2}3SdCT38mTcP`=}P<>{-ILDr6n9!#(&=LNtwH*8xTK6$q9 z&%~Fq1A-kJ%D{T2xFBED>wuH)YB%%m8LfDbH)6`MlC>txC;$3D_+-TqTV5LD7@b!q zzl$}aco6TNe71wa+v#Efkjn%D4c4(A>T}8u*2An1Y?u4BRu7*fHQ!1Rqh^#Likp+( z0cKZF_NuI#0NFeUu|W3&=iPyil-%v6q|kGr!ZH{uT>btTw4F~cl*!FJ_rY|5C^?#l zNVlAhydv7E8Wg_0VequBha@q>C2bvL*7MD>aD*?;!k`r9psw3Wh2z7WEAAcZ&Z@_vGg_FcYOehX>22o zU3Ims*@v}QR!48DOLfAeXz7em$K?7z<%L1bZS*YZ4Cj7)m_eD!(i87^~)or7pnq;h?8YwPS#)yr-d|mcGlt3I@Hldu9|PjYX%*+ z6d9w^!M^P!j~gypZ4J}9MBkQ7FzT#IR4ycp2$Mcj2DEtCinMkq_uSiuB)%FL`=ZBq?&e=p8x8$=2}XZ*`qrjq$>*v3Axq?fx$@A zvhL6+&cfv0^PlI-eetIIChhdz_df47cX7Nk_B^6BM3#ly2M5h+5ho*5BH}1Fn8-oS zup{JxiO1r_{H%+5F?npkzYT&>l=?!$vbNm0R5-CrI!2bsq7Gf4$8sfo>uiCt){RfEwwlGAc+a_47hC7w~Wyd<;Y%mH-a^U<==b&eiH zx3<7X>e`GH;8K#gc9i00WC6;ECEwxV$x#qe(@-wG89E^PuwAGXbku1u=nv8>Tok>$ zo6e8BE4S9k3$4T*v|J%Dq0>_8kd{3u&P@p{Mj=zm!<_YZF^a&&ZQb-JAYi)DpnF_B zzgAEP{U;Mf?vlBDNZxgEYa!A|OJFs+u$X;w$+d-CDY4I(Lybwzr~(Akfv;!HQu49uIKbT3GCwtZC3P06#hmR2JVB^Lq zDLYdFHp>*`)Ezz-(>@_Pc|rC5MEEf`Tq^2wf+s7k53uulj*{g*48#!T|Ky;+isJ}p zU7zqBK$FSqgvO$Pa#S+TmiOQ7A7^yR7o}Y0B%O;9Pf%AtospZo%T0yV$(T(uGDfd| zc;LJ+oCol@@D;0+PxGwOumHZOEr+*?$24k?<|-RAJcJ6DGiQVN#4g#JPe1K@7-lSe z5pRd{0Upe6{z>M$*Ej#%x6wuxJzQ5*q632;Swanp-1)xeKGDUzt z;ghLUFD!+36XLUMfTueDmk;o_&dZL#c{=uoQ#!^!4@4->+ofTv}Qe z8pwSId)hPkdgBJ=#NiSLj%<$^SW->I!-#HIr%M~ailzDVyNnpjK~;W9&UrXaHilJdrD7M(TbPw1LHSX z8~=H>(JT-MYz}Q0+|`->L*<}GN1VRv=C^XreKMl6_m$Y^YnQn#nPP^kkREvcB1=o>hcvuCtHSF1+)+J9SUd+Ft=vnMb6A}FZlUFdpvpW<6=I+hIbgT`&% zFJP=<5E97(sFhAnZ^KB!dxmJHXPDeU*>`iWT>mhZS3Kp)X9;}Ty7_S?8N+1;B!8c# zTjFPCxO{w)5y37nEAF4jSupG+Gk z_6=a?pSeCzZ)iq&(Xt|au9qF5XFUOFPe_raNkJasF{EXA{#c+_vJW1nV!M5$wOL#; zTV}uE!^9cA@n~dI?mZ)y+?VAd`Pl*h1UewkiMx*lpK1=m3~6ToT&asMH_6RZj*Pzojk#vFqwcO8!)_C)evwl`gwX7Z zNf#7}hzKv5mtqC2lG10IRtr|3ymph~ z6->?#LW}kK0dqxBavf4J+aAXE*GsbUHApWAxu1W;WJ^d%Q#cu|cI5-v4V!rq#OQE_ zBmO}>QXZKWhx>|8w|?ujA`WvGK9V2ytMIdtt9ya(#yRwo5fil&h5i z7qc_!_xnbER>5@lknZg9!%9?%c;Mym7oi*!yc$z)bfj&Jqg_=0Qv zr0${8qtg+A3dOW|ag=lzzO1&ChrBs<^}^FHzvdQaj@V1Z5>?2sA7@CbQRB+#%H8|_ z2;gFgeUYqwvAns8v^e21|FJ1$kc?!K_N3B@2aYObOLNuO`bb?O8p5%&km~aqGuj)2 zI6X0OrPK4e!2w;OYI58R*EQ2}uLXPA2MzSdi=B_igIEB)*sG)^m}x$hq}yGxpz=zt zmSBlv>l!lihwSQF*C=Vq9PZ5`&Ud`^-l@wE{uN(PtPdbW7ffp9m@ZKqTe?0_t4LIg z-NJ`Wffu`+G!yAaF^8t*i*yz<&#~;a(Jm;R#*1%VDa01sZR#Z*NLm_8v60MPley%P zE;DdCp~gW4chzUfhCcsncJ^Nyl0K}Q&)Y{cSons<#(^pPm43TeY}A| z$4iAjBwgM?Nxhj2H)zl5xo)dZIhuYND2S#hS9sH0MY}4dR}&NBeVb2CYHBG;BRVdvk@N?vic69jjKWaJTZjHfX0;!%DE))zmuQR zsuAa;h%4E^NG8aO24qnrThmU?SJkHklpmqVH2Gd!BR&fFE8>HxO#Kto&-ASrAx7mQ zmYKoU<07l4T+8OW6Az~>`lad#TSHAl$wG{2P~)Us;N0vD#K$GA;I<9Jg1$xQG|u_RYZ8yJU-a zpg2=xs8SD?N`5k7_R4rHR$&{Mr9)1qhy7@D=v3*(w(WaHbSw=SGpJKu%oLHfhfc!> zB^e@zlh4yhBF?>!8{2c+NJm&{-S{?aNUO}g=yhhfJJ`I$ZmHrhKWs0$P@=x$~D zE{wuG6O(S)##vV?z8WTge)ATQ&FKZT#RjHhS)6%Qcm8!Bmo+fa?b=x;A5L1Be<=5I zIhaUXjH5*L$WNU=w%!qJ>dVaZk}bwH&<`Z!6Vp0djC#pc9k5ZSq?8w<4H~8Vk%e!Q z1~-gqNLwS^AyLOVv}Lt8y;uSFeqoeO3he{DciDH`~@WTR;KoIG) zSRQtmY5|D#^-6DTFGh$wdCT=9yn_OS@KKXf0OK$jcRShcgV;MZi?!2YG@_fsS0r*H zFsU;ODJ_IeXvfVwDTVXMG%dDL7Xb15GN= zU+X{b42Pz-UVa8SmF_R=hTF?L1gDWR8DNGl4$X$xI<2W$%xTf^xqgQuR&Xhx)vj>c z!vuswkz+59oU|hv0IUG#+1nX}gb@z?22wm1lnt@}dpT~Dpy}h8a51t=?rx_G@Hi&) zUfNvE@pCkyeLs@{T(qDJBnt+x(EVKP`;kH;)?PQ4OlQncK)>HF$4W_f;W7j7f!VGk z5F@^`2v3W8faPC;a%!7mFi$a94yBl8EpA2eFl~EF@2PwyLr>D+;+9){_?>Y5D5? zop$$U4Z#gc(FIPX+izRO%Zt^0PS3cIGt@ev7&2$poYH7s&cCr&SUT#H)5B79?Foh%_sSC(qtK*&+uZasA%smBmlLkIJqtTH zi-majf-vC4&2Mj2Y@AFog)~eAo4Pm?^l9;%S*nU?uLbd*npo{GdXq$}P!lstCwvEE zN?S^N8EK~yO_|t)J!$C6QI;cRL02{!%m99k)BajP=%kE7C*@p%>7hrr$=q7=8j_n` zfh9-HwNvOFG47&K-f|J=FhAEyHT%po@1HSKVe|?aX5KGDA*x@Ly=CZr<@a7+T$QV` zj{GlH!gn8>Xm(n|{~TC(_k8Qp=yZa+Faw(y3;fu|8Pn|6dBzjRViWfiOzYr$2jnNN zbK?_cX_vaj&tLc6HaUQ3MzH3>d-I;OPl5rSN^5MQJ>%WTXhxNG2de3o2p<=^WD`WcxD!{qHMR(pa`-_Mu*MGWJ)JeBfKI>V&O zZ|(}S!rpXnC!5QnMy#u%V^zzGx-CNy*u*xjs3Ai&Z2I!7_Ps7gnJ;%F#*oGrTxjTW zXbt+zYgrdosqwh4-a>MGoC88MchoGSx}|jjgqLoTW70ZVp;f}*@%)>`M3bbOB;xGX zo%O6L&BB92|QiG%n}P z`Of9wq|%FJ`9lFEC#&Y!3(+Rcw77)WI5iJ_(}Iw|L{%lf@BMS*>#K=k#kD`FhY`c& z$3$2o02aQBfnXG6jW2YOU^>7Dw5%uqkoz%aA)LZKOcMpt{Oj&=fe>Pd9ad?WOmm&Y zLW=zP@1p7i|I1_wvy?@J|#!E@Wri(NG`VaZN%T;5&rHKXG+=DmaPRH_~Z>dM8 zj9n;w1eX|Gk)z8|eMr%9fd>XNKHWN!)S_EHwOu924-1NL(=-~!x{QP1HXlK5^Dx>9 zkn?n-UP9a^tfw+HBoI_4u$q%`IwO1rm6kIQS3)E>mK!&K z^&4p5kt^>+`{jRmT|cGWI9e20aqjoq?6u1cw_vbigC^0B<8W3)Z)&OWe!G0}mGymQ>eX0tk~PWdMZMlJ-O>2XZt` zoB9rwCMHv{03Ru4^z55y-|vUJR&aP(12Di!gJylQ4>ulCuwfiUc&j}O8Wp?XF6vG$ z%CU#VG}9K{|Ebuq>pj}|y4-@RFO)Pite0JEw}x;Q1Px^)4j7&A(A3)MwNRZ%w0K;i zp%J)jTbztx2^#IXEgNfmC2UUyE*cy=|8Q>$)m6H%SN^*ym)JlPa`XhkiCpDj#9d7*9t=czCFFl`rBjQD)|-_>QZY z*2iZZbA@{~Ne;qA)dCW?TO3E#@}PEiz=F=))0(qmhcZx!YUQHpFkKi&GMYm|M7i1t49mlF zkq*sZTyrh1r_!E)mgycb?U3Lg5-I?QpNB7`6lmilU1l^(nB5Wqd$YBuW1*=1XfeI* z2sqS)i}Gc)46b#${E17NEtiMO+j7jnh>2$yI8GCNfA;a>PpbFDJf=Qeym+DbSI)}= z<8;UX&8;ETU7SaTk*=2IOl%<`RB!t{uqYnRwIt2$X*eL)&7KGljH7Il?wO>bXs=AibTrD@)7FI2x5e9OIM^K0SdBZm4^_Arx*w&5&K$- z$`wVyy5RJE!Kq%!`*ht@oy;%C6|~E`A8vCX9h3wdnhublJH`6`b|Hd2_*vB#f3SVs z!S|VL|HHAF$8A-iK}YbXqP)RY#l+-I@tzr7VvT%pM()vV*&n!V!sZM~5-=lg(w#*L z+#jwf-rJVHej*KvuUY0wB&tAS`s;k}lOCG41bPj$WXU^Sj6;C2hB<|)*)Px;Q#ixIi@Oe_fQo+5K35yhJc7c#s+9CRlu zveW3IrGKf6%UCYb=6?5W(c?pr@y6J|AwD^JgNWGI0P%POQR|#P)n;gqO9VZF9?j!!?v8TsU;3tgV zpZzx{T~xHQtg&I>7jI>UXgcB+g2&e<>D0pw6D5#!OKP$nS6kF#?4r3f`j+tHE9}9@ zxL%_3n6jfOKU|GPnZ8W$R8N%fA2(#HGUd2u{1$h_+2cTDuG>Cp1S^+7$2^tdFJrpkBGAjQGA6uUq=3L)jzpDUROiKE$JzWeSz9-ad6>@Na>RvZ_>~<=W%!73 zJSu(rvA|aVsQ-@!-(QJ&6bF0!-Q(cDYGfdm{80PiP;1$es`xQ`XnCR|J)%i9E9@(3 z9;}jhbai644`=#KDrQGTugsG$oK%|8?F`;&-u@^l@sX)_u=*Db#D-P-2LJ@{QbRWx z&0@=?+v2-uAfdQ@*=Ke@Z^HSWfI2k{%@?G%F>qFi3-{NE*#{{N3SOwS29$S)Wdog= zlEaM-`HEX_pzcp6qgzJ2ede4hvm;#+M@?+vu!t`Pxa=VE?OF$ z&?J^lpVe8srpG0sq?`eMQp3d9gnGobTB#n%kPRoPX)Ju`mZi5e>LC^1y^LkI-1vN~ zSv|5U$EYZKBq-V!Y%@cBOC zc@OTo!w>;3HKVy9#3HlX+(Apfd1L=7dQjGW_BibaGyg>OL7+l)eraI&N;`{AermL@aJRDypbuUgV zcR6m6)#cll*c%snZI11Ws`I0Xo<*BDRF^O=($e z?Zxmr77*m09ex*N)d`QIsPvADyoc#&5?LE24bZw7ApiEyPHZQ0W7>_T=r1;$Ul*3^ zb>#Z>0jmIR7MNm7KX#62CHd~r#Nh^8)_^BQJ#1R~TA1X0aUvtDt_k|#YOndUJ;O{+ z;5NEs%*UaHavSf9pDdw8_#9_V-sqJghUs*iMLQ$X?!jL)Qpv<?Zl>&U$Hm|)&yfd2v#=*2Yn;Dm?Zi~KUpsGo=M!D;IV&;hLa0W&TkGhM@I^z?vCABe+D zL-R;Whx<2;0FAJth{9;ri*duH9x*3d_C%iAX7)xc{xlW=gAk%zYP9iE8c37C_kckM zGukoG;<-bRhY<9II~o`XFCf{6r^IqsIoyYWVU(#>fB-SY2jv<8XJ&eqy4_(suaNF@@8Vv?Fc+3_db|ft-$8FcFTH`fb_*GqPa8p(}0uk8` zGgx&8A;_*-X>Dpc+SzGTvB%kNRfTFCr120#I?CMa*1&L2eI1PFNk-xT79L6QsuF^C zB6nt!{rBDN4x@L%=wvcYL*Wu(=vUqGh1?GKU_qNTo@tx~QeqdDTn;y=`N{`?!3)j` z7x+Y`%V@!AarYT%*9TC%)elvYSd15KvR}gr;a{~M#jJ!TGPf@*Mj&p^3BK%R%;d+k zy3KjK7`=}@AY6B&k{y$!N||B=qA5*o7$ z{aJ^NswUG@KJsAnY-!*8!#?lyAuZC;`@0K=sZcK#d;7qA_Lg^lR-#4pvi|#n;WX)+ z;;g>;%8G)_2xcRVlJQE%;fU4qOSZKx^XGpSpFD+6)y|!8RK9zHt3|cad-OThX*HQG zPeuTJCK>PrR{KGLr4c3IqRNjUmm2|}<{KLr=qri#jb={DZs0mZVq)aju4wT5VETg7 zWmiVKuhU!4{$bueziK6-;I}W~%UgaDfdieh^^)66N zo$3Dn&V{gpn{)?~G(d2YfDkZr5(FBNP6H&|43v8#)=skVMnne`DbtyD0>ls!Kv47` zg2SybB!Ec;J5$G*gd~WzGAhJDT4xaLRIT>tjO|Q&rswy6T<3o-tmSeqS+2DSd%y4d ze4o$v`^2Ywj3KqRr~dtw$Y@f!JL$7;?kGoN*AYTp5>Nnfb1tLO%aj7iT74D=hA2ZhjorPRCc z0d$E!MR?6pT8C5)un>u2gy#LhkhlkZMqHA`n5Vbolk@i!Gf()ay8!@Ts#>OULtf(} z;ydpPPGrMsJ=Y)*2r03^P#byO;X-!F!`MzEH!NOJ zlv!BVKJ4M^_fn&^AxDaC;?|h-&RJhyfiSVPnIyjvc=P3~2Z84GlOvBtDdkV5PJNDz z?GDRl{GZF`#U;hXzzzG0u%AwFvX_Kl&&iBPBU~OrX1a!3{D0l38>zfl`O{eC(_-la z(H*h$B$+9h)TKLWDlUdQ4u{DLJA=rq+!h4uk-NkAWECRfm#&&>+UaPs+y~yFR_LkS zLs6sNTP;OXNu1Wv*bUwxQAjl^${!{j&ny z1v&Fc!<)uU;hD%EErBUc)S|A0IaB6aHbeF7PUI}=-i%6OgMkp+GO6Z;dQ+lWS?mf& zBITw6#2(8^mEv&`ydW(@t&TZFs9}i0AyKu=rHC|xp1Ut(UKV!3Zh|#N^q=2x~5l{d?FI+M4mwxbS&eSA6z`}p^#~3=l$&|#|viMfL#}(tClXkZ0W3!UMuD75uAvo*;edj zjtVh@W-)7G8eOhsEt3*m?y3@}5v>CI!g%07g=A#rJvB3RU|GxwK23s?x(U6@XJxve z3CQm=ty=N_u8>`S+1O})_b%9v0;PenTU4O6N563UJjGsB*AJ# z7)fxQd7K^#FhK|OD_8YM!^5dh-%VkEsR)buxZ%y+ul1V`3EM+0oq_3%oDxTkXO5Uy z?r)4V3gQ~si?bt@wMoX#5v!^5d2H#fBRdMC*uB&3*K{6_!Z+vavwGu3bka8+?~Ej- zEw)DlBP0z@9pYw~aZQE-5rKmYx))skD9#|^S$w$yYExAItSJ&p-Ml_mMIYvZNhXt; z$D<=m9NH^u*yegg$Q5b`oAl*?j07A-i3G`DpF91V&r2N9k$Zmfzn9-8mzQunPA+F= zxwc=Y-d{4aysV8emQ?zu{cv1sZ`S;yM77BI%yvO1ttl_uzG&vBahS6=5-TqXty4AZC$4fY+M)@rZLrcO5pSQg)<_>0ucKL&4_oGKDd6Na*$#x5 z)JrX$E!;C~Hhb@>ZxlYz0d7Ac8J6xZDbS!GW`VNHU#2YquVKAJ?vyZIx?9Y}UEnsh zc&h1$5D}+#^+w_$)T0}QxTuH1%92v4t)3Ve+1y+&>ysP!DgkqFL4mK=07W-M7WQ!| z13~Zn@!h0@jG^q;)_r~Eo2vUfdE3gmk*u5$qt=xgxLmYYo+{3&-|&UV7_G)swUavC zQJk3=n48nJFc};uITDH{m!DLY(1TBpF7pbrUG1g>L85FX$~fAdh&ab$xd$^+liWjG zGIMrSi;;{^acK~p&Dq+O*)GG3C|FGOIJSOkzN+Q&vEz3oq5?M=SkU{1j&4D27Jm*1 zIB0x<^IU;qzO%Ok=VGb)!9N%`&*(b^@p)k55Q+>u zoci^pp8Lro)ZC&5>&5rK%{lgoDU7$dku01w5pcYe-zjvD1%5gj_SKDwZ?t4Z#INe? z>JRh6qA!Tx?M~d7J+7G4^<6Nwjsr`#w$Wx=20%J_ ztTYub+dtVwxK>mb&#RU7?j>{UrV6aycL7n{zrQp+rr>5UK&8wuw3e{m@F5uyp+QMT z6GxE6<&lCZbp#gSUX#j%oZ0TRy?b3U9m}7oCNsR;+&QKm`~rM^EbPpT0n#2H9W$Aw zNJi$b>PUKe!#{sL^!jfQH#PlV;LlCFU%-G&L~4@#h^VqebV9q&RQ1ID zSMWJ_cDst?m1L@^BGfS&&OGcKzUw>i>VW!*@mfk!pXn?#@u$}zj2vXWTd_9Z&5XxE z1L6}d!x(Dp>kgTnm2r;M7Bq8jD^S}hOryS!_jPi~cVLf!4nFfS%jkfImI@c#lOXz=&nuVQb#{2?e4|1W#mdG3T`eB9}pnmO-s zPR&epNY8!#`N6ufb@AD*$hwZ7fAQCot*5JG5$1sYwThhHW$p!HMe|R4W2ywZG9eOK zRp6b=ew-4$-)al5EMA(s#n=M)5H2#N3pqTM*CQ+{31)}4m5*pv)UI@JXt5)tS=mO7 z7BrY=GM>uEB&{clj3;R}Q4P|AK2-=?d_DC=GC5VGLa02ITSM2^FW|^#oEesj?BtP- zQ=3H%iDnO}7loFhfPy41eU|chUPDsso7_)#|1JAcp|?}uiVJhgGZDr3#dce2<@ z!A6UvU{`_gZ~LD>=VP(R(yXmgNt4pjMvV4oE5ITjRTVoDbXCfw5o`aD&ZdT7g2c;a z|1Cx~m161atVvbYNd{%IDjw!#ojtcK;;JS4eYd9V&7BF>pdg3(nroX__h$IwG&BQR z1x2c}R;}&M0T+Zq{=#c-Q7*Au6lI}we{Ff;MYWSOv)(e87H5Pf#9x&9IE5EbM7x&3 z9A^B9aZ*{K$fUZ4j3GLckmIUaza13%im23pFU6mNrIs))gQmlhBqLf0B!^uYdYWz= zHb+~oa&1A(C0#0(y`)%5VX4Zns9tBpWZ`FiK97}ILMic1e`1*&PrG3BLr01om0eg{ z7`2#ExRKxCuS=;2txpM}R7BZZ`Uy2a<<{4!CfG&2H|khgN$5Jl6o3{10SL=qZN$qL z1#ZS=1BQkHIbMlN`EzZ&hcax0hY41zceP$@6TYO{sjhFGvjUO|@Gdpzu3 ziTF%EO&}cEAQUR+=Orn!s;u5H%PPWY-H?UTjtqK3F-lT43nIl!>i-!MQ=!jxHDQoE!E{Ls ztt42|>eqmFK&ZqEGljxUB5ls*TG|9;rqGR^LBr`(luRYla-KGc&E8QF!?Q**Y#<~} ztfR_yuv)n35lk{I*o&SttvQj__%%MyOfZE#s8<1iNp79QXyP}$X!qRJ2+dh&4{V7d zgXWo9%rGJC6w)5IY>&IAo15H)@*wm;CafL^hw4;MV&?Lxd@`xK;nSh+*yA~wEE=IX zmQ$U~%)%mzrCc6AOU>h0nw=uOOQGjCWpF%v85&$&$K`dIJgZN+83q!!caws=HcxL3 z7YLZyMFV(XsU7u{c|szPlTmrc(SwY=Q|2_;K)ljwa(r@;~T~ zwGx{vqG&*{%rP-ElqKu`JjftEJL=VTH^+!D<9u}@ao}x6oP9~0EN3c(F zGfC?`6#XioHuWQ8L!RTSHdlGCJToUhKcqt-sN=akYH^3KdOm^~41{wyr3)PG2nkkj zU(h=Xw>A{Mdt}M7?(2cct^LnK#y`@o)U23xuqPV1X}TRQ3$Wy=Po|f(nV&fOE)X%5 z7ya!IS@E2|*iD)@H&w*6q!dc)9*K;$3T)j6YTRE}T;^}lX8YVEq-9l#-GC()w9ogL&^EuO#ALc$%@>>7>OlcW zz7I4f_Kkh)M<@bi^p8F#MbFDmeEq#A`g$|=Pxbz!#^rv_E>`>6htl#Ztbz*R`3}Ds z6xh&p_B5g(oolqMOf)Xr2P@0yGp86uwT;1NS66)pHVyO%)4Y;3Jos#jO}qTkYkH98 z$$)90d&hBu!O(9$*?$rnjvLIjwz_4SHgSy;@@CO|xgB_TjE70qw1 zrz*e%)m@alSEag%=r;+8Qb~{m`Q?+hH=RE7e5d?hE0=bsz4q{mUTxgr^6EBPfqFgU ztP0#3_B*%C3|W(~nfCVZ#RH~0c-gM7!@gq22YrurwtxMg;X?BBW60b+xc&e9AB;$sy;#X>s;T+Ve=D#4>~ST7hJI?g(luT%|Dj%Vej9LpqHjP&t0-|QL7 z^_pXE1@@YrS0KozKNJ|*`nO_ozkGj#H$*m=ppKzQLQB1%6MGkO5|QGyJ9g#3Eaj3{LzCUYoF~7SO)B6EPq2XNiLPK=I#oF z$zcTt4?n^Xy+%M%!x2v72A&WoHE*0mpr@sIpLn^@kq05`RDTN{K5jd zflFSG*QtfnQE27ID5z~g$eaes=X#uTw5?8$+$$k;L^6+-XKSy)OGCmEHHP`k+G30m zLwrOZN0AOW1(Zu?!6R%WZ1)VW@; zpbZZn>}4YIf-cXo>Sy;6O-V+ULDEE}#Hce`@Mn6{d_;Dj4plr z8c31C(yELsRmWOMpJ`3Nk|9XEKFlTJ1e>Tr8jiz1Bx_8wv7jj%zMC3+tLIM?_px|E{~Y;)_>%9yH}szxx(ko@5qZjMO={Y1vmEHy@ciW^O<2+6w{ zwo*vJ8C7TW#8B?%DX{fI0@{kmP7L8>(b0~BREE2KZf7y7k^oi>USJVM#%ahef0)|x z#opwRzm5iZ-~T_?Q_F!{&c({0ErpBI-0HSLoqiDPa6@sOY(YpxG5wTd+-&YthHjsc z#$pbTus&MBPLCH&-fGYh{=aHmrXkySLAA?{K;SGiN8gb1F{56nFv$6cKDSs*z2}q( z69jPf%Bd+faNg+JARtqzTNU+OaSsCFVY6Vj@#(pH!1X2+W&w@v#z}1w8qL}bhkO!p z|H)PRrq0hUMl@ah>_o+$$dBIH^mKZ;rfp@#7O8WkiYu$3&uj?*gSTU1WX`NkYFtq# zRZ1sXQU`5!M(m8rD97@$IfAn#%@KZfq|s9KIPJ0|ng{+qmL=d}l{rtP1^F4psD&gl z!ahW&!VN=rDNc^J#LMBpwGKti9u2^#1T>y5%fh4@ph2?gxV;o+Zq`m}2hMD-2bZ{v zA5T-DZoc6aPyho31N}de@2YB7Od zd^&s`AH+XStEL1aX-pDhH%Yo0d%s*HHJ(H??Jt%Nr-bPNQHR1Wau@gJ`PM)o2ouBz z-DDo=NDn2R*0CvTt{LQ(&A|`Oegd!Ev#C?WfI3?Ax6pe#Hu+_)^y2#$2h*&|{SpQI zVsBkfiGFMiKTydaSD3Y2SB!n@<{`AGWdol}X2|DJuyfKzxjYP6 zmAl(zs#tfE9^WhgjFZX(2lRZ8?4Xf~AQRtRJv?=?UXY%8?XAC``0A~sdsz*-{@?EK z3maEzs>CCej=}lmK+0o@YGdC8t5%%@`dOn=!CrLMYAmRgyR6-pno#11Z0R?K&up1d zXBA!ycv=F}diz~&<3=J~i3KAFN+N+6Y(i;m@gtIsRRMRFBIYPfBAQ=Im!U=g)mt;^ zO?nSW*y0bDA|6tPO2LP2stdp8mQjd#6B9>piV;P8dg+V0zn66G)AzCW;}*~UA$j%0 z?W3MQ?)?7wM>YFiE>n3&h)CVp;qCj&_p73UpjB)+RaDoowl_SNBAwuPKhKe{0Qy&iA#q;=&;OZ=J>N}VH6>a@~PX7D|i#2k;4^d%X= z3fe$;yCg&)V$O|f8mF>w^8lN5A{=h*lRh?CpTv{rW^ED)r<)&u-nTQ>+q2-8)YLe^exOo-l zb!2PwP=uoMCV_}V8OGgSE{}86Q@ppFc4CY&m;)g`G}>U1A5M1FNC!!f3qnThlef2& zjID+Aewx2>sc|IF&la6JuYI`!avUp`7}@)GWn&hIf`L#XqHmWykb+s1it@mX3nqJw z9d^vVzDoLOS(Or)aQ`cu_?B=;UgKn!)h+ZWJPAcihZN)- zq?Y;9^ZlECdvEofk4)#bT|4!8{nLw|C8X(IcB#PxH=}`=(X`;;!%o5hRE~N}$hKZ> zTMg6EdCYi6IMf)moqch|KbOYCDdD*@wnAQ#t>z}dR{5q+(KPBpIUmC2W@jbqEiq*5 zjDU&fl4+D`x`gpYW`}azW^*+OdjKBGn~xBN)g$Yw1@2}hzZy}PVE@j8+On>wgG3HH zNE>)4sMwoFuKnTd*Pdh7BOkv1)ju8$@6q4N`$trx=Io%3Iboet2R>W|!iJd9v;|pe zAYIGU9B7Xbro|goM0(Yvty(aeb)vha=A+xT3+G0&F0h})r+fA{t;=3g5xy;?L){{7W|tYm+kf1zv#%<7B1=Jyui8ATuN2 z%gp~poiWJcJbn8|2u2I`idy(;w9N}N@#SzPbrr(a!rF23noCmPW13_*^F|FeBze$4 zrN9|<4Fy6o9^uOFb?7(6=FCS}uO~Ddn_X1^0~s5BW3OIH{o*GtX#zK8i=N>Bx%!7a z=+rJN`2Mxh4wqDHj5dZ`ASxC=u7M?@+9jnjm)>NSyEbjwbbbPJ*#kmj>orO7Mpz?K zmCEPu*)L}Kt( znRGquH{JZOgKKichtn-&1IjnaSuL?>-0`exTpnif$?B*L&!#5QJ2ze55%6F9@KMTw z{GEVq--@5(O(gblb)PhvCacQ#m;2{9J;{FPAFVv}r9@-hDK67WQe2*asqinb)Q>TYW7t_ZlIW`+J7w|!DgxorAyN@6{DD|pJ zcZ(Hr>cp;n4r7ANEVK8GEG(G&E6Zw)n`19Q%$X@Z%!x8vFB7B!HxOTXgprBMsfs>* z=2MB;D=l(&Gn-8UKD2y;s`!3B>xB%*>_s4^1gAI9P83}?#oSZq^ILMdQE5K8ECKRj z-@4QIk_EEeZhrCT!Y|aA&ei>jBRVaOfIFN?om}qURRzc9nX19aBL6FC+qe0gYRuAk zjp(y?eOtbm*qAzD^plO5r$FK_mll?stqgCpgfhKOgMY-l5;%}v6<{jSlX{|F&6A@j z$D^T(%tz>4@lxp5~ZY8A|6?gH;FC!i64L9sH?h zbpD?F{i9ZhU4AF&mQJ|!`?R(_?j4qy{`q6Szjjx>|H+6BPB=wT;#<>OWK!rN+!$Gg z2X&hfb_{7%ZVpbCn?R5aM!8Zj?qFQL`EoTF@z>9iSQ-Nef6Efvi$oE2`?Y)JW@PR zu#2PE`NajATIH~JhQ<-+qct|Ibbn}hVQSLfoYl)p_PR9qj#>=A2st`4EbG_IoaV%H zEDx`otQAnRw|3s_#z$ESb!0|psKL$U3TG9-zCwQ-B3ZNaayb(-kD#rYLA2Icg%mf$ z5GBxx7U=y5+1&Pw$`fSAB3*j4qgr)YzDpuGK6c#}dx<>}^iI+5Q{VlAIqE-ewQPz1 zOXQ`W`a^%^2)qK7QfR8mqkB30FU}beQLwFi8(LEmwK!MlOC)BbF32~=u$j-mWm;ba z0V+b8u_~#HC=)Z@`-85JQ>NI@StO%qvq0QI5|P1x9E@^~DoHe@$(E1K=jBP%WJ7S1 znB*a$M@(wHH@iv5d@LX092JURUgX*)H9N14 z2-8Bb?cp=ocy{?BtEA+tHHl{2QMjLNr|-&9`(CkX_o^X1=W(OMZ@kl0)302JQz_+z z#(2dzibBi^+9j83SjzgHWA~{kO)xt`gQLo)3NCaEiZgPH=DU%QyP#-{P)kdB>$hG5 z$?#xoEGR@^8XXlz9{0%!swy&c5dxs5e`x%4YUT69oYt?Gzx_;lQFq9}4gL5Y)Yer= zRuCrAF6f?3F59@)4Kaz?bBVeY?Y>CUxUnLs=2agnb+E58YEhz!0A6m{+{dZNBPj6^KM;;-K^^t}z4nO6P=V2yb(ph8OW= zho196T*Or6En-`K0& zH&cfBb>SCB(*+&^=nj2tOwhr8!Vo5O;s!c`e-2>!SBSV|(nkE|Xz#289= zA!!Aj+i`7$%K79{+y7ksta^ps2wSs##jc%7Gu8|d`>Ja9?>B^Q_az!lTDz_0_8d#9 zEX=M|vJ$pOMQwKtLB1KK#j3e1sY6_;q5j)TB~nPR2LttpLP%=!4>gG)ZUi%XhJaJ> z;7ryVZlVq+hnqy4EL6tzR6o_reM1tOh6!H9=4VX?xtm{&&LcgPd-F~i8CFG*4$0Z+ z?Py3ddIH|Qv7mFcf8H`)Hj z^zF5(s|33wyU=CUmRQ`#=r4v#x9t??We1Ig7af$F4;>3$^POQ$M`?fj6sX$ zlHzT<4U?7Yz*n4#vAt&h@V;nl-39XQ_DLxF2zBwIQ&w`8IB#qDlpdbCzj85=<9FI( zIzEWKj0jStXAn)VY3&)6g%|VOVWr*S;Ulp!RvaH8!_U*YS|S{5m!4=AQDNnSq++L< z=O*YNBa!(=o=HH#DaT_8o*vzNZyt#_AB>DWyc)LyGo-_CBV5I$pAoqzh)<#fSU6z=(V z|McUj>cQ@BNFAT`r(I~2?q_?amsf^ARPUdFpkI|`ki)*?CL$YW`ZzEZs53BfS7WZR zaT|j#7D{TaWCcdT7FlOGzDL;N?vMJeDjKyj+x*jJZk*=wRhm~+ppc4aZ%~nS8t$x+ zi|JjGX2c0~K1wwp)h1a6>1YfA7HcZv?x~;KTVq0P?R8BHvN}eG3}Fff#}>!25W3!n zHSv#nzGk;ZNw=4#S~ z)LvO6Pe2zSkZ&yKl1WBz?FQqVRV{ap#HD1z;^c8t4W?Y&B&e4=L6L!p2P{J@n$?;6 zLX(V9GkCa6$`?}kR5En|js~%8xZhtsnG%0}W}++N&bd1${CAEAq@x!Db43@IVJVNS z+)|q~4+6B`YzHP}OK6!We2Wys($4mDf6C!h$e(s}?npvSy*7U(*kFo${>u?rM3>=v`Qem~@3$;a(L`kGMq5d2)lE>J=Gq zK}H8erLuDM8rJNnXgz9*p@c+NBZ((s>S+cAG9VaTOkjny&c)_o@Fd-7O#4%Sbw|=! z_R-+A!>P(wRn^tw;weRrAWK;r69+>$2p4>rPS#WvI?Q)heMCv>!ei-}|?y<W$k0qe z6yz2HjPe=)1R!=gA2_s3yw1qu!qAXsO=L!dKuS}kUjbWaGnX5V#qAl0*`wgKhYR?y zJH>wU_QjG&V)XTd@qesz-o&GR$p5SYFhiok5~!T0ocX8GU(Q_jfjRHg2h07svwfVi zl@>dF|U59S2@5&p9k=&dHf4t`KFO1!>vM<84mR&Y`&70xgX<0o!&7w{a^>x$4Cg|0Id9`wphGnM~R|KCX`ubM) z+TVNN(Y={_STicvupu_)gAI@hs9q;dA?>+Y_N77}Mi*gDNjwO> zZ4iUfI;*DU2v}SBUw^n+{{G^V@4eR^ zymFdy|7T}AYuY*kgk77eigLhkfE9jXnr<0Pbb%27sa%T$dr>$dunyZfXO~O7#G$H6 zZ;^|=kyBf_2v+RuTCixHGM!2s8R<$ZD{)m#B$E}WFpQ4GX_ycwQHsPqds-B7k6yfr zPo`dfYxnEx>xzCee&?IEPaa=}|N5r_CA*;JFyLjp4Fj4A*QsU2fVp+JJzVA8Evs^w z%(&4mT;{2A#kz{N@y64I*XRP(&C^P`Du1g!D49GL!K9Gy^IimBAssRGIR>6wWZr;~ z>*YC$Jm3W>@+=0`J(gUfl4G=J%5g-V64_dSw!A(0ld&T?%*gTF3fO4CR{4+X@BQ)T zn*4uD`14omKmPa4FNq)C45?5K-`C&i3iqDWr2~KAZ>i}wGOac267N){Wt_+^oCFmt zGvMB=4h3F}d~EOpMA@>ezyhiPk^-Bx{#NxVfu%kgjdX_s&VwCgO>O~z0*AhcO zmjOIodO@y2K3B}+v<9j5F+)hOM$D8HVdE+3;Wy~V4rvs50|Ff0tB4p)Bk9Fa>5k*) zDT_rT=giwK?fZvr{k7@i4;*Wisrx6Om8w~3)_xTQ@=$q#t)rzQ*;%F9{@A%)8A!?V zn@#C6*-I(qVvZ> zw-c<=@soW9vjOwpBtVtvLNa|!S?(MP4ekv7Dx@*Jk(HA#R~XMKiwyH5*&ax83s25b zxHre=TXh{??K=zq6p~t11q7vYOL~}QujmSr-R{2! zyRM1M%_#wIVOVMDu^#*;&Tpd1QS)UjDrxa*Wqg>hVcIk&>*>BxIy^Qe^2FvJ<8y(x zOOBvQP+Au27^yZoOUDrc>K+4suHR}+q2FZj)1U!#jz zTj(Q9J0>04egdqQx?rPj<7lzS@`*&nc0AnsBgD1Ru9dPy7(g4-u9YO&4A&ZA^Seu^ zmTL!A{4gDRF{PH#*C;kBA(4tN!>D&jG`>Q(e#0ssF`*=-0LxM^b&xYzh0N(=f@u_R zFr!r1*<{?-Yz?c8f^0RR2A+v42#bkT#4aFu6NN0zaihrZ1fT4B`_=Cr6&L<&{@|%U z75+ZG{P@p6Er3YEo`giT)GXC2=#Mt|qrRM&v? zK}XH(9fu=k50-vUx8m2eLBye$m|6E%!ak|p*Jsk6RVuGal1wYhE9Dc6M$2ZKt&an- zPK(ZhQ^pz%dtGIGrQ_Q8*m&BE*=`H5D!l}#Uu4a)3ZZ2^Mb^O#iFz0x7w1-p-Go!b z9FlZoOHtZv^-~f5Ak0`uU- z31Bfc?X_10SU?jShwP(P|E+SE6G7|lGindjIh)z3lB` zqz1t9j=J?s*DK&1y86b{ZAgW1?)dm`$M>bZW(j-T2%n{PAIZV3jH)s)*o8nk}mfZ?c&EZ!#6e{Ji`kB<*4L7PnNq1*@1YB zTrm>HN-RD_?aUh0L<&>s2(t8P<16pa@6Snee>rjL$y@*G{;Z>1|HqowqAX?>VSGMas-+RopB#_n6uW$W&3f(pk1~yC@VSS%MtfoFsps#wbr|eXlAH1nvJmI zfv+!TCetM<_uXgcJsy2?7>b7gs!30X=o;wn?`uwI=*Xv$f{~r5+<+)pFJ(g@Knx#O zxHEz6#YxpvxycP#(=jJw;>oX9?H;m`sXGdx2*LtWfBBDU?DyY!9{$YM_`{!nRQ>eY zOGUrBl>CWk)7G*{VrBSbl4%gI%Vllb4y+`j!pqo#|6P*F{;jowHE|(OOp)#v6DBi# z3pXvhmUEcmo{lj;711}G%HIH>rk^-H0YVe-8vv zt^syT66&8q$XBpH!Z^aD4KRbVObbIXZYrYpmEXGYDA1OGh@UhTzI}uB5lytVW93Qz z??w_1gcke00!ZgVr8qI>zvDZ{@h2dnHNTqMBcT3dEz=J12?aGSWzl2D9G=O zcMt3JM+AnL;Du&1ZsdlIC10S+zy&jkt~biQ1P&&y&y>ICCKr;>TXOdJP_+0*HywW% z86AyBKJ~p_^y}MA@BWo~^Kjg^2fzPxZgEq5_tYib?o3WWw%=)w{&=O&I!v>64(h5y zKHw}m&C!*v+ewYstleyurDBdChrg_fK+v?H8E%D$9{Api1B?cgOH`#dV|$s3PX{5OPGE;TP5c+=w7?W+dx z(^cgcp01ox*A`;omd=&P4PY-xP14P*EG6!?llr@NnvOI!7XHlHVl989+w(LTeeC`!JIat(+RVAVAf;$L&&%

    2h)Cy}k@lD-o_S3o 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 literal 0 HcmV?d00001 From e7161e37e1e7810506c67731e1fbe12bdbfb006f Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Tue, 2 Jul 2024 08:13:30 +0100 Subject: [PATCH 025/141] Automatic changelog for PR #6439 [ci skip] --- html/changelogs/AutoChangeLog-pr-6439.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6439.yml diff --git a/html/changelogs/AutoChangeLog-pr-6439.yml b/html/changelogs/AutoChangeLog-pr-6439.yml new file mode 100644 index 000000000000..606fddc29b51 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6439.yml @@ -0,0 +1,5 @@ +author: "Blundir" +delete-after: True +changes: + - soundadd: "larva talking sounds" + - imageadd: "larva moving sprites, tweak of standing ones" \ No newline at end of file From bbae238ce393fe70bec9023649b72951a145cbd1 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 3 Jul 2024 01:17:00 +0000 Subject: [PATCH 026/141] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-6439.yml | 5 ----- html/changelogs/archive/2024-07.yml | 4 ++++ 2 files changed, 4 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-6439.yml create mode 100644 html/changelogs/archive/2024-07.yml diff --git a/html/changelogs/AutoChangeLog-pr-6439.yml b/html/changelogs/AutoChangeLog-pr-6439.yml deleted file mode 100644 index 606fddc29b51..000000000000 --- a/html/changelogs/AutoChangeLog-pr-6439.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Blundir" -delete-after: True -changes: - - soundadd: "larva talking sounds" - - imageadd: "larva moving sprites, tweak of standing ones" \ No newline at end of file diff --git a/html/changelogs/archive/2024-07.yml b/html/changelogs/archive/2024-07.yml new file mode 100644 index 000000000000..cf474db8722d --- /dev/null +++ b/html/changelogs/archive/2024-07.yml @@ -0,0 +1,4 @@ +2024-07-03: + Blundir: + - soundadd: larva talking sounds + - imageadd: larva moving sprites, tweak of standing ones From 5d29bf4c4a89dcaa7789a96e6a5d2dbea2fe571c Mon Sep 17 00:00:00 2001 From: zzzmike <85382350+zzzmike@users.noreply.github.com> Date: Wed, 3 Jul 2024 10:20:10 -0700 Subject: [PATCH 027/141] Clarity for facehugger/drone text (#6577) # About the pull request A small change to make my other PR clear that the hive can support for example "3 total facehuggers" and not "3 more facehuggers" - and changed lesser drone text for parity # Explain why it's good for the game clarity # Testing Photographs and Procedure

    Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
    ` tags.
    # Changelog :cl: spellcheck: more clarity for facehugger/lesser drone text /:cl: --------- Co-authored-by: harryob <55142896+harryob@users.noreply.github.com> --- code/modules/cm_aliens/structures/egg.dm | 2 +- code/modules/cm_aliens/structures/special/egg_morpher.dm | 2 +- code/modules/cm_aliens/structures/special/pylon_core.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/cm_aliens/structures/egg.dm b/code/modules/cm_aliens/structures/egg.dm index 4e22f1b5e6ba..9825389c8ac4 100644 --- a/code/modules/cm_aliens/structures/egg.dm +++ b/code/modules/cm_aliens/structures/egg.dm @@ -58,7 +58,7 @@ if(isobserver(user) && status == EGG_GROWN) var/datum/hive_status/hive = GLOB.hive_datum[hivenumber] var/current_hugger_count = hive.get_current_playable_facehugger_count(); - . += "There are currently [SPAN_NOTICE("[current_hugger_count]")] facehuggers in the hive. The hive can support [SPAN_NOTICE("[hive.playable_hugger_limit]")] facehuggers." + . += "There are currently [SPAN_NOTICE("[current_hugger_count]")] facehuggers in the hive. The hive can support a total of [SPAN_NOTICE("[hive.playable_hugger_limit]")] facehuggers at present." /obj/effect/alien/egg/attack_alien(mob/living/carbon/xenomorph/M) if(status == EGG_BURST || status == EGG_DESTROYED) diff --git a/code/modules/cm_aliens/structures/special/egg_morpher.dm b/code/modules/cm_aliens/structures/special/egg_morpher.dm index 32cf0ee591b5..c4fb5c0a900c 100644 --- a/code/modules/cm_aliens/structures/special/egg_morpher.dm +++ b/code/modules/cm_aliens/structures/special/egg_morpher.dm @@ -46,7 +46,7 @@ . += "It has [stored_huggers] facehuggers within, with [huggers_to_grow] more to grow (reserved: [huggers_reserved])." if(isobserver(user)) var/current_hugger_count = linked_hive.get_current_playable_facehugger_count(); - . += "There are currently [SPAN_NOTICE("[current_hugger_count]")] facehuggers in the hive. The hive can support [SPAN_NOTICE("[linked_hive.playable_hugger_limit]")] facehuggers." + . += "There are currently [SPAN_NOTICE("[current_hugger_count]")] facehuggers in the hive. The hive can support a total of [SPAN_NOTICE("[linked_hive.playable_hugger_limit]")] facehuggers at present." /obj/effect/alien/resin/special/eggmorph/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/grab)) diff --git a/code/modules/cm_aliens/structures/special/pylon_core.dm b/code/modules/cm_aliens/structures/special/pylon_core.dm index ae3be4d55bef..71211d67e23c 100644 --- a/code/modules/cm_aliens/structures/special/pylon_core.dm +++ b/code/modules/cm_aliens/structures/special/pylon_core.dm @@ -70,7 +70,7 @@ lesser_count++ . += "Currently holding [SPAN_NOTICE("[floor(lesser_drone_spawns)]")]/[SPAN_NOTICE("[lesser_drone_spawn_limit]")] lesser drones." - . += "There are currently [SPAN_NOTICE("[lesser_count]")] lesser drones in the hive. The hive can support [SPAN_NOTICE("[linked_hive.lesser_drone_limit]")] lesser drones." + . += "There are currently [SPAN_NOTICE("[lesser_count]")] lesser drones in the hive. The hive can support a total of [SPAN_NOTICE("[linked_hive.lesser_drone_limit]")] lesser drones at present." /obj/effect/alien/resin/special/pylon/attack_ghost(mob/dead/observer/user) . = ..() From 524c9dbd18e9334cb5108feceb95c0b7aab57486 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 3 Jul 2024 18:27:07 +0100 Subject: [PATCH 028/141] Automatic changelog for PR #6577 [ci skip] --- html/changelogs/AutoChangeLog-pr-6577.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6577.yml diff --git a/html/changelogs/AutoChangeLog-pr-6577.yml b/html/changelogs/AutoChangeLog-pr-6577.yml new file mode 100644 index 000000000000..0a632cde43b2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6577.yml @@ -0,0 +1,4 @@ +author: "zzzmike" +delete-after: True +changes: + - spellcheck: "more clarity for facehugger/lesser drone text" \ No newline at end of file From 41dcf116f6cc7d048a412784d7f2e6f19d84e17e Mon Sep 17 00:00:00 2001 From: Doubleumc Date: Wed, 3 Jul 2024 13:21:04 -0400 Subject: [PATCH 029/141] In-view verbs work for varying view ranges (#6591) # About the pull request Admin "InView" procs now take the user's current view range into account. If you zoom out as a ghost, it will use your current view size as you'd expect. Where possible, admin and observer procs use a global list check instead of a view check. This prevents an issue where a right-clicked subject moves out of view before you can click on the menu option, which causes the option to fail and fill your command bar with some useless text. Does *not* take view offsets into account, e.g. binoculars shifting `client.pixel_x` & `client.pixel_y` # Explain why it's good for the game Procs billed as "in-view" should work based on your current view range. Right-click actions without a specific range cap should work on anything in your view range. # Testing Photographs and Procedure Each proc continues to work as expected, just with more lenient ranging rules. # Changelog :cl: qol: ghost health scan & follow right-click actions work at any range admin: "InView" procs use your current view range (e.g. ghost zoom) /:cl: --- code/modules/admin/callproc.dm | 2 +- code/modules/admin/tabs/admin_tab.dm | 10 +++++----- code/modules/admin/verbs/freeforghosts.dm | 2 +- code/modules/admin/verbs/mob_verbs.dm | 8 ++++---- code/modules/admin/verbs/select_equipment.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 4 ++-- code/modules/mob/mob_helpers.dm | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/code/modules/admin/callproc.dm b/code/modules/admin/callproc.dm index 1af1f5aa9fa3..36ed859a210f 100644 --- a/code/modules/admin/callproc.dm +++ b/code/modules/admin/callproc.dm @@ -230,7 +230,7 @@ GLOBAL_PROTECT(LastAdminCalledProc) to_chat(usr, SPAN_BOLDWARNING("Warning: Force attempt has been logged.")) message_admins("[key_name(usr)] has attempted to execute a restricted proc. ([procname])") -/client/proc/callproc_datum(datum/called_datum as null|area|mob|obj|turf) +/client/proc/callproc_datum(datum/called_datum as null|area|mob|obj|turf in view(src)) set category = "Debug" set name = "Datum ProcCall" set waitfor = FALSE diff --git a/code/modules/admin/tabs/admin_tab.dm b/code/modules/admin/tabs/admin_tab.dm index f29f99004625..5f3bc220876c 100644 --- a/code/modules/admin/tabs/admin_tab.dm +++ b/code/modules/admin/tabs/admin_tab.dm @@ -435,7 +435,7 @@ if(tgui_alert(src, "Do you want to strip yourself as well?", "Confirmation", list("Yes", "No")) == "Yes") strip_self = TRUE - for(var/mob/living/current_mob in view()) + for(var/mob/living/current_mob in view(src)) if(!strip_self && usr == current_mob) continue for (var/obj/item/current_item in current_mob) @@ -458,7 +458,7 @@ if(alert("This will rejuvenate ALL mobs within your view range. Are you sure?",,"Yes","Cancel") == "Cancel") return - for(var/mob/living/M in view()) + for(var/mob/living/M in view(src)) M.rejuvenate(FALSE) message_admins(WRAP_STAFF_LOG(usr, "ahealed everyone in [get_area(usr)] ([usr.x],[usr.y],[usr.z])."), usr.x, usr.y, usr.z) @@ -476,7 +476,7 @@ if(alert("This will rejuvenate ALL humans within your view range. Are you sure?",,"Yes","Cancel") == "Cancel") return - for(var/mob/living/carbon/human/M in view()) + for(var/mob/living/carbon/human/M in view(src)) M.rejuvenate(FALSE) message_admins(WRAP_STAFF_LOG(usr, "ahealed all humans in [get_area(usr)] ([usr.x],[usr.y],[usr.z])"), usr.x, usr.y, usr.z) @@ -493,7 +493,7 @@ if(alert("This will rejuvenate ALL revivable humans within your view range. Are you sure?",,"Yes","Cancel") == "Cancel") return - for(var/mob/living/carbon/human/M in view()) + for(var/mob/living/carbon/human/M in view(src)) if(!ishuman_strict(M) && !ishumansynth_strict(M)) continue @@ -519,7 +519,7 @@ if(alert("This will rejuvenate ALL xenos within your view range. Are you sure?",,"Yes","Cancel") == "Cancel") return - for(var/mob/living/carbon/xenomorph/X in view()) + for(var/mob/living/carbon/xenomorph/X in view(src)) X.rejuvenate(FALSE) message_admins(WRAP_STAFF_LOG(usr, "ahealed all xenos in [get_area(usr)] ([usr.x],[usr.y],[usr.z])"), usr.x, usr.y, usr.z) diff --git a/code/modules/admin/verbs/freeforghosts.dm b/code/modules/admin/verbs/freeforghosts.dm index 4bf5549f30f0..b5e43bbb8793 100644 --- a/code/modules/admin/verbs/freeforghosts.dm +++ b/code/modules/admin/verbs/freeforghosts.dm @@ -38,7 +38,7 @@ if(alert("This will free ALL mobs within your view range. Are you sure?",,"Yes","Cancel") == "Cancel") return - for(var/mob/living/M in view()) + for(var/mob/living/M in view(src)) free_for_ghosts(M, notify = FALSE) message_admins(WRAP_STAFF_LOG(usr, "freed all mobs in [get_area(usr)] ([usr.x],[usr.y],[usr.z])"), usr.x, usr.y, usr.z) diff --git a/code/modules/admin/verbs/mob_verbs.dm b/code/modules/admin/verbs/mob_verbs.dm index 3b4de192e78f..7a1dab7c7cf3 100644 --- a/code/modules/admin/verbs/mob_verbs.dm +++ b/code/modules/admin/verbs/mob_verbs.dm @@ -203,7 +203,7 @@ else return -/client/proc/cmd_admin_object_narrate(obj/selected) +/client/proc/cmd_admin_object_narrate(obj/selected in view(src)) set name = "Object Narrate" set category = null @@ -234,7 +234,7 @@ log_admin("[key_name(src)] sent an Object Narrate with message [message].") message_admins("[key_name(src)] sent an Object Narrate with message [message].") -/client/proc/cmd_admin_direct_narrate(mob/M) +/client/proc/cmd_admin_direct_narrate(mob/M in GLOB.mob_list) set name = "Narrate" set category = null @@ -330,7 +330,7 @@ message_admins("[key_name_admin(usr)] made [key_name_admin(M)] drop everything!") -/client/proc/cmd_admin_change_their_hivenumber(mob/living/carbon/H) +/client/proc/cmd_admin_change_their_hivenumber(mob/living/carbon/H in GLOB.living_mob_list) set name = "Change Hivenumber" set category = null @@ -370,7 +370,7 @@ message_admins("[key_name(src)] changed hivenumber of [H] to [H.hivenumber].") -/client/proc/cmd_admin_change_their_name(mob/living/carbon/carbon) +/client/proc/cmd_admin_change_their_name(mob/living/carbon/carbon in GLOB.living_mob_list) set name = "Change Name" set category = null diff --git a/code/modules/admin/verbs/select_equipment.dm b/code/modules/admin/verbs/select_equipment.dm index 90269f70c1aa..196079fe4739 100644 --- a/code/modules/admin/verbs/select_equipment.dm +++ b/code/modules/admin/verbs/select_equipment.dm @@ -98,7 +98,7 @@ var/datum/job/J = GLOB.RoleAuthority.roles_by_name[newskillset] H.set_skills(J.get_skills()) -/client/proc/cmd_admin_dress(mob/M) +/client/proc/cmd_admin_dress(mob/M in GLOB.mob_list) set category = null set name = "Select Equipment" diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 0ea2b3856da1..1112247380dd 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -662,7 +662,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp usr.forceMove(pick(L)) following = null -/mob/dead/observer/proc/scan_health(mob/living/target in view(src.client)) +/mob/dead/observer/proc/scan_health(mob/living/target in GLOB.living_mob_list) set name = "Scan Health" if(!istype(target)) @@ -695,7 +695,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp last_health_display.target_mob = target last_health_display.look_at(src, DETAIL_LEVEL_FULL, bypass_checks = TRUE) -/mob/dead/observer/verb/follow_local(mob/target) +/mob/dead/observer/verb/follow_local(mob/target in GLOB.mob_list) set category = "Ghost.Follow" set name = "Follow Local Mob" set desc = "Follow on-screen mob" diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 8c41e1149f35..76841c2097c9 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -484,7 +484,7 @@ GLOBAL_LIST_INIT(limb_types_by_name, list( * [this byond forum post](https://secure.byond.com/forum/?post=1326139&page=2#comment8198716) * for why this isn't atom/verb/examine() */ -/mob/verb/examinate(atom/examinify as mob|obj|turf in view()) +/mob/verb/examinate(atom/examinify as mob|obj|turf in view(client)) set name = "Examine" set category = "IC" From 39ac3938c17c975696d662176ad069bb51deca52 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 3 Jul 2024 18:34:16 +0100 Subject: [PATCH 030/141] Automatic changelog for PR #6591 [ci skip] --- html/changelogs/AutoChangeLog-pr-6591.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6591.yml diff --git a/html/changelogs/AutoChangeLog-pr-6591.yml b/html/changelogs/AutoChangeLog-pr-6591.yml new file mode 100644 index 000000000000..1cab75dbe648 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6591.yml @@ -0,0 +1,5 @@ +author: "Doubleumc" +delete-after: True +changes: + - qol: "ghost health scan & follow right-click actions work at any range" + - admin: "\"InView\" procs use your current view range (e.g. ghost zoom)" \ No newline at end of file From a0e93b9a3eae4bc985b192f15563aa8ec3ddd3c2 Mon Sep 17 00:00:00 2001 From: Nomoresolvalou Date: Wed, 3 Jul 2024 12:23:39 -0500 Subject: [PATCH 031/141] Replaces Synth Vendor Headset (#6574) # About the pull request Replaces the senior command headset with the synthetic headset in the synth equipment vendor # Explain why it's good for the game The synth headset is very useful as it gives synthetics a tracker for the SLs, XO, and CO. This change will allow for survivor synthetics that ally with the Almayer to track just as a normal synth. It also allows shipside synths to keep the tracker if their spawn headset is lost/stolen/melted. Also makes sense that the synth vendor gives the synth headset # Testing Photographs and Procedure
    Screenshots & Videos Put screenshots and videos here with an empty line between the screenshots and the `
    ` tags.
    # Changelog :cl: Nomoresolvalou balance: The headset in the synthetic equipment vendor has been replaced with a synthetic headset as opposed to a senior command headset /:cl: Co-authored-by: harryob <55142896+harryob@users.noreply.github.com> --- code/game/machinery/vending/vendor_types/crew/synthetic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/vending/vendor_types/crew/synthetic.dm b/code/game/machinery/vending/vendor_types/crew/synthetic.dm index 1ece8d353d4f..0146af139871 100644 --- a/code/game/machinery/vending/vendor_types/crew/synthetic.dm +++ b/code/game/machinery/vending/vendor_types/crew/synthetic.dm @@ -91,7 +91,7 @@ GLOBAL_LIST_INIT(cm_vending_clothing_synth, list( list("Experimental Tool Vendor Token", 0, /obj/item/coin/marine/synth, MARINE_CAN_BUY_ESSENTIALS, VENDOR_ITEM_MANDATORY), list("RADIO (TAKE ALL)", 0, null, null, null), - list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/cdrcom, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), + list("Headset", 0, /obj/item/device/radio/headset/almayer/mcom/synth, MARINE_CAN_BUY_EAR, VENDOR_ITEM_MANDATORY), list("UNIFORM (CHOOSE 1)", 0, null, null, null), list("Uniform, Outdated Synth", 0, /obj/item/clothing/under/rank/synthetic/old, MARINE_CAN_BUY_UNIFORM, VENDOR_ITEM_REGULAR), From f6596a7e511d55df12355de19ef4ddd1034b8879 Mon Sep 17 00:00:00 2001 From: cm13-github <128137806+cm13-github@users.noreply.github.com> Date: Wed, 3 Jul 2024 18:42:12 +0100 Subject: [PATCH 032/141] Automatic changelog for PR #6574 [ci skip] --- html/changelogs/AutoChangeLog-pr-6574.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-6574.yml diff --git a/html/changelogs/AutoChangeLog-pr-6574.yml b/html/changelogs/AutoChangeLog-pr-6574.yml new file mode 100644 index 000000000000..e7a6ad8e069b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-6574.yml @@ -0,0 +1,4 @@ +author: "Nomoresolvalou" +delete-after: True +changes: + - balance: "The headset in the synthetic equipment vendor has been replaced with a synthetic headset as opposed to a senior command headset" \ No newline at end of file From 72fa3851c2226ec32bdaf2b365f17d12fff5fb54 Mon Sep 17 00:00:00 2001 From: Doubleumc Date: Wed, 3 Jul 2024 13:32:01 -0400 Subject: [PATCH 033/141] length() over .len (#6546) # About the pull request Replaces `list.len` lookup with `length(list)`. The following replacements are broadly applied: - `list.len` -> `length(list)` : except where `len is being assigned or modified, such as `list.len--`, which is a valid use-case - `list && list.len`, `!isnull(list) && list.len`, `list?.len` -> `LAZYLEN(list)` : also the inverted form; `LAZYLEN` is just a define for `length` but is used here to more clearly communicate that originally the list was tested for existence - `if(list.len) list.Cut()` -> `LAZYCLEARLIST(list)` : identical to the define so instead of replacing `len` with `length` just used the define A few one-offs: - `(list?(list.len):(0))` -> `(LAZYLEN(list) || 0)` in `recipe.dm` : resulting value gets assigned to a variable that is used elsewhere, so ensured it returned 0 in the same circumstances - `if(!list || !list.len) { return FALSE } if(list?.len) { ...`-> `if(!LAZYLEN(list)) { return FALSE } ...` in `modify_variables.dm` : simplified two branching checks into one - `!list || list.len == 0` -> `!LAZYLEN(list)` in `teleporter.dm` : removed the `==` test to allow simplifying down to `LAZYLEN` while ensuring it has the same truthiness # Explain why it's good for the game `length(list)` is preferred over `list.len` since it inherently handles nulls and is allegedly slightly more performant. # Testing Photographs and Procedure Boots without issue. # Changelog No player-facing changes. --- code/__DEFINES/tgs.config.dm | 2 +- code/__HELPERS/_lists.dm | 10 +- code/__HELPERS/chat.dm | 2 +- code/__HELPERS/game.dm | 4 +- code/__HELPERS/guid.dm | 2 +- code/__HELPERS/icons.dm | 10 +- code/__HELPERS/lists.dm | 122 +++++++++--------- code/__HELPERS/mobs.dm | 4 +- code/__HELPERS/sanitize_values.dm | 2 +- code/__HELPERS/shell.dm | 2 +- code/__HELPERS/sorts/TimSort.dm | 10 +- code/__HELPERS/sorts/_Main.dm | 22 ++-- code/__HELPERS/unsorted.dm | 12 +- code/_globalvars/global_lists.dm | 2 +- code/_macros.dm | 2 +- code/_onclick/adjacent.dm | 4 +- code/_onclick/click.dm | 2 +- code/_onclick/click_hold.dm | 2 +- code/_onclick/hud/hud.dm | 32 ++--- code/_onclick/hud/human.dm | 2 +- code/_onclick/hud/radial.dm | 8 +- code/_onclick/hud/screen_objects.dm | 4 +- code/_onclick/item_attack.dm | 2 +- code/_onclick/ventcrawl.dm | 4 +- .../controllers/configuration/config_entry.dm | 2 +- .../configuration/configuration.dm | 2 +- code/controllers/mc/globals.dm | 10 +- code/controllers/mc/master.dm | 4 +- code/controllers/shuttle_controller.dm | 4 +- code/controllers/subsystem/acid_pillar.dm | 4 +- code/controllers/subsystem/atoms.dm | 8 +- code/controllers/subsystem/cellauto.dm | 6 +- code/controllers/subsystem/decorator.dm | 20 +-- code/controllers/subsystem/disease.dm | 6 +- code/controllers/subsystem/events.dm | 4 +- code/controllers/subsystem/fz_transitions.dm | 2 +- code/controllers/subsystem/garbage.dm | 2 +- code/controllers/subsystem/human.dm | 6 +- code/controllers/subsystem/init/landmarks.dm | 10 +- code/controllers/subsystem/input.dm | 2 +- code/controllers/subsystem/item_cleanup.dm | 10 +- code/controllers/subsystem/lighting.dm | 2 +- code/controllers/subsystem/machinery.dm | 6 +- code/controllers/subsystem/mapping.dm | 14 +- code/controllers/subsystem/mob.dm | 6 +- code/controllers/subsystem/nanoui.dm | 6 +- code/controllers/subsystem/perf_logging.dm | 4 +- code/controllers/subsystem/ping.dm | 6 +- code/controllers/subsystem/playtime.dm | 4 +- code/controllers/subsystem/police_clues.dm | 6 +- code/controllers/subsystem/power.dm | 10 +- .../subsystem/processing/obj_tab_items.dm | 4 +- .../subsystem/processing/processing.dm | 4 +- code/controllers/subsystem/projectiles.dm | 6 +- code/controllers/subsystem/quadtrees.dm | 8 +- code/controllers/subsystem/round_recording.dm | 4 +- code/controllers/subsystem/shuttles.dm | 12 +- code/controllers/subsystem/sound.dm | 4 +- code/controllers/subsystem/soundscape.dm | 4 +- code/controllers/subsystem/statpanel.dm | 2 +- code/controllers/subsystem/tgui.dm | 4 +- code/controllers/subsystem/tracking.dm | 2 +- code/controllers/subsystem/xeno.dm | 6 +- code/datums/_ndatabase/code/brsql_adapter.dm | 6 +- code/datums/_ndatabase/code/native_adapter.dm | 4 +- .../code/native_persistent_query.dm | 6 +- .../subsystems/database_query_manager.dm | 2 +- .../_ndatabase/subsystems/entity_manager.dm | 4 +- code/datums/_ndatabase/tests/test_entity.dm | 2 +- code/datums/ammo/ammo.dm | 2 +- code/datums/ammo/misc.dm | 6 +- code/datums/browser.dm | 4 +- code/datums/components/_component.dm | 8 +- code/datums/datum.dm | 2 +- code/datums/diseases/advance/advance.dm | 34 ++--- .../diseases/advance/symptoms/symptoms.dm | 2 +- code/datums/diseases/black_goo.dm | 6 +- code/datums/emergency_calls/custom.dm | 2 +- code/datums/emergency_calls/emergency_call.dm | 18 +-- code/datums/entities/player.dm | 6 +- code/datums/global_variables.dm | 4 +- code/datums/helper_datums/getrev.dm | 4 +- code/datums/helper_datums/teleport.dm | 4 +- code/datums/matrix_editor.dm | 6 +- code/datums/medal_awards.dm | 4 +- code/datums/quadtree.dm | 2 +- code/datums/recipe.dm | 12 +- code/datums/soundOutput.dm | 2 +- .../datums/statistics/entities/panel_stats.dm | 4 +- .../datums/statistics/entities/round_stats.dm | 4 +- code/datums/weather/weather_map_holder.dm | 2 +- code/defines/procs/AStar.dm | 34 ++--- code/game/atoms.dm | 2 +- .../cas_manager/datums/cas_fire_mission.dm | 6 +- code/game/gamemodes/cm_initialize.dm | 30 ++--- code/game/gamemodes/cm_process.dm | 14 +- .../colonialmarines/colonialmarines.dm | 14 +- .../gamemodes/colonialmarines/huntergames.dm | 8 +- .../colonialmarines/whiskey_outpost.dm | 12 +- .../whiskey_outpost/whiskey_output_waves.dm | 2 +- .../gamemodes/colonialmarines/xenovsxeno.dm | 6 +- code/game/gamemodes/extended/extended.dm | 2 +- code/game/gamemodes/extended/infection.dm | 8 +- code/game/jobs/access.dm | 10 +- .../jobs/job/civilians/other/survivors.dm | 2 +- code/game/jobs/job/job.dm | 2 +- code/game/jobs/job/marine/squad_info.dm | 6 +- code/game/jobs/job/marine/squads.dm | 2 +- code/game/jobs/role_authority.dm | 10 +- code/game/machinery/air_alarm.dm | 10 +- code/game/machinery/autolathe.dm | 16 +-- code/game/machinery/bots/cleanbot.dm | 12 +- code/game/machinery/bots/floorbot.dm | 10 +- code/game/machinery/bots/medbot.dm | 16 +-- code/game/machinery/bots/mulebot.dm | 12 +- code/game/machinery/camera/camera.dm | 4 +- code/game/machinery/camera/motion.dm | 2 +- .../machinery/computer/almayer_control.dm | 2 +- code/game/machinery/computer/arcade.dm | 2 +- code/game/machinery/computer/atmos_alert.dm | 8 +- .../game/machinery/computer/camera_console.dm | 2 +- .../game/machinery/computer/communications.dm | 6 +- .../machinery/computer/dropship_weapons.dm | 8 +- code/game/machinery/computer/guestpass.dm | 2 +- code/game/machinery/computer/security.dm | 10 +- code/game/machinery/computer/skills.dm | 10 +- code/game/machinery/computer/station_alert.dm | 6 +- code/game/machinery/constructable_frame.dm | 2 +- code/game/machinery/cryo.dm | 2 +- code/game/machinery/cryopod.dm | 4 +- .../machinery/door_display/door_display.dm | 2 +- code/game/machinery/doors/airlock.dm | 4 +- code/game/machinery/doors/firedoor.dm | 10 +- code/game/machinery/doors/windowdoor.dm | 10 +- code/game/machinery/iv_drip.dm | 2 +- code/game/machinery/kitchen/microwave.dm | 4 +- code/game/machinery/kitchen/processor.dm | 8 +- code/game/machinery/kitchen/smartfridge.dm | 4 +- code/game/machinery/medical_pod/autodoc.dm | 12 +- .../game/machinery/medical_pod/bodyscanner.dm | 2 +- code/game/machinery/nuclearbomb.dm | 8 +- code/game/machinery/rechargestation.dm | 2 +- code/game/machinery/scoreboard.dm | 3 +- code/game/machinery/status_display.dm | 6 +- .../telecomms/machine_interactions.dm | 4 +- .../machinery/telecomms/portable_comms.dm | 4 +- code/game/machinery/vending/cm_vending.dm | 14 +- code/game/machinery/vending/vending.dm | 4 +- .../machinery/vending/vendor_types/dress.dm | 4 +- .../vending/vendor_types/requisitions.dm | 4 +- code/game/machinery/washing_machine.dm | 2 +- .../effects/decals/cleanable/blood/blood.dm | 2 +- code/game/objects/effects/decals/posters.dm | 4 +- .../effects/effect_system/chemsmoke.dm | 8 +- code/game/objects/effects/glowshroom.dm | 2 +- .../objects/effects/spawners/gibspawner.dm | 8 +- .../effects/spawners/wo_spawners/supplies.dm | 2 +- code/game/objects/effects/spiders.dm | 4 +- code/game/objects/items.dm | 4 +- code/game/objects/items/ashtray.dm | 8 +- code/game/objects/items/bodybag.dm | 6 +- code/game/objects/items/cards_ids.dm | 10 +- .../objects/items/circuitboards/airlock.dm | 4 +- .../objects/items/circuitboards/computer.dm | 2 +- .../objects/items/devices/autopsy_scanner.dm | 6 +- .../objects/items/devices/clue_scanner.dm | 2 +- .../objects/items/devices/data_detector.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 2 +- code/game/objects/items/devices/scanners.dm | 4 +- .../objects/items/devices/taperecorder.dm | 12 +- .../objects/items/devices/teleportation.dm | 2 +- code/game/objects/items/devices/walkman.dm | 10 +- .../objects/items/explosives/explosive.dm | 14 +- code/game/objects/items/frames/camera.dm | 4 +- code/game/objects/items/frames/matrix.dm | 4 +- .../objects/items/implants/implantchair.dm | 4 +- code/game/objects/items/misc.dm | 4 +- .../items/reagent_containers/autoinjectors.dm | 2 +- .../reagent_containers/food/condiment.dm | 4 +- .../reagent_containers/food/drinks/bottle.dm | 2 +- .../food/drinks/drinkingglass.dm | 6 +- .../reagent_containers/food/drinks/jar.dm | 2 +- .../items/reagent_containers/food/sandwich.dm | 10 +- .../items/reagent_containers/food/snacks.dm | 24 ++-- .../reagent_containers/food/snacks/grown.dm | 2 +- .../reagent_containers/reagent_container.dm | 6 +- .../objects/items/reagent_containers/spray.dm | 2 +- code/game/objects/items/stacks/stack.dm | 2 +- code/game/objects/items/storage/belt.dm | 6 +- code/game/objects/items/storage/firstaid.dm | 6 +- .../objects/items/storage/large_holster.dm | 2 +- code/game/objects/items/storage/misc.dm | 6 +- code/game/objects/items/storage/pouch.dm | 16 +-- code/game/objects/items/storage/storage.dm | 18 +-- .../objects/items/storage/surgical_tray.dm | 2 +- .../objects/items/tools/experimental_tools.dm | 2 +- code/game/objects/items/tools/extinguisher.dm | 2 +- code/game/objects/items/weapons/weaponry.dm | 2 +- code/game/objects/structures/bedsheet_bin.dm | 4 +- code/game/objects/structures/bookcase.dm | 6 +- .../crates_lockers/largecrate_supplies.dm | 4 +- code/game/objects/structures/morgue.dm | 4 +- .../objects/structures/reagent_dispensers.dm | 2 +- code/game/objects/structures/safe.dm | 2 +- .../game/objects/structures/tank_dispenser.dm | 4 +- code/game/sound.dm | 2 +- code/game/supplyshuttle.dm | 22 ++-- code/game/turfs/turf.dm | 22 ++-- code/game/turfs/walls/wall_icon.dm | 12 +- code/game/verbs/who.dm | 2 +- code/game/world.dm | 2 +- code/modules/admin/IsBanned.dm | 2 +- code/modules/admin/STUI.dm | 32 ++--- code/modules/admin/admin.dm | 6 +- code/modules/admin/admin_ranks.dm | 10 +- code/modules/admin/callproc.dm | 14 +- .../admin/medal_panel/medals_panel_tgui.dm | 4 +- code/modules/admin/player_notes.dm | 2 +- .../admin/player_panel/player_panel.dm | 6 +- code/modules/admin/tabs/debug_tab.dm | 4 +- code/modules/admin/tabs/event_tab.dm | 2 +- code/modules/admin/topic/topic.dm | 14 +- code/modules/admin/topic/topic_chems.dm | 2 +- code/modules/admin/topic/topic_events.dm | 4 +- code/modules/admin/topic/topic_teleports.dm | 34 ++--- code/modules/admin/verbs/SDQL2/SDQL_2.dm | 8 +- .../admin/verbs/SDQL2/SDQL_2_parser.dm | 8 +- .../admin/verbs/SDQL2/SDQL_2_wrappers.dm | 4 +- code/modules/admin/verbs/adminhelp.dm | 14 +- code/modules/admin/verbs/adminpanelweapons.dm | 4 +- code/modules/admin/verbs/autoreplace.dm | 2 +- code/modules/admin/verbs/debug.dm | 2 +- .../admin/view_variables/debug_variables.dm | 8 +- .../admin/view_variables/get_variables.dm | 2 +- .../view_variables/mass_edit_variables.dm | 10 +- .../admin/view_variables/modify_variables.dm | 21 ++- .../view_variables/reference_tracking.dm | 4 +- .../admin/view_variables/topic_list.dm | 8 +- .../admin/view_variables/view_variables.dm | 2 +- code/modules/almayer/machinery.dm | 4 +- code/modules/asset_cache/asset_list.dm | 4 +- .../asset_cache/transports/asset_transport.dm | 4 +- code/modules/clans/client.dm | 8 +- code/modules/client/client_procs.dm | 2 +- code/modules/client/player_details.dm | 2 +- code/modules/client/preferences.dm | 8 +- code/modules/client/preferences_savefile.dm | 7 +- code/modules/clothing/clothing.dm | 6 +- code/modules/clothing/clothing_accessories.dm | 2 +- code/modules/clothing/head/helmet.dm | 2 +- code/modules/clothing/spacesuits/breaches.dm | 8 +- .../modules/clothing/spacesuits/spacesuits.dm | 2 +- .../structures/special/recovery_node.dm | 2 +- code/modules/cm_aliens/structures/tunnel.dm | 10 +- code/modules/cm_marines/dropship_equipment.dm | 2 +- code/modules/cm_marines/equipment/gear.dm | 2 +- .../modules/cm_marines/equipment/kit_boxes.dm | 2 +- code/modules/cm_marines/equipment/weapons.dm | 15 +-- code/modules/cm_marines/marines_consoles.dm | 4 +- code/modules/cm_marines/shuttle_backend.dm | 2 +- code/modules/cm_preds/yaut_items.dm | 2 +- code/modules/customitems/item_spawning.dm | 4 +- code/modules/decorators/cassette_decorator.dm | 2 +- code/modules/defenses/sentry.dm | 12 +- code/modules/droppod/droppod_ui.dm | 2 +- .../dropships/cas/fire_mission_record.dm | 2 +- code/modules/economy/economy_misc.dm | 4 +- code/modules/flufftext/Hallucination.dm | 12 +- code/modules/flufftext/TextFilters.dm | 4 +- code/modules/hydroponics/grown_inedible.dm | 2 +- code/modules/hydroponics/hydro_tools.dm | 8 +- code/modules/hydroponics/hydro_tray.dm | 4 +- code/modules/hydroponics/seed_datums.dm | 26 ++-- .../hydroponics/seed_machines/seed_editor.dm | 2 +- .../seed_machines/seed_machines.dm | 4 +- code/modules/hydroponics/vines.dm | 10 +- code/modules/mapping/preloader.dm | 2 +- code/modules/mapping/reader.dm | 10 +- .../mapping/space_management/traits.dm | 8 +- .../space_management/zlevel_manager.dm | 14 +- code/modules/mapping/verify.dm | 12 +- code/modules/mob/dead/observer/observer.dm | 6 +- code/modules/mob/hear_say.dm | 4 +- code/modules/mob/holder.dm | 2 +- code/modules/mob/inventory.dm | 12 +- code/modules/mob/language/language.dm | 6 +- .../modules/mob/language/language_handling.dm | 2 +- code/modules/mob/living/blood.dm | 6 +- code/modules/mob/living/carbon/carbon.dm | 2 +- .../mob/living/carbon/human/examine.dm | 18 +-- .../mob/living/carbon/human/exercise.dm | 2 +- code/modules/mob/living/carbon/human/human.dm | 8 +- .../mob/living/carbon/human/human_damage.dm | 8 +- .../mob/living/carbon/human/human_defense.dm | 2 +- .../mob/living/carbon/human/human_helpers.dm | 2 +- .../mob/living/carbon/human/human_movement.dm | 2 +- .../human/life/handle_regular_hud_updates.dm | 4 +- code/modules/mob/living/carbon/human/say.dm | 2 +- .../mob/living/carbon/human/species/monkey.dm | 2 +- .../living/carbon/human/species/species.dm | 2 +- .../mob/living/carbon/human/update_icons.dm | 4 +- .../mob/living/carbon/human/whisper.dm | 4 +- .../mob/living/carbon/xenomorph/XenoProcs.dm | 10 +- .../abilities/ability_helper_procs.dm | 2 +- .../xenomorph/abilities/general_powers.dm | 8 +- .../abilities/praetorian/praetorian_powers.dm | 4 +- .../xenomorph/abilities/queen/queen_powers.dm | 8 +- .../living/carbon/xenomorph/castes/Crusher.dm | 2 +- .../living/carbon/xenomorph/castes/Queen.dm | 4 +- .../living/carbon/xenomorph/damage_procs.dm | 4 +- .../living/carbon/xenomorph/hive_status.dm | 30 ++--- .../mob/living/carbon/xenomorph/life.dm | 4 +- .../mob/living/carbon/xenomorph/say.dm | 4 +- .../xenomorph/strains/castes/runner/acid.dm | 2 +- .../living/carbon/xenomorph/xeno_helpers.dm | 2 +- code/modules/mob/living/living.dm | 4 +- code/modules/mob/living/living_healthscan.dm | 8 +- code/modules/mob/living/login.dm | 2 +- .../simple_animal/friendly/farm_animals.dm | 4 +- .../hostile/retaliate/retaliate.dm | 2 +- .../mob/living/simple_animal/parrot.dm | 12 +- .../mob/living/simple_animal/simple_animal.dm | 32 ++--- code/modules/mob/mob.dm | 2 +- code/modules/mob/mob_defines.dm | 2 +- code/modules/mob/mob_grab.dm | 6 +- code/modules/mob/mob_helpers.dm | 6 +- code/modules/mob/mob_movement.dm | 2 +- code/modules/mob/new_player/new_player.dm | 4 +- code/modules/nano/nanomanager.dm | 12 +- code/modules/nano/nanoui.dm | 2 +- .../modules/nightmare/nmtasks/mapscheduler.dm | 2 +- code/modules/organs/limbs.dm | 14 +- code/modules/organs/wound.dm | 4 +- code/modules/paperwork/filingcabinet.dm | 2 +- code/modules/paperwork/folders.dm | 2 +- code/modules/paperwork/notepad.dm | 6 +- code/modules/paperwork/paper.dm | 23 ++-- code/modules/paperwork/paper_bundle.dm | 10 +- code/modules/paperwork/paperbin.dm | 6 +- code/modules/paperwork/photocopier.dm | 2 +- code/modules/power/apc.dm | 4 +- code/modules/power/power_monitor.dm | 2 +- code/modules/power/powernet.dm | 4 +- .../projectiles/ammo_boxes/ammo_boxes.dm | 4 +- .../projectiles/ammo_boxes/box_structures.dm | 16 +-- .../projectiles/ammo_boxes/misc_boxes.dm | 2 +- code/modules/projectiles/gun.dm | 2 +- code/modules/projectiles/gun_attachables.dm | 2 +- code/modules/projectiles/gun_helpers.dm | 4 +- .../modules/projectiles/guns/flamer/flamer.dm | 10 +- code/modules/projectiles/guns/shotguns.dm | 2 +- code/modules/projectiles/guns/smartgun.dm | 6 +- .../projectiles/guns/specialist/sniper.dm | 2 +- code/modules/projectiles/magazines/flamer.dm | 4 +- code/modules/projectiles/projectile.dm | 6 +- code/modules/reagents/Chemistry-Holder.dm | 18 +-- code/modules/reagents/Chemistry-Reagents.dm | 2 +- .../chemistry_machinery/autodispenser.dm | 18 +-- .../chemistry_machinery/centrifuge.dm | 10 +- .../chemistry_machinery/chem_dispenser.dm | 2 +- .../chemistry_machinery/chem_master.dm | 12 +- .../chemistry_machinery/chem_simulator.dm | 2 +- .../reagents/chemistry_machinery/pandemic.dm | 10 +- .../chemistry_machinery/reagent_analyzer.dm | 6 +- .../chemistry_machinery/reagent_grinder.dm | 10 +- .../chemistry_properties/prop_positive.dm | 2 +- code/modules/recycling/disposal.dm | 12 +- code/modules/recycling/sortingmachinery.dm | 2 +- code/modules/shuttle/docking.dm | 16 +-- code/modules/shuttle/on_move.dm | 4 +- code/modules/shuttle/shuttle.dm | 14 +- code/modules/shuttles/marine_ferry.dm | 6 +- code/modules/shuttles/shuttle_console.dm | 2 +- code/modules/teleporters/teleporter.dm | 4 +- .../modules/teleporters/teleporter_console.dm | 2 +- code/modules/tgs/core/tgs_version.dm | 6 +- code/modules/tgs/v3210/api.dm | 12 +- code/modules/tgui_panel/telemetry.dm | 2 +- code/modules/unit_tests/unit_test.dm | 2 +- .../vehicles/hardpoints/primary/minigun.dm | 2 +- .../vehicles/multitile/multitile_verbs.dm | 2 +- 381 files changed, 1252 insertions(+), 1261 deletions(-) diff --git a/code/__DEFINES/tgs.config.dm b/code/__DEFINES/tgs.config.dm index e0d5f1baac92..bd30a6707966 100644 --- a/code/__DEFINES/tgs.config.dm +++ b/code/__DEFINES/tgs.config.dm @@ -8,5 +8,5 @@ #define TGS_WARNING_LOG(message) log_world("TGS Warn: [##message]") #define TGS_ERROR_LOG(message) log_world("TGS Error: [##message]") #define TGS_NOTIFY_ADMINS(event) message_admins(##event) -#define TGS_CLIENT_COUNT GLOB.clients.len +#define TGS_CLIENT_COUNT length(GLOB.clients) #define TGS_PROTECT_DATUM(Path) GENERAL_PROTECT_DATUM(##Path) diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index dd92b9be1295..e46c92df543a 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -103,7 +103,7 @@ /proc/bitfield_to_list(bitfield = 0, list/wordlist) var/list/return_list = list() if(islist(wordlist)) - var/max = min(wordlist.len, 24) + var/max = min(length(wordlist), 24) var/bit = 1 for(var/i in 1 to max) if(bitfield & bit) @@ -148,10 +148,10 @@ * Returns TRUE if the list had nulls, FALSE otherwise **/ /proc/list_clear_nulls(list/list_to_clear) - var/start_len = list_to_clear.len + var/start_len = length(list_to_clear) var/list/new_list = new(start_len) list_to_clear -= new_list - return list_to_clear.len < start_len + return length(list_to_clear) < start_len ///Return a list with no duplicate entries /proc/unique_list(list/inserted_list) @@ -174,6 +174,6 @@ if(!inserted_list) return - for(var/i in 1 to inserted_list.len - 1) - inserted_list.Swap(i, rand(i, inserted_list.len)) + for(var/i in 1 to length(inserted_list) - 1) + inserted_list.Swap(i, rand(i, length(inserted_list))) diff --git a/code/__HELPERS/chat.dm b/code/__HELPERS/chat.dm index 20d1a45b31cc..4629c699636a 100644 --- a/code/__HELPERS/chat.dm +++ b/code/__HELPERS/chat.dm @@ -22,7 +22,7 @@ if((!admin_only || channel.is_admin_channel) && (channel_tag in applicable_tags)) channels_to_use += channel - if(channels_to_use.len) + if(length(channels_to_use)) world.TgsChatBroadcast(message, channels_to_use) /** diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index 721c179b9cef..5bf36f785746 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -58,7 +58,7 @@ /proc/recursive_mob_check(atom/O, list/L = list(), recursion_limit = 3, client_check = 1, sight_check = 1, include_radio = 1) - //debug_mob += O.contents.len + //debug_mob += length(O.contents) if(!recursion_limit) return L for(var/atom/A in O.contents) @@ -294,7 +294,7 @@ * * cache_only - Whether to not actually send a to_chat message and instead only update larva_queue_cached_message */ /proc/message_alien_candidates(list/candidates, dequeued, cache_only = FALSE) - for(var/i in (1 + dequeued) to candidates.len) + for(var/i in (1 + dequeued) to length(candidates)) var/mob/dead/observer/cur_obs = candidates[i] // Generate the messages diff --git a/code/__HELPERS/guid.dm b/code/__HELPERS/guid.dm index 49903cceb3c3..e763aaf73b69 100644 --- a/code/__HELPERS/guid.dm +++ b/code/__HELPERS/guid.dm @@ -6,7 +6,7 @@ /proc/GUID() var/const/GUID_VERSION = "b" var/const/GUID_VARIANT = "d" - var/node_id = copytext_char(md5("[rand()*rand(1,9999999)][world.name][world.hub][world.hub_password][world.internet_address][world.address][world.contents.len][world.status][world.port][rand()*rand(1,9999999)]"), 1, 13) + var/node_id = copytext_char(md5("[rand()*rand(1,9999999)][world.name][world.hub][world.hub_password][world.internet_address][world.address][length(world.contents)][world.status][world.port][rand()*rand(1,9999999)]"), 1, 13) var/time_high = "[num2hex(text2num(time2text(world.realtime,"YYYY")), 2)][num2hex(world.realtime, 6)]" diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 081fcec5a137..fcfb512e0c12 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -332,7 +332,7 @@ world /proc/getFlatIcon(image/appearance, defdir, deficon, defstate, defblend, start = TRUE, no_anim = FALSE, appearance_flags = FALSE) // Loop through the underlays, then overlays, sorting them into the layers list #define PROCESS_OVERLAYS_OR_UNDERLAYS(flat, process, base_layer) \ - for (var/i in 1 to process.len) { \ + for (var/i in 1 to length(process)) { \ var/image/current = process[i]; \ if (!current) { \ continue; \ @@ -347,7 +347,7 @@ world } \ current_layer = base_layer + appearance.layer + current_layer / 1000; \ } \ - for (var/index_to_compare_to in 1 to layers.len) { \ + for (var/index_to_compare_to in 1 to length(layers)) { \ var/compare_to = layers[index_to_compare_to]; \ if (current_layer < layers[compare_to]) { \ layers.Insert(index_to_compare_to, current); \ @@ -403,7 +403,7 @@ world var/curblend = appearance.blend_mode || defblend - if(appearance.overlays.len || appearance.underlays.len) + if(length(appearance.overlays) || length(appearance.underlays)) var/icon/flat = icon(flat_template) // Layers will be a sorted list of icons/overlays, based on the order in which they are displayed var/list/layers = list() @@ -556,7 +556,7 @@ world /proc/sort_atoms_by_layer(list/atoms) // Comb sort icons based on levels var/list/result = atoms.Copy() - var/gap = result.len + var/gap = length(result) var/swapped = 1 while (gap > 1 || swapped) swapped = 0 @@ -564,7 +564,7 @@ world gap = floor(gap / 1.3) // 1.3 is the emperic comb sort coefficient if(gap < 1) gap = 1 - for(var/i = 1; gap + i <= result.len; i++) + for(var/i = 1; gap + i <= length(result); i++) var/atom/l = result[i] //Fucking hate var/atom/r = result[gap+i] //how lists work here if(l.layer > r.layer) //no "result[i].layer" for me diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index 856a0a492cbb..d5212611a04b 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -12,7 +12,7 @@ //Returns a list in plain english as a string /proc/english_list(list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" ) - var/total = input.len + var/total = length(input) if (!total) return "[nothing_text]" else if (total == 1) @@ -33,9 +33,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(ISINRANGE(index,1,list.len)) + if(ISINRANGE(index,1,length(list))) return list[index] else if(list[index]) return list[index] @@ -106,35 +106,35 @@ /// Pick a random element from the list and remove it from the list. /proc/pick_n_take(list/L) RETURN_TYPE(L[_].type) - if(L.len) - var/picked = rand(1,L.len) + if(length(L)) + var/picked = rand(1,length(L)) . = L[picked] L.Cut(picked,picked+1) //Cut is far more efficient that Remove() //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) //Returns the next element in parameter list after first appearance of parameter element. If it is the last element of the list or not present in list, returns first element. /proc/next_in_list(element, list/L) - for(var/i=1, i1, i--) + for(var/i=length(L), i>1, i--) if(L[i] == element) return L[i-1] - return L[L.len] + return L[length(L)] /* * Sorting @@ -144,7 +144,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 @@ -155,7 +155,7 @@ . = L_n var/L_o[] = L.Copy() var/i - while(L_o.len) + while(length(L_o)) i = pick(L_o) if(!ref) L_n += i else L_n[i] = L_o[i] @@ -171,9 +171,9 @@ //Mergesort: divides up the list into halves to begin the sort /proc/sortKey(list/client/L, order = 1) - if(isnull(L) || L.len < 2) + if(isnull(L) || length(L) < 2) return L - var/middle = L.len / 2 + 1 + var/middle = length(L) / 2 + 1 return mergeKey(sortKey(L.Copy(0,middle)), sortKey(L.Copy(middle)), order) //Mergsort: does the actual sorting and returns the results back to sortAtom @@ -181,7 +181,7 @@ var/Li=1 var/Ri=1 var/list/result = new() - while(Li <= L.len && Ri <= R.len) + while(Li <= length(L) && Ri <= length(R)) var/client/rL = L[Li] var/client/rR = R[Ri] if(sorttext(rL.ckey, rR.ckey) == order) @@ -189,20 +189,20 @@ else result += R[Ri++] - if(Li <= L.len) + if(Li <= length(L)) return (result + L.Copy(Li, 0)) return (result + R.Copy(Ri, 0)) // Quicksort implementation /proc/sortAtom(list/atom/L, order = 1) - if(isnull(L) || L.len < 2) + if(isnull(L) || length(L) < 2) return L var/startIndex = 1 var/list/atom/M = new/list() for(var/atom/mob in L) if(istype(mob)) M.Add(mob) - var/endIndex = M.len - 1 + var/endIndex = length(M) - 1 var/top = 0 var/list/stack[endIndex*2] stack[++top] = startIndex @@ -241,9 +241,9 @@ /proc/sortRecord(list/datum/data/record/L, field = "name", order = 1) if(isnull(L)) return list() - if(L.len < 2) + if(length(L) < 2) return L - var/middle = L.len / 2 + 1 + var/middle = length(L) / 2 + 1 return mergeRecordLists(sortRecord(L.Copy(0, middle), field, order), sortRecord(L.Copy(middle), field, order), field, order) //Mergsort: does the actual sorting and returns the results back to sortRecord @@ -252,7 +252,7 @@ var/Ri=1 var/list/result = new() if(!isnull(L) && !isnull(R)) - while(Li <= L.len && Ri <= R.len) + while(Li <= length(L) && Ri <= length(R)) var/datum/data/record/rL = L[Li] if(isnull(rL)) L -= rL @@ -266,7 +266,7 @@ else result += R[Ri++] - if(Li <= L.len) + if(Li <= length(L)) return (result + L.Copy(Li, 0)) return (result + R.Copy(Ri, 0)) @@ -285,9 +285,9 @@ RETURN_TYPE(/list) if(!istype(L)) return - if(L.len < 2) + if(length(L) < 2) return L - var/middle = L.len / 2 + 1 // Copy is first,second-1 + var/middle = length(L) / 2 + 1 // Copy is first,second-1 return mergeLists(sortList(L.Copy(0,middle)), sortList(L.Copy(middle))) //second parameter null = to end of list //Mergsorge: uses sortList() but uses the var's name specifically. This should probably be using mergeAtom() instead @@ -301,13 +301,13 @@ var/Li=1 var/Ri=1 var/list/result = new() - while(Li <= L.len && Ri <= R.len) + while(Li <= length(L) && Ri <= length(R)) if(sorttext(L[Li], R[Ri]) < 1) result += R[Ri++] else result += L[Li++] - if(Li <= L.len) + if(Li <= length(L)) return (result + L.Copy(Li, 0)) return (result + R.Copy(Ri, 0)) @@ -322,68 +322,68 @@ // List of lists, sorts by element[key] - for things like crew monitoring computer sorting records by name. /proc/sortByKey(list/L, key) - if(L.len < 2) + if(length(L) < 2) return L - var/middle = L.len / 2 + 1 + var/middle = length(L) / 2 + 1 return mergeKeyedLists(sortByKey(L.Copy(0, middle), key), sortByKey(L.Copy(middle), key), key) /proc/mergeKeyedLists(list/L, list/R, key) var/Li=1 var/Ri=1 var/list/result = new() - while(Li <= L.len && Ri <= R.len) + while(Li <= length(L) && Ri <= length(R)) if(sorttext(L[Li][key], R[Ri][key]) < 1) // Works around list += list2 merging lists; it's not pretty but it works result += "temp item" - result[result.len] = R[Ri++] + result[length(result)] = R[Ri++] else result += "temp item" - result[result.len] = L[Li++] + result[length(result)] = L[Li++] - if(Li <= L.len) + if(Li <= length(L)) return (result + L.Copy(Li, 0)) return (result + R.Copy(Ri, 0)) //Mergesort: any value in a list, preserves key=value structure /proc/sortAssoc(list/L) - if(L.len < 2) + if(length(L) < 2) return L - var/middle = L.len / 2 + 1 // Copy is first,second-1 + var/middle = length(L) / 2 + 1 // Copy is first,second-1 return mergeAssoc(sortAssoc(L.Copy(0,middle)), sortAssoc(L.Copy(middle))) //second parameter null = to end of list /proc/mergeAssoc(list/L, list/R) var/Li=1 var/Ri=1 var/list/result = new() - while(Li <= L.len && Ri <= R.len) + while(Li <= length(L) && Ri <= length(R)) if(sorttext(L[Li], R[Ri]) < 1) result += R&R[Ri++] else result += L&L[Li++] - if(Li <= L.len) + if(Li <= length(L)) return (result + L.Copy(Li, 0)) return (result + R.Copy(Ri, 0)) // Same as sortAssoc but rather than creating a whole new list keeps the original list ref and just returns that list modified /proc/sortAssocKeepList(list/L) - if(L.len < 2) + if(length(L) < 2) return L - var/middle = L.len / 2 + 1 // Copy is first,second-1 + var/middle = length(L) / 2 + 1 // Copy is first,second-1 return mergeAssocKeepList(sortAssoc(L.Copy(0,middle)), sortAssoc(L.Copy(middle)), L) //second parameter null = to end of list /proc/mergeAssocKeepList(list/L, list/R, list/original) var/Li=1 var/Ri=1 var/list/result = new() - while(Li <= L.len && Ri <= R.len) + while(Li <= length(L) && Ri <= length(R)) if(sorttext(L[Li], R[Ri]) < 1) result += R&R[Ri++] else result += L&L[Li++] - if(Li <= L.len) + if(Li <= length(L)) result += L.Copy(Li, 0) else result += R.Copy(Ri, 0) @@ -408,7 +408,7 @@ /proc/bitfield2list(bitfield = 0, list/wordlist) var/list/r = list() if(islist(wordlist)) - var/max = min(wordlist.len,16) + var/max = min(length(wordlist),16) var/bit = 1 for(var/i=1, i<=max, i++) if(bitfield & bit) @@ -430,9 +430,9 @@ //Move a single element from position fromIndex within a list, to position toIndex //All elements in the range [1,toIndex) before the move will be before the pivot afterwards -//All elements in the range [toIndex, L.len+1) before the move will be after the pivot afterwards +//All elements in the range [toIndex, length(L)+1) before the move will be after the pivot afterwards //In other words, it's as if the range [fromIndex,toIndex) have been rotated using a <<< operation common to other languages. -//fromIndex and toIndex must be in the range [1,L.len+1] +//fromIndex and toIndex must be in the range [1,length(L)+1] //This will preserve associations ~Carnie /proc/moveElement(list/L, fromIndex, toIndex) if(fromIndex == toIndex || fromIndex+1 == toIndex) //no need to move @@ -493,13 +493,13 @@ //replaces reverseList ~Carnie /proc/reverseRange(list/L, start=1, end=0) - if(L.len) - start = start % L.len - end = end % (L.len+1) + if(length(L)) + start = start % length(L) + end = end % (length(L)+1) if(start <= 0) - start += L.len + start += length(L) if(end <= 0) - end += L.len + 1 + end += length(L) + 1 --end while(start < end) @@ -518,13 +518,13 @@ ///replaces reverseList ~Carnie /proc/reverse_range(list/inserted_list, start = 1, end = 0) - if(inserted_list.len) - start = start % inserted_list.len - end = end % (inserted_list.len + 1) + if(length(inserted_list)) + start = start % length(inserted_list) + end = end % (length(inserted_list) + 1) if(start <= 0) - start += inserted_list.len + start += length(inserted_list) if(end <= 0) - end += inserted_list.len + 1 + end += length(inserted_list) + 1 --end while(start < end) @@ -574,7 +574,7 @@ var/list/found = list() for(var/atom/A in contents) found += A - if(A.contents.len) + if(length(A.contents)) found += A.contents_recursive() return found @@ -582,7 +582,7 @@ var/list/found = list() for(var/atom/A in contents) found += A - if(A.contents.len) + if(length(A.contents)) found += A.contents return found @@ -594,15 +594,15 @@ if(!sort) return L - if(L.len <= 1) + if(length(L) <= 1) return L - var/middle = floor(L.len / 2) + var/middle = floor(length(L) / 2) var/list/left = custom_mergesort(L.Copy(1, middle + 1)) var/list/right = custom_mergesort(L.Copy(middle + 1)) var/list/result = list() - while(left.len > 0 && right.len > 0) + while(length(left) > 0 && length(right) > 0) var/a = left[1] var/b = right[1] @@ -613,11 +613,11 @@ result += b right.Cut(1,2) - while(left.len > 0) + while(length(left) > 0) result += left[1] left.Cut(1,2) - while(right.len > 0) + while(length(right) > 0) result += right[1] right.Cut(1,2) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index b5bf7a02d026..1d123b3a8e00 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -26,7 +26,7 @@ continue valid_hairstyles[hairstyle] = GLOB.hair_styles_list[hairstyle] - if(valid_hairstyles.len) + if(length(valid_hairstyles)) h_style = pick(valid_hairstyles) return h_style @@ -48,7 +48,7 @@ continue valid_facialhairstyles[facialhairstyle] = GLOB.facial_hair_styles_list[facialhairstyle] - if(valid_facialhairstyles.len) + if(length(valid_facialhairstyles)) f_style = pick(valid_facialhairstyles) return f_style diff --git a/code/__HELPERS/sanitize_values.dm b/code/__HELPERS/sanitize_values.dm index eddb326568c0..291246e621a0 100644 --- a/code/__HELPERS/sanitize_values.dm +++ b/code/__HELPERS/sanitize_values.dm @@ -20,7 +20,7 @@ /proc/sanitize_inlist(value, list/List, default) if(value in List) return value if(default) return default - if(List && List.len)return List[1] + if(LAZYLEN(List))return List[1] /proc/sanitize_list(list/List, list/filter = list(null), default = list()) if(!islist(List)) diff --git a/code/__HELPERS/shell.dm b/code/__HELPERS/shell.dm index 35a8e4635b41..a165a7981fe8 100644 --- a/code/__HELPERS/shell.dm +++ b/code/__HELPERS/shell.dm @@ -20,7 +20,7 @@ shelleo_id = "[seo_id]" break if(!shelleo_id) - shelleo_id = "[shelleo_ids.len + 1]" + shelleo_id = "[length(shelleo_ids) + 1]" shelleo_ids += shelleo_id shelleo_ids[shelleo_id] = TRUE out_file = "[SHELLEO_NAME][shelleo_id][SHELLEO_OUT]" diff --git a/code/__HELPERS/sorts/TimSort.dm b/code/__HELPERS/sorts/TimSort.dm index ae83bd9b0682..89a93802edee 100644 --- a/code/__HELPERS/sorts/TimSort.dm +++ b/code/__HELPERS/sorts/TimSort.dm @@ -1,12 +1,12 @@ //TimSort interface /proc/sortTim(list/L, cmp=/proc/cmp_numeric_asc, associative, fromIndex=1, toIndex=0) - if(L && L.len >= 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/sort_instance = GLOB.sortInstance if(!sort_instance) diff --git a/code/__HELPERS/sorts/_Main.dm b/code/__HELPERS/sorts/_Main.dm index 7fe3adf02870..4caf2c4c068e 100644 --- a/code/__HELPERS/sorts/_Main.dm +++ b/code/__HELPERS/sorts/_Main.dm @@ -76,7 +76,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 @@ -178,8 +178,8 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) //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 @@ -193,8 +193,8 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) //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) @@ -204,9 +204,9 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) //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] @@ -596,8 +596,8 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) 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 @@ -607,8 +607,8 @@ GLOBAL_DATUM_INIT(sortInstance, /datum/sortInstance, new()) 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/unsorted.dm b/code/__HELPERS/unsorted.dm index 5b9154eac655..d8eebf79bca6 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -534,7 +534,7 @@ /atom/proc/GetAllContents(searchDepth = 5, list/toReturn = list()) for(var/atom/part as anything in contents) toReturn += part - if(part.contents.len && searchDepth) + if(length(part.contents) && searchDepth) part.GetAllContents(searchDepth - 1, toReturn) return toReturn @@ -555,7 +555,7 @@ if(part.loc != src) // That's a multitile atom, and it's not actually here stricto sensu continue toReturn += part - if(part.contents.len && searchDepth) + if(length(part.contents) && searchDepth) part.GetAllContents(searchDepth - 1, toReturn) return toReturn @@ -1082,7 +1082,7 @@ GLOBAL_DATUM(action_purple_power_up, /image) var/list/doors = new/list() - if(toupdate.len) + if(length(toupdate)) for(var/turf/T1 in toupdate) for(var/obj/structure/machinery/door/D2 in T1) doors += D2 @@ -1091,7 +1091,7 @@ GLOBAL_DATUM(action_purple_power_up, /image) else air_master.tiles_to_update += T1*/ - if(fromupdate.len) + if(length(fromupdate)) for(var/turf/T2 in fromupdate) for(var/obj/structure/machinery/door/D2 in T2) doors += D2 @@ -1287,7 +1287,7 @@ GLOBAL_LIST_INIT(WALLITEMS, list( for(var/turf/T in orange(origin, outer_range)) if(!inner_range || get_dist(origin, T) >= inner_range) turfs += T - if(turfs.len) + if(length(turfs)) return pick(turfs) // Returns true if arming a given explosive might be considered grief @@ -1531,7 +1531,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) return GetAllContents() var/list/processing = list(src) var/list/assembled = list() - while(processing.len) + while(length(processing)) var/atom/A = processing[1] processing.Cut(1,2) if(!ignore_typecache[A.type]) diff --git a/code/_globalvars/global_lists.dm b/code/_globalvars/global_lists.dm index e663bc287946..c054b9a4bf1f 100644 --- a/code/_globalvars/global_lists.dm +++ b/code/_globalvars/global_lists.dm @@ -303,7 +303,7 @@ GLOBAL_LIST_INIT(hj_emotes, setup_hazard_joe_emotes()) /proc/number_list_decode(number_list_data) var/list/L = params2list(number_list_data) - for(var/i in 1 to L.len) + for(var/i in 1 to length(L)) L[i] = text2num(L[i]) return L diff --git a/code/_macros.dm b/code/_macros.dm index 075d098e3d50..abfa83df7d36 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -74,7 +74,7 @@ lazy_list[key] |= value; // Insert an object A into a sorted list using cmp_proc (/code/_helpers/cmp.dm) for comparison. -#define ADD_SORTED(list, A, cmp_proc) if(!list.len) {list.Add(A)} else {list.Insert(FindElementIndex(A, list, cmp_proc), A)} +#define ADD_SORTED(list, A, cmp_proc) if(!length(list)) {list.Add(A)} else {list.Insert(FindElementIndex(A, list, cmp_proc), A)} //Currently used in SDQL2 stuff #define send_output(target, msg, control) target << output(msg, control) diff --git a/code/_onclick/adjacent.dm b/code/_onclick/adjacent.dm index 678c5373fe67..af0882d6a9df 100644 --- a/code/_onclick/adjacent.dm +++ b/code/_onclick/adjacent.dm @@ -262,10 +262,10 @@ Quick adjacency (to turf): // Make sure pass flags are removed A.remove_temp_pass_flags(pass_flags) - if ((fd1 && !blockers["fd1"].len) || (fd2 && !blockers["fd2"].len)) // This means that for a given direction it did not have a blocker + if ((fd1 && !length(blockers["fd1"])) || (fd2 && !length(blockers["fd2"]))) // This means that for a given direction it did not have a blocker return src - if (blockers["fd1"].len || blockers["fd2"].len) + if (length(blockers["fd1"]) || length(blockers["fd2"])) var/guaranteed_hit = 0 // indicates whether there is a guaranteed hit (aka there is not chance to bypass blocker). 0 = nothing var/list/cur_dense_blockers = list() for (var/atom/blocker in blockers["fd1"]) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 57c529c7a156..a5d07ec060cb 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -199,7 +199,7 @@ if (mods["alt"]) var/turf/T = get_turf(src) - if(T && user.TurfAdjacent(T) && T.contents.len) + if(T && user.TurfAdjacent(T) && length(T.contents)) user.set_listed_turf(T) return TRUE diff --git a/code/_onclick/click_hold.dm b/code/_onclick/click_hold.dm index 41e2be147d85..1d6c25619e5e 100644 --- a/code/_onclick/click_hold.dm +++ b/code/_onclick/click_hold.dm @@ -88,7 +88,7 @@ if(mods["left"]) SEND_SIGNAL(src, COMSIG_CLIENT_LMB_DRAG, src_obj, over_obj, params) - var/atom/last_atom = LAZYACCESS(mouse_trace_history, mouse_trace_history.len) + var/atom/last_atom = LAZYACCESS(mouse_trace_history, length(mouse_trace_history)) if(over_obj == last_atom) return diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 7277c74b2fd3..2d49abb52012 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -91,19 +91,19 @@ /datum/hud/Destroy() if(mymob.hud_used == src) mymob.hud_used = null - if(static_inventory.len) + if(length(static_inventory)) for(var/thing in static_inventory) qdel(thing) static_inventory.Cut() - if(toggleable_inventory.len) + if(length(toggleable_inventory)) for(var/thing in toggleable_inventory) qdel(thing) toggleable_inventory.Cut() - if(hotkeybuttons.len) + if(length(hotkeybuttons)) for(var/thing in hotkeybuttons) qdel(thing) hotkeybuttons.Cut() - if(infodisplay.len) + if(length(infodisplay)) for(var/thing in infodisplay) qdel(thing) infodisplay.Cut() @@ -188,24 +188,24 @@ switch(display_hud_version) if(HUD_STYLE_STANDARD) //Default HUD hud_shown = 1 //Governs behavior of other procs - if(static_inventory.len) + if(length(static_inventory)) screenmob.client.add_to_screen(static_inventory) - if(toggleable_inventory.len && inventory_shown) + if(length(toggleable_inventory) && inventory_shown) screenmob.client.add_to_screen(toggleable_inventory) - if(hotkeybuttons.len && !hotkey_ui_hidden) + if(length(hotkeybuttons) && !hotkey_ui_hidden) screenmob.client.add_to_screen(hotkeybuttons) - if(infodisplay.len) + if(length(infodisplay)) screenmob.client.add_to_screen(infodisplay) if(HUD_STYLE_REDUCED) //Reduced HUD hud_shown = 0 //Governs behavior of other procs - if(static_inventory.len) + if(length(static_inventory)) screenmob.client.remove_from_screen(static_inventory) - if(toggleable_inventory.len) + if(length(toggleable_inventory)) screenmob.client.remove_from_screen(toggleable_inventory) - if(hotkeybuttons.len) + if(length(hotkeybuttons)) screenmob.client.remove_from_screen(hotkeybuttons) - if(infodisplay.len) + if(length(infodisplay)) screenmob.client.add_to_screen(infodisplay) //These ones are a part of 'static_inventory', 'toggleable_inventory' or 'hotkeybuttons' but we want them to stay @@ -218,13 +218,13 @@ if(HUD_STYLE_NOHUD) //No HUD hud_shown = 0 //Governs behavior of other procs - if(static_inventory.len) + if(length(static_inventory)) screenmob.client.remove_from_screen(static_inventory) - if(toggleable_inventory.len) + if(length(toggleable_inventory)) screenmob.client.remove_from_screen(toggleable_inventory) - if(hotkeybuttons.len) + if(length(hotkeybuttons)) screenmob.client.remove_from_screen(hotkeybuttons) - if(infodisplay.len) + if(length(infodisplay)) screenmob.client.remove_from_screen(infodisplay) hud_version = display_hud_version diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index b8b55b42c028..bbdfaa25b92f 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -120,7 +120,7 @@ if(!screenmob?.client) return - if(!gear.len) + if(!length(gear)) inventory_shown = FALSE return //species without inv slots don't show items. diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 2886b2edb0ee..244e79e583f6 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -143,9 +143,9 @@ GLOBAL_LIST_EMPTY(radial_menus) zone = 360 - starting_angle + ending_angle max_elements = floor(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/slice/new_element = new /atom/movable/screen/radial/slice new_element.tooltips = use_tooltips @@ -246,7 +246,7 @@ 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, use_tooltips, use_labels) if(length(choices)) diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 8508352bb338..a8162911804b 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -119,7 +119,7 @@ layer = HUD_LAYER /atom/movable/screen/storage/proc/update_fullness(obj/item/storage/master_storage) - if(!master_storage.contents.len) + if(!length(master_storage.contents)) color = null else var/total_w = 0 @@ -131,7 +131,7 @@ if (master_storage.storage_slots == null) fullness = floor(10*total_w/master_storage.max_storage_space) else - fullness = floor(10*master_storage.contents.len/master_storage.storage_slots) + fullness = floor(10*length(master_storage.contents)/master_storage.storage_slots) switch(fullness) if(10) color = "#ff0000" diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index ffcab30234ae..1a3c279db8b3 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -90,7 +90,7 @@ power = floor(power * (1 + 0.25 * user.skills.get_skill_level(SKILL_MELEE_WEAPONS))) //25% bonus per melee level if(!ishuman(M)) var/used_verb = "attacked" - if(attack_verb && attack_verb.len) + if(LAZYLEN(attack_verb)) used_verb = pick(attack_verb) user.visible_message(SPAN_DANGER("[M] has been [used_verb] with [src][showname]."), \ SPAN_DANGER("You [used_verb] [M == user ? "yourself":M] with [src]."), null, 5, CHAT_TYPE_MELEE_HIT) diff --git a/code/_onclick/ventcrawl.dm b/code/_onclick/ventcrawl.dm index e1877dcbd0a7..72fe31f35cdc 100644 --- a/code/_onclick/ventcrawl.dm +++ b/code/_onclick/ventcrawl.dm @@ -24,10 +24,10 @@ for(var/obj/structure/pipes/vents/V in range(1)) if(Adjacent(V) && !V.welded) pipes |= V - if(!pipes || !pipes.len) + if(!LAZYLEN(pipes)) to_chat(src, SPAN_WARNING("There are no pipes that we can ventcrawl into within range!")) return - if(pipes.len == 1) + if(length(pipes) == 1) pipe = pipes[1] else pipe = tgui_input_list(usr, "Crawl Through Vent", "Pick a pipe", pipes) diff --git a/code/controllers/configuration/config_entry.dm b/code/controllers/configuration/config_entry.dm index 657e7470fc54..49dae4c2ff38 100644 --- a/code/controllers/configuration/config_entry.dm +++ b/code/controllers/configuration/config_entry.dm @@ -125,7 +125,7 @@ if(isnull(temp)) return FALSE new_list += temp - if(!new_list.len) + if(!length(new_list)) return FALSE config_entry_value = new_list return TRUE diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index 147f57fcb1aa..7207f878614a 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -329,7 +329,7 @@ continue in_character_filter += REGEX_QUOTE(line) - ic_filter_regex = in_character_filter.len ? regex("\\b([jointext(in_character_filter, "|")])\\b", "i") : null + ic_filter_regex = length(in_character_filter) ? regex("\\b([jointext(in_character_filter, "|")])\\b", "i") : null //Message admins when you can. /datum/controller/configuration/proc/DelayedMessageAdmins(text) diff --git a/code/controllers/mc/globals.dm b/code/controllers/mc/globals.dm index 724f58010699..59b96c017d10 100644 --- a/code/controllers/mc/globals.dm +++ b/code/controllers/mc/globals.dm @@ -20,7 +20,7 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) QDEL_IN(exclude_these, 0) //signal logging isn't ready - log_world("[vars.len - gvars_datum_in_built_vars.len] global variables") + log_world("[length(vars) - length(gvars_datum_in_built_vars)] global variables") Initialize() @@ -42,10 +42,10 @@ GLOBAL_REAL(GLOB, /datum/controller/global_vars) gvars_datum_init_order = list() gvars_datum_protected_varlist = list(NAMEOF(src, 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/mc/master.dm b/code/controllers/mc/master.dm index edfda35a1e75..31460bf4e9c5 100644 --- a/code/controllers/mc/master.dm +++ b/code/controllers/mc/master.dm @@ -415,9 +415,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/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index 35031cf7334f..fb0cb1ff7637 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -215,7 +215,7 @@ dock_controller_map[shuttle.docking_controller_tag] = shuttle //search for the controllers, if we have one. - if(dock_controller_map.len) + if(length(dock_controller_map)) for(var/obj/structure/machinery/embedded_controller/radio/C in GLOB.machines) //only radio controllers are supported at the moment if (istype(C.program, /datum/computer/file/embedded_program/docking)) if(dock_controller_map[C.id_tag]) @@ -226,7 +226,7 @@ //sanity check //NO SANITY -// if (dock_controller_map.len || dock_controller_map_station.len || dock_controller_map_offsite.len) +// if (length(dock_controller_map) || length(dock_controller_map_station) || length(dock_controller_map_offsite)) // var/dat = "" // for (var/dock_tag in dock_controller_map + dock_controller_map_station + dock_controller_map_offsite) // dat += "\"[dock_tag]\", " diff --git a/code/controllers/subsystem/acid_pillar.dm b/code/controllers/subsystem/acid_pillar.dm index aaa38834667f..70994e641503 100644 --- a/code/controllers/subsystem/acid_pillar.dm +++ b/code/controllers/subsystem/acid_pillar.dm @@ -11,8 +11,8 @@ SUBSYSTEM_DEF(acid_pillar) if (!resumed) currentrun = queuedrun.Copy() - while (currentrun.len) - var/hash = currentrun[currentrun.len] + while (length(currentrun)) + var/hash = currentrun[length(currentrun)] var/datum/acid_spray_info/data = currentrun[hash] currentrun.len-- diff --git a/code/controllers/subsystem/atoms.dm b/code/controllers/subsystem/atoms.dm index f0d5ee14363e..dbe2f1a39c6b 100644 --- a/code/controllers/subsystem/atoms.dm +++ b/code/controllers/subsystem/atoms.dm @@ -62,7 +62,7 @@ SUBSYSTEM_DEF(atoms) processing_late_loaders = TRUE - for(var/I = 1; I <= late_loaders.len; I++) + for(var/I = 1; I <= length(late_loaders); I++) var/atom/A = late_loaders[I] //I hate that we need this if(QDELETED(A)) @@ -70,7 +70,7 @@ SUBSYSTEM_DEF(atoms) A.LateInitialize() #ifdef TESTING - testing("Late initialized [late_loaders.len] atoms") + testing("Late initialized [length(late_loaders)] atoms") #endif late_loaders.Cut() processing_late_loaders = FALSE @@ -87,10 +87,10 @@ SUBSYSTEM_DEF(atoms) var/list/mapload_arg = list(TRUE) if(atoms) #ifdef TESTING - count = atoms.len + count = length(atoms) #endif - for(var/I in 1 to atoms.len) + for(var/I in 1 to length(atoms)) var/atom/A = atoms[I] if(!(A.flags_atom & INITIALIZED)) CHECK_TICK diff --git a/code/controllers/subsystem/cellauto.dm b/code/controllers/subsystem/cellauto.dm index b543ddd43c26..983d168d61a1 100644 --- a/code/controllers/subsystem/cellauto.dm +++ b/code/controllers/subsystem/cellauto.dm @@ -9,15 +9,15 @@ SUBSYSTEM_DEF(cellauto) var/list/currentrun = list() /datum/controller/subsystem/cellauto/stat_entry(msg) - msg = "C: [GLOB.cellauto_cells.len]" + msg = "C: [length(GLOB.cellauto_cells)]" return ..() /datum/controller/subsystem/cellauto/fire(resumed = FALSE) if (!resumed) currentrun = GLOB.cellauto_cells.Copy() - while(currentrun.len) - var/datum/automata_cell/C = currentrun[currentrun.len] + while(length(currentrun)) + var/datum/automata_cell/C = currentrun[length(currentrun)] currentrun.len-- if (!C || QDELETED(C)) diff --git a/code/controllers/subsystem/decorator.dm b/code/controllers/subsystem/decorator.dm index 6194b05d561b..ac63fca47ac5 100644 --- a/code/controllers/subsystem/decorator.dm +++ b/code/controllers/subsystem/decorator.dm @@ -35,7 +35,7 @@ SUBSYSTEM_DEF(decorator) if(!decor.is_active_decor()) continue var/list/applicable_types = decor.get_decor_types() - if(!applicable_types || !applicable_types.len) + if(!LAZYLEN(applicable_types)) continue active_decorators |= decor for(var/app_type in applicable_types) @@ -64,7 +64,7 @@ SUBSYSTEM_DEF(decorator) currentrun = swap while(length(currentrun)) - var/datum/weakref/ref = currentrun[currentrun.len] + var/datum/weakref/ref = currentrun[length(currentrun)] currentrun.len-- var/atom/A = ref?.resolve() if(A) A.Decorate(deferable = FALSE) @@ -80,7 +80,7 @@ SUBSYSTEM_DEF(decorator) // DECORATOR IS ENABLED FORCEFULLY var/list/applicable_types = decor.get_decor_types() - if(!applicable_types || !applicable_types.len) + if(!LAZYLEN(applicable_types)) return active_decorators |= decor for(var/app_type in applicable_types) @@ -100,7 +100,7 @@ SUBSYSTEM_DEF(decorator) /datum/controller/subsystem/decorator/stat_entry(msg) if(registered_decorators && decoratable) - msg = "D:[registered_decorators.len],P:[decoratable.len]" + msg = "D:[length(registered_decorators)],P:[length(decoratable)]" return ..() /datum/controller/subsystem/decorator/proc/decorate(atom/o) @@ -118,25 +118,25 @@ SUBSYSTEM_DEF(decorator) /datum/controller/subsystem/decorator/proc/sortDecorators(list/datum/decorator/L) if(!istype(L)) return null - if(L.len < 2) + if(length(L) < 2) return L - var/middle = L.len / 2 + 1 + var/middle = length(L) / 2 + 1 return mergeDecoratorLists(sortDecorators(L.Copy(0, middle)), sortDecorators(L.Copy(middle))) /datum/controller/subsystem/decorator/proc/mergeDecoratorLists(list/datum/decorator/L, list/datum/decorator/R) var/Li=1 var/Ri=1 var/list/result = new() - while(Li <= L.len && Ri <= R.len) + while(Li <= length(L) && Ri <= length(R)) if(sorttext(L[Li].priority, R[Ri].priority) < 1) // Works around list += list2 merging lists; it's not pretty but it works result += "temp item" - result[result.len] = R[Ri++] + result[length(result)] = R[Ri++] else result += "temp item" - result[result.len] = L[Li++] + result[length(result)] = L[Li++] - if(Li <= L.len) + if(Li <= length(L)) return (result + L.Copy(Li, 0)) return (result + R.Copy(Ri, 0)) diff --git a/code/controllers/subsystem/disease.dm b/code/controllers/subsystem/disease.dm index b98187ca252c..342a6b28906b 100644 --- a/code/controllers/subsystem/disease.dm +++ b/code/controllers/subsystem/disease.dm @@ -8,15 +8,15 @@ SUBSYSTEM_DEF(disease) var/list/datum/disease/currentrun = list() /datum/controller/subsystem/disease/stat_entry(msg) - msg = "P:[all_diseases.len]" + msg = "P:[length(all_diseases)]" return ..() /datum/controller/subsystem/disease/fire(resumed = FALSE) if (!resumed) currentrun = all_diseases.Copy() - while (currentrun.len) - var/datum/disease/D = currentrun[currentrun.len] + while (length(currentrun)) + var/datum/disease/D = currentrun[length(currentrun)] currentrun.len-- if (!D || QDELETED(D)) diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index f4dd544784f0..db1b07475489 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -35,8 +35,8 @@ SUBSYSTEM_DEF(events) //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun - while(currentrun.len) - var/datum/thing = currentrun[currentrun.len] + while(length(currentrun)) + var/datum/thing = currentrun[length(currentrun)] currentrun.len-- if(thing) thing.process() diff --git a/code/controllers/subsystem/fz_transitions.dm b/code/controllers/subsystem/fz_transitions.dm index d12ab1358535..5a6db625145c 100644 --- a/code/controllers/subsystem/fz_transitions.dm +++ b/code/controllers/subsystem/fz_transitions.dm @@ -10,7 +10,7 @@ SUBSYSTEM_DEF(fz_transitions) flags = SS_KEEP_TIMING /datum/controller/subsystem/fz_transitions/stat_entry(msg) - msg = "P:[GLOB.projectors.len]|C:[GLOB.clones.len]|T:[GLOB.clones_t.len]" + msg = "P:[length(GLOB.projectors)]|C:[length(GLOB.clones)]|T:[length(GLOB.clones_t)]" return ..() /datum/controller/subsystem/fz_transitions/Initialize() diff --git a/code/controllers/subsystem/garbage.dm b/code/controllers/subsystem/garbage.dm index 37c305d59cde..072419df2cbd 100644 --- a/code/controllers/subsystem/garbage.dm +++ b/code/controllers/subsystem/garbage.dm @@ -297,7 +297,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] /// Qdel Item: Holds statistics on each type that passes thru qdel diff --git a/code/controllers/subsystem/human.dm b/code/controllers/subsystem/human.dm index ffbbb7aa9240..3bc67c48a2be 100644 --- a/code/controllers/subsystem/human.dm +++ b/code/controllers/subsystem/human.dm @@ -10,15 +10,15 @@ SUBSYSTEM_DEF(human) /datum/controller/subsystem/human/stat_entry(msg) - msg = "P:[processable_human_list.len]" + msg = "P:[length(processable_human_list)]" return ..() /datum/controller/subsystem/human/fire(resumed = FALSE) if (!resumed) currentrun = processable_human_list.Copy() - while (currentrun.len) - var/mob/living/carbon/human/M = currentrun[currentrun.len] + while (length(currentrun)) + var/mob/living/carbon/human/M = currentrun[length(currentrun)] currentrun.len-- if (!M || QDELETED(M)) diff --git a/code/controllers/subsystem/init/landmarks.dm b/code/controllers/subsystem/init/landmarks.dm index 31b71c074a5d..1fdf83083833 100644 --- a/code/controllers/subsystem/init/landmarks.dm +++ b/code/controllers/subsystem/init/landmarks.dm @@ -47,14 +47,14 @@ SUBSYSTEM_DEF(landmark_init) message_admins("Item pool [pool.pool_name] has no master landmark, aborting item spawns. Tell the devs. Code: ITEM_POOL_3") continue - if (pool.quota > pool.turfs.len) - log_debug("Item pool [pool.pool_name] wants to spawn more items than it has landmarks for. Spawning [pool.turfs.len] instances of [pool.type_to_spawn] instead. Code: ITEM_POOL_4") - message_admins("Item pool [pool.pool_name] wants to spawn more items than it has landmarks for. Spawning [pool.turfs.len] instances of [pool.type_to_spawn] instead. Tell the devs. Code: ITEM_POOL_4") - pool.quota = pool.turfs.len + if (pool.quota > length(pool.turfs)) + log_debug("Item pool [pool.pool_name] wants to spawn more items than it has landmarks for. Spawning [length(pool.turfs)] instances of [pool.type_to_spawn] instead. Code: ITEM_POOL_4") + message_admins("Item pool [pool.pool_name] wants to spawn more items than it has landmarks for. Spawning [length(pool.turfs)] instances of [pool.type_to_spawn] instead. Tell the devs. Code: ITEM_POOL_4") + pool.quota = length(pool.turfs) // Quota times, pick a random turf, spawn an item there, then remove that turf from the list. for (var/i in 1 to pool.quota) - var/turf/T = pool.turfs[rand(1, pool.turfs.len)] + var/turf/T = pool.turfs[rand(1, length(pool.turfs))] var/atom/movable/newly_spawned = new pool.type_to_spawn() newly_spawned.forceMove(T) diff --git a/code/controllers/subsystem/input.dm b/code/controllers/subsystem/input.dm index 26d393d197b7..5dfd7bc5bbac 100644 --- a/code/controllers/subsystem/input.dm +++ b/code/controllers/subsystem/input.dm @@ -33,7 +33,7 @@ SUBSYSTEM_DEF(input) // Badmins just wanna have fun ♪ /datum/controller/subsystem/input/proc/refresh_client_macro_sets() var/list/clients = GLOB.clients - for(var/i in 1 to clients.len) + for(var/i in 1 to length(clients)) var/client/user = clients[i] INVOKE_ASYNC(user, /client/proc/set_macros) diff --git a/code/controllers/subsystem/item_cleanup.dm b/code/controllers/subsystem/item_cleanup.dm index 26958eb8742b..85c25e4712d3 100644 --- a/code/controllers/subsystem/item_cleanup.dm +++ b/code/controllers/subsystem/item_cleanup.dm @@ -18,9 +18,9 @@ SUBSYSTEM_DEF(item_cleanup) //Do nothing for the first 35 minutes to preserve the colony look for the first drop return - var/to_delete = items_to_clean_up.len * percentage_of_garbage_to_delete + var/to_delete = length(items_to_clean_up) * percentage_of_garbage_to_delete var/deleted = 0 - var/total_items = items_to_clean_up.len //save total before we start deleting stuff + var/total_items = length(items_to_clean_up) //save total before we start deleting stuff for (var/atom/o in items_to_clean_up) if(QDELETED(o)) items_to_clean_up -= o @@ -34,9 +34,9 @@ SUBSYSTEM_DEF(item_cleanup) break //We transfer items from the global garbage list onto the next iteration list - while(!isnull(GLOB.item_cleanup_list) && GLOB.item_cleanup_list.len > 0) - addToListNoDupe(items_to_clean_up, GLOB.item_cleanup_list[GLOB.item_cleanup_list.len]) - GLOB.item_cleanup_list -= GLOB.item_cleanup_list[GLOB.item_cleanup_list.len] + while(!isnull(GLOB.item_cleanup_list) && length(GLOB.item_cleanup_list) > 0) + addToListNoDupe(items_to_clean_up, GLOB.item_cleanup_list[length(GLOB.item_cleanup_list)]) + GLOB.item_cleanup_list -= GLOB.item_cleanup_list[length(GLOB.item_cleanup_list)] log_debug("item_cleanup deleted [deleted] garbage out of total [total_items]") diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm index 3c3d14468bc2..f8c6b14e6bf7 100644 --- a/code/controllers/subsystem/lighting.dm +++ b/code/controllers/subsystem/lighting.dm @@ -27,7 +27,7 @@ SUBSYSTEM_DEF(lighting) /datum/controller/subsystem/lighting/stat_entry() - . = ..("ShCalcs:[total_shadow_calculations]|SourcQ:[static_sources_queue.len]|CcornQ:[corners_queue.len]|ObjQ:[objects_queue.len]|HybrQ:[mask_queue.len]") + . = ..("ShCalcs:[total_shadow_calculations]|SourcQ:[length(static_sources_queue)]|CcornQ:[length(corners_queue)]|ObjQ:[length(objects_queue)]|HybrQ:[length(mask_queue)]") /datum/controller/subsystem/lighting/fire(resumed, init_tick_checks) MC_SPLIT_TICK_INIT(3) diff --git a/code/controllers/subsystem/machinery.dm b/code/controllers/subsystem/machinery.dm index 6a0f938475a1..a2860615274f 100644 --- a/code/controllers/subsystem/machinery.dm +++ b/code/controllers/subsystem/machinery.dm @@ -19,15 +19,15 @@ SUBSYSTEM_DEF(machinery) return SS_INIT_SUCCESS /datum/controller/subsystem/machinery/stat_entry(msg) - msg = "M:[GLOB.processing_machines.len]" + msg = "M:[length(GLOB.processing_machines)]" return ..() /datum/controller/subsystem/machinery/fire(resumed = FALSE) if (!resumed) currentrunmachines = GLOB.processing_machines.Copy() - while (currentrunmachines.len) - var/obj/structure/machinery/M = currentrunmachines[currentrunmachines.len] + while (length(currentrunmachines)) + var/obj/structure/machinery/M = currentrunmachines[length(currentrunmachines)] currentrunmachines.len-- if (!M || QDELETED(M)) diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index f6c45453950d..0d8848217d4f 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -161,11 +161,11 @@ SUBSYSTEM_DEF(mapping) if (!length(traits)) // null or empty - default for (var/i in 1 to total_z) traits += list(default_traits) - else if (total_z != traits.len) // mismatch - INIT_ANNOUNCE("WARNING: [traits.len] trait sets specified for [total_z] z-levels in [path]!") - if (total_z < traits.len) // ignore extra traits + else if (total_z != length(traits)) // mismatch + INIT_ANNOUNCE("WARNING: [length(traits)] trait sets specified for [total_z] z-levels in [path]!") + if (total_z < length(traits)) // ignore extra traits traits.Cut(total_z + 1) - while (total_z > traits.len) // fall back to defaults on extra levels + while (total_z > length(traits)) // fall back to defaults on extra levels traits += list(default_traits) // preload the relevant space_level datums @@ -236,8 +236,8 @@ SUBSYSTEM_DEF(mapping) if(LAZYLEN(FailedZs)) //but seriously, unless the server's filesystem is messed up this will never happen var/msg = "RED ALERT! The following map files failed to load: [FailedZs[1]]" - if(FailedZs.len > 1) - for(var/I in 2 to FailedZs.len) + if(length(FailedZs) > 1) + for(var/I in 2 to length(FailedZs)) msg += ", [FailedZs[I]]" msg += ". Yell at your server host!" INIT_ANNOUNCE(msg) @@ -276,7 +276,7 @@ SUBSYSTEM_DEF(mapping) . = list() var/list/Lines = file2list(filename) - if(!Lines.len) + if(!length(Lines)) return for (var/t in Lines) if (!t) diff --git a/code/controllers/subsystem/mob.dm b/code/controllers/subsystem/mob.dm index 60e7476da89b..3596b17e5d16 100644 --- a/code/controllers/subsystem/mob.dm +++ b/code/controllers/subsystem/mob.dm @@ -8,7 +8,7 @@ SUBSYSTEM_DEF(mob) var/list/living_misc_mobs = list() /datum/controller/subsystem/mob/stat_entry(msg) - msg = "P:[living_misc_mobs.len]" + msg = "P:[length(living_misc_mobs)]" return ..() @@ -16,8 +16,8 @@ SUBSYSTEM_DEF(mob) if (!resumed) currentrun = living_misc_mobs.Copy() - while (currentrun.len) - var/mob/living/M = currentrun[currentrun.len] + while (length(currentrun)) + var/mob/living/M = currentrun[length(currentrun)] currentrun.len-- if (!M || QDELETED(M)) diff --git a/code/controllers/subsystem/nanoui.dm b/code/controllers/subsystem/nanoui.dm index 85ad0d32aaf4..b0117016e38b 100644 --- a/code/controllers/subsystem/nanoui.dm +++ b/code/controllers/subsystem/nanoui.dm @@ -13,15 +13,15 @@ SUBSYSTEM_DEF(nano) nanomanager = new() /datum/controller/subsystem/nano/stat_entry(msg) - msg = "P:[nanomanager.processing_uis.len]" + msg = "P:[length(nanomanager.processing_uis)]" return ..() /datum/controller/subsystem/nano/fire(resumed = FALSE) if (!resumed) currentrun = nanomanager.processing_uis.Copy() - while (currentrun.len) - var/datum/nanoui/UI = currentrun[currentrun.len] + while (length(currentrun)) + var/datum/nanoui/UI = currentrun[length(currentrun)] currentrun.len-- if (!UI || QDELETED(UI)) diff --git a/code/controllers/subsystem/perf_logging.dm b/code/controllers/subsystem/perf_logging.dm index 5ca98ad10dd0..4a3066b758ba 100644 --- a/code/controllers/subsystem/perf_logging.dm +++ b/code/controllers/subsystem/perf_logging.dm @@ -26,8 +26,8 @@ SUBSYSTEM_DEF(perf_logging) if(SS?.cost > 0.1) currentrun += SS - while(currentrun.len) - var/datum/controller/subsystem/SS = currentrun[currentrun.len] + while(length(currentrun)) + var/datum/controller/subsystem/SS = currentrun[length(currentrun)] currentrun.len-- var/datum/entity/mc_controller/C = controller_assoc[SS.type] new_record(SS, C) diff --git a/code/controllers/subsystem/ping.dm b/code/controllers/subsystem/ping.dm index c813081ed526..5d413c128684 100644 --- a/code/controllers/subsystem/ping.dm +++ b/code/controllers/subsystem/ping.dm @@ -14,7 +14,7 @@ SUBSYSTEM_DEF(ping) var/list/currentrun = list() /datum/controller/subsystem/ping/stat_entry() - ..("P:[GLOB.clients.len]") + ..("P:[length(GLOB.clients)]") /datum/controller/subsystem/ping/fire(resumed = FALSE) // Prepare the new batch of clients @@ -24,8 +24,8 @@ SUBSYSTEM_DEF(ping) // De-reference the list for sanic speeds var/list/currentrun = src.currentrun - while (currentrun.len) - var/client/client = currentrun[currentrun.len] + while (length(currentrun)) + var/client/client = currentrun[length(currentrun)] currentrun.len-- if (client?.tgui_panel?.is_ready()) diff --git a/code/controllers/subsystem/playtime.dm b/code/controllers/subsystem/playtime.dm index 7a6d3b97a036..6813c4fabd78 100644 --- a/code/controllers/subsystem/playtime.dm +++ b/code/controllers/subsystem/playtime.dm @@ -12,8 +12,8 @@ SUBSYSTEM_DEF(playtime) var/list/currentrun = src.currentrun - while (currentrun.len) - var/client/C = currentrun[currentrun.len] + while (length(currentrun)) + var/client/C = currentrun[length(currentrun)] currentrun.len-- var/mob/M = C.mob diff --git a/code/controllers/subsystem/police_clues.dm b/code/controllers/subsystem/police_clues.dm index 134eae9bca9e..0d39c72c874d 100644 --- a/code/controllers/subsystem/police_clues.dm +++ b/code/controllers/subsystem/police_clues.dm @@ -8,15 +8,15 @@ SUBSYSTEM_DEF(clues) var/list/prints_list = list() /datum/controller/subsystem/clues/stat_entry(msg) - msg = "P:[prints_list.len]" + msg = "P:[length(prints_list)]" return ..() /datum/controller/subsystem/clues/fire(resumed = FALSE) if(!resumed && length(prints_list)) currentrun = prints_list.Copy() - while(currentrun.len) - var/obj/effect/decal/prints/P = currentrun[currentrun.len] + while(length(currentrun)) + var/obj/effect/decal/prints/P = currentrun[length(currentrun)] currentrun.len-- if(!P || QDELETED(P)) diff --git a/code/controllers/subsystem/power.dm b/code/controllers/subsystem/power.dm index 9908a60420b2..08668e5fc564 100644 --- a/code/controllers/subsystem/power.dm +++ b/code/controllers/subsystem/power.dm @@ -12,7 +12,7 @@ SUBSYSTEM_DEF(power) var/list/currentrun_areas = list() /datum/controller/subsystem/power/stat_entry(msg) - msg = "PN:[GLOB.powernets.len]|PM:[GLOB.power_machines.len]|A:[GLOB.active_areas.len]" + msg = "PN:[length(GLOB.powernets)]|PM:[length(GLOB.power_machines)]|A:[length(GLOB.active_areas)]" return ..() @@ -29,8 +29,8 @@ SUBSYSTEM_DEF(power) // First we reset the powernets. // This is done first because we want the power machinery to have acted last on the powernet between intervals. - while(currentrun_powerents.len) - var/datum/powernet/Powernet = currentrun_powerents[currentrun_powerents.len] + while(length(currentrun_powerents)) + var/datum/powernet/Powernet = currentrun_powerents[length(currentrun_powerents)] currentrun_powerents.len-- if(Powernet) Powernet.process() @@ -39,8 +39,8 @@ SUBSYSTEM_DEF(power) // Next we let the power machines operate, this way until the next tick it will be as if they have all done their work. - while (currentrun_power_machines.len) - var/datum/X = currentrun_power_machines[currentrun_power_machines.len] + while (length(currentrun_power_machines)) + var/datum/X = currentrun_power_machines[length(currentrun_power_machines)] currentrun_power_machines.len-- if (!X || QDELETED(X)) continue diff --git a/code/controllers/subsystem/processing/obj_tab_items.dm b/code/controllers/subsystem/processing/obj_tab_items.dm index 53786daf0117..6be6bceab1eb 100644 --- a/code/controllers/subsystem/processing/obj_tab_items.dm +++ b/code/controllers/subsystem/processing/obj_tab_items.dm @@ -12,8 +12,8 @@ PROCESSING_SUBSYSTEM_DEF(obj_tab_items) //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)] if(QDELETED(thing)) processing -= thing else if(thing.process(wait * 0.1) == PROCESS_KILL) diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm index 73a5db433dc8..c2736528df86 100644 --- a/code/controllers/subsystem/processing/processing.dm +++ b/code/controllers/subsystem/processing/processing.dm @@ -20,8 +20,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/projectiles.dm b/code/controllers/subsystem/projectiles.dm index a23303ea282d..da3b5a7b9c71 100644 --- a/code/controllers/subsystem/projectiles.dm +++ b/code/controllers/subsystem/projectiles.dm @@ -28,7 +28,7 @@ SUBSYSTEM_DEF(projectiles) */ /datum/controller/subsystem/projectiles/stat_entry(msg) - msg = " | #Proj: [projectiles.len]" + msg = " | #Proj: [length(projectiles)]" return ..() /datum/controller/subsystem/projectiles/Initialize(start_timeofday) @@ -41,8 +41,8 @@ SUBSYSTEM_DEF(projectiles) if(!resumed) flying = projectiles.Copy() flying -= sleepers - while(flying.len) - var/obj/projectile/projectile = flying[flying.len] + while(length(flying)) + var/obj/projectile/projectile = flying[length(flying)] flying.len-- var/delta_time = wait * world.tick_lag * (1 SECONDS) handle_projectile_flight(projectile, delta_time) diff --git a/code/controllers/subsystem/quadtrees.dm b/code/controllers/subsystem/quadtrees.dm index da217cb58cee..8c55cb8f1c50 100644 --- a/code/controllers/subsystem/quadtrees.dm +++ b/code/controllers/subsystem/quadtrees.dm @@ -24,17 +24,17 @@ SUBSYSTEM_DEF(quadtree) if(!resumed) player_feed = GLOB.clients.Copy() cur_quadtrees = new_quadtrees.Copy() - if(new_quadtrees.len < world.maxz) + if(length(new_quadtrees) < world.maxz) new_quadtrees.len = world.maxz for(var/i in 1 to world.maxz) new_quadtrees[i] = QTREE(RECT(world.maxx/2,world.maxy/2, world.maxx, world.maxy), i) while(length(player_feed)) - var/client/C = player_feed[player_feed.len] + var/client/C = player_feed[length(player_feed)] player_feed.len-- if(!C) continue var/turf/T = get_turf(C.mob) - if(!T?.z || new_quadtrees.len < T.z) + if(!T?.z || length(new_quadtrees) < T.z) continue var/datum/coords/qtplayer/p_coords = new p_coords.player = C @@ -52,7 +52,7 @@ SUBSYSTEM_DEF(quadtree) var/list/players = list() if(!cur_quadtrees) return players - if(z_level && cur_quadtrees.len >= z_level) + if(z_level && length(cur_quadtrees) >= z_level) var/datum/quadtree/Q = cur_quadtrees[z_level] if(!Q) return players diff --git a/code/controllers/subsystem/round_recording.dm b/code/controllers/subsystem/round_recording.dm index f1244d386d10..e45854ac5730 100644 --- a/code/controllers/subsystem/round_recording.dm +++ b/code/controllers/subsystem/round_recording.dm @@ -35,8 +35,8 @@ SUBSYSTEM_DEF(round_recording) return currentrun = recorder.tracked_players.Copy() - while(currentrun.len) - var/mob/M = currentrun[currentrun.len] + while(length(currentrun)) + var/mob/M = currentrun[length(currentrun)] currentrun.len-- // Try to stop the tracking diff --git a/code/controllers/subsystem/shuttles.dm b/code/controllers/subsystem/shuttles.dm index 0348eddd9900..d400e02f3bae 100644 --- a/code/controllers/subsystem/shuttles.dm +++ b/code/controllers/subsystem/shuttles.dm @@ -94,7 +94,7 @@ SUBSYSTEM_DEF(shuttle) qdel(T, force=TRUE) if(!SSmapping.clearing_reserved_turfs) - while(transit_requesters.len) + while(length(transit_requesters)) var/requester = popleft(transit_requesters) var/success = null // Do not try and generate any transit if we're using more then our max already @@ -311,7 +311,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/get_containing_shuttle(atom/A) var/list/mobile_cache = mobile - for(var/i in 1 to mobile_cache.len) + for(var/i in 1 to length(mobile_cache)) var/obj/docking_port/port = mobile_cache[i] if(port.is_in_shuttle_bounds(A)) return port @@ -319,7 +319,7 @@ SUBSYSTEM_DEF(shuttle) /datum/controller/subsystem/shuttle/proc/get_containing_dock(atom/A) . = 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.is_in_shuttle_bounds(A)) . += port @@ -327,7 +327,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 @@ -335,7 +335,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) @@ -353,7 +353,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/sound.dm b/code/controllers/subsystem/sound.dm index 4fdfd7935349..024df7cc45ad 100644 --- a/code/controllers/subsystem/sound.dm +++ b/code/controllers/subsystem/sound.dm @@ -24,7 +24,7 @@ SUBSYSTEM_DEF(sound) if(MC_TICK_CHECK) return while(length(run_hearers)) // Output sound to hearers - var/client/C = run_hearers[run_hearers.len] + var/client/C = run_hearers[length(run_hearers)] run_hearers.len-- if(C && C.soundOutput) C.soundOutput.process_sound(run_template) @@ -40,6 +40,6 @@ SUBSYSTEM_DEF(sound) for(var/datum/interior/VI in extra_interiors) if(VI?.ready) var/list/bounds = VI.get_middle_coords() - if(bounds.len >= 2) + if(length(bounds) >= 2) hearers |= SSquadtree.players_in_range(RECT(bounds[1], bounds[2], VI.map_template.width, VI.map_template.height), bounds[3]) template_queue[template] = hearers diff --git a/code/controllers/subsystem/soundscape.dm b/code/controllers/subsystem/soundscape.dm index 2219a0b35c86..432166e06be9 100644 --- a/code/controllers/subsystem/soundscape.dm +++ b/code/controllers/subsystem/soundscape.dm @@ -15,8 +15,8 @@ SUBSYSTEM_DEF(soundscape) if(!resumed) currentrun = GLOB.clients.Copy() - while(currentrun.len) - var/client/C = currentrun[currentrun.len] + while(length(currentrun)) + var/client/C = currentrun[length(currentrun)] currentrun.len-- if(!C || !C.soundOutput) diff --git a/code/controllers/subsystem/statpanel.dm b/code/controllers/subsystem/statpanel.dm index 030043d12d3a..613c8df5850f 100644 --- a/code/controllers/subsystem/statpanel.dm +++ b/code/controllers/subsystem/statpanel.dm @@ -197,7 +197,7 @@ SUBSYSTEM_DEF(statpanels) /datum/controller/subsystem/statpanels/proc/generate_mc_data() mc_data = list( list("CPU:", world.cpu), - list("Instances:", "[num2text(world.contents.len, 10)]"), + list("Instances:", "[num2text(length(world.contents), 10)]"), list("World Time:", "[world.time]"), list("Globals:", GLOB.stat_entry(), "\ref[GLOB]"), list("[config]:", config.stat_entry(), "\ref[config]"), diff --git a/code/controllers/subsystem/tgui.dm b/code/controllers/subsystem/tgui.dm index 0bd0c29e450a..a3ef03f3e397 100644 --- a/code/controllers/subsystem/tgui.dm +++ b/code/controllers/subsystem/tgui.dm @@ -45,8 +45,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?.user && ui.src_object) diff --git a/code/controllers/subsystem/tracking.dm b/code/controllers/subsystem/tracking.dm index 3955ace8da09..4dcc5d5c4e29 100644 --- a/code/controllers/subsystem/tracking.dm +++ b/code/controllers/subsystem/tracking.dm @@ -98,7 +98,7 @@ SUBSYSTEM_DEF(tracking) /datum/controller/subsystem/tracking/proc/setup_trackers(mob/mob, tracked_group) if(!tracked_group) - tracked_group = "tracked_[tracked_mobs.len]" + tracked_group = "tracked_[length(tracked_mobs)]" tracked_mobs[tracked_group] = list() leaders[tracked_group] = mob diff --git a/code/controllers/subsystem/xeno.dm b/code/controllers/subsystem/xeno.dm index 0623da804254..df711fd90366 100644 --- a/code/controllers/subsystem/xeno.dm +++ b/code/controllers/subsystem/xeno.dm @@ -7,7 +7,7 @@ SUBSYSTEM_DEF(xeno) var/list/currentrun = list() /datum/controller/subsystem/xeno/stat_entry(msg) - msg = "P:[GLOB.xeno_mob_list.len]" + msg = "P:[length(GLOB.xeno_mob_list)]" return ..() @@ -15,8 +15,8 @@ SUBSYSTEM_DEF(xeno) if (!resumed) currentrun = GLOB.xeno_mob_list.Copy() - while (currentrun.len) - var/mob/living/carbon/xenomorph/M = currentrun[currentrun.len] + while (length(currentrun)) + var/mob/living/carbon/xenomorph/M = currentrun[length(currentrun)] currentrun.len-- if (!M || QDELETED(M)) diff --git a/code/datums/_ndatabase/code/brsql_adapter.dm b/code/datums/_ndatabase/code/brsql_adapter.dm index 251267a04fdb..2362572f588a 100644 --- a/code/datums/_ndatabase/code/brsql_adapter.dm +++ b/code/datums/_ndatabase/code/brsql_adapter.dm @@ -103,7 +103,7 @@ /datum/db/adapter/brsql_adapter/insert_table(table_name, list/values, datum/callback/CB, sync = FALSE) set waitfor = FALSE - var/length = values.len + var/length = length(values) var/list/qpars = list() var/query_inserttable = getquery_insert_table(table_name, values, qpars) var/datum/callback/callback = CALLBACK(src, TYPE_PROC_REF(/datum/db/adapter/brsql_adapter, after_insert_table), CB, length, table_name) @@ -150,7 +150,7 @@ if(table_meta.status != DB_QUERY_FINISHED) issue_log += "Unable to access system table, error: '[table_meta.error]'" return FALSE // OH SHIT OH FUCK - if(!table_meta.results.len) // Table doesn't exist + if(!length(table_meta.results)) // Table doesn't exist return internal_create_table(table_name, field_types) && internal_record_table_in_sys(type_name, table_name, field_types) var/id = table_meta.results[1][DB_DEFAULT_ID_FIELD] @@ -178,7 +178,7 @@ if(index_meta.status != DB_QUERY_FINISHED) issue_log += "Unable to access system index table, error: '[index_meta.error]'" return FALSE // OH SHIT OH FUCK - if(!index_meta.results.len) // Index doesn't exist + if(!length(index_meta.results)) // Index doesn't exist return internal_create_index(index_name, table_name, fields, unique, cluster) && internal_record_index_in_sys(index_name, table_name, fields) var/id = index_meta.results[1][DB_DEFAULT_ID_FIELD] diff --git a/code/datums/_ndatabase/code/native_adapter.dm b/code/datums/_ndatabase/code/native_adapter.dm index 1c23a6ceab8f..d5956ca8d85f 100644 --- a/code/datums/_ndatabase/code/native_adapter.dm +++ b/code/datums/_ndatabase/code/native_adapter.dm @@ -92,7 +92,7 @@ /datum/db/adapter/native_adapter/insert_table(table_name, list/values, datum/callback/CB, sync = FALSE) set waitfor = 0 - var/length = values.len + var/length = length(values) var/startid = internal_request_insert_allocation(table_name, length) var/list/qpars = list() var/query_inserttable = getquery_insert_table(table_name, values, startid, qpars) @@ -138,7 +138,7 @@ if(table_meta.status != DB_QUERY_FINISHED) issue_log += "Unable to access system table, error: '[table_meta.error]'" return FALSE // OH SHIT OH FUCK - if(!table_meta.results.len) // Table doesn't exist + if(!length(table_meta.results)) // Table doesn't exist return internal_create_table(table_name, field_types) && internal_record_table_in_sys(type_name, table_name, field_types) var/id = table_meta.results[1][DB_DEFAULT_ID_FIELD] diff --git a/code/datums/_ndatabase/code/native_persistent_query.dm b/code/datums/_ndatabase/code/native_persistent_query.dm index 15e505d578d7..39025aa1fd93 100644 --- a/code/datums/_ndatabase/code/native_persistent_query.dm +++ b/code/datums/_ndatabase/code/native_persistent_query.dm @@ -29,7 +29,7 @@ /datum/db/query/native/read_single() if(status >= DB_QUERY_FINISHED || completed) //broken or finished return - + if(!completed) completed = TRUE var/status = query.Execute(db) @@ -41,9 +41,9 @@ if(!results) results = list() var/list/cols = query.Columns() - if(cols && cols.len>0) + if(LAZYLEN(cols)>0) while(query.NextRow()) var/list/current_row = query.GetRowData() results += list(current_row) - affected_rows = query.RowsAffected() + affected_rows = query.RowsAffected() status = DB_QUERY_FINISHED diff --git a/code/datums/_ndatabase/subsystems/database_query_manager.dm b/code/datums/_ndatabase/subsystems/database_query_manager.dm index 596d55121920..5a68c4e349c1 100644 --- a/code/datums/_ndatabase/subsystems/database_query_manager.dm +++ b/code/datums/_ndatabase/subsystems/database_query_manager.dm @@ -62,7 +62,7 @@ GLOBAL_REAL(SSdatabase, /datum/controller/subsystem/database_query_manager) /datum/controller/subsystem/database_query_manager/stat_entry(msg) var/text = (connection && connection.status == DB_CONNECTION_READY) ? ("READY") : ("PREPPING") - msg = "[text], AQ:[queries_active.len]; SQ:[queries_standby.len]; P:[queries_current.len]; C:[in_callback]" + msg = "[text], AQ:[length(queries_active)]; SQ:[length(queries_standby)]; P:[length(queries_current)]; C:[in_callback]" return ..() /datum/controller/subsystem/database_query_manager/fire(resumed = FALSE) diff --git a/code/datums/_ndatabase/subsystems/entity_manager.dm b/code/datums/_ndatabase/subsystems/entity_manager.dm index 833bc6926e09..2ef5da2b22dd 100644 --- a/code/datums/_ndatabase/subsystems/entity_manager.dm +++ b/code/datums/_ndatabase/subsystems/entity_manager.dm @@ -102,8 +102,8 @@ GLOBAL_REAL(SSentity_manager, /datum/controller/subsystem/entity_manager) currentrun = tables_unsorted.Copy() if(!SSdatabase.connection.connection_ready()) return - while (currentrun.len) - var/datum/entity_meta/Q = currentrun[currentrun.len] + while (length(currentrun)) + var/datum/entity_meta/Q = currentrun[length(currentrun)] do_select(Q) do_insert(Q) do_update(Q) diff --git a/code/datums/_ndatabase/tests/test_entity.dm b/code/datums/_ndatabase/tests/test_entity.dm index de1942eec7d3..3bc9cc829bf4 100644 --- a/code/datums/_ndatabase/tests/test_entity.dm +++ b/code/datums/_ndatabase/tests/test_entity.dm @@ -50,7 +50,7 @@ SSentity_manager.filter_then(/datum/entity/test_entity, DB_COMP("value", DB_EQUALS, value), CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(log_filter))) /proc/log_filter(list/datum/entity/elist) - to_world("got [elist.len] items") + to_world("got [length(elist)] items") /proc/log_sync(datum/entity/test_entity/ET) to_world("id:[ET.id] = name: [ET.name], description: [ET.description], value: [ET.value]") diff --git a/code/datums/ammo/ammo.dm b/code/datums/ammo/ammo.dm index a59290ab5f51..022909691cfc 100644 --- a/code/datums/ammo/ammo.dm +++ b/code/datums/ammo/ammo.dm @@ -212,7 +212,7 @@ M.apply_damage(damage,damage_type) - if(XNO && XNO.xeno_shields.len) + if(XNO && length(XNO.xeno_shields)) P.play_shielded_hit_effect(M) else P.play_hit_effect(M) diff --git a/code/datums/ammo/misc.dm b/code/datums/ammo/misc.dm index d3ce356372be..9a9ed2fb505b 100644 --- a/code/datums/ammo/misc.dm +++ b/code/datums/ammo/misc.dm @@ -200,7 +200,7 @@ if(!M || M == P.firer) return if(M.throw_mode && !M.get_active_hand()) //empty active hand and we're in throw mode. If so we catch the can. if(!M.is_mob_incapacitated()) // People who are not able to catch cannot catch. - if(P.contents.len == 1) + if(length(P.contents) == 1) for(var/obj/item/reagent_container/food/drinks/cans/souto/S in P.contents) M.put_in_active_hand(S) for(var/mob/O in viewers(GLOB.world_view_size, P)) //find all people in view. @@ -214,7 +214,7 @@ H.apply_effect(15, DAZE) H.apply_effect(15, SLOW) shake_camera(H, 2, 1) - if(P.contents.len) + if(length(P.contents)) drop_can(P.loc, P) //We make a can at the location. /datum/ammo/souto/on_hit_obj(obj/O,obj/projectile/P) @@ -230,7 +230,7 @@ drop_can(P.loc, P) //We make a can at the location. /datum/ammo/souto/proc/drop_can(loc, obj/projectile/P) - if(P.contents.len) + if(length(P.contents)) for(var/obj/item/I in P.contents) I.forceMove(loc) randomize_projectile(P) diff --git a/code/datums/browser.dm b/code/datums/browser.dm index 3b694e8f44bb..f7626214a73e 100644 --- a/code/datums/browser.dm +++ b/code/datums/browser.dm @@ -117,9 +117,9 @@ window_size = "size=[width]x[height];" common_asset.send(user) other_asset.send(user) - if (stylesheets.len) + if (length(stylesheets)) SSassets.transport.send_assets(user, stylesheets) - if (scripts.len) + if (length(scripts)) SSassets.transport.send_assets(user, scripts) user << browse(get_content(), "window=[window_id];[window_size][window_options]") diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index c998bd55257c..f356fc5c1077 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() @@ -243,7 +243,7 @@ lookup[sig] -= src signal_procs[target] -= sig_type_or_types - if(!signal_procs[target].len) + if(!length(signal_procs[target])) signal_procs -= target /** diff --git a/code/datums/datum.dm b/code/datums/datum.dm index 3e317ffd601e..e926dfd022ca 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -119,7 +119,7 @@ var/datum/component/C = all_components qdel(C, FALSE, TRUE) if(datum_components) - debug_log("'[src]' datum_components was not null after removing all components! [datum_components.len] entries remained...") + debug_log("'[src]' datum_components was not null after removing all components! [length(datum_components)] entries remained...") datum_components.Cut() var/list/lookup = comp_lookup diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm index 6ccbaa66e7de..41f1fe30e921 100644 --- a/code/datums/diseases/advance/advance.dm +++ b/code/datums/diseases/advance/advance.dm @@ -50,7 +50,7 @@ GLOBAL_LIST_INIT(advance_cures, list( /datum/disease/advance/New(process = 1, datum/disease/advance/D) // Setup our dictionary if it hasn't already. - if(!GLOB.dictionary_symptoms.len) + if(!length(GLOB.dictionary_symptoms)) for(var/symp in GLOB.list_symptoms) var/datum/symptom/S = new symp GLOB.dictionary_symptoms[S.id] = symp @@ -59,9 +59,9 @@ GLOBAL_LIST_INIT(advance_cures, list( D = null // Generate symptoms if we weren't given any. - if(!symptoms || !symptoms.len) + if(!LAZYLEN(symptoms)) - if(!D || !D.symptoms || !D.symptoms.len) + if(!D || !LAZYLEN(D.symptoms)) symptoms = GenerateSymptoms() else for(var/datum/symptom/S in D.symptoms) @@ -80,7 +80,7 @@ GLOBAL_LIST_INIT(advance_cures, list( // Randomly pick a symptom to activate. /datum/disease/advance/stage_act() ..() - if(symptoms && symptoms.len) + if(LAZYLEN(symptoms)) if(!processing) processing = 1 @@ -148,7 +148,7 @@ GLOBAL_LIST_INIT(advance_cures, list( if(!HasSymptom(S)) possible_symptoms += S - if(!possible_symptoms.len) + if(!length(possible_symptoms)) return //error("Advance Disease - We weren't able to get any possible symptoms in GenerateSymptoms([type_level_limit], [amount_get])") @@ -182,7 +182,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(!LAZYLEN(symptoms)) CRASH("We did not have any symptoms before generating properties.") var/list/properties = list("resistance" = 1, "stealth" = 1, "stage_rate" = 1, "transmittable" = 1, "severity" = 1) @@ -200,11 +200,11 @@ 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(LAZYLEN(properties)) hidden = list( (properties["stealth"] > 2), (properties["stealth"] > 3) ) // The more symptoms we have, the less transmittable it is but some symptoms can make up for it. - SetSpread(clamp(properties["transmittable"] - symptoms.len, BLOOD, AIRBORNE)) + SetSpread(clamp(properties["transmittable"] - length(symptoms), BLOOD, AIRBORNE)) permeability_mod = max(ceil(0.4 * properties["transmittable"]), 1) cure_chance = 15 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20 stage_prob = max(properties["stage_rate"], 2) @@ -253,8 +253,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(LAZYLEN(properties)) + var/res = clamp(properties["resistance"] - (length(symptoms) / 2), 1, length(GLOB.advance_cures)) cure_id = GLOB.advance_cures[res] // Get the cure name from the cure_id @@ -274,7 +274,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) @@ -305,7 +305,7 @@ GLOBAL_LIST_INIT(advance_cures, list( if(HasSymptom(S)) return - if(symptoms.len < 5 + rand(-1, 1)) + if(length(symptoms) < 5 + rand(-1, 1)) symptoms += S else RemoveSymptom(pick(symptoms)) @@ -331,14 +331,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++ @@ -362,7 +362,7 @@ GLOBAL_LIST_INIT(advance_cures, list( R.data_properties = data.Copy() else R.data_properties = data - if(preserve.len) + if(length(preserve)) R.data_properties["viruses"] = preserve /proc/AdminCreateVirus(mob/user) @@ -385,7 +385,7 @@ GLOBAL_LIST_INIT(advance_cures, list( i-- while(i > 0) - if(D.symptoms.len > 0) + if(length(D.symptoms) > 0) var/new_name = input(user, "Name your new disease.", "New Name") D.AssignName(new_name) diff --git a/code/datums/diseases/advance/symptoms/symptoms.dm b/code/datums/diseases/advance/symptoms/symptoms.dm index 7746a03b4f89..8ddd5897f92a 100644 --- a/code/datums/diseases/advance/symptoms/symptoms.dm +++ b/code/datums/diseases/advance/symptoms/symptoms.dm @@ -17,7 +17,7 @@ GLOBAL_LIST_EMPTY(dictionary_symptoms) /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(src.type == S[i]) id = "[i]" return diff --git a/code/datums/diseases/black_goo.dm b/code/datums/diseases/black_goo.dm index 5d6d96fcc57c..6fb74bc82bd4 100644 --- a/code/datums/diseases/black_goo.dm +++ b/code/datums/diseases/black_goo.dm @@ -301,12 +301,12 @@ /obj/item/storage/fancy/blackgoo/get_examine_text(mob/user) . = ..() . += "A strange looking metal container..." - if(contents.len <= 0) + if(length(contents) <= 0) . += "There are no bottles left inside it." - else if(contents.len == 1) + else if(length(contents) == 1) . += "There is one bottle left inside it." else - . += "There are [src.contents.len] bottles inside the container." + . += "There are [length(src.contents)] bottles inside the container." /obj/item/storage/fancy/blackgoo/Initialize() diff --git a/code/datums/emergency_calls/custom.dm b/code/datums/emergency_calls/custom.dm index 0117c83fc19c..b62d984f6fe3 100644 --- a/code/datums/emergency_calls/custom.dm +++ b/code/datums/emergency_calls/custom.dm @@ -19,7 +19,7 @@ if(!istype(spawn_loc)) return //Didn't find a useable spawn point. - if(!players_to_offer.len) + if(!length(players_to_offer)) return // No more players var/mob/living/carbon/human/H = pick(players_to_offer) diff --git a/code/datums/emergency_calls/emergency_call.dm b/code/datums/emergency_calls/emergency_call.dm index a803a7f06c78..99b31ab41f19 100644 --- a/code/datums/emergency_calls/emergency_call.dm +++ b/code/datums/emergency_calls/emergency_call.dm @@ -64,11 +64,11 @@ var/home_base = /datum/lazy_template/ert/freelancer_station /datum/game_mode/proc/initialize_emergency_calls() - if(all_calls.len) //It's already been set up. + if(length(all_calls)) //It's already been set up. return var/list/total_calls = typesof(/datum/emergency_call) - if(!total_calls.len) + if(!length(total_calls)) to_world(SPAN_DANGER("\b Error setting up emergency calls, no datums found.")) return FALSE for(var/S in total_calls) @@ -154,7 +154,7 @@ if(jobban_isbanned(src, "Syndicate") || jobban_isbanned(src, "Emergency Response Team")) to_chat(src, SPAN_DANGER("You are jobbanned from the emergency response team!")) return - if(!SSticker.mode || !SSticker.mode.picked_calls.len) + if(!SSticker.mode || !length(SSticker.mode.picked_calls)) to_chat(src, SPAN_WARNING("No distress beacons are active. You will be notified if this changes.")) return @@ -230,8 +230,8 @@ SEND_SIGNAL(src, COMSIG_ERT_SETUP) - if(candidates.len < mob_min && !spawn_max_amount) - message_admins("Aborting distress beacon, not enough candidates: found [candidates.len].") + if(length(candidates) < mob_min && !spawn_max_amount) + message_admins("Aborting distress beacon, not enough candidates: found [length(candidates)].") members = list() //Empty the members list. candidates = list() @@ -244,7 +244,7 @@ var/list/datum/mind/picked_candidates = list() if(mob_max > 0) var/mob_count = 0 - while (mob_count < mob_max && candidates.len) + while (mob_count < mob_max && length(candidates)) var/datum/mind/M = pick(candidates) //Get a random candidate, then remove it from the candidates list. if(!istype(M))//Something went horrifically wrong candidates.Remove(M) @@ -254,13 +254,13 @@ continue if(M.current && M.current.stat != DEAD) candidates.Remove(M) //Strip them from the list, they aren't dead anymore. - if(!candidates.len) + if(!length(candidates)) break //NO picking from empty lists continue picked_candidates.Add(M) candidates.Remove(M) mob_count++ - if(candidates.len) + if(length(candidates)) for(var/datum/mind/I in candidates) if(I.current) to_chat(I.current, SPAN_WARNING("You didn't get selected to join the distress team. Better luck next time!")) @@ -310,7 +310,7 @@ SSshuttle.moveShuttleToDock(shuttle, pick(active_lzs), TRUE) var/i = 0 - if(picked_candidates.len) + if(length(picked_candidates)) for(var/datum/mind/M in picked_candidates) members += M i++ diff --git a/code/datums/entities/player.dm b/code/datums/entities/player.dm index a62e663ba21c..fbdcc11e1037 100644 --- a/code/datums/entities/player.dm +++ b/code/datums/entities/player.dm @@ -606,14 +606,14 @@ BSQL_PROTECT_DATUM(/datum/entity/player) note.admin_rank = "N/A" note.date = I.timestamp var/list/splitting = splittext(I.content, "|") - if(splitting.len == 1) + if(length(splitting) == 1) note.text = I.content note.is_ban = FALSE - if(splitting.len == 3) + if(length(splitting) == 3) note.text = splitting[3] note.ban_time = text2num(replacetext(replacetext(splitting[2],"Duration: ","")," minutes","")) note.is_ban = TRUE - if(splitting.len == 2) + if(length(splitting) == 2) note.text = I.content note.is_ban = TRUE diff --git a/code/datums/global_variables.dm b/code/datums/global_variables.dm index 53e9c0391e17..24d32bbf3552 100644 --- a/code/datums/global_variables.dm +++ b/code/datums/global_variables.dm @@ -154,9 +154,9 @@ else if (istype(value, /list)) var/list/L = value - html += "[name] = /list ([L.len])" + html += "[name] = /list ([length(L)])" - if (L.len > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || L.len > 500)) + if (length(L) > 0 && !(name == "underlays" || name == "overlays" || name == "vars" || length(L) > 500)) // not sure if this is completely right... html += "