Commit Graph

13311 Commits

Author SHA1 Message Date
Fikou
29c22f68c7 brain washing now cures up to lobotomy tier traumas (#62426)
About The Pull Request

brain washing cures up to lobotomy tier traumas, instead of surgery
Why It's Good For The Game

if you wash a brain you already surgeried it so its kinda pointless, now the funny very rare item can also be useful and it encourages doing brain washing, leading to more rp opportunities
Changelog

cl
balance: brain washing now cures up to lobotomy tier traumas
/cl
2021-11-02 15:07:45 +13:00
Len Kagamine
0cd057f886 Allows pAI's to print photographs for 10 ram (#62462)
## About The Pull Request
Allows PAI to access a newly inbuilt bluespace printer at the cost of some processing power being diverted to mine for cryptocurrency.

## Why It's Good For The Game
Pai's are perfect travel buddies, but its a shame they cant print out their memories to share with their master. Well now they can! Simply take a picture, select the "Printer" button, and (optionally select an image if multiple are available) Presto! Instant picture. No toner required, its ported directly from an automatic nanotransen printer! Of course, some ram is actually being used for crypto mining for pure NT profit, but who cares? Pictures!
2021-11-01 16:49:56 -04:00
phasenoisepon
5d008107c5 stops aheal from deleting all restraints in target's inventory (#62476)
fixes a corner case with an often used admin command
2021-11-01 12:28:26 -04:00
Mothblocks
0f3c4e51f7 Modernizing Radiation -- TL;DR: Radiation is now a status effect healed by tox healing, and contamination is removed (#62265)
Implements the Modernizing radiation design document ( https://hackmd.io/@tgstation/rJNIyeBHt ) and replaces the current radiation sources with the new system, as well as replacing/removing a bunch of old consumers of radiation that either had no reason to exist, or could be replaced by something else.

Diverges from the doc in that items radiation don't go up like explained. I was going to, but items get irradiated so easily that it just feels pretty lame. Items still get irradiated, but it's mostly just so that radiation sources look cooler (wow, lots of stuff around going green), and for things like the geiger counter.

Instead of the complicated radiation_wave system, radiation now just checks everything between the radiation source and the potential target, losing power along the way based on the radiation insulation of whats in between. If this reaches too low a point (specified by radiation_pulse consumers), then the radiation will not pass. Otherwise, will roll a chance to irradiate. Uranium structures allow a delay before irradiating, so stay away!
2021-11-01 04:20:39 -03:00
RaveRadbury
ca0eb2b3f0 changes vampire and dullahan to be config enableable (#62357)
Dullahan and Vampire had some trace of old shitcode that the other Halloween races didn't, preventing them from being added to the config for cases like early Halloween
2021-10-31 19:33:08 +00:00
Timberpoes
bb86c015eb Nerfs felipires and dullanids. (#62432)
Vampires and Dullahans have tail and ear mutant_parts defined but set to "None".

Because they're defined at all, the new prefs menu gives preference entries for them.

The /mob/living/carbon/human/dummy/consistent used to set these up has Cat ears and Cat tails defined in its DNA features.

Vampires and Dullahans inherit this dummy setting on the prefs menu, and thus can select cat ears and cat tails on the prefs menu.

Fixes /mob/living/carbon/human/dummy/consistent to not define cat ears and tails.
Fixes the Vampire and Dullahan species to define mutant bodyparts the same as humans, removing their ear and tail entries.
2021-10-29 22:53:07 -03:00
Krysonism
13142fcb1c no more easy slurry (#62330) 2021-10-29 17:24:55 -07:00
Timberpoes
025018014d Tackles various problems with keyed_list config entries, fixing broken roundstart races and more! (#62359)
While helping RaveRadbury debug some issues with enabling Halloween species early via the brute force method of enabling them in the config rather than the gentleman's solution of testmerging a PR that changes the Halloween date, we discovered something dreadful.

Cloth golems cannot be enabled! Infact, any species with a space in the ID cannot be enabled.

It uses the splitter despite VALUE_MODE_FLAG being set. So a key entry like ROUNDSTART_RACES cloth golem would get parsed as cloth = golem, then entered into the config as cloth = TRUE
NEW AND IMPROVED PART HERE

I've re-written how keyed_list config entries are parsed, splitting it into a number of procs to do some discrete block of logic.

Based on feedback from MSO, he expected that VALUE_MODE_FLAG keyed_list entries could have elements overridden. However, this functionality was not present in the code.

I have implemented it. We now support 3 methods of setting VALUE_MODE_FLAGS.

Implicitly enable the config entry: CONFIG_ENTRY config_key_goes_here
Explicitly enable the config entry: CONFIG_ENTRY config_key_goes_here 1
Explicitly disable the config entry: CONFIG_ENTRY config_key_goes_here 0

There have been functionality changes too. Previously, everything before the first splitter was the key and everything after was the value. However, in ambiguous config entries (Such as ROUNDSTART_RACES cloth golem 0) it would be unclear if the intent was (cloth, golem 0) or (cloth golem, 0) or indeed if the intent was (cloth golem 0, 1).

As a result, there is now the following paradigm in place: Everything after the LAST splitter is the value, everything before is the key and a log_config warning is now given explaining the problem and showing how it was resolved.

[2021-10-27 19:48:12.840] WARNING: Multiple splitter characters (" ") found. Using "cloth golem" as config key and "1" as config value.

This warning will trigger if multiple splitters are present for any keyed_list config entry, and will trigger on implicit VALUE_MODE_FLAGS entries that have splitters. The example above is it triggering on ROUNDSTART_RACES cloth golem - It has detected that there is potential ambiguity between (cloth, golem) or (cloth golem, 1), has picked a sensible option for the data type and has warned about it.

The intent is that no config entry should be ambiguous. It should be clear what is key and what is value when dealing with keyed_list config entries.

There's probably more work to do on other config entries to bring them up to this standard, but this is the thing I'm hitting in this PR.

Similarly, I have improved the validation aspect of keyed_list config entries with additional logging in general.
[2021-10-27 19:47:53.135] ERROR: Invalid KEY_MODE_TYPE typepath. Is not a valid typepath: /mob/living/carbon/monkey

I have added a unit test to make sure species IDs do not contain splitters from the two keyed_list subtypes relating to species.

I have added sanity checking to the race config subtypes since we have a big dick global list of all races sorted by ID, so a race not existing will fail validation and output a meaningful config log entry.

I have removed /datum/config_entry/keyed_list/probability from the code as it is unused with the removal of all game modes except Dynamic.

The config change necessitated the renaming of all golem species IDs. Doing so and renaming the clothgolem.ts file to match has fixed the broken cloth golem page too.
2021-10-29 16:38:00 -03:00
John Willard
88d7dbfc10 removes double spaces before symbols (#62397)
This can apparently cause some bugs on occasions, so I thought I might as well try to kill them all.
2021-10-28 19:25:50 -03:00
AnturK
f03fd9dd8a Few minor runtime fixes (#62394) 2021-10-28 19:24:18 -03:00
esainane
d521116acf Refactor /turf/var/intact (#62331)
Turfs have a variable, intact, which conflates three meanings:

    Determining whether there's something that can be pried out, such as directly with a crowbar or indirectly with a tile stack and a crowbar off-hand.
    Determining whether underfloor pieces are visible.
    Determining whether underfloor pieces can be interacted with - by players with tools, through interaction with effects like chemical acid, or foam.

When plating is hit with a stack of tiles, /turf/open/floor/attackby checks whether the turf is intact, and if so, ends the attack chain regardless of whether or not the attempt to hotswap a turf (with a crowbar) is successful or not. However, turfs which want the underfloor to be visible - such as catwalks and glass - set the intact variable to FALSE, and so can be repeatedly placed over one another, as if they were the first tile to be placed over the plating.

This refactors /turf/var/intact into two distinct variables:

    /turf/var/overfloor_placed, for whether or not there is something over plating.
    /turf/var/underfloor_visible, for whether or not the various underfloor pieces should be invisible, visible, or both visible and interactable.

All references to /turf/var/intact have been replaced with an equivalent overfloor_placed or underfloor_visible reference, depending on which check is appropriate. underfloor_accessibility can take one of UNDERFLOOR_HIDDEN, UNDERFLOOR_VISIBLE, or UNDERFLOOR_INTERACTABLE. This prevents cases such as acid foam or tools phasing through glass floors to affect the underfloor pieces underneath, and covers all kinds of unusual, not-wiring-visiblity usage such as Holodeck completeness, Revenant interaction, or station integrity checking.
2021-10-28 19:14:40 -03:00
MrMelbert
07601f90b2 Removes whitespace from two filenames (#62382)
Renames ice demon.dm -> ice_demon.dm
Renames ice whelp.dm -> ice_whelp.dm
2021-10-28 10:20:06 +01:00
Watermelon914
6b360a0e80 Shooting specific wizard staffs as a non-wizard or non-magician now backfires in different ways. (#62257)
About The Pull Request

If you try using the staff of change, the staff of chaos, the spellblade or the staff of healing as a crewmember, then it'll backfire.
People who can use the staff normally: Apprentices, Wizards, Amateur Magician (from Summon Magic event)

Backfiring is different depending on the staff, each effect is listed below and happens when you try firing the staff.
Staff of change - Wabbajacks the imposter, although they can't become a xeno or a borg.
Staff of chaos - 5% chance to fire the staff at the imposter using it.
Staff of healing - Acts as a medibeam gun to the imposter.
Why It's Good For The Game

Crew getting access to the Staff of Change tends to end in a lot of people becoming xenomorphs or syndicate borgs. It forces the round into a turn for the worse for all antags as xenomorphs have hardstuns, syndicate borgs have emag, greatly improved healing chemicals and powerful weaponary.
Crew getting access to the Staff of Healing results in death being irrelevant. Killing people is no longer a viable tactic as an antagonist because anyone killed, no matter how damaged their body is, can be instantly healed with this staff.
Crew getting access to the Staff of Chaos is like crew getting access to the staff of change and the staff of healing at the same time, only more unpredictable. It's better if they can't reliably use it to get the spells they want as chaos is implied in the name, it becomes russian roulette trying to get the correct bolt as you can also get shot by a bolt of death, instantly killing you.

This is a better alternative to outright removing the staffs or making them usable only by wizards as it gives a quirky use to trying to use them as a crewmember. Maybe not the staff of healing, but fuck the staff of healing.
Changelog

cl
balance: If you try using the staff of change, the staff of chaos or the staff of healing as a crewmember, then it'll backfire. The Staff of change wabbajacks the user, like the pool of change; this means you can't become a xenomorph or a syndicate borg. The Staff of chaos has a 5% chance of firing the bolt directly at the user using it. The Staff of healing now behaves like a medibeam gun to non-wizards trying to use it.
/cl
2021-10-28 11:50:59 +13:00
LemonInTheDark
a47ff2485c Fixes emag ethereals, also ensures mutcolor is used properly (#62088)
* Fixes emagged ethereals not working

* Ensures mutcolor is properly treated as something without # ahead of it

* gI take it all back (Someone else went in a different direction then me wth mutcolor, adding the sharp instead
of removing it. Just gonna roll back my unneeded stuff. Oh also I found an issue in spraytans, cleaning that up too
2021-10-27 08:22:21 +02:00
Sealed101
9582e3ff91 Fixes corgi hats stuck to them forever & SAVES HALLOWEEN (#62318)
About The Pull Request

Corgi hats used to resist any attempts at removing them from the corgi wearing said hat. This fixes that.
Also fixes #62297 by giving carved pumpkins and blumpkins their own dog_fashion datums.
Why It's Good For The Game

Corgis are now no longer stuck to wearing one hat. Spookifies Ian for Halloween with two amazing pumpkin hats.
image
Changelog

cl
expansion: Spooky headless corgi spirits have been sighted across the Sector!
fix: fixes hats glued to corgis' heads when dressing corgis up
/cl
2021-10-27 11:57:10 +13:00
Capsandi
176cc70031 Ethereals now have their own lungs and electrolyze breathed water vapor (#62197) 2021-10-26 13:47:35 -07:00
esainane
46adbde226 Don't remove stamcrit on stronger stat (#62335)
Any time update_stamina was called, such as being reduced by 0.3 while
unconscious, it would check to see if stat was set. If so, it would then
immediately remove all stamcrit traits, even if these traits were not set
to expire before whatever was causing the stat did.

This allowed players to enter a very brief unconscious period with
the *collapse emote, which would immediately override and remove stamcrit
traits, and be able to move around and act freely as soon as the very
short emote induced unconsciousness finished.

Don't ask how long it took to track this down.

Fixes #61890.
2021-10-26 12:53:37 -07:00
Likteer
51eb3131e3 Allows ethereals to have beards (#62321)
Adds the FACEHAIR species_trait to code\modules\mob\living\carbon\human\species_types\ethereal.dm
Tested, works as intended.
2021-10-26 12:51:58 -07:00
NamelessFairy
1238ce2373 Adds the ability to soft filter words, also fixes some word filter bugs (#62158) 2021-10-26 12:45:36 -07:00
Seris02
aa9c06bce5 fixes a slight issue with the hair color not being visible on ghosts after the legacy color removal (#62225) 2021-10-25 11:25:06 -04:00
John Willard
7ea24b8a03 Re-organizes robot defines file (#62223)
It currently looks like a mess, I tried to mess with it locally and it bugged me how jumbled up everything is.
I moved all the main defines that affects all bots at the top, and the rest organized by bot.
2021-10-25 11:24:10 -04:00
tralezab
51705fcd9d Adds The Secret Brainwashing Technique-Chip (#62295)
Adds a skillchip found in maint that lets you put brains in washing machines, and scrub em back into good health. Brains now get maximum damage if put in a washing machine OTHERWISE.

VERY heavily inspired by this video:
https://www.youtube.com/watch?v=88po7PY14E8

> I believe having a brain successfully washed should give its brainmob an achievement for exposure of this feature.

can be done in a separate pr
2021-10-24 19:47:20 +01:00
Jeremiah
84320b02cf Adds punctuation to the item offering message (#62292) 2021-10-24 10:33:15 -07:00
Seris02
fc36aea489 runtime fix for borgs cryoing with upgrade modules + no more mmi laying around after they cryo, and various other runtime fixes (#62091)
human huds will no longer runtime and die when prefs aren't initalised
SSEconomy will no longer have to deal with pathed jobs inside accounts
Some of the negative/neutral quirks that use the mind have been relegated to last_mind instead for runtime purposes
Mafia saymode will no longer runtime when someone uses it with no current mafia game
Autolathe secondary_attack will no longer runtime/work only because of runtimes
MULTIPLE CHECKS FOR QDELETED STACKS BEFORE ADDING FINGERPRINTS
More player_list client checks
A lazyinitlist for proximity monitors, as they used lazyremove which nulls the list when it hits zero things in it
A check for cigarettes in case temperature exposure causes a reaction that removes all reagents
Catwalks no longer runtime every time someone walks on them
/obj/machinery/atmospherics/components/binary/crystallizer will no longer runtime on secondary_attack if someone can't interact
cyborg models will no longer assume the thing they're inside is a cyborg and runtime when it isn't (cryopods)
When a simplemob falls into nullspace, it will no longer runtime (goliaths falling into chasms and etc)
runtime fix in techweb.dm when using a card without a sanity check
runtime fix with folders when they have nothing in them
runtime fix with glowing eyes when the LAZYADD doesn't get called in regenerate_light_effets() and so doesn't initalise the list
2021-10-22 10:31:07 +01:00
IndieanaJones
6fedb21394 Lets Player-Controlled Monkeys Make Noise When Using *Screech (#62206)
This PR lets player-controlled monkeys make screeching noises using *screech.

Under the hood, this PR also adds a new proc to emotes called, should_play_sound. What this does by default is the same check run_emote used to do with only_forced_audio, but now that it's in a proc you can override it if you want to. Though, let's be real here, this is only going to get used for this PR because the only reason you'd want to bypass that check is if you're doing something for monkeys. The amount of extremely specific circumstances which even warranted something like this could only stem from some stupid monkey/alien specific crap anyway, BUT JUST IN CASE YOU NEED IT, here it is.

Considering all the screeching AI monkeys do, it's a big shame that currently player monkeys can't do similar. 

Considering that monkeys are valid salad and that AI monkeys already screech a lot anyway, I don't think letting players get in on the fun is a bad idea. If need be, we can just tune up the sound cooldown on *screech but I don't think it's really that abusable to begin with.

Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com>
2021-10-20 23:55:32 -07:00
Ghom
15c316bdb2 Moves Pun Pun away from the kitchen on Delta (and makes monkeys actually look like monkeys in the map editor) (#62108) 2021-10-20 13:48:38 -07:00
ATH1909
2b22150fdf Butter bear attack fixes (#62082)
## About The Pull Request

Butter bears can now attack structures, as they were intended to.

Fugu glanded butter bears can now break down walls, matching the behavior of other fugu glanded mobs.

Butter bears now have a melee_damage_lower of 0 and a melee_damage_upper of 0 instead of a melee_damage_lower of 1 and a melee_damage_upper of 1. Previously, those two variables had no effect on the attacks of butter bears, which always dealt no damage. They now do, meaning that a butter bear wearing bear armor or under the effects of a fugu gland can deal damage with its attacks.

Butter bear attacks are now considered to be blunt instead of sharp for the purposes of wounds.

Fixes https://github.com/tgstation/tgstation/issues/61250.

## Why It's Good For The Game

Butter bears were intended to be able to attack structures, as they were specifically given an obj_damage of 11 (as opposed to the 60 obj_damage of normal bears).

Other fugu glanded mobs can break down walls, the only reason that butter bears couldn't was because their AttackingTarget() code didn't call ..(), which appears to be an oversight.

Other mobs, like Ian, gain the ability to deal damage with their attacks if their melee damage variables are nonzeroes, and butter bears have no reason to be an exception.

Butter bears made of butter and their (lethal) attacks use a slapping sound, so their attacks should be considered to be blunt instead of sharp.

This PR has been tested on a private server.
2021-10-20 11:36:32 -04:00
Fikou
fe70cf243a adds no float trait to megafauna that dont float (#62174)
adds no float animation trait to bubblegum, blood drunk miner, demonic frost miner, wendigo as they dont float
adds no float animation trait to clockwork defender as he has his own animation so it looks weird when thats combined with the animation from the floating
2021-10-20 11:24:25 -04:00
Fikou
cb1ed1d715 fixes robots looking for the no xray z level trait twice (#62155)
i moved the check but i forgot to delete it
2021-10-17 10:39:57 -04:00
RandomGamer123
3ae0111292 Prevent aghosted admins from being forcibly dragged back to their body when being defibbed (#62048)
Aghosted admins won't be forcibly dragged back to their body when being defibbed.
2021-10-16 19:29:31 -04:00
Seris02
39e841a759 fixes udder gutlunch runtimes (#62034) 2021-10-16 19:28:23 -04:00
Ghom
3fa98c0bfd Fixes an old one line PR that was supposed to fix something but actually didn't. (#62020)
In #61595, I forgot that `mind.transfer_to()` sets the mind variable of the current mob to null. So i'm moving that `mind.name = new_xeno.real_name` statement above the proc call.
2021-10-16 19:27:00 -04:00
magatsuchi
05eab1bd26 use your custom character as an AI hologram (#62101)
don't mind the slightly different sprites, not included in the PR

adds a new option to the change hologram command in AI commands, allowing you to now select a "custom character" option. this option allows you to either use another station member as a hologram, or use the currently selected character slot as a hologram (will use the preview of the highest job priority. set to assistant to have your loadout used as appearance.)
2021-10-16 22:20:29 +01:00
itseasytosee
f51000f506 Repaths knives to not all be children of the kitchen knife. (#62035)
Basically makes the code less dumb, took a long time. I worked hard to make sure there were no unintended effects (minus the fact you can no longer get spoons from the experimentor). No player-facing effects

I thought it looked weird that all cultist and combat knives were subtypes of the kitchen knives
2021-10-15 15:28:01 -07:00
Seris02
694c2999b0 makes it so the sanitize_hexcolors' default is 6 characters rather than 3 and gets rid of color_legacy (#61980) 2021-10-15 11:48:55 -07:00
thatoneplebeian
2a826e7380 Drowsiness refactor (#62104)
Creates two procs in /mob/status_procs for handling drowsiness changes (with check for negative values), and refactors all code to use these procs instead of assigning values to the mob's drowsiness themselves.
2021-10-15 10:15:24 +01:00
Ghom
266d3b56bb Fixes the on fire overlay for monkeys. (#62110)
Monkeys were receiving the "Standing" overlay when ablaze, which is meant for human mobs.
2021-10-15 10:14:03 +01:00
Seth Scherer
f973ce1b0c Fixed hand grabbing messages appearing when they shouldn't (#61991)
Co-authored-by: Mothblocks <35135081+Mothblocks@users.noreply.github.com>
2021-10-14 10:54:34 -07:00
Ghilker
cb5fb1df2d modules/atmospherics major cleanup (#61904)
major cleanup of modules/atmospherics folder and all related files, still many missing
-cleanup of procs name
-cleanup of vars name
-documentation of some of the procs
-minor changes to some for() logic (no in game changes just early continue or as anything checks)

No in game changes, only code and docs
2021-10-14 01:13:57 -07:00
Ryll Ryll
b3f176998d Buffs eye contact, adds "Shifty Eyes" quirk (#61711) 2021-10-14 00:19:27 -07:00
Seris02
ff31569b14 no more regal rat runtimes, and, cheeeeeeeeeeeese can now be eaten by it (#62032) 2021-10-12 22:33:49 -07:00
MrMelbert
e3ee130b07 Fix double examine showing the examiner when nothing of interest was found (#62053) 2021-10-12 22:29:38 -07:00
RandomGamer123
086d9ec527 Syringe injection failure messages now show correct body part (#62044)
* Makes injection failure message actually display correct body part

* Move get_bodypart out of or
2021-10-12 15:55:43 +02:00
Ghilker
95c8e00af7 cleanup _HELPERS/_lists.dm and all the necessary files (#61827)
Bring _HELPERS/_lists.dm to latest standards by:
-Adding proper documentation and fixing existing one
-Giving vars proper names
-Procs now use snake case as per standard (many files that use those procs will be affected)
2021-10-12 14:48:51 +01:00
Seris02
5816d4c55c better fix for some runtimes with clients in player_list (maybe) (#62028) 2021-10-12 02:39:17 -07:00
Colovorat
d199a07e13 Fixes ability to extract DNA of species that has no DNA (#61928)
Co-authored-by: Colovorat <lolqwert569@gmail.com>
2021-10-12 00:02:24 -07:00
tralezab
dc38af86c9 Basic mobs can be vareditted again (#62046)
Readds the missing parent call.
2021-10-11 17:05:14 +13:00
Fikou
4663f9afce secret gateway update (#62003)
admins are now notified about a secret gateway load failing, also logs this
secret z levels are protected from incorporeal movement
fixes unpowered ruin areas being powered
adds a bunch of new areas for secret gateways, since var edited areas probably arent a good idea its good to have a few presets
adds cordon turfs and areas, ingame they just look like the z level border, they are completely indestructible, you cant pass them, and if you somehow do, the cordon area kills you (idea from goon but the code and sprites are mine)
adds a z level injector mapping trait, injects a z level trait into the z level its placed on, if you want to add something like ash storms or whatever to your map
adds an anti xray z level trait, you can optionally add this with the z level injector to protect your map against any xray or whatever
2021-10-10 20:20:22 +01:00
Krysonism
82e9d894fe mini_arachnid (#61860) 2021-10-09 04:32:27 -07:00
LemonInTheDark
861bf808bc Fixes a few hard deletes and runtimes I either caused, or ran into when trying to fix hard deletes (#61953)
Please don't try and send chat messages if you have nothing to say
Fixes a spurious runtime.
Fixes a runtime caused by my lack of understanding of huds. remove_hud_from is intended for hud watchers, remove_from_hud is intended for hud items. Doesn't really make sense most of the time, and just runtimes out the ass
Fixes a runtime in shapeshifting, restore should not run if the object is not restoring, or if it's deleting. it should run if it's not restoring, and it's not deleted. 4head
Fun fact, if there's two turret control boards they'll override each other. Use weakrefs. Oh also removes a var called cp, nothing good will come of that
Today in: Good lord the stacking machine is an afront to god, we discover that the labor claims console was attempting to act as a console, which of course fails when it comes time to clear it's improperly named var. Disgusting
Attempts to fix potential wound ref hangs in surgeries? maybe?
Fixes a runtime in luminescent stuff I created in my big harddel crusade. owner is a mob, not a species
Fixes a runtime related to headspikes deleting themselves twice. Pain
Fixes hard deletes sourced from the prophet trauma. Good fucking lord this is awful
Offhand item is somehow hard deleting. I have no idea how. Here's hoping signals fixes it, because if it doesn't I'm stumped. It's not a common scenario, but it does happen in spurts that suggest repeated usage
2021-10-09 09:44:21 +01:00