From 823c33fade0fde1853b6e91d8b923ffa349ea033 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 1 Jun 2024 00:55:30 +0000 Subject: [PATCH 01/73] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-2279.yml | 5 ---- html/changelogs/AutoChangeLog-pr-2543.yml | 7 ----- html/changelogs/AutoChangeLog-pr-2822.yml | 4 --- html/changelogs/AutoChangeLog-pr-2980.yml | 4 --- html/changelogs/AutoChangeLog-pr-3017.yml | 12 -------- html/changelogs/AutoChangeLog-pr-3027.yml | 7 ----- html/changelogs/AutoChangeLog-pr-3045.yml | 4 --- html/changelogs/AutoChangeLog-pr-3049.yml | 5 ---- html/changelogs/AutoChangeLog-pr-3051.yml | 5 ---- html/changelogs/archive/2024-06.yml | 34 +++++++++++++++++++++++ 10 files changed, 34 insertions(+), 53 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-2279.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2543.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2822.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-2980.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3017.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3027.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3045.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3049.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3051.yml create mode 100644 html/changelogs/archive/2024-06.yml diff --git a/html/changelogs/AutoChangeLog-pr-2279.yml b/html/changelogs/AutoChangeLog-pr-2279.yml deleted file mode 100644 index e42dc6fb7a8f..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2279.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Sun-Soaked -changes: - - {rscadd: World icon element.} - - {rscadd: World icons for combat knives.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-2543.yml b/html/changelogs/AutoChangeLog-pr-2543.yml deleted file mode 100644 index c53332a488f1..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2543.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: FalloutFalcon -changes: - - {rscadd: Added new more varied legion corpses} - - {rscdel: Removed lot of the crappy legion corpses} - - {balance: rebalanced most of the old legion corpses} - - {refactor: moved most legion corpse loot behavior to outfits} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-2822.yml b/html/changelogs/AutoChangeLog-pr-2822.yml deleted file mode 100644 index ffa9649d9669..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2822.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: thgvr -changes: - - {rscadd: Roundstart ships no longer spawn} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-2980.yml b/html/changelogs/AutoChangeLog-pr-2980.yml deleted file mode 100644 index d2769b09faf3..000000000000 --- a/html/changelogs/AutoChangeLog-pr-2980.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: SomeguyManperson -changes: - - {bugfix: fueled thruster throttling now works right} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3017.yml b/html/changelogs/AutoChangeLog-pr-3017.yml deleted file mode 100644 index 13e3aae87260..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3017.yml +++ /dev/null @@ -1,12 +0,0 @@ -author: Skies-Of-Blue -changes: - - {bugfix: 'rds based delusions now pass without the player having to relog, thank - god'} - - {bugfix: rds can once again be treated with mindbreaker toxin (hopefully)} - - {tweak: the pool of possible delusions has been changed to better reflect shiptest's - narrative} - - {rscadd: a base ramzi sprite to simple_human.dmi to be used in the changed delusion - pool} - - {rscdel: 'chat warning message for rds users not to grief. Just be cool about - it, okay?'} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3027.yml b/html/changelogs/AutoChangeLog-pr-3027.yml deleted file mode 100644 index 2360e7f949a8..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3027.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: Gristlebee -changes: - - {rscadd: Suit Storage Unit construction} - - {rscadd: Added suit storage unit circuit boards to industrial engineering tech} - - {tweak: Suit storage unit examines} - - {tweak: span class to span macros in suit_storage.dm} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3045.yml b/html/changelogs/AutoChangeLog-pr-3045.yml deleted file mode 100644 index 7557baf6ddf7..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3045.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: FalloutFalcon -changes: - - {tweak: tweaked the new ore} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3049.yml b/html/changelogs/AutoChangeLog-pr-3049.yml deleted file mode 100644 index b2f3179c7ceb..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3049.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: INFRARED_BARON -changes: - - {imageadd: 'All mechs have been successfully resprited, including the Mauler, - Marauder and Seraph now!'} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3051.yml b/html/changelogs/AutoChangeLog-pr-3051.yml deleted file mode 100644 index a9c25f392971..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3051.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Skies-Of-Blue -changes: - - {tweak: 'mugs referencing an ancient terran empire have been confiscated by the - confederation. Please enjoy your complementary, generic mug in compensation'} -delete-after: true diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml new file mode 100644 index 000000000000..a8e765ddba01 --- /dev/null +++ b/html/changelogs/archive/2024-06.yml @@ -0,0 +1,34 @@ +2024-06-01: + FalloutFalcon: + - rscadd: Added new more varied legion corpses + - rscdel: Removed lot of the crappy legion corpses + - balance: rebalanced most of the old legion corpses + - refactor: moved most legion corpse loot behavior to outfits + - tweak: tweaked the new ore + Gristlebee: + - rscadd: Suit Storage Unit construction + - rscadd: Added suit storage unit circuit boards to industrial engineering tech + - tweak: Suit storage unit examines + - tweak: span class to span macros in suit_storage.dm + INFRARED_BARON: + - imageadd: All mechs have been successfully resprited, including the Mauler, Marauder + and Seraph now! + Skies-Of-Blue: + - tweak: mugs referencing an ancient terran empire have been confiscated by the + confederation. Please enjoy your complementary, generic mug in compensation + - bugfix: rds based delusions now pass without the player having to relog, thank + god + - bugfix: rds can once again be treated with mindbreaker toxin (hopefully) + - tweak: the pool of possible delusions has been changed to better reflect shiptest's + narrative + - rscadd: a base ramzi sprite to simple_human.dmi to be used in the changed delusion + pool + - rscdel: chat warning message for rds users not to grief. Just be cool about it, + okay? + SomeguyManperson: + - bugfix: fueled thruster throttling now works right + Sun-Soaked: + - rscadd: World icon element. + - rscadd: World icons for combat knives. + thgvr: + - rscadd: Roundstart ships no longer spawn From 4d3f4b7add44bda7a086022a463e32cbe9ec7abb Mon Sep 17 00:00:00 2001 From: Theos Date: Sat, 1 Jun 2024 11:56:15 -0400 Subject: [PATCH 02/73] Secret documents black market item properly randomizes its documents (#3041) ## About The Pull Request Wrong subtype ## Why It's Good For The Game There is only one person who would notice this and its. Me ## Changelog :cl: fix: black market secret documents are no longer default documents /:cl: --- code/modules/cargo/blackmarket/blackmarket_items/misc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/cargo/blackmarket/blackmarket_items/misc.dm b/code/modules/cargo/blackmarket/blackmarket_items/misc.dm index eb3de3c4040d..a5e2c67175af 100644 --- a/code/modules/cargo/blackmarket/blackmarket_items/misc.dm +++ b/code/modules/cargo/blackmarket/blackmarket_items/misc.dm @@ -91,7 +91,7 @@ stock = 1 availability_prob = 40 -/datum/blackmarket_item/consumable/secret_docs/spawn_item(loc) +/datum/blackmarket_item/misc/secret_docs/spawn_item(loc) var/docs = pick(list(/obj/item/documents/nanotrasen, /obj/item/documents/solgov, /obj/item/documents/terragov, From 30f6d485b9cd720de6c21c057420ceed02f8f522 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 1 Jun 2024 11:17:35 -0500 Subject: [PATCH 03/73] Automatic changelog generation for PR #3041 [ci skip] --- html/changelogs/AutoChangeLog-pr-3041.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3041.yml diff --git a/html/changelogs/AutoChangeLog-pr-3041.yml b/html/changelogs/AutoChangeLog-pr-3041.yml new file mode 100644 index 000000000000..73dfff3beea4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3041.yml @@ -0,0 +1,4 @@ +author: SomeguyManperson +changes: + - {bugfix: black market secret documents are no longer default documents} +delete-after: true From 00cb67cc43e9084d60997c1e7655af8d175d648d Mon Sep 17 00:00:00 2001 From: Theos Date: Sat, 1 Jun 2024 11:56:38 -0400 Subject: [PATCH 04/73] Swaps armor values on survivor and explorer armor so survivor armor isn't better (#3043) ## About The Pull Request Survivor armor now gets the current explorer armor base armor values (10/0/0/10) Explorer armor now gets slightly reduced survivor armor base values (15/10/10/10) Both keep their old non-physical armor values since the survivor suit's are already worse (rarely matters outside explosion resistance) ## Why It's Good For The Game Explorer suits are significantly rarer than survivor suits on account of not coming from hermits (guaranteed drop) Also why is the scrapheap challenge armor just straight better ??? ## Changelog :cl: balance: the shoddy survivor suits found on hermits are now actually worse than the EXOCOM explorer suits /:cl: --------- Signed-off-by: Theos --- code/modules/mining/equipment/explorer_gear.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index 6955bd23d66b..46c20dd02e1b 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -10,7 +10,7 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT heat_protection = CHEST|GROIN|LEGS|ARMS hoodtype = /obj/item/clothing/head/hooded/explorer - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) + armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe) resistance_flags = FIRE_PROOF supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION @@ -23,7 +23,7 @@ flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT - armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) + armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 50, "bio" = 100, "rad" = 50, "fire" = 50, "acid" = 50) resistance_flags = FIRE_PROOF /obj/item/clothing/suit/hooded/explorer/Initialize() @@ -166,7 +166,7 @@ max_heat_protection_temperature = (FIRE_SUIT_MAX_TEMP_PROTECT / 2) heat_protection = CHEST|GROIN|LEGS|ARMS hoodtype = /obj/item/clothing/head/hooded/survivor_hood - armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 15, "bomb" = 20, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 30) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 10, "bomb" = 20, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 30) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe) resistance_flags = FIRE_PROOF supports_variations = DIGITIGRADE_VARIATION | VOX_VARIATION @@ -180,7 +180,7 @@ flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT - armor = list("melee" = 15, "bullet" = 10, "laser" = 10, "energy" = 15, "bomb" = 20, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 30) + armor = list("melee" = 10, "bullet" = 0, "laser" = 0, "energy" = 10, "bomb" = 20, "bio" = 100, "rad" = 20, "fire" = 50, "acid" = 30) resistance_flags = FIRE_PROOF /obj/item/clothing/suit/hooded/survivor/Initialize() From 20163bd844ccb7dbbcec5ef6d19c3064d5159dd5 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 1 Jun 2024 11:31:02 -0500 Subject: [PATCH 05/73] Automatic changelog generation for PR #3043 [ci skip] --- html/changelogs/AutoChangeLog-pr-3043.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3043.yml diff --git a/html/changelogs/AutoChangeLog-pr-3043.yml b/html/changelogs/AutoChangeLog-pr-3043.yml new file mode 100644 index 000000000000..824ea1ecca13 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3043.yml @@ -0,0 +1,5 @@ +author: SomeguyManperson +changes: + - {balance: the shoddy survivor suits found on hermits are now actually worse than + the EXOCOM explorer suits} +delete-after: true From d24f6a255bc4846147c6253d2d75cd4262f8d07a Mon Sep 17 00:00:00 2001 From: Skies-Of-Blue <86762641+Skies-Of-Blue@users.noreply.github.com> Date: Sat, 1 Jun 2024 08:57:25 -0700 Subject: [PATCH 06/73] Round Join Soul Removal (#3050) ## About The Pull Request Removes the "Welcome to TG Station" audio clip from the game. Forgot to do this when doing my first pass in https://github.com/shiptest-ss13/Shiptest/pull/2837. ## Why It's Good For The Game We aren't /tg/, and from time to time it's healthy to remove soul from the game. ## Changelog :cl: del: removes the roundjoin "welcome to /tg/ station" audio clip /:cl: --- code/modules/mob/dead/new_player/new_player.dm | 1 - sound/voice/ApproachingTG.ogg | Bin 39666 -> 0 bytes 2 files changed, 1 deletion(-) delete mode 100644 sound/voice/ApproachingTG.ogg diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 5ccba743bb1b..25722dd28e5f 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -319,7 +319,6 @@ spawn_point.join_player_here(character) var/atom/movable/screen/splash/Spl = new(character.client, TRUE) Spl.Fade(TRUE) - character.playsound_local(get_turf(character), 'sound/voice/ApproachingTG.ogg', 25) character.update_parallax_teleport() diff --git a/sound/voice/ApproachingTG.ogg b/sound/voice/ApproachingTG.ogg deleted file mode 100644 index 3f8bc1c488010c5df005ee176dd78f34a647c219..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39666 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 D$>-P{ From e0c2e9422c020cada25cefb130e5f9342df2bbbf Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 1 Jun 2024 11:43:35 -0500 Subject: [PATCH 07/73] Automatic changelog generation for PR #3050 [ci skip] --- html/changelogs/AutoChangeLog-pr-3050.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3050.yml diff --git a/html/changelogs/AutoChangeLog-pr-3050.yml b/html/changelogs/AutoChangeLog-pr-3050.yml new file mode 100644 index 000000000000..df47b14b3b97 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3050.yml @@ -0,0 +1,4 @@ +author: Skies-Of-Blue +changes: + - {rscdel: removes the roundjoin "welcome to /tg/ station" audio clip} +delete-after: true From 2edd720f05cc6a0e44bd984120e3770733e6d4ad Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 00:55:38 +0000 Subject: [PATCH 08/73] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-3041.yml | 4 ---- html/changelogs/AutoChangeLog-pr-3043.yml | 5 ----- html/changelogs/AutoChangeLog-pr-3050.yml | 4 ---- html/changelogs/archive/2024-06.yml | 7 +++++++ 4 files changed, 7 insertions(+), 13 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-3041.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3043.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-3050.yml diff --git a/html/changelogs/AutoChangeLog-pr-3041.yml b/html/changelogs/AutoChangeLog-pr-3041.yml deleted file mode 100644 index 73dfff3beea4..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3041.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: SomeguyManperson -changes: - - {bugfix: black market secret documents are no longer default documents} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3043.yml b/html/changelogs/AutoChangeLog-pr-3043.yml deleted file mode 100644 index 824ea1ecca13..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3043.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: SomeguyManperson -changes: - - {balance: the shoddy survivor suits found on hermits are now actually worse than - the EXOCOM explorer suits} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-3050.yml b/html/changelogs/AutoChangeLog-pr-3050.yml deleted file mode 100644 index df47b14b3b97..000000000000 --- a/html/changelogs/AutoChangeLog-pr-3050.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: Skies-Of-Blue -changes: - - {rscdel: removes the roundjoin "welcome to /tg/ station" audio clip} -delete-after: true diff --git a/html/changelogs/archive/2024-06.yml b/html/changelogs/archive/2024-06.yml index a8e765ddba01..04885ae26286 100644 --- a/html/changelogs/archive/2024-06.yml +++ b/html/changelogs/archive/2024-06.yml @@ -32,3 +32,10 @@ - rscadd: World icons for combat knives. thgvr: - rscadd: Roundstart ships no longer spawn +2024-06-02: + Skies-Of-Blue: + - rscdel: removes the roundjoin "welcome to /tg/ station" audio clip + SomeguyManperson: + - bugfix: black market secret documents are no longer default documents + - balance: the shoddy survivor suits found on hermits are now actually worse than + the EXOCOM explorer suits From 4bbd8fbb06f9b80d8346ffc78740ada8610c4cfd Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 1 Jun 2024 22:30:22 -0500 Subject: [PATCH 09/73] Hostile humans (#2972) ## About The Pull Request Repaths hostile humans to a generic type so we don't have to redefine that same thing 100 times Also I am probably going to add some stuff to make them all affected by something similar? None of them act human. ## Why It's Good For The Game ## Changelog :cl: refactor: refactored hostile humans /:cl: --- .../BeachRuins/beach_fishing_hut.dmm | 14 +- .../BeachRuins/beach_pirate_crash.dmm | 6 +- .../BeachRuins/beach_treasure_cove.dmm | 8 +- .../icemoon_surface_corporate_rejects.dmm | 26 +-- .../icemoon_underground_abandoned_newcops.dmm | 2 +- .../icemoon_underground_abandoned_village.dmm | 2 +- .../icemoon_underground_brazillianlab.dmm | 32 ++-- .../JungleRuins/jungle_cavecrew.dmm | 22 +-- .../JungleRuins/jungle_medtech_outbreak.dmm | 26 +-- .../RandomRuins/JungleRuins/jungle_pirate.dmm | 12 +- .../JungleRuins/jungle_syndicate.dmm | 10 +- .../lavaland_surface_ashwalker_shrine.dmm | 6 +- .../lavaland_surface_comm_outpost.dmm | 2 +- .../RockRuins/rockplanet_budgetcuts.dmm | 22 +-- .../RockRuins/rockplanet_dangerpod.dmm | 2 +- .../RockRuins/rockplanet_miningexpedition.dmm | 2 +- .../whitesands_surface_camp_combination.dmm | 30 +-- .../whitesands_surface_camp_drugstore.dmm | 2 +- .../whitesands_surface_camp_saloon.dmm | 32 ++-- .../whitesands_surface_chokepoint.dmm | 8 +- .../whitesands_surface_onlyaspoonful.dmm | 8 +- .../whitesands_surface_pubbyslopcrash.dmm | 16 +- .../whitesands_surface_starfurycrash.dmm | 20 +- _maps/RandomRuins/SpaceRuins/ntfacility.dmm | 30 +-- .../RandomRuins/SpaceRuins/provinggrounds.dmm | 42 ++--- .../SpaceRuins/singularity_lab.dmm | 38 ++-- .../wasteplanet_abandoned_mechbay.dmm | 28 +-- .../wasteplanet_fortress_of_solitide.dmm | 4 +- .../WasteRuins/wasteplanet_pandora.dmm | 6 +- code/controllers/subsystem/traumas.dm | 2 +- code/datums/mapgen/planetary/SandGenerator.dm | 6 +- code/game/machinery/computer/arcade.dm | 4 +- code/game/mecha/mecha.dm | 4 +- .../structures/icemoon/cave_entrance.dm | 116 ++++++------ code/game/objects/structures/spawner.dm | 4 +- code/modules/awaymissions/corpse.dm | 4 +- .../awaymissions/mission_code/spacebattle.dm | 4 +- code/modules/clothing/suits/wiz_robe.dm | 33 ---- .../hostile/bosses/paperwizard.dm | 171 ------------------ .../simple_animal/hostile/dark_wizard.dm | 41 ----- .../living/simple_animal/hostile/hostile.dm | 2 +- .../hostile/{ => human}/cat_butcher.dm | 24 +-- .../hostile/{ => human}/frontiersman.dm | 50 ++--- .../simple_animal/hostile/human/human.dm | 41 +++++ .../simple_animal/hostile/human/nanotrasen.dm | 80 ++++++++ .../hostile/{ => human}/pirate.dm | 38 +--- .../hostile/{ => human}/skeleton.dm | 19 +- .../hostile/{ => human}/survivors.dm | 42 +---- .../hostile/{ => human}/syndicate.dm | 94 ++++------ .../hostile/{ => human}/zombie.dm | 13 +- .../simple_animal/hostile/mecha_pilot.dm | 42 ++--- .../simple_animal/hostile/nanotrasen.dm | 59 ------ .../living/simple_animal/hostile/stickman.dm | 61 ------- .../living/simple_animal/hostile/wizard.dm | 82 --------- code/modules/projectiles/projectile/magic.dm | 2 - code/modules/ruins/lavaland_ruin_code.dm | 2 +- .../ruins/spaceruin_code/forgottenship.dm | 42 ----- icons/mob/simple_human.dmi | Bin 116825 -> 113180 bytes shiptest.dme | 21 +-- .../Scripts/2972_human_hostile.txt | 7 + 60 files changed, 547 insertions(+), 1021 deletions(-) delete mode 100644 code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm delete mode 100644 code/modules/mob/living/simple_animal/hostile/dark_wizard.dm rename code/modules/mob/living/simple_animal/hostile/{ => human}/cat_butcher.dm (88%) rename code/modules/mob/living/simple_animal/hostile/{ => human}/frontiersman.dm (70%) create mode 100644 code/modules/mob/living/simple_animal/hostile/human/human.dm create mode 100644 code/modules/mob/living/simple_animal/hostile/human/nanotrasen.dm rename code/modules/mob/living/simple_animal/hostile/{ => human}/pirate.dm (67%) rename code/modules/mob/living/simple_animal/hostile/{ => human}/skeleton.dm (87%) rename code/modules/mob/living/simple_animal/hostile/{ => human}/survivors.dm (88%) rename code/modules/mob/living/simple_animal/hostile/{ => human}/syndicate.dm (73%) rename code/modules/mob/living/simple_animal/hostile/{ => human}/zombie.dm (83%) delete mode 100644 code/modules/mob/living/simple_animal/hostile/nanotrasen.dm delete mode 100644 code/modules/mob/living/simple_animal/hostile/stickman.dm delete mode 100644 code/modules/mob/living/simple_animal/hostile/wizard.dm create mode 100644 tools/UpdatePaths/Scripts/2972_human_hostile.txt diff --git a/_maps/RandomRuins/BeachRuins/beach_fishing_hut.dmm b/_maps/RandomRuins/BeachRuins/beach_fishing_hut.dmm index 4aaff2b5a160..84fabfbe5ff7 100644 --- a/_maps/RandomRuins/BeachRuins/beach_fishing_hut.dmm +++ b/_maps/RandomRuins/BeachRuins/beach_fishing_hut.dmm @@ -667,7 +667,7 @@ /area/overmap_encounter/planetoid/beachplanet/explored) "Bg" = ( /obj/effect/turf_decal/corner/opaque/pink/diagonal, -/mob/living/simple_animal/hostile/pirate/melee{ +/mob/living/simple_animal/hostile/human/pirate/melee{ faction = list("beach","pirate") }, /turf/open/floor/plastic, @@ -827,7 +827,7 @@ /area/ruin/beach) "Gt" = ( /obj/effect/turf_decal/corner/opaque/lightgrey/diagonal, -/mob/living/simple_animal/hostile/cat_butcherer{ +/mob/living/simple_animal/hostile/human/cat_butcherer{ atmos_requirements = list("min_oxy"=0,"max_oxy"=0,"min_tox"=0,"max_tox"=0,"min_co2"=0,"max_co2"=0,"min_n2"=0,"max_n2"=0); desc = "A profession carp butcher, gone mad due to carptoxin exposure. There seems to be something in their pocket..."; faction = list("beach","pirate"); @@ -853,7 +853,7 @@ "GP" = ( /obj/structure/chair/sofa/brown/right/directional/south, /obj/effect/decal/cleanable/cobweb, -/mob/living/simple_animal/hostile/pirate/melee{ +/mob/living/simple_animal/hostile/human/pirate/melee{ faction = list("beach","pirate") }, /turf/open/floor/carpet, @@ -1045,7 +1045,7 @@ /obj/structure/chair/plastic{ dir = 8 }, -/mob/living/simple_animal/hostile/pirate/ranged{ +/mob/living/simple_animal/hostile/human/pirate/ranged{ faction = list("beach","pirate") }, /turf/open/floor/wood/ebony, @@ -1135,7 +1135,7 @@ /area/ruin/beach) "Rh" = ( /obj/structure/chair/sofa/brown/corner/directional/south, -/mob/living/simple_animal/hostile/pirate/melee{ +/mob/living/simple_animal/hostile/human/pirate/melee{ faction = list("beach","pirate") }, /turf/open/floor/carpet, @@ -1250,7 +1250,7 @@ pixel_x = 4; layer = 2.9 }, -/mob/living/simple_animal/hostile/pirate/ranged{ +/mob/living/simple_animal/hostile/human/pirate/ranged{ faction = list("beach","pirate") }, /turf/open/floor/wood/ebony, @@ -1333,7 +1333,7 @@ /turf/open/water/beach, /area/overmap_encounter/planetoid/beachplanet/explored) "ZJ" = ( -/mob/living/simple_animal/hostile/pirate/melee{ +/mob/living/simple_animal/hostile/human/pirate/melee{ faction = list("beach","pirate") }, /turf/open/floor/wood, diff --git a/_maps/RandomRuins/BeachRuins/beach_pirate_crash.dmm b/_maps/RandomRuins/BeachRuins/beach_pirate_crash.dmm index 3cdd90e5e1cb..e47ffa92a5e9 100644 --- a/_maps/RandomRuins/BeachRuins/beach_pirate_crash.dmm +++ b/_maps/RandomRuins/BeachRuins/beach_pirate_crash.dmm @@ -385,7 +385,7 @@ }, /area/overmap_encounter/planetoid/beachplanet/explored) "jE" = ( -/mob/living/simple_animal/hostile/pirate/ranged{ +/mob/living/simple_animal/hostile/human/pirate/ranged{ environment_smash = 0; faction = list("pirate","mining") }, @@ -522,7 +522,7 @@ /obj/structure/cable{ icon_state = "1-4" }, -/mob/living/simple_animal/hostile/pirate/melee{ +/mob/living/simple_animal/hostile/human/pirate/melee{ environment_smash = 0; faction = list("pirate","mining") }, @@ -1508,7 +1508,7 @@ /turf/open/floor/plating/asteroid/sand/lit, /area/overmap_encounter/planetoid/cave/explored) "Vc" = ( -/mob/living/simple_animal/hostile/pirate/melee{ +/mob/living/simple_animal/hostile/human/pirate/melee{ environment_smash = 0; faction = list("pirate","mining") }, diff --git a/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm b/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm index 7943cf93372e..e97a926aec6b 100644 --- a/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm +++ b/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm @@ -417,7 +417,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/pirate/ranged/space, +/mob/living/simple_animal/hostile/human/pirate/ranged/space, /turf/open/floor/wood, /area/ruin/beach/treasure_cove) "oR" = ( @@ -970,12 +970,12 @@ dir = 8 }, /obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/pirate/melee, +/mob/living/simple_animal/hostile/human/pirate/melee, /turf/open/floor/plating/dirt/jungle/lit, /area/ruin/beach/treasure_cove) "EU" = ( /obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/pirate/melee, +/mob/living/simple_animal/hostile/human/pirate/melee, /turf/open/floor/plating/dirt/jungle/lit, /area/ruin/beach/treasure_cove) "Gm" = ( @@ -1301,7 +1301,7 @@ /obj/structure/chair/wood{ dir = 8 }, -/mob/living/simple_animal/hostile/pirate/ranged, +/mob/living/simple_animal/hostile/human/pirate/ranged, /turf/open/floor/carpet/red, /area/ruin/beach/treasure_cove) "SX" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm b/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm index add7c0f50743..c48664ffdcf3 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_surface_corporate_rejects.dmm @@ -518,7 +518,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 9 }, -/mob/living/simple_animal/hostile/nanotrasen/ranged/assault{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/assault{ desc = "No longer a member of Nanotrasen's more militaristic forces. Seems grumpy."; faction = list("DeserterNT"); name = "Benny Bleighch" @@ -566,7 +566,7 @@ /turf/open/floor/vault, /area/ruin/unpowered/corprejectrooms) "or" = ( -/mob/living/simple_animal/hostile/nanotrasen/elite{ +/mob/living/simple_animal/hostile/human/nanotrasen/elite{ desc = "A former major player for Nanotrasen militaristic needs. He doesn't seem like someone who'd want to talk over tea."; faction = list("DeserterNT"); name = "Sam the Sharp" @@ -780,7 +780,7 @@ /area/ruin/unpowered/corprejectrooms) "tb" = ( /obj/effect/turf_decal/corner/opaque/white/diagonal, -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/smg{ desc = "An officer no longer part of Nanotrasen's private security force, he seems rather unpleased to meet you."; faction = list("DeserterNT"); name = "Rebecca Slouch" @@ -1064,7 +1064,7 @@ /obj/structure/cable/blue{ icon_state = "4-9" }, -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/smg{ desc = "An officer no longer part of Nanotrasen's private security force, he seems rather unpleased to meet you."; faction = list("DeserterNT"); name = "Gloria the Glorious" @@ -1106,7 +1106,7 @@ /obj/structure/chair{ dir = 8 }, -/mob/living/simple_animal/hostile/nanotrasen/screaming{ +/mob/living/simple_animal/hostile/human/nanotrasen/screaming{ desc = "An officer no longer part of Nanotrasen's private security force, he seems rather unpleased to meet you."; faction = list("DeserterNT"); name = "Jimmy Firecracker" @@ -1879,7 +1879,7 @@ /obj/structure/cable/blue{ icon_state = "4-9" }, -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/smg{ desc = "An officer no longer part of Nanotrasen's private security force, he seems rather unpleased to meet you."; faction = list("DeserterNT"); name = "Todd Clorox" @@ -1902,7 +1902,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 4 }, -/mob/living/simple_animal/hostile/nanotrasen/elite{ +/mob/living/simple_animal/hostile/human/nanotrasen/elite{ desc = "A former major player for Nanotrasen militaristic needs. He doesn't seem like someone who'd want to talk over tea."; faction = list("DeserterNT"); name = "Max the Maniac" @@ -1927,7 +1927,7 @@ /area/ruin/unpowered/corprejectrooms) "Rp" = ( /obj/effect/turf_decal/corner/opaque/white/diagonal, -/mob/living/simple_animal/hostile/nanotrasen/ranged/assault{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/assault{ desc = "No longer a member of Nanotrasen's more militaristic forces. Seems grumpy."; faction = list("DeserterNT"); name = "Gordon Lary" @@ -2003,7 +2003,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2{ dir = 4 }, -/mob/living/simple_animal/hostile/nanotrasen/ranged/assault{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/assault{ desc = "No longer a member of Nanotrasen's more militaristic forces. Seems grumpy."; faction = list("DeserterNT"); name = "Gary Larson" @@ -2086,7 +2086,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ dir = 4 }, -/mob/living/simple_animal/hostile/nanotrasen/ranged/assault{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/assault{ desc = "No longer a member of Nanotrasen's more militaristic forces. Seems grumpy."; faction = list("DeserterNT"); name = "Nancy Drew" @@ -2094,7 +2094,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/ruin/unpowered/corprejectrooms) "Us" = ( -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/smg{ desc = "An officer no longer part of Nanotrasen's private security force, he seems rather unpleased to meet you."; faction = list("DeserterNT"); name = "Larry Liessahl" @@ -2231,7 +2231,7 @@ /obj/structure/cable/blue{ icon_state = "0-4" }, -/mob/living/simple_animal/hostile/nanotrasen/screaming{ +/mob/living/simple_animal/hostile/human/nanotrasen/screaming{ desc = "An officer no longer part of Nanotrasen's private security force, he seems rather unpleased to meet you."; faction = list("DeserterNT"); name = "Wendy Wallaby" @@ -2286,7 +2286,7 @@ /obj/structure/cable/blue{ icon_state = "4-5" }, -/mob/living/simple_animal/hostile/nanotrasen/screaming{ +/mob/living/simple_animal/hostile/human/nanotrasen/screaming{ desc = "An officer no longer part of Nanotrasen's private security force, he seems rather unpleased to meet you."; faction = list("DeserterNT"); name = "Wetzel the Pretzel" diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_newcops.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_newcops.dmm index bf034757b5a2..149f4a579542 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_newcops.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_newcops.dmm @@ -1028,7 +1028,7 @@ /area/ruin/powered) "Wp" = ( /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space, +/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun/space, /turf/open/floor/plasteel/freezer, /area/ruin/powered) "Ws" = ( diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm index 0e44f641ab4e..aee0cc51330b 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm @@ -483,7 +483,7 @@ /area/ruin/powered) "PQ" = ( /obj/effect/decal/cleanable/blood/splatter, -/mob/living/simple_animal/hostile/frontier/ranged/trooper, +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/ruin/powered) diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_brazillianlab.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_brazillianlab.dmm index 7fde87854827..4954a9a5aaf4 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_brazillianlab.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_brazillianlab.dmm @@ -55,7 +55,7 @@ /turf/open/floor/plating/asteroid/snow/icemoon, /area/overmap_encounter/planetoid/cave/explored) "ct" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter{ +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter{ faction = list("brazillian") }, /turf/open/floor/wood{ @@ -88,7 +88,7 @@ /area/ruin/unpowered) "fB" = ( /obj/structure/chair/stool/bar, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ desc = " A wild-eyed figure, wearing tattered mining equipment and boasting a malformed body."; faction = list("brazillian") }, @@ -101,7 +101,7 @@ /turf/open/floor/plating/asteroid/snow/icemoon, /area/ruin/unpowered) "gH" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/gunslinger{ +/mob/living/simple_animal/hostile/human/hermit/ranged/gunslinger{ faction = list("brazillian") }, /turf/open/floor/carpet/green{ @@ -117,7 +117,7 @@ "hp" = ( /obj/item/stack/cable_coil, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter{ +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter{ faction = list("brazillian") }, /turf/open/floor/wood{ @@ -128,7 +128,7 @@ /turf/closed/wall/mineral/wood/nonmetal, /area/overmap_encounter/planetoid/cave/explored) "ht" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter{ +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter{ faction = list("brazillian") }, /turf/open/floor/plating/asteroid/snow/icemoon, @@ -177,7 +177,7 @@ /obj/structure/chair/wood{ dir = 1 }, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ desc = " A wild-eyed figure, wearing tattered mining equipment and boasting a malformed body."; faction = list("brazillian") }, @@ -341,7 +341,7 @@ /turf/open/floor/plating/asteroid/snow/icemoon, /area/overmap_encounter/planetoid/cave/explored) "qS" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ desc = "The greatest chef this side of the wastes."; faction = list("brazillian"); health = 150; @@ -475,7 +475,7 @@ /obj/structure/bed, /obj/structure/curtain, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ desc = " A wild-eyed figure, wearing tattered mining equipment and boasting a malformed body."; faction = list("brazillian") }, @@ -535,7 +535,7 @@ /turf/open/floor/plating/asteroid/snow/icemoon, /area/overmap_encounter/planetoid/cave/explored) "zy" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ desc = " A wild-eyed figure, wearing tattered mining equipment and boasting a malformed body."; faction = list("brazillian") }, @@ -545,7 +545,7 @@ /obj/structure/chair/wood{ dir = 8 }, -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter{ +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter{ faction = list("brazillian") }, /turf/open/floor/wood{ @@ -635,7 +635,7 @@ /area/ruin/unpowered) "CI" = ( /obj/structure/flora/junglebush/c, -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter{ +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter{ faction = list("brazillian") }, /turf/open/floor/plating/grass/jungle{ @@ -775,7 +775,7 @@ "JM" = ( /obj/structure/bed, /obj/structure/curtain, -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter{ +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter{ faction = list("brazillian") }, /obj/effect/turf_decal/corner/opaque/green/border, @@ -827,7 +827,7 @@ /obj/structure/chair/stool/bar{ dir = 4 }, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ desc = " A wild-eyed figure, wearing tattered mining equipment and boasting a malformed body."; faction = list("brazillian") }, @@ -895,7 +895,7 @@ }, /area/ruin/unpowered) "NR" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ desc = " A wild-eyed figure, wearing tattered mining equipment and boasting a malformed body."; faction = list("brazillian") }, @@ -1070,7 +1070,7 @@ }, /area/ruin/unpowered) "Ux" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter{ +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter{ faction = list("brazillian") }, /turf/open/floor/plating/grass/jungle{ @@ -1205,7 +1205,7 @@ }, /area/ruin/unpowered) "Yy" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ desc = " A wild-eyed figure, wearing tattered mining equipment and boasting a malformed body."; faction = list("brazillian") }, diff --git a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm index bb99ab04efb3..2f671753e72c 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm @@ -658,7 +658,7 @@ dir = 4; name = "tactical swivel chair" }, -/mob/living/simple_animal/hostile/frontier/ranged/officer/neutured, +/mob/living/simple_animal/hostile/human/frontier/ranged/officer/neutured, /turf/open/floor/plasteel/dark, /area/ruin/jungle/cavecrew/bridge) "iE" = ( @@ -1342,7 +1342,7 @@ /obj/structure/cable{ icon_state = "1-8" }, -/mob/living/simple_animal/hostile/frontier/ranged/trooper/heavy/neutered, +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy/neutered, /turf/open/floor/plasteel/patterned/brushed, /area/ruin/jungle/cavecrew/security) "pB" = ( @@ -1432,7 +1432,7 @@ /area/ruin/jungle/cavecrew/hallway) "rN" = ( /obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/frontier/ranged/trooper/neutered, +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/neutered, /turf/open/floor/plating/dirt/old, /area/ruin/powered) "rQ" = ( @@ -1832,7 +1832,7 @@ /obj/structure/railing/corner{ dir = 8 }, -/mob/living/simple_animal/hostile/frontier/ranged/trooper/skm/neutured, +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/skm/neutured, /turf/open/floor/plasteel/stairs{ dir = 1 }, @@ -2354,7 +2354,7 @@ /obj/effect/turf_decal/spline/fancy/opaque/black{ dir = 8 }, -/mob/living/simple_animal/hostile/frontier/ranged/neutered, +/mob/living/simple_animal/hostile/human/frontier/ranged/neutered, /turf/open/floor/plasteel, /area/ruin/jungle/cavecrew/hallway) "CN" = ( @@ -2365,7 +2365,7 @@ dir = 9 }, /obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/frontier, +/mob/living/simple_animal/hostile/human/frontier, /obj/structure/cable{ icon_state = "4-8" }, @@ -2570,7 +2570,7 @@ /turf/open/floor/plating/dirt/jungle, /area/overmap_encounter/planetoid/cave/explored) "Fw" = ( -/mob/living/simple_animal/hostile/frontier/ranged/mosin/neutered, +/mob/living/simple_animal/hostile/human/frontier/ranged/mosin/neutered, /turf/open/floor/plating/dirt/jungle, /area/ruin/powered) "Fy" = ( @@ -2797,7 +2797,7 @@ dir = 4; layer = 3.1 }, -/mob/living/simple_animal/hostile/frontier/ranged/neutered, +/mob/living/simple_animal/hostile/human/frontier/ranged/neutered, /turf/open/water/jungle, /area/ruin/jungle/cavecrew/cargo) "II" = ( @@ -3208,7 +3208,7 @@ /obj/structure/cable{ icon_state = "2-5" }, -/mob/living/simple_animal/hostile/frontier/ranged/trooper/rifle/neutered, +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/neutered, /turf/open/floor/plasteel, /area/ruin/jungle/cavecrew/hallway) "MW" = ( @@ -3391,7 +3391,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/mob/living/simple_animal/hostile/frontier/ranged/neutered, +/mob/living/simple_animal/hostile/human/frontier/ranged/neutered, /turf/open/floor/plating, /area/ruin/powered) "Pg" = ( @@ -4092,7 +4092,7 @@ /turf/open/floor/plating/dirt/jungle, /area/ruin/powered) "Xx" = ( -/mob/living/simple_animal/hostile/frontier/ranged/mosin/neutered, +/mob/living/simple_animal/hostile/human/frontier/ranged/mosin/neutered, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/tech, /area/ship/storage) diff --git a/_maps/RandomRuins/JungleRuins/jungle_medtech_outbreak.dmm b/_maps/RandomRuins/JungleRuins/jungle_medtech_outbreak.dmm index 0f68c7b7ebd9..e8f075b9005d 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_medtech_outbreak.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_medtech_outbreak.dmm @@ -22,7 +22,7 @@ /obj/effect/turf_decal/industrial/warning{ dir = 6 }, -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /turf/open/floor/plasteel/white, /area/ship/science) "aM" = ( @@ -234,7 +234,7 @@ /area/ship/engineering/electrical) "fe" = ( /obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/zombie{ +/mob/living/simple_animal/hostile/human/zombie{ zombiejob = "Geneticist" }, /turf/open/floor/plasteel/tech/techmaint, @@ -511,7 +511,7 @@ dir = 1 }, /obj/effect/gibspawner/human, -/mob/living/simple_animal/hostile/zombie{ +/mob/living/simple_animal/hostile/human/zombie{ zombiejob = "Janitor" }, /turf/open/floor/plasteel/dark, @@ -542,7 +542,7 @@ "jL" = ( /obj/structure/chair/comfy/orange/directional/north, /obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/zombie{ +/mob/living/simple_animal/hostile/human/zombie{ name = "Zombiefied Facility Director"; zombiejob = "Research Director" }, @@ -1113,7 +1113,7 @@ /area/ship/medical) "rf" = ( /obj/effect/turf_decal/corner/opaque/orange/full, -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /turf/open/floor/plasteel/white, /area/ship/science/storage) "ro" = ( @@ -1281,14 +1281,14 @@ /turf/open/floor/plating, /area/ship/science/storage) "uT" = ( -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /turf/open/floor/plating, /area/ship/medical) "ve" = ( /obj/effect/turf_decal/industrial/warning{ dir = 10 }, -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /turf/open/floor/plasteel/white, /area/ship/science) "vf" = ( @@ -1308,7 +1308,7 @@ dir = 10 }, /obj/machinery/light/directional/south, -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /turf/open/floor/plasteel/white, /area/ship/medical) "vu" = ( @@ -1679,7 +1679,7 @@ pixel_x = -13; pixel_y = -6 }, -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /turf/open/floor/plasteel/tech, /area/ship/crew/office) "Bh" = ( @@ -1743,7 +1743,7 @@ /turf/open/floor/plasteel/white, /area/ship/science/storage) "Cg" = ( -/mob/living/simple_animal/hostile/zombie{ +/mob/living/simple_animal/hostile/human/zombie{ zombiejob = "Assistant" }, /obj/item/rack_parts, @@ -2208,7 +2208,7 @@ /turf/open/floor/plasteel/tech, /area/ship/science) "Jx" = ( -/mob/living/simple_animal/hostile/zombie{ +/mob/living/simple_animal/hostile/human/zombie{ zombiejob = "Chemist" }, /turf/open/floor/plasteel/white, @@ -2411,7 +2411,7 @@ pixel_x = 4; pixel_y = -13 }, -/mob/living/simple_animal/hostile/zombie{ +/mob/living/simple_animal/hostile/human/zombie{ zombiejob = "Assistant" }, /turf/open/floor/plasteel/dark, @@ -3069,7 +3069,7 @@ dir = 5 }, /obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/zombie{ +/mob/living/simple_animal/hostile/human/zombie{ zombiejob = "Assistant" }, /turf/open/floor/plasteel/white, diff --git a/_maps/RandomRuins/JungleRuins/jungle_pirate.dmm b/_maps/RandomRuins/JungleRuins/jungle_pirate.dmm index 83f17d9f7026..739244a8b282 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_pirate.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_pirate.dmm @@ -124,7 +124,7 @@ /obj/structure/railing{ dir = 4 }, -/mob/living/simple_animal/hostile/pirate/ranged, +/mob/living/simple_animal/hostile/human/pirate/ranged, /turf/open/floor/wood, /area/ruin/unpowered) "qL" = ( @@ -209,11 +209,11 @@ /turf/open/floor/wood, /area/ruin/unpowered) "DH" = ( -/mob/living/simple_animal/hostile/pirate/ranged/space, +/mob/living/simple_animal/hostile/human/pirate/ranged/space, /turf/open/floor/carpet/red, /area/ruin/unpowered) "DS" = ( -/mob/living/simple_animal/hostile/pirate/ranged, +/mob/living/simple_animal/hostile/human/pirate/ranged, /turf/open/floor/wood, /area/overmap_encounter/planetoid/jungle/explored) "DV" = ( @@ -270,7 +270,7 @@ /turf/open/floor/wood, /area/ruin/unpowered) "LT" = ( -/mob/living/simple_animal/hostile/pirate/melee, +/mob/living/simple_animal/hostile/human/pirate/melee, /obj/structure/chair/wood, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, @@ -355,7 +355,7 @@ /turf/open/floor/plating/dirt/jungle/lit, /area/overmap_encounter/planetoid/jungle/explored) "UX" = ( -/mob/living/simple_animal/hostile/pirate/melee, +/mob/living/simple_animal/hostile/human/pirate/melee, /turf/open/floor/wood, /area/ruin/unpowered) "Vf" = ( @@ -391,7 +391,7 @@ /turf/open/floor/carpet/red, /area/ruin/unpowered) "XA" = ( -/mob/living/simple_animal/hostile/pirate/melee, +/mob/living/simple_animal/hostile/human/pirate/melee, /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/ruin/unpowered) diff --git a/_maps/RandomRuins/JungleRuins/jungle_syndicate.dmm b/_maps/RandomRuins/JungleRuins/jungle_syndicate.dmm index ebd333289382..4ecf5ee382b1 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_syndicate.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_syndicate.dmm @@ -123,7 +123,7 @@ /turf/open/floor/plating/rust, /area/ruin/jungle/syndifort) "ef" = ( -/mob/living/simple_animal/hostile/syndicate{ +/mob/living/simple_animal/hostile/human/syndicate{ desc = "God dammit Jerry! Why the fuck are you barricading yourself in with all of our weapon supplies?"; name = "Jerry"; unsuitable_atmos_damage = 0 @@ -180,7 +180,7 @@ /turf/open/floor/plating/grass/jungle/lit, /area/overmap_encounter/planetoid/jungle/explored) "fS" = ( -/mob/living/simple_animal/hostile/syndicate{ +/mob/living/simple_animal/hostile/human/syndicate{ unsuitable_atmos_damage = 0 }, /obj/effect/decal/cleanable/dirt/dust, @@ -533,7 +533,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/ruin/jungle/syndifort) "rg" = ( -/mob/living/simple_animal/hostile/syndicate/space, +/mob/living/simple_animal/hostile/human/syndicate/space, /obj/structure/cable{ icon_state = "1-2" }, @@ -1102,7 +1102,7 @@ /area/overmap_encounter/planetoid/jungle/explored) "HR" = ( /obj/structure/chair/plastic, -/mob/living/simple_animal/hostile/syndicate/ranged{ +/mob/living/simple_animal/hostile/human/syndicate/ranged{ unsuitable_atmos_damage = 0 }, /turf/open/floor/plating/dirt/jungle/lit, @@ -1365,7 +1365,7 @@ /area/ruin/jungle/syndifort) "Qs" = ( /obj/structure/cable, -/mob/living/simple_animal/hostile/syndicate{ +/mob/living/simple_animal/hostile/human/syndicate{ unsuitable_atmos_damage = 0 }, /obj/machinery/light/directional/north, diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_ashwalker_shrine.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_ashwalker_shrine.dmm index 5001fd7a1831..b3d7e439a805 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_ashwalker_shrine.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_ashwalker_shrine.dmm @@ -394,7 +394,7 @@ /turf/open/floor/plating/ashplanet/ash, /area/overmap_encounter/planetoid/lava/explored) "pJ" = ( -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg, +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/smg, /turf/open/floor/wood, /area/overmap_encounter/planetoid/lava/explored) "pT" = ( @@ -645,7 +645,7 @@ /area/overmap_encounter/planetoid/lava/explored) "yJ" = ( /obj/structure/stone_tile/slab, -/mob/living/simple_animal/hostile/nanotrasen/ranged/assault, +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/assault, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/overmap_encounter/planetoid/lava/explored) "zG" = ( @@ -1064,7 +1064,7 @@ /area/overmap_encounter/planetoid/lava/explored) "Ty" = ( /obj/structure/stone_tile/slab/cracked, -/mob/living/simple_animal/hostile/nanotrasen/ranged, +/mob/living/simple_animal/hostile/human/nanotrasen/ranged, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/overmap_encounter/planetoid/lava/explored) "TX" = ( diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_comm_outpost.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_comm_outpost.dmm index 91b482df849f..44988210b7e4 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_comm_outpost.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_comm_outpost.dmm @@ -211,7 +211,7 @@ }, /area/ruin/unpowered/syndicate_outpost) "Ts" = ( -/mob/living/simple_animal/hostile/syndicate/ranged{ +/mob/living/simple_animal/hostile/human/syndicate/ranged{ dir = 8; health = 125; name = "Syndicate Radio Operative" diff --git a/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm b/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm index 5c3606aa6a94..b837eff979f7 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm @@ -35,7 +35,7 @@ /turf/open/floor/plastic, /area/ruin/rockplanet/nanotrasen) "aQ" = ( -/mob/living/simple_animal/hostile/nanotrasen, +/mob/living/simple_animal/hostile/human/nanotrasen, /obj/machinery/door/firedoor, /obj/effect/turf_decal/siding/white{ dir = 1 @@ -339,7 +339,7 @@ /turf/open/floor/engine, /area/ruin/rockplanet/nanotrasen) "ff" = ( -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg, +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/smg, /obj/effect/turf_decal/siding/white{ dir = 4 }, @@ -1347,7 +1347,7 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/oil, /obj/machinery/light/small/broken/directional/north, -/mob/living/simple_animal/hostile/pirate/ranged/space, +/mob/living/simple_animal/hostile/human/pirate/ranged/space, /turf/open/floor/plating, /area/ruin/rockplanet/nanotrasen) "vz" = ( @@ -1462,7 +1462,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 4 }, -/mob/living/simple_animal/hostile/nanotrasen, +/mob/living/simple_animal/hostile/human/nanotrasen, /turf/open/floor/wood{ icon_state = "wood-broken7" }, @@ -1728,7 +1728,7 @@ /turf/open/floor/plasteel/white, /area/ruin/rockplanet/nanotrasen) "CJ" = ( -/mob/living/simple_animal/hostile/pirate/melee/space, +/mob/living/simple_animal/hostile/human/pirate/melee/space, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -1767,7 +1767,7 @@ /turf/open/floor/plasteel, /area/ruin/rockplanet/nanotrasen) "Dt" = ( -/mob/living/simple_animal/hostile/pirate/ranged/space, +/mob/living/simple_animal/hostile/human/pirate/ranged/space, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, /obj/structure/cable{ @@ -2036,7 +2036,7 @@ /obj/effect/turf_decal/corner/opaque/red/border{ dir = 8 }, -/mob/living/simple_animal/hostile/nanotrasen/ranged, +/mob/living/simple_animal/hostile/human/nanotrasen/ranged, /turf/open/floor/plasteel/dark, /area/ruin/rockplanet/nanotrasen) "Hs" = ( @@ -2069,7 +2069,7 @@ }, /area/ruin/rockplanet/nanotrasen) "Ie" = ( -/mob/living/simple_animal/hostile/pirate/melee/space, +/mob/living/simple_animal/hostile/human/pirate/melee/space, /turf/open/floor/plating{ icon_state = "platingdmg1" }, @@ -2697,7 +2697,7 @@ /turf/open/floor/plasteel/rockvault, /area/ruin/rockplanet/nanotrasen) "Vn" = ( -/mob/living/simple_animal/hostile/nanotrasen/ranged, +/mob/living/simple_animal/hostile/human/nanotrasen/ranged, /obj/effect/turf_decal/industrial/warning{ dir = 1 }, @@ -2834,7 +2834,7 @@ /turf/open/floor/plating/dirt/jungle/lit, /area/overmap_encounter/planetoid/rockplanet/explored) "Ze" = ( -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg, +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/smg, /obj/effect/turf_decal/corner/transparent/purple/border{ dir = 1 }, @@ -2907,7 +2907,7 @@ /obj/structure/railing{ dir = 8 }, -/mob/living/simple_animal/hostile/nanotrasen/ranged/assault, +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/assault, /turf/open/floor/plasteel/dark, /area/ruin/rockplanet/nanotrasen) "ZZ" = ( diff --git a/_maps/RandomRuins/RockRuins/rockplanet_dangerpod.dmm b/_maps/RandomRuins/RockRuins/rockplanet_dangerpod.dmm index dd6bb43fd913..cf91b07b4072 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_dangerpod.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_dangerpod.dmm @@ -8,7 +8,7 @@ /turf/open/floor/pod/dark, /area/overmap_encounter/planetoid/rockplanet/explored) "h" = ( -/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer, +/mob/living/simple_animal/hostile/human/skeleton/plasmaminer/jackhammer, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/pod/dark, /area/overmap_encounter/planetoid/rockplanet/explored) diff --git a/_maps/RandomRuins/RockRuins/rockplanet_miningexpedition.dmm b/_maps/RandomRuins/RockRuins/rockplanet_miningexpedition.dmm index 088015c83b13..83e80f79a4a3 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_miningexpedition.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_miningexpedition.dmm @@ -114,7 +114,7 @@ /turf/open/floor/plating/asteroid/rockplanet/lit, /area/overmap_encounter/planetoid/rockplanet/explored) "sP" = ( -/mob/living/simple_animal/hostile/skeleton/plasmaminer, +/mob/living/simple_animal/hostile/human/skeleton/plasmaminer, /turf/open/floor/plating/asteroid/rockplanet/lit, /area/overmap_encounter/planetoid/rockplanet/explored) "tN" = ( diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm index f8b569cebdf4..f59cff023b4a 100644 --- a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm +++ b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm @@ -89,7 +89,7 @@ }, /area/overmap_encounter/planetoid/sand/explored) "eq" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor, +/mob/living/simple_animal/hostile/human/hermit/survivor, /turf/open/floor/plating/asteroid/whitesands{ light_range = 2 }, @@ -157,7 +157,7 @@ /area/ruin) "fO" = ( /obj/structure/chair/plastic, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ faction = list("adobe") }, /turf/open/floor/plating/asteroid/whitesands{ @@ -360,7 +360,7 @@ }, /area/overmap_encounter/planetoid/sand/explored) "nx" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 4; faction = list("adobe") }, @@ -425,7 +425,7 @@ "oB" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter{ +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter{ faction = list("saloon"); name = "Whitesands Bartender" }, @@ -592,7 +592,7 @@ /turf/open/floor/concrete, /area/ruin) "we" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor, +/mob/living/simple_animal/hostile/human/hermit/survivor, /turf/open/floor/plating/asteroid/whitesands/dried{ light_range = 2 }, @@ -678,14 +678,14 @@ }, /area/overmap_encounter/planetoid/sand/explored) "zB" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 1; faction = list("adobe") }, /turf/open/floor/concrete, /area/ruin) "AC" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/gunslinger{ +/mob/living/simple_animal/hostile/human/hermit/ranged/gunslinger{ dir = 4; faction = list("adobe") }, @@ -704,7 +704,7 @@ /turf/open/floor/wood, /area/ruin) "AR" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter, +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter, /turf/open/floor/plating/asteroid/whitesands{ light_range = 2 }, @@ -782,14 +782,14 @@ /area/ruin) "Ed" = ( /obj/item/chair/stool/bar, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 1; faction = list("saloon") }, /turf/open/floor/wood, /area/ruin) "Ef" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter{ +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter{ dir = 4; faction = list("adobe") }, @@ -939,7 +939,7 @@ /obj/structure/chair/plastic{ dir = 4 }, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 4; faction = list("adobe") }, @@ -1189,7 +1189,7 @@ /turf/open/floor/concrete, /area/ruin) "TH" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter{ +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter{ faction = list("adobe") }, /turf/open/floor/concrete, @@ -1200,7 +1200,7 @@ /area/ruin) "UT" = ( /obj/structure/chair/stool/bar, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 1; faction = list("saloon") }, @@ -1209,7 +1209,7 @@ "Vq" = ( /obj/structure/chair/stool/bar, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 8; faction = list("saloon") }, @@ -1253,7 +1253,7 @@ /area/overmap_encounter/planetoid/sand/explored) "Ws" = ( /obj/structure/chair/stool/bar, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 8; faction = list("saloon") }, diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_drugstore.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_drugstore.dmm index 4bf53b738636..7f69ca337c00 100644 --- a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_drugstore.dmm +++ b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_drugstore.dmm @@ -80,7 +80,7 @@ /turf/open/floor/wood, /area/ruin/unpowered) "n" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 4 }, /turf/open/floor/wood{ diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_saloon.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_saloon.dmm index b17207b75020..400a710091b4 100644 --- a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_saloon.dmm +++ b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_saloon.dmm @@ -243,7 +243,7 @@ }, /obj/effect/turf_decal/siding/wood, /obj/structure/chair/stool/bar, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor, +/mob/living/simple_animal/hostile/human/hermit/survivor, /turf/open/floor/wood, /area/ruin/whitesands/saloon) "gC" = ( @@ -328,7 +328,7 @@ "ih" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/blood/old, -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter{ +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter{ name = "Hermit Bartender" }, /turf/open/floor/wood{ @@ -499,7 +499,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 1 }, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 1 }, /turf/open/floor/wood, @@ -615,7 +615,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 6 }, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 1 }, /turf/open/floor/wood, @@ -654,7 +654,7 @@ /obj/structure/chair/stool/bar{ dir = 1 }, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 1 }, /turf/open/floor/wood{ @@ -666,7 +666,7 @@ dir = 8 }, /obj/item/chair/stool/bar, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 8 }, /turf/open/floor/wood, @@ -744,7 +744,7 @@ /obj/effect/turf_decal/siding/wood{ dir = 8 }, -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter{ +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter{ dir = 8 }, /turf/open/floor/wood{ @@ -756,7 +756,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 1 }, /turf/open/floor/wood{ @@ -981,7 +981,7 @@ /area/ruin/whitesands/saloon) "DT" = ( /obj/structure/chair/wood, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ name = "Robert"; desc = "This fellow seems relatively sane and normal"; faction = list("neutral") @@ -1114,7 +1114,7 @@ /obj/structure/chair/stool/bar{ dir = 8 }, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 8 }, /turf/open/floor/wood, @@ -1148,7 +1148,7 @@ }, /area/ruin/whitesands/saloon) "Ie" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 1 }, /turf/open/floor/plating/asteroid/whitesands/lit, @@ -1389,7 +1389,7 @@ /obj/structure/chair/stool/bar{ dir = 8 }, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 8 }, /turf/open/floor/wood, @@ -1421,7 +1421,7 @@ /turf/open/floor/wood, /area/ruin/whitesands/saloon) "QV" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter{ +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter{ name = "Hermit Bartender"; dir = 4 }, @@ -1497,7 +1497,7 @@ /area/ruin/whitesands/saloon) "Ua" = ( /obj/structure/chair/stool/bar, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 8 }, /turf/open/floor/wood{ @@ -1525,7 +1525,7 @@ /obj/structure/sign/poster/official/cohiba_robusto_ad{ pixel_y = 32 }, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor, +/mob/living/simple_animal/hostile/human/hermit/survivor, /turf/open/floor/wood{ icon_state = "wood-broken7" }, @@ -1641,7 +1641,7 @@ /obj/structure/chair/stool/bar{ dir = 1 }, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 1 }, /turf/open/floor/wood, diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_chokepoint.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_chokepoint.dmm index 5d63a30bf22b..d4fa2737cd38 100644 --- a/_maps/RandomRuins/SandRuins/whitesands_surface_chokepoint.dmm +++ b/_maps/RandomRuins/SandRuins/whitesands_surface_chokepoint.dmm @@ -26,7 +26,7 @@ "g" = ( /obj/structure/bed, /obj/item/bedsheet/hos, -/mob/living/simple_animal/hostile/nanotrasen/ranged{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged{ atmos_requirements = list("min_oxy"=5,"max_oxy"=0,"min_tox"=0,"max_tox"=0,"min_co2"=0,"max_co2"=999,"min_n2"=0,"max_n2"=0); damage_coeff = list("brute"=1,"fire"=1,"toxin"=1,"clone"=1,"stamina"=0,"oxygen"=0); name = "\improper Nanotrasen Stranded Security Officer" @@ -34,7 +34,7 @@ /turf/open/floor/plating/asteroid/whitesands/dried, /area/ruin) "h" = ( -/mob/living/simple_animal/hostile/nanotrasen/ranged{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged{ atmos_requirements = list("min_oxy"=5,"max_oxy"=0,"min_tox"=0,"max_tox"=0,"min_co2"=0,"max_co2"=999,"min_n2"=0,"max_n2"=0); damage_coeff = list("brute"=1,"fire"=1,"toxin"=1,"clone"=1,"stamina"=0,"oxygen"=0); dir = 4; @@ -46,7 +46,7 @@ /obj/structure/chair/wood{ dir = 8 }, -/mob/living/simple_animal/hostile/nanotrasen/ranged{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged{ atmos_requirements = list("min_oxy"=5,"max_oxy"=0,"min_tox"=0,"max_tox"=0,"min_co2"=0,"max_co2"=999,"min_n2"=0,"max_n2"=0); damage_coeff = list("brute"=1,"fire"=1,"toxin"=1,"clone"=1,"stamina"=0,"oxygen"=0); dir = 8; @@ -93,7 +93,7 @@ /turf/open/floor/plating/asteroid/whitesands, /area/ruin) "v" = ( -/mob/living/simple_animal/hostile/nanotrasen/ranged{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged{ atmos_requirements = list("min_oxy"=5,"max_oxy"=0,"min_tox"=0,"max_tox"=0,"min_co2"=0,"max_co2"=999,"min_n2"=0,"max_n2"=0); damage_coeff = list("brute"=1,"fire"=1,"toxin"=1,"clone"=1,"stamina"=0,"oxygen"=0); dir = 8; diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_onlyaspoonful.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_onlyaspoonful.dmm index f74a8895976a..f84ccaf6c8ef 100644 --- a/_maps/RandomRuins/SandRuins/whitesands_surface_onlyaspoonful.dmm +++ b/_maps/RandomRuins/SandRuins/whitesands_surface_onlyaspoonful.dmm @@ -65,7 +65,7 @@ /area/ruin/powered) "ew" = ( /obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor, +/mob/living/simple_animal/hostile/human/hermit/survivor, /turf/open/floor/plastic, /area/ruin/powered) "eH" = ( @@ -155,7 +155,7 @@ /turf/open/floor/plastic, /area/ruin/powered) "hw" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter, +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter, /turf/open/floor/plastic, /area/ruin/powered) "hA" = ( @@ -318,7 +318,7 @@ pixel_y = 9 }, /obj/effect/decal/cleanable/blood/tracks, -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/gunslinger, +/mob/living/simple_animal/hostile/human/hermit/ranged/gunslinger, /turf/open/floor/plastic, /area/ruin/powered) "wr" = ( @@ -439,7 +439,7 @@ /turf/open/floor/plastic, /area/ruin/powered) "EC" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter, +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter, /turf/open/floor/plating/asteroid/whitesands, /area/overmap_encounter/planetoid/sand/explored) "Fi" = ( diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_pubbyslopcrash.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_pubbyslopcrash.dmm index 209709f2599b..e664dfec8d96 100644 --- a/_maps/RandomRuins/SandRuins/whitesands_surface_pubbyslopcrash.dmm +++ b/_maps/RandomRuins/SandRuins/whitesands_surface_pubbyslopcrash.dmm @@ -804,7 +804,7 @@ /obj/effect/decal/fakelattice{ icon_state = "lattice-2" }, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 1; faction = list("adobe"); desc = " A wild-eyed figure, wearing tattered mining equipment and boasting a malformed body, twisted by the heavy metals and high background radiation of the sandworlds. Their helmet also seems to be filled with vomit" @@ -1003,7 +1003,7 @@ /turf/open/floor/plasteel/tech, /area/ruin/whitesands/pubbycrash/engine_room) "xc" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 4 }, /turf/open/floor/plating/asteroid/whitesands/lit, @@ -1145,7 +1145,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/directional/west, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 1; faction = list("saloon") }, @@ -1744,7 +1744,7 @@ /obj/effect/turf_decal/spline/fancy/opaque/black{ dir = 1 }, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ faction = list("saloon") }, /turf/open/floor/plasteel/dark, @@ -1777,7 +1777,7 @@ /obj/effect/turf_decal/ntspaceworks_small/left{ dir = 4 }, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 4; faction = list("saloon") }, @@ -1946,7 +1946,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/decal/cleanable/vomit/old, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 1; faction = list("saloon") }, @@ -1969,7 +1969,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 1 }, -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor{ +/mob/living/simple_animal/hostile/human/hermit/survivor{ dir = 4; faction = list("adobe"); desc = " A wild-eyed figure, wearing tattered mining equipment and boasting a malformed body, twisted by the heavy metals and high background radiation of the sandworlds. Their helmet also seems to be filled with vomit" @@ -2060,7 +2060,7 @@ /turf/open/floor/plating/asteroid/whitesands/dried, /area/overmap_encounter/planetoid/cave/explored) "Qo" = ( -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged, +/mob/living/simple_animal/hostile/human/hermit/ranged, /turf/open/floor/plating/asteroid/whitesands/dried, /area/overmap_encounter/planetoid/cave/explored) "Qu" = ( diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_starfurycrash.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_starfurycrash.dmm index bc8616028058..9e00376a8953 100644 --- a/_maps/RandomRuins/SandRuins/whitesands_surface_starfurycrash.dmm +++ b/_maps/RandomRuins/SandRuins/whitesands_surface_starfurycrash.dmm @@ -147,7 +147,7 @@ /obj/effect/turf_decal/industrial/traffic{ dir = 4 }, -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space, +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space, /turf/open/floor/engine{ initial_gas_mix = "ws_atmos" }, @@ -224,7 +224,7 @@ }, /area/overmap_encounter/planetoid/cave/explored) "mv" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/space, +/mob/living/simple_animal/hostile/human/syndicate/ranged/space, /turf/open/floor/plating/asteroid/whitesands, /area/overmap_encounter/planetoid/cave/explored) "mP" = ( @@ -395,15 +395,15 @@ }, /area/overmap_encounter/planetoid/cave/explored) "wS" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space, +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space, /turf/open/floor/plating{ icon_state = "platingdmg2"; initial_gas_mix = "ws_atmos" }, /area/overmap_encounter/planetoid/cave/explored) "xr" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space, -/mob/living/simple_animal/hostile/syndicate/ranged/space, +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space, +/mob/living/simple_animal/hostile/human/syndicate/ranged/space, /turf/open/floor/plating{ icon_state = "platingdmg2"; initial_gas_mix = "ws_atmos" @@ -467,7 +467,7 @@ }, /area/overmap_encounter/planetoid/cave/explored) "Bt" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space, +/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun/space, /turf/open/floor/plating{ icon_state = "platingdmg1"; initial_gas_mix = "ws_atmos" @@ -546,7 +546,7 @@ }, /area/overmap_encounter/planetoid/cave/explored) "Eu" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/space/stormtrooper, +/mob/living/simple_animal/hostile/human/syndicate/ranged/space/stormtrooper, /turf/open/floor/plating{ icon_state = "panelscorched"; initial_gas_mix = "ws_atmos" @@ -632,7 +632,7 @@ }, /area/overmap_encounter/planetoid/cave/explored) "KR" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space, +/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun/space, /turf/open/floor/plating/asteroid/whitesands, /area/overmap_encounter/planetoid/cave/explored) "KT" = ( @@ -645,7 +645,7 @@ }, /area/overmap_encounter/planetoid/cave/explored) "Md" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/space, +/mob/living/simple_animal/hostile/human/syndicate/ranged/space, /turf/open/floor/plating{ initial_gas_mix = "ws_atmos" }, @@ -880,7 +880,7 @@ /area/overmap_encounter/planetoid/cave/explored) "Xh" = ( /obj/item/stack/tile/plasteel, -/mob/living/simple_animal/hostile/syndicate/ranged/space, +/mob/living/simple_animal/hostile/human/syndicate/ranged/space, /turf/open/floor/plating/asteroid/whitesands/dried, /area/overmap_encounter/planetoid/cave/explored) "XR" = ( diff --git a/_maps/RandomRuins/SpaceRuins/ntfacility.dmm b/_maps/RandomRuins/SpaceRuins/ntfacility.dmm index 355ab65494ae..c9a4b0798185 100644 --- a/_maps/RandomRuins/SpaceRuins/ntfacility.dmm +++ b/_maps/RandomRuins/SpaceRuins/ntfacility.dmm @@ -114,7 +114,7 @@ /obj/effect/mob_spawn/human/corpse/assistant{ outfit = /datum/outfit/job/cmo }, -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /turf/open/floor/mineral/titanium/blue, /area/ruin/powered) "dh" = ( @@ -136,7 +136,7 @@ /turf/open/floor/plating, /area/ruin/powered) "dm" = ( -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, /area/ruin/powered) @@ -269,7 +269,7 @@ /turf/open/floor/plating, /area/ruin/powered) "gb" = ( -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, @@ -389,8 +389,8 @@ /turf/open/floor/vault, /area/ruin/powered) "hI" = ( -/mob/living/simple_animal/hostile/zombie, -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, +/mob/living/simple_animal/hostile/human/zombie, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/ruin/powered) @@ -478,7 +478,7 @@ /turf/open/floor/plasteel/white, /area/ruin/powered) "jP" = ( -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/corner/opaque/black{ @@ -568,7 +568,7 @@ pixel_x = -12 }, /obj/effect/gibspawner/human, -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, @@ -879,7 +879,7 @@ /obj/effect/turf_decal/number/four{ dir = 4 }, -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, @@ -1113,13 +1113,13 @@ /obj/effect/decal/cleanable/blood/tracks{ dir = 6 }, -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plating, /area/ruin/powered) "BG" = ( -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel, @@ -1671,7 +1671,7 @@ /turf/open/floor/plasteel/dark, /area/ruin/powered) "LD" = ( -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/carpet/royalblue, @@ -1959,7 +1959,7 @@ /area/ruin/powered) "TD" = ( /obj/effect/gibspawner/human, -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /obj/effect/decal/cleanable/dirt/dust, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/dark, @@ -2037,7 +2037,7 @@ /turf/open/floor/plasteel/dark, /area/ruin/powered) "VE" = ( -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, @@ -2140,7 +2140,7 @@ /turf/open/floor/carpet/royalblue, /area/ruin/powered) "XB" = ( -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/ruin/powered) @@ -2221,7 +2221,7 @@ /area/ruin/powered) "Zu" = ( /obj/machinery/door/poddoor/preopen, -/mob/living/simple_animal/hostile/zombie, +/mob/living/simple_animal/hostile/human/zombie, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, /area/ruin/powered) diff --git a/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm b/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm index 7577cdeb99f5..83e662b69ad0 100644 --- a/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm +++ b/_maps/RandomRuins/SpaceRuins/provinggrounds.dmm @@ -115,7 +115,7 @@ /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/syndicircle/research) "du" = ( -/mob/living/simple_animal/hostile/syndicate/civilian{ +/mob/living/simple_animal/hostile/human/syndicate/civilian{ name = "Syndicate Researcher" }, /turf/open/floor/mineral/plastitanium/red, @@ -232,7 +232,7 @@ /turf/open/floor/plating/asteroid/snow/atmosphere, /area/ruin/space/has_grav/syndicircle/winter) "gz" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/smg{ +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg{ name = "REDFOR operative" }, /turf/open/floor/plating/asteroid/snow/atmosphere, @@ -309,7 +309,7 @@ /obj/structure/flippedtable{ dir = 4 }, -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/smg{ name = "BLUFOR operative" }, /turf/open/floor/plasteel/tech, @@ -422,7 +422,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/syndicircle/halls) "lX" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/infiltrator{ +/mob/living/simple_animal/hostile/human/syndicate/ranged/infiltrator{ name = "REDFOR operative" }, /turf/open/floor/plasteel/tech/techmaint, @@ -465,7 +465,7 @@ /area/ruin/space/has_grav/syndicircle/winter) "na" = ( /obj/structure/flippedtable, -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/smg{ name = "BLUFOR operative" }, /obj/structure/cable{ @@ -497,7 +497,7 @@ /turf/open/floor/plating, /area/ruin/space/has_grav/syndicircle/winter) "ov" = ( -/mob/living/simple_animal/hostile/syndicate/civilian{ +/mob/living/simple_animal/hostile/human/syndicate/civilian{ name = "Syndicate Researcher" }, /obj/structure/cable{ @@ -561,7 +561,7 @@ /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/ruin/space/has_grav/syndicircle/winter) "qv" = ( -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun{ +/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun{ name = "REDFOR operative" }, /turf/open/floor/plating/ice, @@ -610,7 +610,7 @@ /obj/effect/turf_decal/ntlogo{ dir = 1 }, -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space{ +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space{ name = "REDFOR commando" }, /turf/open/floor/mineral/titanium/white, @@ -693,7 +693,7 @@ /obj/effect/turf_decal/ntlogo{ dir = 4 }, -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space{ +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space{ name = "REDFOR commando" }, /turf/open/floor/mineral/titanium/white, @@ -1222,7 +1222,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/mob/living/simple_animal/hostile/syndicate, +/mob/living/simple_animal/hostile/human/syndicate, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/syndicircle/halls) "Fv" = ( @@ -1247,7 +1247,7 @@ /turf/open/floor/plasteel/tech/techmaint, /area/ruin/space/has_grav/syndicircle/research) "FM" = ( -/mob/living/simple_animal/hostile/syndicate/civilian{ +/mob/living/simple_animal/hostile/human/syndicate/civilian{ name = "Syndicate Researcher" }, /turf/open/floor/mineral/plastitanium, @@ -1304,7 +1304,7 @@ /turf/open/space/basic, /area/ruin/space/has_grav/syndicircle/halls) "HC" = ( -/mob/living/simple_animal/hostile/syndicate/civilian{ +/mob/living/simple_animal/hostile/human/syndicate/civilian{ name = "Syndicate Researcher" }, /obj/structure/cable{ @@ -1507,7 +1507,7 @@ /area/ruin/space/has_grav/syndicircle/training) "MP" = ( /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space{ +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space{ name = "REDFOR commando" }, /obj/item/storage/backpack/duffelbag/syndie/c4, @@ -1608,7 +1608,7 @@ /turf/open/floor/plating/dirt/jungle/wasteland, /area/ruin/space/has_grav/syndicircle/training) "Rj" = ( -/mob/living/simple_animal/hostile/syndicate, +/mob/living/simple_animal/hostile/human/syndicate, /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/syndicircle/halls) "Rs" = ( @@ -1670,7 +1670,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 8 }, -/mob/living/simple_animal/hostile/nanotrasen/ranged{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged{ name = "BLUFOR operative" }, /turf/open/floor/mineral/titanium, @@ -1705,7 +1705,7 @@ dir = 4 }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/nanotrasen/ranged{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged{ name = "BLUFOR operative" }, /turf/open/floor/mineral/titanium, @@ -1756,7 +1756,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/syndicircle/halls) "UA" = ( -/mob/living/simple_animal/hostile/syndicate, +/mob/living/simple_animal/hostile/human/syndicate, /turf/open/floor/mineral/plastitanium/red, /area/ruin/space/has_grav/syndicircle/halls) "UI" = ( @@ -1794,7 +1794,7 @@ /obj/structure/chair/comfy/shuttle{ dir = 4 }, -/mob/living/simple_animal/hostile/nanotrasen/ranged{ +/mob/living/simple_animal/hostile/human/nanotrasen/ranged{ name = "BLUFOR operative" }, /turf/open/floor/mineral/titanium, @@ -1931,7 +1931,7 @@ /turf/open/floor/mineral/plastitanium, /area/ruin/space/has_grav/syndicircle/halls) "XW" = ( -/mob/living/simple_animal/hostile/syndicate/melee/space{ +/mob/living/simple_animal/hostile/human/syndicate/melee/space{ name = "REDFOR commando" }, /turf/open/space, @@ -1950,7 +1950,7 @@ /area/ruin/space/has_grav/syndicircle/escape) "Yr" = ( /obj/structure/chair/comfy/shuttle, -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/nanotrasen{ +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/no_mech/nanotrasen{ name = "BLUFOR Pilot" }, /turf/open/floor/mineral/titanium/blue, @@ -2027,7 +2027,7 @@ /area/ruin/space/has_grav/syndicircle/halls) "ZU" = ( /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space{ +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space{ name = "REDFOR commando" }, /turf/open/floor/plating/asteroid/airless, diff --git a/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm b/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm index 202a6c0c0b74..54896bfe8630 100644 --- a/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm +++ b/_maps/RandomRuins/SpaceRuins/singularity_lab.dmm @@ -827,7 +827,7 @@ /obj/structure/spacevine/dense{ pixel_x = -32 }, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Assistant" }, /obj/structure/flora/ausbushes/lavendergrass, @@ -885,7 +885,7 @@ /area/ruin/space/has_grav/singularitylab/cargo) "dx" = ( /obj/structure/spacevine/dense, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Assistant" }, /turf/open/floor/plating/grass/jungle{ @@ -2576,7 +2576,7 @@ }, /obj/structure/window/reinforced/tinted/frosted, /obj/item/soap/nanotrasen, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Assistant" }, /turf/open/floor/plasteel/dark, @@ -2642,7 +2642,7 @@ /turf/open/floor/plating/asteroid/airless, /area/ruin/space/has_grav) "kR" = ( -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Cargo Technician" }, /obj/effect/turf_decal/siding/yellow{ @@ -2942,7 +2942,7 @@ /area/ruin/space/has_grav/singularitylab/lab) "lL" = ( /obj/structure/spacevine/dense, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Assistant" }, /obj/structure/flora/ausbushes/fullgrass, @@ -3049,7 +3049,7 @@ /area/ruin/space/has_grav/singularitylab/cargo) "mj" = ( /obj/structure/spacevine/dense, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Assistant" }, /obj/structure/flora/ausbushes/fullgrass, @@ -3290,7 +3290,7 @@ /area/ruin/space/has_grav/singularitylab/reactor) "nd" = ( /obj/effect/turf_decal/corner/opaque/white/full, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Scientist" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{ @@ -3610,7 +3610,7 @@ }, /area/ruin/space/has_grav/singularitylab) "ol" = ( -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Shaft Miner" }, /turf/open/floor/plasteel/dark, @@ -4271,7 +4271,7 @@ dir = 10 }, /obj/structure/railing/corner, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Station Engineer" }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4, @@ -5557,7 +5557,7 @@ /area/ruin/space/has_grav/singularitylab) "wV" = ( /obj/structure/spacevine/dense, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Assistant" }, /turf/open/floor/plating/grass/jungle{ @@ -6315,7 +6315,7 @@ "zC" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/effect/turf_decal/corner/opaque/white/full, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Scientist" }, /obj/effect/turf_decal/siding/thinplating/light, @@ -6899,7 +6899,7 @@ /obj/effect/turf_decal/corner/opaque/purple{ dir = 5 }, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Scientist" }, /turf/open/floor/plasteel, @@ -7222,7 +7222,7 @@ "CX" = ( /obj/effect/turf_decal/corner/opaque/white/full, /obj/effect/turf_decal/corner/opaque/white/full, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Scientist" }, /obj/effect/turf_decal/siding/thinplating/light{ @@ -9024,7 +9024,7 @@ /obj/structure/chair/office{ dir = 8 }, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Security Officer" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer2, @@ -9452,7 +9452,7 @@ pixel_y = 4 }, /obj/effect/turf_decal/corner/opaque/white/full, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Scientist" }, /obj/effect/turf_decal/siding/thinplating/light/corner, @@ -9798,7 +9798,7 @@ /obj/structure/chair{ dir = 1 }, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Cargo Technician" }, /obj/machinery/light/small/directional/south, @@ -10328,7 +10328,7 @@ /obj/structure/chair{ dir = 8 }, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Cargo Technician" }, /turf/open/floor/carpet/nanoweave/beige, @@ -11694,7 +11694,7 @@ /obj/structure/chair/office{ dir = 4 }, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Quartermaster" }, /obj/effect/decal/cleanable/blood{ @@ -12894,7 +12894,7 @@ /area/ruin/space/has_grav/singularitylab/civvie) "WE" = ( /obj/structure/spacevine, -/mob/living/simple_animal/hostile/zombie/kudzu{ +/mob/living/simple_animal/hostile/human/zombie/kudzu{ zombiejob = "Assistant" }, /turf/open/floor/plating/grass/jungle{ diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm index 20301b381145..31c53d09a82e 100644 --- a/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm +++ b/_maps/RandomRuins/WasteRuins/wasteplanet_abandoned_mechbay.dmm @@ -480,7 +480,7 @@ /area/ruin/wasteplanet/abandoned_mechbay/bay1) "fe" = ( /obj/effect/decal/cleanable/dirt/dust, -/mob/living/simple_animal/hostile/syndicate/melee{ +/mob/living/simple_animal/hostile/human/syndicate/melee{ name = "Syndicate Mech Pilot" }, /turf/open/floor/concrete/slab_1, @@ -1376,7 +1376,7 @@ dir = 4 }, /obj/effect/decal/cleanable/plastic, -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun, +/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun, /turf/open/floor/plasteel/dark, /area/ruin/wasteplanet/abandoned_mechbay/mechlab) "pA" = ( @@ -1499,7 +1499,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/mob/living/simple_animal/hostile/syndicate{ +/mob/living/simple_animal/hostile/human/syndicate{ name = "Syndicate Engineer"; desc = "Death to bad mechanics." }, @@ -1558,7 +1558,7 @@ /area/ruin/wasteplanet/abandoned_mechbay/bay1) "rT" = ( /obj/structure/chair/sofa/brown/right/directional/south, -/mob/living/simple_animal/hostile/syndicate{ +/mob/living/simple_animal/hostile/human/syndicate{ name = "Syndicate Engineer"; desc = "Death to bad mechanics." }, @@ -1779,7 +1779,7 @@ /obj/machinery/camera/autoname{ dir = 4 }, -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space, +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space, /turf/open/floor/plasteel/tech/techmaint, /area/ruin/wasteplanet/abandoned_mechbay/crewquarters) "uM" = ( @@ -1907,7 +1907,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun, +/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun, /turf/open/floor/plasteel/dark, /area/ruin/wasteplanet/abandoned_mechbay/mechlab) "vS" = ( @@ -2047,7 +2047,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/mob/living/simple_animal/hostile/syndicate{ +/mob/living/simple_animal/hostile/human/syndicate{ name = "Syndicate Launderer"; desc = "Death to Dirty Laundry?" }, @@ -2180,7 +2180,7 @@ dir = 8 }, /obj/machinery/light/floor, -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space, +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space, /obj/machinery/door/firedoor/border_only{ dir = 8 }, @@ -2473,7 +2473,7 @@ pixel_y = 19 }, /obj/structure/curtain, -/mob/living/simple_animal/hostile/syndicate/civilian{ +/mob/living/simple_animal/hostile/human/syndicate/civilian{ desc = "Can an armored mook not shower in peace?" }, /turf/open/floor/carpet/blue, @@ -2722,7 +2722,7 @@ dir = 1 }, /obj/effect/decal/cleanable/dirt, -/mob/living/simple_animal/hostile/syndicate/melee{ +/mob/living/simple_animal/hostile/human/syndicate/melee{ name = "Syndicate Mech Pilot" }, /turf/open/floor/plasteel/tech/techmaint, @@ -2770,7 +2770,7 @@ /area/overmap_encounter/planetoid/cave/explored) "Hj" = ( /obj/machinery/light/dim/directional/south, -/mob/living/simple_animal/hostile/syndicate/melee{ +/mob/living/simple_animal/hostile/human/syndicate/melee{ name = "Syndicate Mech Pilot" }, /turf/open/floor/plasteel/tech/techmaint, @@ -3015,7 +3015,7 @@ }, /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/light/directional/south, -/mob/living/simple_animal/hostile/syndicate/melee{ +/mob/living/simple_animal/hostile/human/syndicate/melee{ name = "Syndicate Mech Pilot" }, /turf/open/floor/plasteel/dark, @@ -3056,7 +3056,7 @@ /obj/effect/turf_decal/industrial/warning{ dir = 8 }, -/mob/living/simple_animal/hostile/syndicate{ +/mob/living/simple_animal/hostile/human/syndicate{ name = "Syndicate Engineer"; desc = "Death to bad mechanics." }, @@ -3375,7 +3375,7 @@ }, /obj/effect/decal/cleanable/dirt, /obj/item/radio/intercom/directional/west, -/mob/living/simple_animal/hostile/syndicate{ +/mob/living/simple_animal/hostile/human/syndicate{ name = "Syndicate Engineer"; desc = "Death to bad mechanics." }, diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_fortress_of_solitide.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_fortress_of_solitide.dmm index 227bbf0c0338..b795826ec6c2 100644 --- a/_maps/RandomRuins/WasteRuins/wasteplanet_fortress_of_solitide.dmm +++ b/_maps/RandomRuins/WasteRuins/wasteplanet_fortress_of_solitide.dmm @@ -2096,7 +2096,7 @@ /obj/structure/chair/wood{ dir = 8 }, -/mob/living/simple_animal/hostile/frontier{ +/mob/living/simple_animal/hostile/human/frontier{ dir = 8 }, /turf/open/floor/wood, @@ -5545,7 +5545,7 @@ /turf/open/floor/plating, /area/ruin/powered) "Zo" = ( -/mob/living/simple_animal/hostile/cat_butcherer{ +/mob/living/simple_animal/hostile/human/cat_butcherer{ dir = 4 }, /obj/effect/decal/cleanable/blood, diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm index b6298e29f39d..a880d2947ae2 100644 --- a/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm +++ b/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm @@ -659,7 +659,7 @@ /turf/open/floor/mineral/titanium/white, /area/ruin/wasteplanet) "Bb" = ( -/mob/living/simple_animal/hostile/skeleton{ +/mob/living/simple_animal/hostile/human/skeleton{ desc = "A villager resurrected by the power of an unknown deity, eternally seeking vengeance for its people." }, /turf/open/floor/plating/dirt/old/waste, @@ -791,7 +791,7 @@ /turf/open/indestructible/hierophant/waste, /area/ruin/wasteplanet) "Fc" = ( -/mob/living/simple_animal/hostile/skeleton{ +/mob/living/simple_animal/hostile/human/skeleton{ desc = "A villager resurrected by the power of an unknown deity, eternally seeking vengeance for its people." }, /turf/open/floor/wood/waste, @@ -1378,7 +1378,7 @@ /turf/open/indestructible/hierophant/waste, /area/ruin/wasteplanet) "Xq" = ( -/mob/living/simple_animal/hostile/skeleton{ +/mob/living/simple_animal/hostile/human/skeleton{ desc = "A villager resurrected by the power of an unknown deity, eternally seeking vengeance for its people." }, /turf/open/floor/plating/grass/wasteplanet, diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index aa7b276afb59..b3009b2fdc03 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -41,7 +41,7 @@ SUBSYSTEM_DEF(traumas) "spiders" = typecacheof(list(/mob/living/simple_animal/hostile/poison/giant_spider)), "security" = typecacheof(list(/mob/living/simple_animal/bot/secbot)), "lizards" = typecacheof(list(/mob/living/simple_animal/hostile/lizard)), - "skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/skeleton)), + "skeletons" = typecacheof(list(/mob/living/simple_animal/hostile/human/skeleton)), "snakes" = typecacheof(list(/mob/living/simple_animal/hostile/retaliate/poison/snake)), "robots" = typecacheof(list(/mob/living/silicon/robot, /mob/living/silicon/ai, /mob/living/simple_animal/drone, /mob/living/simple_animal/bot, /mob/living/simple_animal/hostile/swarmer)), diff --git a/code/datums/mapgen/planetary/SandGenerator.dm b/code/datums/mapgen/planetary/SandGenerator.dm index 442daa0c7705..91fad1430a47 100644 --- a/code/datums/mapgen/planetary/SandGenerator.dm +++ b/code/datums/mapgen/planetary/SandGenerator.dm @@ -103,7 +103,7 @@ /mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 40, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, - /mob/living/simple_animal/hostile/asteroid/whitesands/survivor/random = 25, + /mob/living/simple_animal/hostile/human/hermit/survivor/random = 25, ) /datum/biome/sand/wasteland @@ -135,7 +135,7 @@ ) mob_spawn_chance = 1 mob_spawn_list = list( - /mob/living/simple_animal/hostile/asteroid/whitesands/survivor/random = 1, + /mob/living/simple_animal/hostile/human/hermit/survivor/random = 1, ) /datum/biome/sand/grass/dead @@ -169,7 +169,7 @@ /mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 40, /mob/living/simple_animal/hostile/asteroid/basilisk/whitesands = 30, /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 20, - /mob/living/simple_animal/hostile/asteroid/whitesands/survivor/random = 40, + /mob/living/simple_animal/hostile/human/hermit/survivor/random = 40, ) /datum/biome/sand/acid //plains diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index b665a36bcf32..d7f80fc45680 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -867,7 +867,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( say("WEEWOO! WEEWOO! Spaceport security en route!") playsound(src, 'sound/items/weeoo1.ogg', 100, FALSE) for(var/i, i<=3, i++) - var/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion/O = new/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion(get_turf(src)) + var/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/orion/O = new/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/orion(get_turf(src)) O.target = usr @@ -1242,7 +1242,7 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list( newgame() obj_flags |= EMAGGED -/mob/living/simple_animal/hostile/syndicate/ranged/smg/orion +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/orion name = "spaceport security" desc = "Premier corporate security forces for all spaceports found along the Orion Trail." faction = list("orion") diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index d2c712d32ea8..88c2ca721da2 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -831,7 +831,7 @@ //An actual AI (simple_animal mecha pilot) entering the mech -/obj/mecha/proc/aimob_enter_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob) +/obj/mecha/proc/aimob_enter_mech(mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/pilot_mob) if(pilot_mob && pilot_mob.Adjacent(src)) if(occupant) return @@ -841,7 +841,7 @@ pilot_mob.forceMove(src) GrantActions(pilot_mob)//needed for checks, and incase a badmin puts somebody in the mob -/obj/mecha/proc/aimob_exit_mech(mob/living/simple_animal/hostile/syndicate/mecha_pilot/pilot_mob) +/obj/mecha/proc/aimob_exit_mech(mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/pilot_mob) if(occupant == pilot_mob) occupant = null if(pilot_mob.mecha == src) diff --git a/code/game/objects/structures/icemoon/cave_entrance.dm b/code/game/objects/structures/icemoon/cave_entrance.dm index d1fc91c8e596..2a7a8c5f4a38 100644 --- a/code/game/objects/structures/icemoon/cave_entrance.dm +++ b/code/game/objects/structures/icemoon/cave_entrance.dm @@ -310,18 +310,18 @@ GLOBAL_LIST_INIT(ore_probability, list( playsound(loc,'sound/ambience/ambiholy.ogg', 100, FALSE, 50, TRUE, TRUE) if(prob(30)) new /obj/item/reagent_containers/glass/bottle/potion/flight(loc) - new /mob/living/simple_animal/hostile/skeleton/templar(loc) + new /mob/living/simple_animal/hostile/human/skeleton/templar(loc) else new /obj/item/clothing/neck/memento_mori(loc) - new /mob/living/simple_animal/hostile/skeleton(loc) - new /mob/living/simple_animal/hostile/skeleton/templar(loc) + new /mob/living/simple_animal/hostile/human/skeleton(loc) + new /mob/living/simple_animal/hostile/human/skeleton/templar(loc) if(prob(35)) new /obj/item/storage/box/holy_grenades(loc) - new /mob/living/simple_animal/hostile/skeleton/templar(loc) - new /mob/living/simple_animal/hostile/skeleton/templar(loc) + new /mob/living/simple_animal/hostile/human/skeleton/templar(loc) + new /mob/living/simple_animal/hostile/human/skeleton/templar(loc) if(prob(40)) new /obj/item/claymore(loc) - new /mob/living/simple_animal/hostile/skeleton/templar(loc) + new /mob/living/simple_animal/hostile/human/skeleton/templar(loc) if(prob(45)) new /obj/item/gun/ballistic/bow(loc) new /obj/item/storage/bag/quiver(loc) @@ -330,38 +330,38 @@ GLOBAL_LIST_INIT(ore_probability, list( new /obj/item/ammo_casing/caseless/arrow/bronze(loc) new /obj/item/ammo_casing/caseless/arrow/bronze(loc) new /obj/item/ammo_casing/caseless/arrow/bronze(loc) - new /mob/living/simple_animal/hostile/skeleton/templar(loc) - new /mob/living/simple_animal/hostile/skeleton(loc) + new /mob/living/simple_animal/hostile/human/skeleton/templar(loc) + new /mob/living/simple_animal/hostile/human/skeleton(loc) if(prob(30)) new /obj/item/stack/sheet/mineral/wood/fifty(loc) - new /mob/living/simple_animal/hostile/skeleton(loc) - new /mob/living/simple_animal/hostile/skeleton(loc) + new /mob/living/simple_animal/hostile/human/skeleton(loc) + new /mob/living/simple_animal/hostile/human/skeleton(loc) if(prob(35)) new /obj/item/staff/bostaff(loc) - new /mob/living/simple_animal/hostile/skeleton(loc) - new /mob/living/simple_animal/hostile/skeleton(loc) + new /mob/living/simple_animal/hostile/human/skeleton(loc) + new /mob/living/simple_animal/hostile/human/skeleton(loc) if(prob(45)) new /obj/item/disk/design_disk/adv/cleric_mace(loc) - new /mob/living/simple_animal/hostile/skeleton(loc) - new /mob/living/simple_animal/hostile/skeleton(loc) + new /mob/living/simple_animal/hostile/human/skeleton(loc) + new /mob/living/simple_animal/hostile/human/skeleton(loc) if(prob(25)) new /obj/item/shield/riot/roman(loc) - new /mob/living/simple_animal/hostile/skeleton(loc) + new /mob/living/simple_animal/hostile/human/skeleton(loc) if(prob(55)) new /obj/item/clothing/suit/armor/riot/knight/blue(loc) new /obj/item/clothing/head/helmet/knight/blue(loc) - new /mob/living/simple_animal/hostile/skeleton(loc) - new /mob/living/simple_animal/hostile/skeleton(loc) + new /mob/living/simple_animal/hostile/human/skeleton(loc) + new /mob/living/simple_animal/hostile/human/skeleton(loc) if(prob(35)) new /obj/item/disk/design_disk/adv/knight_gear(loc) - new /mob/living/simple_animal/hostile/skeleton(loc) - new /mob/living/simple_animal/hostile/skeleton(loc) + new /mob/living/simple_animal/hostile/human/skeleton(loc) + new /mob/living/simple_animal/hostile/human/skeleton(loc) new /obj/item/instrument/trombone(loc) new /obj/item/stack/sheet/bone(loc) new /obj/item/stack/sheet/bone(loc) new /obj/item/stack/sheet/bone(loc) new /obj/item/stack/sheet/bone(loc) - new /mob/living/simple_animal/hostile/skeleton/templar(loc) + new /mob/living/simple_animal/hostile/human/skeleton/templar(loc) new /turf/open/floor/mineral/silver(loc) if(4)//syndicate incursion. Again, high-quality loot at low chances, this time with excessive levels of danger visible_message("Radio chatter echoes out from the portal. Red-garbed figures step through, weapons raised.") @@ -370,74 +370,74 @@ GLOBAL_LIST_INIT(ore_probability, list( if(prob(35)) if(prob(15)) new /obj/item/clothing/suit/space/hardsuit/syndi/elite(loc) - new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc) + new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) else if(prob(50)) new /obj/item/clothing/suit/space/hardsuit/syndi(loc) - new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc) + new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) else new /obj/item/clothing/suit/space/hardsuit/syndi(loc) - new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc) - new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc) + new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) + new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) if(prob(25))//the real prize new /obj/effect/spawner/lootdrop/donkpockets(loc) new /obj/effect/spawner/lootdrop/donkpockets(loc) new /obj/effect/spawner/lootdrop/donkpockets(loc) if(prob(35)) new /obj/item/clothing/shoes/magboots/syndie(loc) - new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc) + new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) if(prob(25)) new /obj/item/gun/ballistic/automatic/pistol/suppressed(loc) new /obj/item/ammo_box/magazine/ - new /mob/living/simple_animal/hostile/syndicate/melee/sword(loc) + new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc) if(prob(25)) new /obj/item/gun/ballistic/automatic/pistol/tec9(loc) new /obj/item/ammo_box/magazine/tec9(loc) new /obj/item/ammo_box/magazine/tec9(loc) - new /mob/living/simple_animal/hostile/syndicate/melee/sword(loc) + new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc) if(prob(35)) new /obj/item/clothing/gloves/rapid(loc) - new /mob/living/simple_animal/hostile/syndicate/melee/sword/space(loc) - new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc) + new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc) + new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) if(prob(35)) new /obj/item/wrench/combat(loc) new /obj/item/storage/toolbox/syndicate(loc) - new /mob/living/simple_animal/hostile/syndicate/melee/sword/space(loc) + new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc) if(prob(35)) new /obj/item/storage/fancy/cigarettes/cigpack_syndicate(loc) if(prob(35)) new /obj/item/borg/upgrade/transform/assault(loc) - new /mob/living/simple_animal/hostile/syndicate/ranged/smg(loc) + new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc) if(prob(25)) - new /mob/living/simple_animal/hostile/syndicate/ranged/smg(loc) - new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc) + new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc) + new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) if(prob(25)) - new /mob/living/simple_animal/hostile/syndicate/melee/sword/space(loc) - new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc) + new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc) + new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) if(prob(25)) - new /mob/living/simple_animal/hostile/syndicate/melee/sword(loc) + new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc) new /obj/item/storage/backpack/duffelbag/syndie/c4(loc) if(prob(35)) new /obj/item/storage/belt/military(loc) - new /mob/living/simple_animal/hostile/syndicate/ranged/smg(loc) + new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc) if(prob(35)) new /obj/item/kinetic_crusher/syndie_crusher(loc) - new /mob/living/simple_animal/hostile/syndicate/ranged/smg(loc) - new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc) + new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg(loc) + new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) if(prob(25)) new /obj/item/card/id/syndicate/anyone(loc) if(prob(35)) new /obj/item/clothing/glasses/thermal/syndi(loc) - new /mob/living/simple_animal/hostile/syndicate/melee/sword(loc) + new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc) if(prob(35)) new /obj/item/reagent_containers/hypospray(loc) - new /mob/living/simple_animal/hostile/syndicate/ranged/shotgun(loc) - new /mob/living/simple_animal/hostile/syndicate/melee/sword(loc) + new /mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun(loc) + new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc) if(prob(25)) new /obj/item/card/emag(loc) - new /mob/living/simple_animal/hostile/syndicate/melee/sword(loc) - new /mob/living/simple_animal/hostile/syndicate/ranged/smg/space(loc) - new /mob/living/simple_animal/hostile/syndicate/melee/sword/space(loc) + new /mob/living/simple_animal/hostile/human/syndicate/melee/sword(loc) + new /mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space(loc) + new /mob/living/simple_animal/hostile/human/syndicate/melee/sword/space(loc) new /turf/open/floor/mineral/plastitanium/red(loc) if(5)//;HELP BLOB IN MEDICAL visible_message("You hear a robotic voice saying something about a \"Delta-level biohazard\".") @@ -977,46 +977,46 @@ GLOBAL_LIST_INIT(ore_probability, list( playsound(loc,'sound/misc/bloblarm.ogg', 120, FALSE, 50, TRUE, TRUE) if(prob(35)) new /obj/item/storage/box/rndboards(loc) - new /mob/living/simple_animal/hostile/zombie(loc) + new /mob/living/simple_animal/hostile/human/zombie(loc) if(prob(35)) new /obj/item/storage/box/stockparts/deluxe(loc) - new /mob/living/simple_animal/hostile/zombie(loc) - new /mob/living/simple_animal/hostile/zombie(loc) + new /mob/living/simple_animal/hostile/human/zombie(loc) + new /mob/living/simple_animal/hostile/human/zombie(loc) if(prob(15)) new /obj/effect/spawner/lootdrop/stockparts(loc) - new /mob/living/simple_animal/hostile/zombie(loc) + new /mob/living/simple_animal/hostile/human/zombie(loc) if(prob(15)) new /obj/effect/spawner/lootdrop/stockparts(loc) - new /mob/living/simple_animal/hostile/zombie(loc) + new /mob/living/simple_animal/hostile/human/zombie(loc) if(prob(15)) new /obj/effect/spawner/lootdrop/stockparts(loc) - new /mob/living/simple_animal/hostile/zombie(loc) + new /mob/living/simple_animal/hostile/human/zombie(loc) if(prob(15)) new /obj/effect/spawner/lootdrop/stockparts(loc) - new /mob/living/simple_animal/hostile/zombie(loc) + new /mob/living/simple_animal/hostile/human/zombie(loc) if(prob(30)) new /obj/item/circuitboard/machine/rdserver(loc) - new /mob/living/simple_animal/hostile/zombie(loc) + new /mob/living/simple_animal/hostile/human/zombie(loc) if(prob(35)) new /obj/item/research_notes/loot/big(loc) - new /mob/living/simple_animal/hostile/zombie(loc) + new /mob/living/simple_animal/hostile/human/zombie(loc) else new /obj/item/research_notes/loot/medium(loc) if(prob(35)) new /obj/item/research_notes/loot/medium(loc) - new /mob/living/simple_animal/hostile/zombie(loc) + new /mob/living/simple_animal/hostile/human/zombie(loc) else new /obj/item/research_notes/loot/small(loc) if(prob(35)) new /obj/item/pneumatic_cannon(loc) - new /mob/living/simple_animal/hostile/zombie(loc) + new /mob/living/simple_animal/hostile/human/zombie(loc) if(prob(45)) new /obj/item/research_notes/loot/medium(loc) - new /mob/living/simple_animal/hostile/zombie(loc) + new /mob/living/simple_animal/hostile/human/zombie(loc) else new /obj/item/research_notes/loot/small(loc) new/turf/open/floor/mineral/titanium/purple(loc) - new /mob/living/simple_animal/hostile/zombie(loc) + new /mob/living/simple_animal/hostile/human/zombie(loc) if(22)//Silverback's locker room visible_message("You catch a glimpse of verdant green. Smells like a locker room.") playsound(loc,'sound/creatures/gorilla.ogg', 75, FALSE, 50, TRUE, TRUE) diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm index c3c8e07cc3ab..d44606a1a57b 100644 --- a/code/game/objects/structures/spawner.dm +++ b/code/game/objects/structures/spawner.dm @@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(astroloot, list( icon = 'icons/obj/device.dmi' icon_state = "syndbeacon" spawn_text = "warps in from" - mob_types = list(/mob/living/simple_animal/hostile/syndicate/ranged) + mob_types = list(/mob/living/simple_animal/hostile/human/syndicate/ranged) faction = list(ROLE_SYNDICATE) /obj/structure/spawner/skeleton @@ -68,7 +68,7 @@ GLOBAL_LIST_INIT(astroloot, list( max_integrity = 150 max_mobs = 15 spawn_time = 150 - mob_types = list(/mob/living/simple_animal/hostile/skeleton) + mob_types = list(/mob/living/simple_animal/hostile/human/skeleton) spawn_text = "climbs out of" faction = list("skeleton") diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 40932634cfa4..11358938bd47 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -30,7 +30,7 @@ var/mob_color //Change the mob's color var/assignedrole var/show_flavour = TRUE - var/banType = ROLE_LAVALAND + var/ban_type = ROLE_LAVALAND var/ghost_usable = TRUE /// Weakref to the mob this spawner created - just if you needed to do something with it. var/datum/weakref/spawned_mob_ref @@ -42,7 +42,7 @@ if(!uses) to_chat(user, "This spawner is out of charges!") return - if(is_banned_from(user.key, banType)) + if(is_banned_from(user.key, ban_type)) to_chat(user, "You are jobanned!") return if(!allow_spawn(user)) diff --git a/code/modules/awaymissions/mission_code/spacebattle.dm b/code/modules/awaymissions/mission_code/spacebattle.dm index dee4def256b0..efe429b86b73 100644 --- a/code/modules/awaymissions/mission_code/spacebattle.dm +++ b/code/modules/awaymissions/mission_code/spacebattle.dm @@ -41,11 +41,11 @@ name = "Hidden Chamber" icon_state = "awaycontent10" -/mob/living/simple_animal/hostile/syndicate/ranged/spacebattle +/mob/living/simple_animal/hostile/human/syndicate/ranged/spacebattle loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier, /obj/item/gun/ballistic/automatic/smg/c20r, /obj/item/shield/energy) -/mob/living/simple_animal/hostile/syndicate/melee/spacebattle +/mob/living/simple_animal/hostile/human/syndicate/melee/spacebattle deathmessage = "falls limp as they release their grip from the energy weapons, activating their self-destruct function!" loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier) diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index 41c1cddde5a1..451d428760f3 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -148,39 +148,6 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) resistance_flags = FLAMMABLE -/obj/item/clothing/suit/wizrobe/paper - name = "papier-mache robe" // no non-latin characters! - desc = "A robe held together by various bits of clear-tape and paste." - icon_state = "wizard-paper" - item_state = "wizard-paper" - var/robe_charge = TRUE - actions_types = list(/datum/action/item_action/stickmen) - - -/obj/item/clothing/suit/wizrobe/paper/ui_action_click(mob/user, action) - stickmen() - - -/obj/item/clothing/suit/wizrobe/paper/verb/stickmen() - set category = "Object" - set name = "Summon Stick Minions" - set src in usr - if(!isliving(usr)) - return - if(!robe_charge) - to_chat(usr, "The robe's internal magic supply is still recharging!") - return - - usr.say("Rise, my creation! Off your page into this realm!", forced = "stickman summoning") - playsound(src.loc, 'sound/magic/summon_magic.ogg', 50, TRUE, TRUE) - var/mob/living/M = new /mob/living/simple_animal/hostile/stickman(get_turf(usr)) - var/list/factions = usr.faction - M.faction = factions - src.robe_charge = FALSE - sleep(30) - src.robe_charge = TRUE - to_chat(usr, "The robe hums, its internal magic supply restored.") - /obj/item/clothing/suit/space/hardsuit/shielded/wizard name = "battlemage armour" desc = "Not all wizards are afraid of getting up close and personal." diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm b/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm deleted file mode 100644 index 57d6f2fc325f..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/bosses/paperwizard.dm +++ /dev/null @@ -1,171 +0,0 @@ -//Paper Wizard Boss -/mob/living/simple_animal/hostile/boss/paper_wizard - name = "Mjor the Creative" - desc = "A wizard with a taste for the arts." - mob_biotypes = MOB_HUMANOID - boss_abilities = list(/datum/action/boss/wizard_summon_minions, /datum/action/boss/wizard_mimic) - faction = list("hostile","stickman") - del_on_death = TRUE - icon = 'icons/mob/simple_human.dmi' - icon_state = "paperwizard" - ranged = 1 - environment_smash = ENVIRONMENT_SMASH_NONE - minimum_distance = 3 - retreat_distance = 3 - obj_damage = 0 - melee_damage_lower = 10 - melee_damage_upper = 20 - health = 1000 - maxHealth = 1000 - loot = list(/obj/effect/temp_visual/paperwiz_dying) - projectiletype = /obj/projectile/temp - projectilesound = 'sound/weapons/emitter.ogg' - attack_sound = 'sound/hallucinations/growl1.ogg' - var/list/copies = list() - - footstep_type = FOOTSTEP_MOB_SHOE - - -//Summon Ability -//Lets the wizard summon his art to fight for him -/datum/action/boss/wizard_summon_minions - name = "Summon Minions" - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "art_summon" - usage_probability = 40 - boss_cost = 30 - boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard - needs_target = FALSE - say_when_triggered = "Rise, my creations! Jump off your pages and into this realm!" - var/static/summoned_minions = 0 - -/datum/action/boss/wizard_summon_minions/Trigger() - if(summoned_minions <= 6 && ..()) - var/list/minions = list( - /mob/living/simple_animal/hostile/stickman, - /mob/living/simple_animal/hostile/stickman/ranged, - /mob/living/simple_animal/hostile/stickman/dog) - var/list/directions = GLOB.cardinals.Copy() - for(var/i in 1 to 3) - var/minions_chosen = pick_n_take(minions) - new minions_chosen (get_step(boss,pick_n_take(directions)), 1) - summoned_minions += 3; - - -//Mimic Ability -//Summons mimics of himself with magical papercraft -//Hitting a decoy hurts nearby people excluding the wizard himself -//Hitting the wizard himself destroys all decoys -/datum/action/boss/wizard_mimic - name = "Craft Mimicry" - icon_icon = 'icons/mob/actions/actions_minor_antag.dmi' - button_icon_state = "mimic_summon" - usage_probability = 30 - boss_cost = 40 - boss_type = /mob/living/simple_animal/hostile/boss/paper_wizard - say_when_triggered = "" - -/datum/action/boss/wizard_mimic/Trigger() - if(..()) - var/mob/living/target - if(!boss.client) //AI's target - target = boss.target - else //random mob - var/list/threats = boss.PossibleThreats() - if(threats.len) - target = pick(threats) - if(target) - var/mob/living/simple_animal/hostile/boss/paper_wizard/wiz = boss - var/directions = GLOB.cardinals.Copy() - for(var/i in 1 to 3) - var/mob/living/simple_animal/hostile/boss/paper_wizard/copy/C = new (get_step(target,pick_n_take(directions))) - wiz.copies += C - C.original = wiz - C.say("My craft defines me, you could even say it IS me!") - wiz.say("My craft defines me, you could even say it IS me!") - wiz.forceMove(get_step(target,pick_n_take(directions))) - wiz.minimum_distance = 1 //so he doesn't run away and ruin everything - wiz.retreat_distance = 0 - else - boss.atb.refund(boss_cost) - -/mob/living/simple_animal/hostile/boss/paper_wizard/copy - desc = "'Tis a ruse!" - health = 1 - maxHealth = 1 - alpha = 200 - boss_abilities = list() - melee_damage_lower = 1 - melee_damage_upper = 5 - minimum_distance = 0 - retreat_distance = 0 - ranged = 0 - loot = list() - var/mob/living/simple_animal/hostile/boss/paper_wizard/original - -//Hit a fake? eat pain! -/mob/living/simple_animal/hostile/boss/paper_wizard/copy/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - if(amount > 0) //damage - if(original) - original.minimum_distance = 3 - original.retreat_distance = 3 - original.copies -= src - for(var/c in original.copies) - qdel(c) - for(var/mob/living/L in range(5,src)) - if(L == original || istype(L, type)) - continue - L.adjustBruteLoss(50) - qdel(src) - else - . = ..() - -//Hit the real guy? copies go bai-bai -/mob/living/simple_animal/hostile/boss/paper_wizard/adjustHealth(amount, updating_health = TRUE, forced = FALSE) - . = ..() - if(. > 0)//damage - minimum_distance = 3 - retreat_distance = 3 - for(var/copy in copies) - qdel(copy) - -/mob/living/simple_animal/hostile/boss/paper_wizard/copy/examine(mob/user) - . = ..() - qdel(src) //I see through your ruse! - -//fancy effects -/obj/effect/temp_visual/paper_scatter - name = "scattering paper" - desc = "Pieces of paper scattering to the wind." - layer = ABOVE_OPEN_TURF_LAYER - icon = 'icons/effects/effects.dmi' - icon_state = "paper_scatter" - anchored = TRUE - duration = 5 - randomdir = FALSE - -/obj/effect/temp_visual/paperwiz_dying - name = "craft portal" - desc = "A wormhole sucking the wizard into the void. Neat." - layer = ABOVE_OPEN_TURF_LAYER - icon = 'icons/effects/effects.dmi' - icon_state = "paperwiz_poof" - anchored = TRUE - duration = 18 - randomdir = FALSE - -/obj/effect/temp_visual/paperwiz_dying/Initialize() - . = ..() - visible_message("The wizard cries out in pain as a gate appears behind him, sucking him in!") - playsound(get_turf(src),'sound/magic/mandswap.ogg', 50, TRUE, TRUE) - playsound(get_turf(src),'sound/hallucinations/wail.ogg', 50, TRUE, TRUE) - -/obj/effect/temp_visual/paperwiz_dying/Destroy() - for(var/mob/M in range(7,src)) - shake_camera(M, 7, 1) - var/turf/T = get_turf(src) - playsound(T,'sound/magic/summon_magic.ogg', 50, TRUE, TRUE) - new /obj/effect/temp_visual/paper_scatter(T) - new /obj/item/clothing/suit/wizrobe/paper(T) - new /obj/item/clothing/head/collectable/paper(T) - return ..() diff --git a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm b/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm deleted file mode 100644 index 5c3e60c8377b..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/dark_wizard.dm +++ /dev/null @@ -1,41 +0,0 @@ -/mob/living/simple_animal/hostile/dark_wizard - name = "Dark Wizard" - desc = "Killing amateurs since the dawn of times." - icon = 'icons/mob/simple_human.dmi' - icon_state = "dark_wizard" - icon_living = "dark_wizard" - move_to_delay = 10 - projectiletype = /obj/projectile/temp/earth_bolt - projectilesound = 'sound/magic/ethereal_enter.ogg' - ranged = TRUE - ranged_message = "earth bolts" - ranged_cooldown_time = 20 - maxHealth = 50 - health = 50 - harm_intent_damage = 5 - obj_damage = 20 - melee_damage_lower = 5 - melee_damage_upper = 5 - attack_verb_continuous = "staves" - a_intent = INTENT_HARM - speak_emote = list("chants") - attack_sound = 'sound/weapons/bladeslice.ogg' - aggro_vision_range = 9 - turns_per_move = 5 - gold_core_spawnable = HOSTILE_SPAWN - faction = list(ROLE_WIZARD) - footstep_type = FOOTSTEP_MOB_SHOE - weather_immunities = list("lava","ash") - minbodytemp = 0 - maxbodytemp = INFINITY - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - loot = list(/obj/effect/decal/remains/human) - del_on_death = TRUE - -/obj/projectile/temp/earth_bolt - name = "earth bolt" - icon_state = "declone" - damage = 4 - damage_type = BURN - flag = "energy" - temperature = -100 // closer to the old temp loss diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 526763e875b7..70ce3f665bab 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -30,7 +30,7 @@ var/ranged_cooldown = 0 //What the current cooldown on ranged attacks is, generally world.time + ranged_cooldown_time var/ranged_cooldown_time = 30 //How long, in deciseconds, the cooldown of ranged attacks is var/ranged_ignores_vision = FALSE //if it'll fire ranged attacks even if it lacks vision on its target, only works with environment smash - var/check_friendly_fire = 0 // Should the ranged mob check for friendlies when shooting + var/check_friendly_fire = FALSE // Should the ranged mob check for friendlies when shooting var/retreat_distance = null //If our mob runs from players when they're too close, set in tile distance. By default, mobs do not retreat. var/minimum_distance = 1 //Minimum approach distance, so ranged mobs chase targets down, but still keep their distance set in tiles to the target, set higher to make mobs keep distance diff --git a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm b/code/modules/mob/living/simple_animal/hostile/human/cat_butcher.dm similarity index 88% rename from code/modules/mob/living/simple_animal/hostile/cat_butcher.dm rename to code/modules/mob/living/simple_animal/hostile/human/cat_butcher.dm index 8da384aaca4b..0e265fc3b531 100644 --- a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/cat_butcher.dm @@ -1,41 +1,27 @@ -/mob/living/simple_animal/hostile/cat_butcherer +/mob/living/simple_animal/hostile/human/cat_butcherer name = "Cat Surgeon" desc = "Feline genemod physiological modification surgery is outlawed in Nanotrasen-controlled sectors. This doctor doesn't seem to care, and thus, is wanted for several warcrimes." - icon = 'icons/mob/simple_human.dmi' icon_state = "cat_butcher" icon_living = "cat_butcher" - icon_dead = "syndicate_dead" - icon_gib = "syndicate_gib" projectiletype = /obj/projectile/bullet/dart/tranq projectilesound = 'sound/items/syringeproj.ogg' - ranged = 1 + ranged = TRUE ranged_message = "fires the syringe gun at" ranged_cooldown_time = 30 speak_chance = 0 - turns_per_move = 5 - speed = 0 stat_attack = HARD_CRIT - robust_searching = 1 - maxHealth = 100 - health = 100 - harm_intent_damage = 5 melee_damage_lower = 15 melee_damage_upper = 15 attack_verb_continuous = "slashes at" attack_verb_simple = "slash at" attack_sound = 'sound/weapons/circsawhit.ogg' - a_intent = INTENT_HARM - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID loot = list(/obj/effect/mob_spawn/human/corpse/cat_butcher, /obj/item/circular_saw, /obj/item/gun/syringe) atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 15 faction = list("hostile") - check_friendly_fire = 1 - status_flags = CANPUSH - del_on_death = 1 + check_friendly_fire = TRUE var/impatience = 0 -/mob/living/simple_animal/hostile/cat_butcherer/CanAttack(atom/the_target) +/mob/living/simple_animal/hostile/human/cat_butcherer/CanAttack(atom/the_target) if(iscarbon(target)) var/mob/living/carbon/human/C = target if(C.getorgan(/obj/item/organ/ears/cat) && C.getorgan(/obj/item/organ/tail/cat) && C.has_trauma_type(/datum/brain_trauma/severe/pacifism))//he wont attack his creations @@ -45,7 +31,7 @@ return FALSE return ..() -/mob/living/simple_animal/hostile/cat_butcherer/AttackingTarget() +/mob/living/simple_animal/hostile/human/cat_butcherer/AttackingTarget() if(iscarbon(target)) var/mob/living/carbon/human/L = target if(!L.getorgan(/obj/item/organ/ears/cat) && L.stat >= UNCONSCIOUS) //target doesnt have cat ears diff --git a/code/modules/mob/living/simple_animal/hostile/frontiersman.dm b/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm similarity index 70% rename from code/modules/mob/living/simple_animal/hostile/frontiersman.dm rename to code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm index 213cd8c2b822..040b6b26ae2a 100644 --- a/code/modules/mob/living/simple_animal/hostile/frontiersman.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/frontiersman.dm @@ -1,36 +1,18 @@ -/mob/living/simple_animal/hostile/frontier +/mob/living/simple_animal/hostile/human/frontier name = "Frontiersman" desc = "A frontiersman! A terrorist that would probably kill everyone without mercy." - icon = 'icons/mob/simple_human.dmi' icon_state = "frontiersmanmelee" icon_living = "frontiersmanmelee" icon_dead = "frontiersmanmelee_dead" - icon_gib = "syndicate_gib" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 0 - turns_per_move = 5 - speed = 0 - maxHealth = 100 - health = 100 - harm_intent_damage = 5 melee_damage_lower = 15 melee_damage_upper = 15 - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' - a_intent = INTENT_HARM loot = list(/obj/effect/mob_spawn/human/corpse/frontier, /obj/item/kitchen/knife) atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 15 faction = list(FACTION_ANTAG_FRONTIERSMEN) - status_flags = CANPUSH - del_on_death = 1 - footstep_type = FOOTSTEP_MOB_SHOE - - -/mob/living/simple_animal/hostile/frontier/ranged +/mob/living/simple_animal/hostile/human/frontier/ranged icon_state = "frontiersmanranged" icon_living = "frontiersmanranged" loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged, @@ -41,10 +23,10 @@ projectilesound = 'sound/weapons/gun/revolver/shot.ogg' casingtype = /obj/item/ammo_casing/a357 -/mob/living/simple_animal/hostile/frontier/ranged/neutered +/mob/living/simple_animal/hostile/human/frontier/ranged/neutered loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged) -/mob/living/simple_animal/hostile/frontier/ranged/mosin +/mob/living/simple_animal/hostile/human/frontier/ranged/mosin icon_state = "frontiersmanrangedrifle" icon_living = "frontiersmanrangedrifle" loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged, @@ -52,10 +34,10 @@ casingtype = /obj/item/ammo_casing/a8_50r projectilesound = 'sound/weapons/gun/rifle/mosin.ogg' -/mob/living/simple_animal/hostile/frontier/ranged/mosin/neutered +/mob/living/simple_animal/hostile/human/frontier/ranged/mosin/neutered loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged) -/mob/living/simple_animal/hostile/frontier/ranged/trooper +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper icon_state = "frontiersmanrangedelite" icon_living = "frontiersmanrangedelite" maxHealth = 170 @@ -65,10 +47,10 @@ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper, /obj/item/gun/ballistic/shotgun/brimstone) -/mob/living/simple_animal/hostile/frontier/ranged/trooper/neutered +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/neutered loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper) -/mob/living/simple_animal/hostile/frontier/ranged/trooper/skm +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/skm icon_state = "frontiersmanrangedak47" icon_living = "frontiersmanrangedak47" projectilesound = 'sound/weapons/gun/rifle/skm.ogg' @@ -78,10 +60,10 @@ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper, /obj/item/gun/ballistic/automatic/assault/skm) -/mob/living/simple_animal/hostile/frontier/ranged/trooper/skm/neutured +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/skm/neutured loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper) -/mob/living/simple_animal/hostile/frontier/ranged/trooper/rifle +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle icon_state = "frontiersmanrangedmosin" icon_living = "frontiersmanrangedmosin" @@ -90,10 +72,10 @@ casingtype = /obj/item/ammo_casing/a8_50r projectilesound = 'sound/weapons/gun/rifle/mosin.ogg' -/mob/living/simple_animal/hostile/frontier/ranged/trooper/rifle/neutered +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/rifle/neutered loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper) -/mob/living/simple_animal/hostile/frontier/ranged/trooper/heavy +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy icon_state = "frontiersmanrangedminigun" icon_living = "frontiersmanrangedminigun" projectilesound = 'sound/weapons/laser4.ogg' @@ -105,10 +87,10 @@ projectiletype = /obj/projectile/beam/weak/penetrator loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy) -/mob/living/simple_animal/hostile/frontier/ranged/trooper/heavy/neutered +/mob/living/simple_animal/hostile/human/frontier/ranged/trooper/heavy/neutered loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/trooper/heavy/gunless) -/mob/living/simple_animal/hostile/frontier/ranged/officer +/mob/living/simple_animal/hostile/human/frontier/ranged/officer name = "Frontiersman Officer" icon_state = "frontiersmanofficer" icon_living = "frontiersmanofficer" @@ -119,10 +101,10 @@ loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer, /obj/item/gun/ballistic/automatic/pistol/APS) -/mob/living/simple_animal/hostile/frontier/ranged/officer/neutured +/mob/living/simple_animal/hostile/human/frontier/ranged/officer/neutured loot = list(/obj/effect/mob_spawn/human/corpse/frontier/ranged/officer) -/mob/living/simple_animal/hostile/frontier/ranged/officer/Aggro() +/mob/living/simple_animal/hostile/human/frontier/ranged/officer/Aggro() ..() summon_backup(15) say(pick("Help!!", "They're right here!!", "Don't let me die!!")) diff --git a/code/modules/mob/living/simple_animal/hostile/human/human.dm b/code/modules/mob/living/simple_animal/hostile/human/human.dm new file mode 100644 index 000000000000..633bd40090e8 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/human/human.dm @@ -0,0 +1,41 @@ +/mob/living/simple_animal/hostile/human + name = "crazed human" + desc = "A crazed human, they cannot be reasoned with" + icon = 'icons/mob/simple_human.dmi' + icon_state = "survivor_base" + icon_living = "survivor_base" + icon_dead = null + icon_gib = "syndicate_gib" + mob_biotypes = MOB_ORGANIC|MOB_HUMANOID + + speak_chance = 20 + speak_emote = list("groans") + + turns_per_move = 5 + speed = 0 + maxHealth = 100 + health = 100 + + robust_searching = TRUE + harm_intent_damage = 5 + melee_damage_lower = 10 + melee_damage_upper = 10 + attack_verb_continuous = "punches" + attack_verb_simple = "punch" + attack_sound = 'sound/weapons/punch1.ogg' + a_intent = INTENT_HARM + response_help_continuous = "pushes" + response_help_simple = "push" + + loot = list(/obj/effect/mob_spawn/human/corpse/damaged) + del_on_death = TRUE + + atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + unsuitable_atmos_damage = 15 + minbodytemp = 180 + status_flags = CANPUSH + del_on_death = TRUE + + footstep_type = FOOTSTEP_MOB_SHOE + + faction = list("hermit") diff --git a/code/modules/mob/living/simple_animal/hostile/human/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/human/nanotrasen.dm new file mode 100644 index 000000000000..6c1676d202ab --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/human/nanotrasen.dm @@ -0,0 +1,80 @@ +/mob/living/simple_animal/hostile/human/nanotrasen + name = "\improper Nanotrasen Private Security Officer" + desc = "An officer part of Nanotrasen's private security force, he seems rather unpleased to meet you." + icon_state = "nanotrasen" + icon_living = "nanotrasen" + speak_chance = 0 + stat_attack = HARD_CRIT + melee_damage_upper = 15 + loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasensoldier) + atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + faction = list(ROLE_DEATHSQUAD) + check_friendly_fire = TRUE + dodging = TRUE + +/mob/living/simple_animal/hostile/human/nanotrasen/screaming + icon_state = "nanotrasen" + icon_living = "nanotrasen" + +/mob/living/simple_animal/hostile/human/nanotrasen/screaming/Aggro() + ..() + summon_backup(15) + say("411 in progress, requesting backup!") + + +/mob/living/simple_animal/hostile/human/nanotrasen/ranged + icon_state = "nanotrasenranged" + icon_living = "nanotrasenranged" + ranged = 1 + retreat_distance = 3 + minimum_distance = 5 + casingtype = /obj/item/ammo_casing/c45 + projectilesound = 'sound/weapons/gun/pistol/shot_alt.ogg' + + +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/smg + icon_state = "nanotrasenrangedsmg" + icon_living = "nanotrasenrangedsmg" + rapid = 3 + casingtype = /obj/item/ammo_casing/c46x30mm + projectilesound = 'sound/weapons/gun/smg/shot.ogg' + +/mob/living/simple_animal/hostile/human/nanotrasen/ranged/assault + name = "Nanotrasen Assault Officer" + desc = "A Nanotrasen Assault Officer. Prepare to die, if you've been found near Syndicate property." + icon_state = "nanotrasenrangedassault" + icon_living = "nanotrasenrangedassault" + icon_dead = null + icon_gib = "syndicate_gib" + ranged = TRUE + rapid = 4 + rapid_fire_delay = 1 + rapid_melee = 1 + retreat_distance = 2 + minimum_distance = 4 + casingtype = /obj/item/ammo_casing/c46x30mm + projectilesound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' + loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasenassaultsoldier) + +/mob/living/simple_animal/hostile/human/nanotrasen/elite + name = "Nanotrasen Elite Assault Officer" + desc = "Pray for your life, syndicate. Run while you can." + icon = 'icons/mob/simple_human.dmi' + icon_state = "nanotrasen_ert" + icon_living = "nanotrasen_ert" + maxHealth = 150 + health = 150 + melee_damage_lower = 13 + melee_damage_upper = 18 + ranged = TRUE + rapid = 3 + rapid_fire_delay = 5 + rapid_melee = 3 + retreat_distance = 0 + minimum_distance = 1 + atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + minbodytemp = 0 + projectiletype = /obj/projectile/beam/laser + projectilesound = 'sound/weapons/laser.ogg' + loot = list(/obj/effect/gibspawner/human) + faction = list(ROLE_DEATHSQUAD) diff --git a/code/modules/mob/living/simple_animal/hostile/pirate.dm b/code/modules/mob/living/simple_animal/hostile/human/pirate.dm similarity index 67% rename from code/modules/mob/living/simple_animal/hostile/pirate.dm rename to code/modules/mob/living/simple_animal/hostile/human/pirate.dm index b0bc7941fd69..df10cfa6a2b4 100644 --- a/code/modules/mob/living/simple_animal/hostile/pirate.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/pirate.dm @@ -1,35 +1,17 @@ -/mob/living/simple_animal/hostile/pirate +/mob/living/simple_animal/hostile/human/pirate name = "Pirate" desc = "Does what he wants cause a pirate is free." - icon = 'icons/mob/simple_human.dmi' icon_state = "piratemelee" icon_living = "piratemelee" icon_dead = "pirate_dead" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 0 - turns_per_move = 5 - response_help_continuous = "pushes" - response_help_simple = "push" - speed = 0 - maxHealth = 100 - health = 100 - harm_intent_damage = 5 - melee_damage_lower = 10 - melee_damage_upper = 10 - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' - a_intent = INTENT_HARM atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 15 speak_emote = list("yarrs") loot = list(/obj/effect/mob_spawn/human/corpse/pirate, /obj/item/melee/transforming/energy/sword/saber/pirate) - del_on_death = 1 faction = list("pirate") - -/mob/living/simple_animal/hostile/pirate/melee +/mob/living/simple_animal/hostile/human/pirate/melee name = "Pirate Swashbuckler" icon_state = "piratemelee" icon_living = "piratemelee" @@ -44,7 +26,7 @@ footstep_type = FOOTSTEP_MOB_SHOE -/mob/living/simple_animal/hostile/pirate/melee/space +/mob/living/simple_animal/hostile/human/pirate/melee/space name = "Space Pirate Swashbuckler" icon_state = "piratespace" icon_living = "piratespace" @@ -53,23 +35,23 @@ minbodytemp = 0 speed = 1 -/mob/living/simple_animal/hostile/pirate/melee/space/Initialize() +/mob/living/simple_animal/hostile/human/pirate/melee/space/Initialize() . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) -/mob/living/simple_animal/hostile/pirate/melee/Initialize() +/mob/living/simple_animal/hostile/human/pirate/melee/Initialize() . = ..() sord = new(src) -/mob/living/simple_animal/hostile/pirate/melee/Destroy() +/mob/living/simple_animal/hostile/human/pirate/melee/Destroy() QDEL_NULL(sord) return ..() -/mob/living/simple_animal/hostile/pirate/melee/Initialize() +/mob/living/simple_animal/hostile/human/pirate/melee/Initialize() . = ..() set_light(2) -/mob/living/simple_animal/hostile/pirate/ranged +/mob/living/simple_animal/hostile/human/pirate/ranged name = "Pirate Gunner" icon_state = "pirateranged" icon_living = "pirateranged" @@ -84,7 +66,7 @@ loot = list(/obj/effect/mob_spawn/human/corpse/pirate/ranged, /obj/item/gun/energy/laser) -/mob/living/simple_animal/hostile/pirate/ranged/space +/mob/living/simple_animal/hostile/human/pirate/ranged/space name = "Space Pirate Gunner" icon_state = "piratespaceranged" icon_living = "piratespaceranged" @@ -93,6 +75,6 @@ minbodytemp = 0 speed = 1 -/mob/living/simple_animal/hostile/pirate/ranged/space/Initialize() +/mob/living/simple_animal/hostile/human/pirate/ranged/space/Initialize() . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/human/skeleton.dm similarity index 87% rename from code/modules/mob/living/simple_animal/hostile/skeleton.dm rename to code/modules/mob/living/simple_animal/hostile/human/skeleton.dm index 978353978e9a..675c6fc99342 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/skeleton.dm @@ -1,20 +1,16 @@ -/mob/living/simple_animal/hostile/skeleton +/mob/living/simple_animal/hostile/human/skeleton name = "reanimated skeleton" desc = "A real bonefied skeleton, doesn't seem like it wants to socialize." - icon = 'icons/mob/simple_human.dmi' icon_state = "skeleton" icon_living = "skeleton" icon_dead = "skeleton" gender = NEUTER mob_biotypes = MOB_UNDEAD|MOB_HUMANOID - turns_per_move = 5 speak_emote = list("rattles") emote_see = list("rattles") - a_intent = INTENT_HARM maxHealth = 40 health = 40 speed = 1 - harm_intent_damage = 5 melee_damage_lower = 15 melee_damage_upper = 15 minbodytemp = 0 @@ -25,18 +21,15 @@ attack_sound = 'sound/hallucinations/growl1.ogg' atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) unsuitable_atmos_damage = 10 - robust_searching = 1 stat_attack = HARD_CRIT faction = list("skeleton") see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE deathmessage = "collapses into a pile of bones!" - del_on_death = 1 loot = list(/obj/effect/decal/remains/human) - footstep_type = FOOTSTEP_MOB_SHOE -/mob/living/simple_animal/hostile/skeleton/templar +/mob/living/simple_animal/hostile/human/skeleton/templar name = "undead templar" desc = "The reanimated remains of a holy templar knight." icon_state = "templar" @@ -58,7 +51,7 @@ /obj/item/clothing/head/helmet/chaplain, /obj/item/claymore/weak{name = "holy sword"}) -/mob/living/simple_animal/hostile/skeleton/ice +/mob/living/simple_animal/hostile/human/skeleton/ice name = "ice skeleton" desc = "A reanimated skeleton protected by a thick sheet of natural ice armor. Looks slow, though." speed = 5 @@ -68,7 +61,7 @@ color = rgb(114,228,250) loot = list(/obj/effect/decal/remains/human{color = rgb(114,228,250)}) -/mob/living/simple_animal/hostile/skeleton/plasmaminer +/mob/living/simple_animal/hostile/human/skeleton/plasmaminer name = "shambling miner" desc = "A plasma-soaked miner, their exposed limbs turned into a grossly incandescent bone seemingly made of plasma." icon_state = "plasma_miner" @@ -86,7 +79,7 @@ deathmessage = "collapses into a pile of bones, their suit dissolving among the plasma!" loot = list(/obj/effect/decal/remains/plasma) -/mob/living/simple_animal/hostile/skeleton/plasmaminer/jackhammer +/mob/living/simple_animal/hostile/human/skeleton/plasmaminer/jackhammer desc = "A plasma-soaked miner, their exposed limbs turned into a grossly incandescent bone seemingly made of plasma. They seem to still have their mining tool in their hand, gripping tightly." icon_state = "plasma_miner_tool" icon_living = "plasma_miner_tool" @@ -101,6 +94,6 @@ attack_sound = 'sound/weapons/sonic_jackhammer.ogg' loot = list(/obj/effect/decal/remains/plasma, /obj/item/pickaxe/drill/jackhammer) -/mob/living/simple_animal/hostile/skeleton/plasmaminer/Initialize() +/mob/living/simple_animal/hostile/human/skeleton/plasmaminer/Initialize() . = ..() set_light(2) diff --git a/code/modules/mob/living/simple_animal/hostile/survivors.dm b/code/modules/mob/living/simple_animal/hostile/human/survivors.dm similarity index 88% rename from code/modules/mob/living/simple_animal/hostile/survivors.dm rename to code/modules/mob/living/simple_animal/hostile/human/survivors.dm index 2c350ab5ca55..4f8c758068ce 100644 --- a/code/modules/mob/living/simple_animal/hostile/survivors.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/survivors.dm @@ -1,38 +1,14 @@ -/mob/living/simple_animal/hostile/asteroid/whitesands +/mob/living/simple_animal/hostile/human/hermit name = "Whitesands Inhabitant" desc = "If you can read this, yell at a coder!" - icon = 'icons/mob/simple_human.dmi' icon_state = "survivor_base" icon_living = "survivor_base" - icon_dead = null - icon_gib = "syndicate_gib" - mob_biotypes = MOB_ORGANIC - minbodytemp = 180 - unsuitable_atmos_damage = 15 atmos_requirements = list("min_oxy" = 1, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 999, "min_n2" = 0, "max_n2" = 0) - speak_chance = 20 - turns_per_move = 5 - response_help_continuous = "pushes" - response_help_simple = "push" - speed = 0 - maxHealth = 100 - health = 100 - harm_intent_damage = 5 - melee_damage_lower = 10 - melee_damage_upper = 10 - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' - a_intent = INTENT_HARM - unsuitable_atmos_damage = 15 - speak_emote = list("groans") loot = list( /obj/effect/mob_spawn/human/corpse/damaged/whitesands ) - del_on_death = 1 - faction = list("hermit") -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor/death(gibbed) +/mob/living/simple_animal/hostile/human/hermit/survivor/death(gibbed) move_force = MOVE_FORCE_DEFAULT move_resist = MOVE_RESIST_DEFAULT pull_force = PULL_FORCE_DEFAULT @@ -41,23 +17,23 @@ visible_message("You notice a glimmering nugget of shiny metal.") ..() -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor +/mob/living/simple_animal/hostile/human/hermit/survivor name = "Hermit Wanderer" desc =" A wild-eyed figure, wearing tattered mining equipment and boasting a malformed body, twisted by the heavy metals and high background radiation of the sandworlds." loot = list( /obj/effect/mob_spawn/human/corpse/damaged/whitesands/survivor ) -/mob/living/simple_animal/hostile/asteroid/whitesands/survivor/random/Initialize() +/mob/living/simple_animal/hostile/human/hermit/survivor/random/Initialize() . = ..() if(prob(35)) - new /mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter(loc) + new /mob/living/simple_animal/hostile/human/hermit/ranged/hunter(loc) return INITIALIZE_HINT_QDEL if(prob(10)) - new /mob/living/simple_animal/hostile/asteroid/whitesands/ranged/gunslinger(loc) + new /mob/living/simple_animal/hostile/human/hermit/ranged/gunslinger(loc) return INITIALIZE_HINT_QDEL -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged +/mob/living/simple_animal/hostile/human/hermit/ranged icon_state = "survivor_hunter" icon_living = "survivor_hunter" projectiletype = null @@ -68,14 +44,14 @@ retreat_distance = 5 minimum_distance = 5 -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/hunter +/mob/living/simple_animal/hostile/human/hermit/ranged/hunter name = "Hermit Hunter" desc ="A wild-eyed figure. Watch out- he has a gun, and he remembers just enough of his old life to use it!" loot = list( /obj/effect/mob_spawn/human/corpse/damaged/whitesands/hunter, ) -/mob/living/simple_animal/hostile/asteroid/whitesands/ranged/gunslinger +/mob/living/simple_animal/hostile/human/hermit/ranged/gunslinger name = "Hermit Soldier" desc = "The miner's rebellion, though mostly underground, recieved a few good weapon shipments from an off-sector source. You should probably start running." icon_state = "survivor_gunslinger" diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm similarity index 73% rename from code/modules/mob/living/simple_animal/hostile/syndicate.dm rename to code/modules/mob/living/simple_animal/hostile/human/syndicate.dm index a05f79e473c8..b4769b647aad 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm @@ -1,12 +1,3 @@ -/* - CONTENTS - LINE 10 - BASE MOB - LINE 52 - SWORD AND SHIELD - LINE 164 - GUNS - LINE 267 - MISC -*/ - - ///////////////Base mob//////////// /obj/effect/light_emitter/red_energy_sword //used so there's a combination of both their head light and light coming off the energy sword set_luminosity = 2 @@ -14,44 +5,25 @@ light_color = COLOR_SOFT_RED -/mob/living/simple_animal/hostile/syndicate +/mob/living/simple_animal/hostile/human/syndicate name = "Ramzi Clique Operative" desc = "An ex-Syndicate pirate of the Ramzi Clique." - icon = 'icons/mob/simple_human.dmi' icon_state = "syndicate" icon_living = "syndicate" - icon_dead = "syndicate_dead" - icon_gib = "syndicate_gib" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID speak_chance = 0 - turns_per_move = 5 - speed = 0 stat_attack = HARD_CRIT - robust_searching = 1 - maxHealth = 100 - health = 100 - harm_intent_damage = 5 - melee_damage_lower = 10 - melee_damage_upper = 10 - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' - a_intent = INTENT_HARM loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier) atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) maxbodytemp = 400 unsuitable_atmos_damage = 15 faction = list(FACTION_ANTAG_SYNDICATE) - check_friendly_fire = 1 - status_flags = CANPUSH - del_on_death = 1 + check_friendly_fire = TRUE dodging = TRUE rapid_melee = 2 - footstep_type = FOOTSTEP_MOB_SHOE ///////////////Melee//////////// -/mob/living/simple_animal/hostile/syndicate/space +/mob/living/simple_animal/hostile/human/syndicate/space icon_state = "syndicate_space" icon_living = "syndicate_space" name = "Ramzi Clique Commando" @@ -62,19 +34,19 @@ maxbodytemp = 1000 speed = 1 -/mob/living/simple_animal/hostile/syndicate/space/Initialize() +/mob/living/simple_animal/hostile/human/syndicate/space/Initialize() . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) set_light(4) -/mob/living/simple_animal/hostile/syndicate/space/stormtrooper +/mob/living/simple_animal/hostile/human/syndicate/space/stormtrooper icon_state = "syndicate_stormtrooper" icon_living = "syndicate_stormtrooper" name = "Ramzi Clique Assault Trooper" maxHealth = 250 health = 250 -/mob/living/simple_animal/hostile/syndicate/melee //dude with a knife and no shields +/mob/living/simple_animal/hostile/human/syndicate/melee //dude with a knife and no shields melee_damage_lower = 15 melee_damage_upper = 15 icon_state = "syndicate_knife" @@ -86,7 +58,7 @@ status_flags = 0 var/projectile_deflect_chance = 0 -/mob/living/simple_animal/hostile/syndicate/melee/space +/mob/living/simple_animal/hostile/human/syndicate/melee/space icon_state = "syndicate_space_knife" icon_living = "syndicate_space_knife" name = "Ramzi Clique Commando" @@ -98,12 +70,12 @@ speed = 1 projectile_deflect_chance = 50 -/mob/living/simple_animal/hostile/syndicate/melee/space/Initialize() +/mob/living/simple_animal/hostile/human/syndicate/melee/space/Initialize() . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) set_light(4) -/mob/living/simple_animal/hostile/syndicate/melee/space/stormtrooper +/mob/living/simple_animal/hostile/human/syndicate/melee/space/stormtrooper icon_state = "syndicate_stormtrooper_knife" icon_living = "syndicate_stormtrooper_knife" name = "Ramzi Clique Stormtrooper" @@ -111,7 +83,7 @@ health = 250 projectile_deflect_chance = 50 -/mob/living/simple_animal/hostile/syndicate/melee/sword +/mob/living/simple_animal/hostile/human/syndicate/melee/sword melee_damage_lower = 30 melee_damage_upper = 30 icon_state = "syndicate_sword" @@ -125,21 +97,21 @@ var/obj/effect/light_emitter/red_energy_sword/sord projectile_deflect_chance = 50 -/mob/living/simple_animal/hostile/syndicate/melee/sword/Initialize() +/mob/living/simple_animal/hostile/human/syndicate/melee/sword/Initialize() . = ..() set_light(2) -/mob/living/simple_animal/hostile/syndicate/melee/sword/Destroy() +/mob/living/simple_animal/hostile/human/syndicate/melee/sword/Destroy() QDEL_NULL(sord) return ..() -/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(obj/projectile/Proj) +/mob/living/simple_animal/hostile/human/syndicate/melee/bullet_act(obj/projectile/Proj) if(prob(projectile_deflect_chance)) visible_message("[src] blocks [Proj] with its shield!") return BULLET_ACT_BLOCK return ..() -/mob/living/simple_animal/hostile/syndicate/melee/sword/space +/mob/living/simple_animal/hostile/human/syndicate/melee/sword/space icon_state = "syndicate_space_sword" icon_living = "syndicate_space_sword" name = "Ramzi Clique Commando" @@ -151,17 +123,17 @@ speed = 1 projectile_deflect_chance = 50 -/mob/living/simple_animal/hostile/syndicate/melee/sword/space/Initialize() +/mob/living/simple_animal/hostile/human/syndicate/melee/sword/space/Initialize() . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) sord = new(src) set_light(4) -/mob/living/simple_animal/hostile/syndicate/melee/sword/space/Destroy() +/mob/living/simple_animal/hostile/human/syndicate/melee/sword/space/Destroy() QDEL_NULL(sord) return ..() -/mob/living/simple_animal/hostile/syndicate/melee/sword/space/stormtrooper +/mob/living/simple_animal/hostile/human/syndicate/melee/sword/space/stormtrooper icon_state = "syndicate_stormtrooper_sword" icon_living = "syndicate_stormtrooper_sword" name = "Ramzi Clique Stormtrooper" @@ -171,7 +143,7 @@ ///////////////Guns//////////// -/mob/living/simple_animal/hostile/syndicate/ranged +/mob/living/simple_animal/hostile/human/syndicate/ranged ranged = 1 retreat_distance = 5 minimum_distance = 5 @@ -183,11 +155,11 @@ dodging = FALSE rapid_melee = 1 -/mob/living/simple_animal/hostile/syndicate/ranged/infiltrator //shuttle loan event +/mob/living/simple_animal/hostile/human/syndicate/ranged/infiltrator //shuttle loan event projectilesound = 'sound/weapons/gun/smg/shot_suppressed.ogg' loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier) -/mob/living/simple_animal/hostile/syndicate/ranged/space +/mob/living/simple_animal/hostile/human/syndicate/ranged/space icon_state = "syndicate_space_pistol" icon_living = "syndicate_space_pistol" name = "Ramzi Clique Commando" @@ -198,30 +170,30 @@ maxbodytemp = 1000 speed = 1 -/mob/living/simple_animal/hostile/syndicate/ranged/space/Initialize() +/mob/living/simple_animal/hostile/human/syndicate/ranged/space/Initialize() . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) set_light(4) -/mob/living/simple_animal/hostile/syndicate/ranged/space/stormtrooper +/mob/living/simple_animal/hostile/human/syndicate/ranged/space/stormtrooper icon_state = "syndicate_stormtrooper_pistol" icon_living = "syndicate_stormtrooper_pistol" name = "Ramzi Clique Stormtrooper" maxHealth = 250 health = 250 -/mob/living/simple_animal/hostile/syndicate/ranged/smg +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg rapid = 2 icon_state = "syndicate_smg" icon_living = "syndicate_smg" casingtype = /obj/item/ammo_casing/c45 projectilesound = 'sound/weapons/gun/smg/shot.ogg' -/mob/living/simple_animal/hostile/syndicate/ranged/smg/pilot //caravan ambush ruin +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/pilot //caravan ambush ruin name = "Ramzi Clique Salvage Pilot" loot = list(/obj/effect/mob_spawn/human/corpse/syndicatesoldier) -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space icon_state = "syndicate_space_smg" icon_living = "syndicate_space_smg" name = "Ramzi Clique Commando" @@ -232,19 +204,19 @@ maxbodytemp = 1000 speed = 1 -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space/Initialize() +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space/Initialize() . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) set_light(4) -/mob/living/simple_animal/hostile/syndicate/ranged/smg/space/stormtrooper +/mob/living/simple_animal/hostile/human/syndicate/ranged/smg/space/stormtrooper icon_state = "syndicate_stormtrooper_smg" icon_living = "syndicate_stormtrooper_smg" name = "Ramzi Clique Stormtrooper" maxHealth = 250 health = 250 -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun +/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun rapid = 2 rapid_fire_delay = 6 minimum_distance = 3 @@ -252,7 +224,7 @@ icon_living = "syndicate_shotgun" casingtype = /obj/item/ammo_casing/shotgun/buckshot //buckshot fired in a two-round burst. This will two-tap unarmored players. -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space +/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun/space icon_state = "syndicate_space_shotgun" icon_living = "syndicate_space_shotgun" name = "Ramzi Clique Commando" @@ -263,12 +235,12 @@ maxbodytemp = 1000 speed = 1 -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space/Initialize() +/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun/space/Initialize() . = ..() ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT) set_light(4) -/mob/living/simple_animal/hostile/syndicate/ranged/shotgun/space/stormtrooper +/mob/living/simple_animal/hostile/human/syndicate/ranged/shotgun/space/stormtrooper icon_state = "syndicate_stormtrooper_shotgun" icon_living = "syndicate_stormtrooper_shotgun" name = "Ramzi Clique Stormtrooper" @@ -277,13 +249,13 @@ ///////////////Misc//////////// -/mob/living/simple_animal/hostile/syndicate/civilian +/mob/living/simple_animal/hostile/human/syndicate/civilian minimum_distance = 10 retreat_distance = 10 obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE -/mob/living/simple_animal/hostile/syndicate/civilian/Aggro() +/mob/living/simple_animal/hostile/human/syndicate/civilian/Aggro() ..() summon_backup(15) say("GUARDS!!") diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/human/zombie.dm similarity index 83% rename from code/modules/mob/living/simple_animal/hostile/zombie.dm rename to code/modules/mob/living/simple_animal/hostile/human/zombie.dm index 6f1db7aaf996..7a12465b98bb 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/zombie.dm @@ -1,4 +1,4 @@ -/mob/living/simple_animal/hostile/zombie +/mob/living/simple_animal/hostile/human/zombie name = "Shambling Corpse" desc = "When there is no more room in hell, the dead will walk in outer space." icon = 'icons/mob/simple_human.dmi' @@ -19,16 +19,17 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 status_flags = CANPUSH + loot = list() del_on_death = 1 var/zombiejob = "Medical Doctor" var/infection_chance = 0 var/obj/effect/mob_spawn/human/corpse/delayed/corpse -/mob/living/simple_animal/hostile/zombie/Initialize(mapload) +/mob/living/simple_animal/hostile/human/zombie/Initialize(mapload) . = ..() INVOKE_ASYNC(src, PROC_REF(setup_visuals)) -/mob/living/simple_animal/hostile/zombie/proc/setup_visuals() +/mob/living/simple_animal/hostile/human/zombie/proc/setup_visuals() var/datum/preferences/dummy_prefs = new dummy_prefs.pref_species = new /datum/species/zombie dummy_prefs.randomise[RANDOM_BODY] = TRUE @@ -48,17 +49,17 @@ corpse.mob_species = /datum/species/zombie corpse.mob_name = name -/mob/living/simple_animal/hostile/zombie/AttackingTarget() +/mob/living/simple_animal/hostile/human/zombie/AttackingTarget() . = ..() if(. && ishuman(target) && prob(infection_chance)) try_to_zombie_infect(target) -/mob/living/simple_animal/hostile/zombie/drop_loot() +/mob/living/simple_animal/hostile/human/zombie/drop_loot() . = ..() corpse.forceMove(drop_location()) corpse.create() -/mob/living/simple_animal/hostile/zombie/kudzu +/mob/living/simple_animal/hostile/human/zombie/kudzu name = "shambling bramble" desc = "A shambling mass of vibrant vines and rotting flesh. " melee_damage_lower = 15 diff --git a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm index cf8a32af157c..2a60b3c52fc2 100644 --- a/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm +++ b/code/modules/mob/living/simple_animal/hostile/mecha_pilot.dm @@ -18,7 +18,7 @@ Featuring: */ -/mob/living/simple_animal/hostile/syndicate/mecha_pilot +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot name = "Syndicate Mecha Pilot" desc = "Death to Nanotrasen. This variant comes in MECHA DEATH flavour." wanted_objects = list() @@ -36,15 +36,15 @@ Featuring: var/smoke_chance = 20 //Chance to deploy smoke for crowd control var/retreat_chance = 40 //Chance to run away -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/no_mech spawn_mecha_type = null search_objects = 2 -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/Initialize() +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/no_mech/Initialize() . = ..() wanted_objects = typecacheof(/obj/mecha/combat, TRUE) -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path. +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/nanotrasen //nanotrasen are syndies! no it's just a weird path. name = "\improper Nanotrasen Mecha Pilot" desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour." icon_living = "nanotrasen" @@ -52,7 +52,7 @@ Featuring: faction = list("nanotrasen") spawn_mecha_type = /obj/mecha/combat/marauder/loaded -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/no_mech/nanotrasen +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/no_mech/nanotrasen name = "\improper Nanotrasen Mecha Pilot" desc = "Death to the Syndicate. This variant comes in MECHA DEATH flavour." icon_living = "nanotrasen" @@ -60,7 +60,7 @@ Featuring: faction = list("nanotrasen") -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Initialize() +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/Initialize() . = ..() if(spawn_mecha_type) var/obj/mecha/M = new spawn_mecha_type (get_turf(src)) @@ -68,7 +68,7 @@ Featuring: INVOKE_ASYNC(src, PROC_REF(enter_mecha), M) -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/enter_mecha(obj/mecha/M) +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/enter_mecha(obj/mecha/M) if(!M) return 0 LoseTarget() //Target was our mecha, so null it out @@ -93,7 +93,7 @@ Featuring: mecha.lights_action.Activate() -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/exit_mecha(obj/mecha/M) +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/exit_mecha(obj/mecha/M) if(!M) return 0 @@ -116,7 +116,7 @@ Featuring: walk(M,0)//end any lingering movement loops, to prevent the haunted mecha bug //Checks if a mecha is valid for theft -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/is_valid_mecha(obj/mecha/M) +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/is_valid_mecha(obj/mecha/M) if(!M) return 0 if(M.occupant) @@ -128,7 +128,7 @@ Featuring: return 1 -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/mecha_face_target(atom/A) +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/mecha_face_target(atom/A) if(mecha) var/dirto = get_dir(mecha,A) if(mecha.dir != dirto) //checking, because otherwise the mecha makes too many turn noises @@ -136,7 +136,7 @@ Featuring: -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/mecha_reload() +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/mecha_reload() if(mecha) for(var/equip in mecha.equipment) var/obj/item/mecha_parts/mecha_equipment/ME = equip @@ -144,7 +144,7 @@ Featuring: ME.rearm() -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = MECHA_RANGED) +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/proc/get_mecha_equip_by_flag(flag = MECHA_RANGED) . = list() if(mecha) for(var/equip in mecha.equipment) @@ -156,7 +156,7 @@ Featuring: //Pick a ranged weapon/tool //Fire it -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/OpenFire(atom/A) +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/OpenFire(atom/A) if(mecha) mecha_reload() mecha_face_target(A) @@ -171,7 +171,7 @@ Featuring: ..() -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/AttackingTarget() +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/AttackingTarget() if(mecha) var/list/possible_weapons = get_mecha_equip_by_flag(MECHA_MELEE) if(possible_weapons.len) @@ -198,7 +198,7 @@ Featuring: return target.attack_animal(src) -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/handle_automated_action() +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/handle_automated_action() if(..()) if(!mecha) for(var/obj/mecha/combat/C in range(src,vision_range)) @@ -245,12 +245,12 @@ Featuring: -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/death(gibbed) +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/death(gibbed) if(mecha) mecha.aimob_exit_mech(src) ..() -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/gib() +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/gib() if(mecha) mecha.aimob_exit_mech(src) ..() @@ -258,7 +258,7 @@ Featuring: //Yes they actually try and pull this shit //~simple animals~ -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/CanAttack(atom/the_target) +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/CanAttack(atom/the_target) if(ismecha(the_target)) var/obj/mecha/M = the_target if(mecha) @@ -275,19 +275,19 @@ Featuring: . = ..() -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/EscapeConfinement() +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/EscapeConfinement() if(mecha && loc == mecha) return 0 ..() -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Move(NewLoc,Dir=0,step_x=0,step_y=0) +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/Move(NewLoc,Dir=0,step_x=0,step_y=0) if(mecha && loc == mecha) return mecha.relaymove(src, Dir) return ..() -/mob/living/simple_animal/hostile/syndicate/mecha_pilot/Goto(target, delay, minimum_distance) +/mob/living/simple_animal/hostile/human/syndicate/mecha_pilot/Goto(target, delay, minimum_distance) if(mecha) walk_to(mecha, target, minimum_distance, mecha.step_in) else diff --git a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm b/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm deleted file mode 100644 index 4417e68e2ec1..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/nanotrasen.dm +++ /dev/null @@ -1,59 +0,0 @@ -/mob/living/simple_animal/hostile/nanotrasen - name = "\improper Nanotrasen Private Security Officer" - desc = "An officer part of Nanotrasen's private security force, he seems rather unpleased to meet you." - icon = 'icons/mob/simple_human.dmi' - icon_state = "nanotrasen" - icon_living = "nanotrasen" - icon_dead = null - icon_gib = "syndicate_gib" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - speak_chance = 0 - turns_per_move = 5 - speed = 0 - stat_attack = HARD_CRIT - robust_searching = 1 - maxHealth = 100 - health = 100 - harm_intent_damage = 5 - melee_damage_lower = 10 - melee_damage_upper = 15 - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' - a_intent = INTENT_HARM - loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasensoldier) - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 15 - faction = list(ROLE_DEATHSQUAD) - check_friendly_fire = TRUE - status_flags = CANPUSH - del_on_death = TRUE - dodging = TRUE - footstep_type = FOOTSTEP_MOB_SHOE - -/mob/living/simple_animal/hostile/nanotrasen/screaming - icon_state = "nanotrasen" - icon_living = "nanotrasen" - -/mob/living/simple_animal/hostile/nanotrasen/screaming/Aggro() - ..() - summon_backup(15) - say("411 in progress, requesting backup!") - - -/mob/living/simple_animal/hostile/nanotrasen/ranged - icon_state = "nanotrasenranged" - icon_living = "nanotrasenranged" - ranged = 1 - retreat_distance = 3 - minimum_distance = 5 - casingtype = /obj/item/ammo_casing/c45 - projectilesound = 'sound/weapons/gun/pistol/shot_alt.ogg' - - -/mob/living/simple_animal/hostile/nanotrasen/ranged/smg - icon_state = "nanotrasenrangedsmg" - icon_living = "nanotrasenrangedsmg" - rapid = 3 - casingtype = /obj/item/ammo_casing/c46x30mm - projectilesound = 'sound/weapons/gun/smg/shot.ogg' diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm deleted file mode 100644 index 1eb03b07650c..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/stickman.dm +++ /dev/null @@ -1,61 +0,0 @@ -/mob/living/simple_animal/hostile/stickman - name = "Angry Stick Man" - desc = "A being from a realm with only 2 dimensions. At least it's trying to stay faced towards you." - icon_state = "stickman" - icon_living = "stickman" - icon_dead = "stickman_dead" - icon_gib = "syndicate_gib" - mob_biotypes = MOB_HUMANOID - gender = MALE - speak_chance = 0 - turns_per_move = 5 - speed = 0 - stat_attack = HARD_CRIT - robust_searching = 1 - environment_smash = ENVIRONMENT_SMASH_NONE - maxHealth = 100 - health = 100 - harm_intent_damage = 5 - obj_damage = 0 - melee_damage_lower = 10 - melee_damage_upper = 10 - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' - a_intent = INTENT_HARM - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 15 - faction = list("hostile","stickman") - check_friendly_fire = 1 - status_flags = CANPUSH - var/datum/action/boss/wizard_summon_minions/changesummons = /datum/action/boss/wizard_summon_minions - var/summoned_by_wizard = 0 - -/mob/living/simple_animal/hostile/stickman/ranged - ranged = 1 - retreat_distance = 5 - minimum_distance = 5 - icon_state = "stickmanranged" - icon_living = "stickmanranged" - casingtype = /obj/item/ammo_casing/c45 - projectilesound = 'sound/misc/bang.ogg' - loot = list(/obj/item/gun/ballistic/automatic/pistol/stickman) - - -/mob/living/simple_animal/hostile/stickman/dog - name = "Angry Stick Dog" - desc = "Stickman's best friend, if he could see him at least." - icon_state = "stickdog" - icon_living = "stickdog" - icon_dead = "stickdog_dead" - mob_biotypes = MOB_BEAST - -/mob/living/simple_animal/hostile/stickman/Initialize(mapload, wizard_summoned) - . = ..() - new /obj/effect/temp_visual/paper_scatter(src) - summoned_by_wizard = wizard_summoned - -/mob/living/simple_animal/hostile/stickman/death() - ..() - if(summoned_by_wizard == 1) - changesummons.summoned_minions -- diff --git a/code/modules/mob/living/simple_animal/hostile/wizard.dm b/code/modules/mob/living/simple_animal/hostile/wizard.dm deleted file mode 100644 index 0d97a1f18869..000000000000 --- a/code/modules/mob/living/simple_animal/hostile/wizard.dm +++ /dev/null @@ -1,82 +0,0 @@ -/mob/living/simple_animal/hostile/wizard - name = "Space Wizard" - desc = "EI NATH?" - icon = 'icons/mob/simple_human.dmi' - icon_state = "wizard" - icon_living = "wizard" - icon_dead = "wizard_dead" - mob_biotypes = MOB_ORGANIC|MOB_HUMANOID - speak_chance = 0 - turns_per_move = 3 - speed = 0 - maxHealth = 100 - health = 100 - harm_intent_damage = 5 - melee_damage_lower = 5 - melee_damage_upper = 5 - attack_verb_continuous = "punches" - attack_verb_simple = "punch" - attack_sound = 'sound/weapons/punch1.ogg' - a_intent = INTENT_HARM - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 15 - faction = list(ROLE_WIZARD) - status_flags = CANPUSH - - retreat_distance = 3 //out of fireball range - minimum_distance = 3 - del_on_death = 1 - loot = list(/obj/effect/mob_spawn/human/corpse/wizard, - /obj/item/staff) - - var/obj/effect/proc_holder/spell/aimed/fireball/fireball = null - var/obj/effect/proc_holder/spell/targeted/turf_teleport/blink/blink = null - var/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/mm = null - - var/next_cast = 0 - - footstep_type = FOOTSTEP_MOB_SHOE - -/mob/living/simple_animal/hostile/wizard/Initialize() - . = ..() - fireball = new /obj/effect/proc_holder/spell/aimed/fireball - fireball.clothes_req = 0 - fireball.human_req = 0 - fireball.player_lock = 0 - AddSpell(fireball) - implants += new /obj/item/implant/exile(src) - - mm = new /obj/effect/proc_holder/spell/targeted/projectile/magic_missile - mm.clothes_req = 0 - mm.human_req = 0 - mm.player_lock = 0 - AddSpell(mm) - - blink = new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink - blink.clothes_req = 0 - blink.human_req = 0 - blink.player_lock = 0 - blink.outer_tele_radius = 3 - AddSpell(blink) - -/mob/living/simple_animal/hostile/wizard/handle_automated_action() - . = ..() - if(target && next_cast < world.time) - if((get_dir(src,target) in list(SOUTH,EAST,WEST,NORTH)) && fireball.cast_check(0,src)) //Lined up for fireball - src.setDir(get_dir(src,target)) - fireball.perform(list(target), user = src) - next_cast = world.time + 10 //One spell per second - return . - if(mm.cast_check(0,src)) - mm.choose_targets(src) - next_cast = world.time + 10 - return . - if(blink.cast_check(0,src)) //Spam Blink when you can - blink.choose_targets(src) - next_cast = world.time + 10 - return . - -/mob/living/simple_animal/hostile/wizard/planet - weather_immunities = list("lava","ash") - minbodytemp = 0 - maxbodytemp = INFINITY diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 458c19d053da..6ca85ca933ec 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -237,8 +237,6 @@ /mob/living/simple_animal/hostile/asteroid/goliath/beast, /mob/living/simple_animal/hostile/headcrab, /mob/living/simple_animal/hostile/morph, - /mob/living/simple_animal/hostile/stickman, - /mob/living/simple_animal/hostile/stickman/dog, /mob/living/simple_animal/hostile/megafauna/dragon/lesser, /mob/living/simple_animal/hostile/gorilla, /mob/living/simple_animal/parrot, diff --git a/code/modules/ruins/lavaland_ruin_code.dm b/code/modules/ruins/lavaland_ruin_code.dm index 1115224a6733..7f050c3ac5e5 100644 --- a/code/modules/ruins/lavaland_ruin_code.dm +++ b/code/modules/ruins/lavaland_ruin_code.dm @@ -75,7 +75,7 @@ /obj/effect/mob_spawn/human/lavaland_syndicate/comms/space/Initialize() . = ..() if(prob(90)) //only has a 10% chance of existing, otherwise it'll just be a NPC syndie. - new /mob/living/simple_animal/hostile/syndicate/ranged(get_turf(src)) + new /mob/living/simple_animal/hostile/human/syndicate/ranged(get_turf(src)) return INITIALIZE_HINT_QDEL /datum/outfit/lavaland_syndicate/comms diff --git a/code/modules/ruins/spaceruin_code/forgottenship.dm b/code/modules/ruins/spaceruin_code/forgottenship.dm index def148f22239..57b9f64bf60f 100644 --- a/code/modules/ruins/spaceruin_code/forgottenship.dm +++ b/code/modules/ruins/spaceruin_code/forgottenship.dm @@ -81,45 +81,3 @@ GLOBAL_VAR_INIT(fscpassword, generate_password()) area_flags = NOTELEPORT | UNIQUE_AREA //Cybersun hardsuit - -//Special NT NPCs - -/mob/living/simple_animal/hostile/nanotrasen/ranged/assault - name = "Nanotrasen Assault Officer" - desc = "A Nanotrasen Assault Officer. Prepare to die, if you've been found near Syndicate property." - icon_state = "nanotrasenrangedassault" - icon_living = "nanotrasenrangedassault" - icon_dead = null - icon_gib = "syndicate_gib" - ranged = TRUE - rapid = 4 - rapid_fire_delay = 1 - rapid_melee = 1 - retreat_distance = 2 - minimum_distance = 4 - casingtype = /obj/item/ammo_casing/c46x30mm - projectilesound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' - loot = list(/obj/effect/mob_spawn/human/corpse/nanotrasenassaultsoldier) - -/mob/living/simple_animal/hostile/nanotrasen/elite - name = "Nanotrasen Elite Assault Officer" - desc = "Pray for your life, syndicate. Run while you can." - icon = 'icons/mob/simple_human.dmi' - icon_state = "nanotrasen_ert" - icon_living = "nanotrasen_ert" - maxHealth = 150 - health = 150 - melee_damage_lower = 13 - melee_damage_upper = 18 - ranged = TRUE - rapid = 3 - rapid_fire_delay = 5 - rapid_melee = 3 - retreat_distance = 0 - minimum_distance = 1 - atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) - minbodytemp = 0 - projectiletype = /obj/projectile/beam/laser - projectilesound = 'sound/weapons/laser.ogg' - loot = list(/obj/effect/gibspawner/human) - faction = list(ROLE_DEATHSQUAD) diff --git a/icons/mob/simple_human.dmi b/icons/mob/simple_human.dmi index 83729d2a2ba4cd38b2587765da8216d41bf725ff..133544acc999c9fd4961b2177db92cb29bd76bc6 100644 GIT binary patch literal 113180 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 z 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

xm^b!l1Se^WRcW=d?9ossAB;LD$ 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

>0F0vy{VBd6GUbuE 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 Date: Sat, 1 Jun 2024 22:41:10 -0500 Subject: [PATCH 10/73] Automatic changelog generation for PR #2972 [ci skip] --- html/changelogs/AutoChangeLog-pr-2972.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2972.yml diff --git a/html/changelogs/AutoChangeLog-pr-2972.yml b/html/changelogs/AutoChangeLog-pr-2972.yml new file mode 100644 index 000000000000..49781e01d5a5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2972.yml @@ -0,0 +1,4 @@ +author: FalloutFalcon +changes: + - {refactor: refactored hostile humans} +delete-after: true From f2cdd508a185d656c87c52aeb4f4084c5086f1c6 Mon Sep 17 00:00:00 2001 From: Theos Date: Sat, 1 Jun 2024 23:31:21 -0400 Subject: [PATCH 11/73] Bandoliers now hold 40 items as intended (#3014) ## About The Pull Request Bandolier max items was set to 40 but max weight was not, meaning it only held up to 14 total weight which is significantly less than 40 ## Why It's Good For The Game Fix ## Changelog :cl: fix: bandoliers now hold the correct amount of bullets (several more) /:cl: Signed-off-by: Theos --- code/game/objects/items/storage/belt.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index bfe08526311b..3214f4915c72 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -698,6 +698,7 @@ . = ..() var/datum/component/storage/STR = GetComponent(/datum/component/storage) STR.max_items = 40 + STR.max_combined_w_class = 40 STR.display_numerical_stacking = TRUE STR.set_holdable(list( /obj/item/ammo_casing From 0784ce67a3497faf253790e4b2f87bf7e41534b5 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 1 Jun 2024 22:54:00 -0500 Subject: [PATCH 12/73] Automatic changelog generation for PR #3014 [ci skip] --- html/changelogs/AutoChangeLog-pr-3014.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3014.yml diff --git a/html/changelogs/AutoChangeLog-pr-3014.yml b/html/changelogs/AutoChangeLog-pr-3014.yml new file mode 100644 index 000000000000..d1aa452b59e7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3014.yml @@ -0,0 +1,4 @@ +author: SomeguyManperson +changes: + - {bugfix: bandoliers now hold the correct amount of bullets (several more)} +delete-after: true From f1b9477e113a4d83e362c69fe2aa565c01360e59 Mon Sep 17 00:00:00 2001 From: Theos Date: Sat, 1 Jun 2024 23:31:54 -0400 Subject: [PATCH 13/73] You cna no longer saw off guns with knives (#3028) ## About The Pull Request This was unintentional ## Why It's Good For The Game ## Changelog :cl: fix: gun sawing can now only be done with proper equipment (usually a saw)) /:cl: Signed-off-by: Theos --- code/modules/projectiles/guns/ballistic.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 4f3b80bf478a..13acf16c0ff2 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -425,7 +425,7 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( ///Handles all the logic of sawing off guns, /obj/item/gun/ballistic/proc/sawoff(mob/user, obj/item/saw) - if(!saw.get_sharpness() || !is_type_in_typecache(saw, GLOB.gun_saw_types) && !saw.tool_behaviour == TOOL_SAW) //needs to be sharp. Otherwise turned off eswords can cut this. + if(!saw.get_sharpness() || !is_type_in_typecache(saw, GLOB.gun_saw_types) && saw.tool_behaviour != TOOL_SAW) //needs to be sharp. Otherwise turned off eswords can cut this. return if(sawn_off) to_chat(user, "\The [src] is already shortened!") From d1ededc94317e97b2a59c50e8003f9234bbc4e30 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 1 Jun 2024 23:07:18 -0500 Subject: [PATCH 14/73] Automatic changelog generation for PR #3028 [ci skip] --- html/changelogs/AutoChangeLog-pr-3028.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3028.yml diff --git a/html/changelogs/AutoChangeLog-pr-3028.yml b/html/changelogs/AutoChangeLog-pr-3028.yml new file mode 100644 index 000000000000..4f9da2d642ab --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3028.yml @@ -0,0 +1,4 @@ +author: SomeguyManperson +changes: + - {bugfix: gun sawing can now only be done with proper equipment (usually a saw))} +delete-after: true From 37d5491adae40bc1cfa13c52f3edb976a15c9f61 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 1 Jun 2024 22:38:45 -0500 Subject: [PATCH 15/73] Thrown Thing Improvments (#2950) ## About The Pull Request My original goal was to let you trigger mines with thrown items Ports https://github.com/tgstation/tgstation/pull/60604 That pr allows thrown objects to target anything you can click on really. A side effect is you can bola a downed person so that's interesting It also fixed a bug we had which caused finalize() to get called twice though i don't think that original pr even noticed that. I added an hitby to landmines and other random items. Landmines trigger if they are hit with an object. the hitby for the mine can be anything more just proving it works. I added a movement type for thrown objects, it could probably just be flying however.. An old issue meant that throwing an item above a landmine it would trigger it. This made chain reactions a lot more common. I added a check to only care about ground based movement so you will only trigger a mine if your grounded https://github.com/shiptest-ss13/Shiptest/assets/86381784/c87a412c-a83f-49d5-a969-95bbb102e537 https://github.com/shiptest-ss13/Shiptest/assets/86381784/5f6c10e6-34f7-4e86-8267-6ea059a4a7c6 https://github.com/shiptest-ss13/Shiptest/assets/86381784/dee243fd-3a43-4027-8b1a-afe670d2be5d Right now you can throw a person on and off a landmine tho. Will fix before undraft ## Why It's Good For The Game Landmines can chain react but not overly so. Targeting things that don't block the bola adds some new options Allows for plenty of new neat interactions to be added ## Changelog :cl: add: You can trip landmines with a well placed throw add: New interaction with throwing things at bottles, lights, and bear traps add You can now target items and resting players with thrown objects. You have to click on them directly however. fix: The end of finalize no longer gets called twice and targeting items seems like an intended behavior that was lost /:cl: --- code/__DEFINES/flags.dm | 1 + code/_globalvars/bitfields.dm | 1 + code/controllers/subsystem/throwing.dm | 61 ++++++++++--------- code/game/atoms_movable.dm | 8 ++- code/game/objects/items/devices/mines.dm | 11 ++-- code/game/objects/items/handcuffs.dm | 5 ++ code/game/objects/items/puzzle_pieces.dm | 4 +- code/modules/food_and_drinks/drinks/drinks.dm | 39 +++++++----- .../food_and_drinks/drinks/drinks/bottle.dm | 32 ---------- code/modules/mob/living/living_defense.dm | 3 + code/modules/power/lighting.dm | 5 +- 11 files changed, 83 insertions(+), 87 deletions(-) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index e0ac4b177001..c27a78ffd2de 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -123,6 +123,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define FLOATING (1<<3) /// When moving, will Cross()/Uncross() everything, but won't stop or Bump() anything. #define PHASING (1<<4) +#define THROWN (1<<5) //Fire and Acid stuff, for resistance_flags #define LAVA_PROOF (1<<0) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 1dffeca4be1b..bbfb0d3a74c5 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -191,6 +191,7 @@ DEFINE_BITFIELD(movement_type, list( "GROUND" = GROUND, "PHASING" = PHASING, "VENTCRAWLING" = VENTCRAWLING, + "THROWN" = THROWN, )) DEFINE_BITFIELD(obj_flags, list( diff --git a/code/controllers/subsystem/throwing.dm b/code/controllers/subsystem/throwing.dm index 0260e952d10d..e8cd514eb48b 100644 --- a/code/controllers/subsystem/throwing.dm +++ b/code/controllers/subsystem/throwing.dm @@ -47,7 +47,7 @@ SUBSYSTEM_DEF(throwing) /datum/thrownthing var/atom/movable/thrownthing - var/atom/target + var/datum/weakref/initial_target var/turf/target_turf var/target_zone var/init_dir @@ -71,12 +71,13 @@ SUBSYSTEM_DEF(throwing) var/last_move = 0 -/datum/thrownthing/New(thrownthing, target, target_turf, init_dir, maxrange, speed, thrower, diagonals_first, force, gentle, callback, target_zone) +/datum/thrownthing/New(thrownthing, target, init_dir, maxrange, speed, thrower, diagonals_first, force, gentle, callback, target_zone) . = ..() src.thrownthing = thrownthing RegisterSignal(thrownthing, COMSIG_PARENT_QDELETING, PROC_REF(on_thrownthing_qdel)) - src.target = target - src.target_turf = target_turf + src.target_turf = get_turf(target) + if(target_turf != target) + src.initial_target = WEAKREF(target) src.init_dir = init_dir src.maxrange = maxrange src.speed = speed @@ -87,14 +88,13 @@ SUBSYSTEM_DEF(throwing) src.callback = callback src.target_zone = target_zone - /datum/thrownthing/Destroy() SSthrowing.processing -= thrownthing SSthrowing.currentrun -= thrownthing thrownthing.throwing = null thrownthing = null - target = null thrower = null + initial_target = null if(callback) QDEL_NULL(callback) //It stores a reference to the thrownthing, its source. Let's clean that. return ..() @@ -109,6 +109,7 @@ SUBSYSTEM_DEF(throwing) /datum/thrownthing/proc/tick() var/atom/movable/AM = thrownthing + AM.setMovetype(AM.movement_type | THROWN) if (!isturf(AM.loc) || !AM.throwing) finalize() return @@ -117,9 +118,17 @@ SUBSYSTEM_DEF(throwing) delayed_time += world.time - last_move return - if (dist_travelled && hitcheck()) //to catch sneaky things moving on our tile while we slept - finalize() - return + var/atom/movable/actual_target = initial_target?.resolve() + + if(dist_travelled) //to catch sneaky things moving on our tile while we slept + for(var/atom/movable/obstacle as anything in get_turf(thrownthing)) + if (obstacle == thrownthing || (obstacle == thrower && !ismob(thrownthing))) + continue + if(obstacle.pass_flags_self & LETPASSTHROW) + continue + if (obstacle == actual_target || (obstacle.density && !(obstacle.flags_1 & ON_BORDER_1))) + finalize(TRUE, obstacle) + return var/atom/step @@ -146,10 +155,15 @@ SUBSYSTEM_DEF(throwing) finalize() return - AM.Move(step, get_dir(AM, step), DELAY_TO_GLIDE_SIZE(1 / speed)) + if(!AM.Move(step, get_dir(AM, step), DELAY_TO_GLIDE_SIZE(1 / speed))) // we hit something during our move... + if(AM.throwing) // ...but finalize() wasn't called on Bump() because of a higher level definition that doesn't always call parent. + finalize() + return - if (!AM.throwing) // we hit something during our move - finalize(hit = TRUE) + dist_travelled++ + + if(actual_target && !(actual_target.pass_flags_self & LETPASSTHROW) && actual_target.loc == AM.loc) // we crossed a movable with no density (e.g. a mouse or APC) we intend to hit anyway. + finalize(TRUE, actual_target) return dist_travelled++ @@ -158,18 +172,19 @@ SUBSYSTEM_DEF(throwing) finalize() return -/datum/thrownthing/proc/finalize(hit = FALSE, target=null) +//If the target hasent been hit search for it in the turf we landed on. +/datum/thrownthing/proc/finalize(hit = FALSE, target = null) set waitfor = FALSE //done throwing, either because it hit something or it finished moving if(!thrownthing) return thrownthing.throwing = null + thrownthing.setMovetype(thrownthing.movement_type & ~THROWN) if (!hit) - for (var/thing in get_turf(thrownthing)) //looking for our target on the turf we land on. - var/atom/A = thing - if (A == target) + for (var/atom/movable/obstacle as anything in get_turf(thrownthing)) //looking for our target on the turf we land on. + if (obstacle == target) hit = TRUE - thrownthing.throw_impact(A, src) + thrownthing.throw_impact(obstacle, src) if(QDELETED(thrownthing)) //throw_impact can delete things, such as glasses smashing return //deletion should already be handled by on_thrownthing_qdel() break @@ -195,15 +210,3 @@ SUBSYSTEM_DEF(throwing) T.zFall(thrownthing) qdel(src) - -/datum/thrownthing/proc/hit_atom(atom/A) - finalize(hit=TRUE, target=A) - -/datum/thrownthing/proc/hitcheck() - for (var/thing in get_turf(thrownthing)) - var/atom/movable/AM = thing - if (AM == thrownthing || (AM == thrower && !ismob(thrownthing))) - continue - if (AM.density && !(AM.pass_flags_self & LETPASSTHROW) && !(AM.flags_1 & ON_BORDER_1)) - finalize(hit=TRUE, target=AM) - return TRUE diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 989db20efd1f..beb7cef2718f 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -624,7 +624,7 @@ SEND_SIGNAL(src, COMSIG_MOVABLE_BUMP, A) . = ..() if(!QDELETED(throwing)) - throwing.hit_atom(A) + throwing.finalize(hit = TRUE, target = A) . = TRUE if(QDELETED(A)) return @@ -821,7 +821,9 @@ var/impact_signal = SEND_SIGNAL(src, COMSIG_MOVABLE_IMPACT, hit_atom, throwingdatum) if(impact_signal & COMPONENT_MOVABLE_IMPACT_FLIP_HITPUSH) hitpush = FALSE // hacky, tie this to something else or a proper workaround later - + if(isturf(loc)) + var/turf/T = loc + T.Entered(src) if(impact_signal & ~COMPONENT_MOVABLE_IMPACT_NEVERMIND) // in case a signal interceptor broke or deleted the thing before we could process our hit return hit_atom.hitby(src, throwingdatum=throwingdatum, hitpush=hitpush) @@ -883,7 +885,7 @@ else target_zone = thrower.zone_selected - var/datum/thrownthing/TT = new(src, target, get_turf(target), get_dir(src, target), range, speed, thrower, diagonals_first, force, gentle, callback, target_zone) + var/datum/thrownthing/TT = new(src, target, get_dir(src, target), range, speed, thrower, diagonals_first, force, gentle, callback, target_zone) var/dist_x = abs(target.x - src.x) var/dist_y = abs(target.y - src.y) diff --git a/code/game/objects/items/devices/mines.dm b/code/game/objects/items/devices/mines.dm index 112e26e1303b..1772cbf497c3 100644 --- a/code/game/objects/items/devices/mines.dm +++ b/code/game/objects/items/devices/mines.dm @@ -212,11 +212,8 @@ SIGNAL_HANDLER if(!can_trigger(arrived)) return - // Flying = can't step on a mine - if(arrived.movement_type & FLYING) - return - //no cheap disarming - if(arrived.throwing && isitem(arrived)) + // All other movment types rn can easily avoid it + if(!(arrived.movement_type == GROUND)) return // Someone already on it if(foot_on_mine?.resolve()) @@ -257,6 +254,10 @@ clicked = FALSE . = ..() +/obj/item/mine/pressure/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + trigger_mine(AM) + ..() + //handles disarming(and failing to disarm) /obj/item/mine/pressure/attackby(obj/item/I, mob/user) if(I.tool_behaviour == TOOL_SCREWDRIVER) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 496fc07288ec..f41deb5598a6 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -272,6 +272,11 @@ update_appearance() playsound(src, 'sound/effects/snap.ogg', 50, TRUE) +/obj/item/restraints/legcuffs/beartrap/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + if(armed) + close_trap() + ..() + /obj/item/restraints/legcuffs/beartrap/proc/on_entered(datum/source, AM as mob|obj) SIGNAL_HANDLER if(armed && isturf(loc)) diff --git a/code/game/objects/items/puzzle_pieces.dm b/code/game/objects/items/puzzle_pieces.dm index 5d6b409e8d32..473bcd945c58 100644 --- a/code/game/objects/items/puzzle_pieces.dm +++ b/code/game/objects/items/puzzle_pieces.dm @@ -1,6 +1,6 @@ //************** -//*****Keys******************* -//************** ** ** +//*****Keys***** +//************** /obj/item/keycard name = "security keycard" desc = "This feels like it belongs to a door." diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 8f88924930f4..aa2830daee92 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -120,27 +120,36 @@ if(!.) //if the bottle wasn't caught smash(hit_atom, throwingdatum?.thrower, TRUE) -/obj/item/reagent_containers/food/drinks/proc/smash(atom/target, mob/thrower, ranged = FALSE) +/obj/item/reagent_containers/food/drinks/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + smash() + ..() + +/obj/item/reagent_containers/food/drinks/proc/smash(atom/target = FALSE, mob/thrower = FALSE, ranged = FALSE) if(!isGlass) return - if(QDELING(src) || !target || !(flags_1 & INITIALIZED_1)) //Invalid loc - return - if(bartender_check(target) && ranged) + if(QDELING(src) || !(flags_1 & INITIALIZED_1)) //Invalid loc return - var/obj/item/broken_bottle/B = new (loc) - B.icon_state = icon_state - var/icon/I = new(icon, icon_state) - I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1) - I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0)) - B.icon = I - B.name = "broken [name]" + if(target) + if(bartender_check(target) && ranged) + return + var/obj/item/broken_bottle/smashed_bottle = new (loc) + if(!ranged && thrower) + thrower.put_in_hands(smashed_bottle) + smashed_bottle.icon_state = icon_state + var/icon/new_icon = new(icon, icon_state) + new_icon.Blend(smashed_bottle.broken_outline, ICON_OVERLAY, rand(5), 1) + new_icon.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0)) + smashed_bottle.icon = new_icon + smashed_bottle.name = "broken [name]" if(prob(33)) - var/obj/item/shard/S = new(drop_location()) - target.Bumped(S) + var/obj/item/shard/new_shard = new(drop_location()) + if(target) + target.Bumped(new_shard) playsound(src, "shatter", 70, TRUE) - transfer_fingerprints_to(B) + transfer_fingerprints_to(smashed_bottle) qdel(src) - target.Bumped(B) + if(target) + target.Bumped(smashed_bottle) /obj/item/reagent_containers/food/drinks/bullet_act(obj/projectile/P) . = ..() diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 4da78a5989a1..c19fd9dd3baa 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -34,39 +34,7 @@ volume = 50 custom_price = 55 -/obj/item/reagent_containers/food/drinks/bottle/smash(mob/living/target, mob/thrower, ranged = FALSE) - if(QDELING(src) || !target || !(flags_1 & INITIALIZED_1)) //Invalid loc - return - //Creates a shattering noise and replaces the bottle with a broken_bottle - if(bartender_check(target) && ranged) - return - var/obj/item/broken_bottle/B = new (loc) - if(!ranged && thrower) - thrower.put_in_hands(B) - B.icon_state = icon_state - - var/icon/I = new('icons/obj/drinks/drinks.dmi', src.icon_state) - I.Blend(B.broken_outline, ICON_OVERLAY, rand(5), 1) - I.SwapColor(rgb(255, 0, 220, 255), rgb(0, 0, 0, 0)) - B.icon = I - - if(isGlass) - if(prob(33)) - var/obj/item/shard/S = new(drop_location()) - target.Bumped(S) - playsound(src, "shatter", 70, TRUE) - else - B.force = 0 - B.throwforce = 0 - B.desc = "A carton with the bottom half burst open. Might give you a papercut." - B.name = "broken [name]" - transfer_fingerprints_to(B) - - qdel(src) - target.Bumped(B) - /obj/item/reagent_containers/food/drinks/bottle/attack(mob/living/target, mob/living/user) - if(!target) return diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 86c85d27360a..977cb220568e 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -101,6 +101,9 @@ return 1 else playsound(loc, 'sound/weapons/genhit.ogg', 50, TRUE, -1) //Item sounds are handled in the item itself + + if(body_position == LYING_DOWN) // physics says it's significantly harder to push someone by constantly chucking random furniture at them if they are down on the floor. + hitpush = FALSE ..() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index b4748c674fc6..e92efb779d67 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -857,8 +857,11 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/light/small/built, 28) if(!..()) //not caught by a mob shatter() -// update the icon state and description of the light +/obj/item/light/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + shatter() + ..() +// update the icon state and description of the light /obj/item/light/proc/update() switch(status) if(LIGHT_OK) From 5cb5989f4a56074892c905f46834d7d9fef6e4e9 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 1 Jun 2024 23:23:34 -0500 Subject: [PATCH 16/73] Automatic changelog generation for PR #2950 [ci skip] --- html/changelogs/AutoChangeLog-pr-2950.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2950.yml diff --git a/html/changelogs/AutoChangeLog-pr-2950.yml b/html/changelogs/AutoChangeLog-pr-2950.yml new file mode 100644 index 000000000000..2086c0a24242 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2950.yml @@ -0,0 +1,7 @@ +author: FalloutFalcon +changes: + - {rscadd: You can trip landmines with a well placed throw} + - {rscadd: 'New interaction with throwing things at bottles, lights, and bear traps'} + - {bugfix: The end of finalize no longer gets called twice and targeting items seems + like an intended behavior that was lost} +delete-after: true From fe03c933d11dc8189cb98f91d7c5ac6cec6387bb Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 1 Jun 2024 22:39:13 -0500 Subject: [PATCH 17/73] Smokers can now pick what they smoke (#2964) ## About The Pull Request Finishes #2444 which I think I told val I was going to do ## Why It's Good For The Game ## Changelog :cl: add: Smokers rejoice! You can now pick your favorite type of nicotine delivery system. add: Smokers have a choice between most brands of cigarette, cigars, a vape, or a pipe! /:cl: --------- Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Co-authored-by: Bjarl <94164348+Bjarl@users.noreply.github.com> --- code/_globalvars/lists/flavor_misc.dm | 16 +++++++ code/controllers/subsystem/traumas.dm | 4 +- code/datums/mood_events/drug_events.dm | 6 +-- code/datums/traits/negative.dm | 49 +++++++++++++++++---- code/game/objects/items/storage/fancy.dm | 10 ++--- code/modules/client/preferences.dm | 10 +++++ code/modules/client/preferences_savefile.dm | 2 + code/modules/reagents/chemistry/holder.dm | 2 +- 8 files changed, 80 insertions(+), 19 deletions(-) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 479e43e34543..f4f000be6d57 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -189,6 +189,22 @@ GLOBAL_LIST_INIT(exowearlist, list(PREF_NOEXOWEAR, PREF_EXOWEAR, PREF_ALTEXOWEAR #define UPLINK_PEN "Pen" //like a real spy! GLOBAL_LIST_INIT(uplink_spawn_loc_list, list(UPLINK_PDA, UPLINK_RADIO, UPLINK_PEN)) +//favorite cigarette brand +#define PREF_CIG_SPACE "Space Cigarettes" +#define PREF_CIG_DROMEDARY "DromedaryCo Cigarettes" +#define PREF_CIG_UPLIFT "Uplift Smooth Cigarettes" +#define PREF_CIG_ROBUST "Robust Cigarettes" +#define PREF_CIG_ROBUSTGOLD "Robust Gold Cigarettes" +#define PREF_CIG_CARP "Carp Classic Cigarettes" +#define PREF_CIG_MIDORI "Midori Taboko Rollies" +#define PREF_CIGAR "Premium Cigars" +#define PREF_CIGAR_SOLAR "Solarian Cigars" +#define PREF_CIGAR_COHIBA "Cohiba Cigars" +#define PREF_VAPE "Vape Pen" +#define PREF_PIPE "Fancy Pipe" + +GLOBAL_LIST_INIT(valid_smoke_types, sortList(list(PREF_CIG_SPACE, PREF_CIG_DROMEDARY, PREF_CIG_UPLIFT, PREF_CIG_ROBUST, PREF_CIG_ROBUSTGOLD, PREF_CIG_CARP, PREF_CIG_MIDORI, PREF_CIGAR, PREF_CIGAR_SOLAR, PREF_CIGAR_COHIBA, PREF_VAPE, PREF_PIPE))) + //Female Uniforms GLOBAL_LIST_EMPTY(female_clothing_icons) //Alternate species icons diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index b3009b2fdc03..3dc5553b7381 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -90,10 +90,10 @@ SUBSYSTEM_DEF(traumas) /obj/item/clothing/under/rank/command/captain, /obj/item/clothing/under/rank/security/head_of_security, /obj/item/clothing/under/rank/engineering/chief_engineer, /obj/item/clothing/under/rank/medical/chief_medical_officer, /obj/item/clothing/under/rank/command/head_of_personnel, /obj/item/clothing/under/rank/rnd/research_director, - /obj/item/clothing/under/rank/security/head_of_security/alt,//WS Edit - Better security jumpsuit sprites + /obj/item/clothing/under/rank/security/head_of_security/alt, /obj/item/clothing/under/rank/rnd/research_director/alt, /obj/item/clothing/under/rank/rnd/research_director/turtleneck, /obj/item/clothing/under/rank/security/head_of_security/parade, - /obj/item/clothing/under/rank/security/head_of_security/parade/female, //WS Edit - Better Command Uniforms + /obj/item/clothing/under/rank/security/head_of_security/parade/female, /obj/item/clothing/head/helmet/abductor, /obj/item/clothing/suit/armor/abductor/vest, /obj/item/melee/baton/abductor, /obj/item/storage/belt/military/abductor, /obj/item/gun/energy/alien, /obj/item/abductor/silencer, /obj/item/abductor/gizmo, /obj/item/clothing/under/rank/centcom/official, diff --git a/code/datums/mood_events/drug_events.dm b/code/datums/mood_events/drug_events.dm index 6af401e8b009..028973c5c839 100644 --- a/code/datums/mood_events/drug_events.dm +++ b/code/datums/mood_events/drug_events.dm @@ -4,12 +4,12 @@ /datum/mood_event/smoked description = "I have had a smoke recently.\n" - mood_change = 2 + mood_change = 1 timeout = 6 MINUTES /datum/mood_event/wrong_brand - description = "I hate that brand of cigarettes.\n" - mood_change = -2 + description = "That brand of cigarette just doesn't hit right.\n" + mood_change = -1 timeout = 6 MINUTES /datum/mood_event/overdose diff --git a/code/datums/traits/negative.dm b/code/datums/traits/negative.dm index 3cbc091cc62a..d1a8fd6acaa5 100644 --- a/code/datums/traits/negative.dm +++ b/code/datums/traits/negative.dm @@ -584,24 +584,57 @@ reagent_type = /datum/reagent/drug/nicotine accessory_type = /obj/item/lighter/greyscale +//I fucking hate prefscode + /datum/quirk/junkie/smoker/on_spawn() - drug_container_type = pick(/obj/item/storage/fancy/cigarettes, - /obj/item/storage/fancy/cigarettes/cigpack_midori, - /obj/item/storage/fancy/cigarettes/cigpack_uplift, - /obj/item/storage/fancy/cigarettes/cigpack_robust, - /obj/item/storage/fancy/cigarettes/cigpack_robustgold, - /obj/item/storage/fancy/cigarettes/cigpack_carp) + var/mob/living/carbon/human/H = quirk_holder + switch (H.client?.prefs.preferred_smoke_brand) + if (PREF_CIG_SPACE) + drug_container_type = /obj/item/storage/fancy/cigarettes + if (PREF_CIG_DROMEDARY) + drug_container_type = /obj/item/storage/fancy/cigarettes/dromedaryco + if (PREF_CIG_UPLIFT) + drug_container_type = /obj/item/storage/fancy/cigarettes/cigpack_uplift + if (PREF_CIG_ROBUST) + drug_container_type = /obj/item/storage/fancy/cigarettes/cigpack_robust + if (PREF_CIG_ROBUSTGOLD) + drug_container_type = /obj/item/storage/fancy/cigarettes/cigpack_robustgold + if (PREF_CIG_CARP) + drug_container_type= /obj/item/storage/fancy/cigarettes/cigpack_carp + if (PREF_CIG_MIDORI) + drug_container_type = /obj/item/storage/fancy/cigarettes/cigpack_midori + if (PREF_CIGAR) + drug_container_type = /obj/item/storage/fancy/cigarettes/cigars + accessory_type = /obj/item/storage/box/matches + if (PREF_CIGAR_SOLAR) + drug_container_type = /obj/item/storage/fancy/cigarettes/cigars/havana + accessory_type = /obj/item/storage/box/matches + if (PREF_CIGAR_COHIBA) + drug_container_type = /obj/item/storage/fancy/cigarettes/cigars/cohiba + accessory_type = /obj/item/storage/box/matches + if (PREF_VAPE) + drug_container_type = /obj/item/clothing/mask/vape + accessory_type = null + if (PREF_PIPE) + drug_container_type = /obj/item/clothing/mask/cigarette/pipe + accessory_type = /obj/item/storage/box/matches + else + CRASH("Someone had an improper cigarette pref on loading") . = ..() /datum/quirk/junkie/smoker/announce_drugs() - to_chat(quirk_holder, "There is a [initial(drug_container_type.name)] [where_drug], and a lighter [where_accessory]. Make sure you get your favorite brand when you run out.") - + if(accessory_type == null) + to_chat(quirk_holder, "There is a [initial(drug_container_type.name)] [where_drug], Make sure you get a refill soon.") + return + to_chat(quirk_holder, "There is a [initial(drug_container_type.name)] [where_drug], and a [initial(accessory_type.name)] [where_accessory]. Make sure you get your favorite brand when you run out.") /datum/quirk/junkie/smoker/on_process() . = ..() var/mob/living/carbon/human/H = quirk_holder var/obj/item/I = H.get_item_by_slot(ITEM_SLOT_MASK) if (istype(I, /obj/item/clothing/mask/cigarette)) + if(I == drug_container_type) + return var/obj/item/storage/fancy/cigarettes/C = drug_container_type if(istype(I, initial(C.spawn_type))) SEND_SIGNAL(quirk_holder, COMSIG_CLEAR_MOOD_EVENT, "wrong_cigs") diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 41f214998ffd..01307d92a0f8 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -163,7 +163,7 @@ //////////// /obj/item/storage/fancy/cigarettes name = "\improper Space Cigarettes packet" - desc = "The most popular brand of cigarettes, sponsors of the Space Olympics." + desc = "The most popular brand of cigarettes on the Frontier." icon = 'icons/obj/cigarettes.dmi' base_icon_state = "cig" icon_state = "cig" @@ -273,14 +273,14 @@ /obj/item/storage/fancy/cigarettes/cigpack_carp name = "\improper Carp Classic packet" - desc = "Since 2313." + desc = "Since 207 FS." icon_state = "carp" base_icon_state = "carp" spawn_type = /obj/item/clothing/mask/cigarette/carp /obj/item/storage/fancy/cigarettes/cigpack_syndicate name = "cigarette packet" - desc = "An obscure brand of cigarettes." + desc = "A semi-obscure brand of cigarettes, favored by interstellar miners." icon_state = "syndie" base_icon_state = "syndie" spawn_type = /obj/item/clothing/mask/cigarette/syndicate @@ -322,7 +322,7 @@ /obj/item/storage/fancy/cigarettes/cigpack_mindbreaker name = "\improper Leary's Delight packet" - desc = "Banned in over 36 galaxies." + desc = "Banned in over 36 Sectors." icon_state = "shadyjim" base_icon_state = "shadyjim" spawn_type = /obj/item/clothing/mask/cigarette/rollie/mindbreaker @@ -435,7 +435,7 @@ /obj/item/storage/fancy/cigarettes/cigars/havana name = "\improper premium Havanian cigar case" - desc = "A case of classy Havanian cigars." + desc = "Even after centuries of Solarian export, Havana smooth is only found in proper terran cigars." icon_state = "cohibacase" base_icon_state = "cohibacase" spawn_type = /obj/item/clothing/mask/cigarette/cigar/havana diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index b1aef68b112b..c6bb71eafc33 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -154,6 +154,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) ) var/fbp = FALSE var/phobia = "spiders" + var/preferred_smoke_brand = PREF_CIG_SPACE var/list/alt_titles_preferences = list() var/list/custom_names = list() var/preferred_ai_core_display = "Blue" @@ -839,6 +840,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "[phobia]
" + if("Smoker" in all_quirks) + dat += "

Smoker

" + + dat += "[preferred_smoke_brand]
" + if("body_size" in pref_species.default_features) if(!mutant_category) dat += APPEARANCE_CATEGORY_COLUMN @@ -2078,6 +2084,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/phobiaType = input(user, "What are you scared of?", "Character Preference", phobia) as null|anything in SStraumas.phobia_types if(phobiaType) phobia = phobiaType + if("preferred_smoke_brand") + var/smokeBrand = input(user, "What cigarettes are your favorite?", "Character Preference", preferred_smoke_brand) as null|anything in GLOB.valid_smoke_types + if(smokeBrand) + preferred_smoke_brand = smokeBrand if("generic_adjective") var/selectAdj diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index cce6b66ac612..b53d761c41da 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -405,6 +405,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car READ_FILE(S["jumpsuit_style"], jumpsuit_style) READ_FILE(S["uplink_loc"], uplink_spawn_loc) READ_FILE(S["phobia"], phobia) + READ_FILE(S["preferred_smoke_brand"], preferred_smoke_brand) READ_FILE(S["generic_adjective"], generic_adjective) READ_FILE(S["randomise"], randomise) READ_FILE(S["body_size"], features["body_size"]) @@ -594,6 +595,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["uplink_loc"] , uplink_spawn_loc) WRITE_FILE(S["randomise"] , randomise) WRITE_FILE(S["species"] , pref_species.id) + WRITE_FILE(S["preferred_smoke_brand"] , preferred_smoke_brand) WRITE_FILE(S["phobia"] , phobia) WRITE_FILE(S["generic_adjective"] , generic_adjective) WRITE_FILE(S["body_size"] , features["body_size"]) diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index f62a3a32035d..86f4e05226e4 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -389,7 +389,7 @@ for(var/addiction in cached_addictions) var/datum/reagent/A = addiction if(istype(R, A)) - A.addiction_stage = -15 // you're satisfied for a good while. + A.addiction_stage = -30 // you're satisfied for a good while. need_mob_update += R.on_mob_life(C) if(can_overdose) From 3bf1d38b933309d20be1251207353c2e7c17778f Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 1 Jun 2024 23:36:47 -0500 Subject: [PATCH 18/73] Automatic changelog generation for PR #2964 [ci skip] --- html/changelogs/AutoChangeLog-pr-2964.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2964.yml diff --git a/html/changelogs/AutoChangeLog-pr-2964.yml b/html/changelogs/AutoChangeLog-pr-2964.yml new file mode 100644 index 000000000000..7df335ae6616 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2964.yml @@ -0,0 +1,7 @@ +author: FalloutFalcon +changes: + - {rscadd: Smokers rejoice! You can now pick your favorite type of nicotine delivery + system.} + - {rscadd: 'Smokers have a choice between most brands of cigarette, cigars, a vape, + or a pipe!'} +delete-after: true From f3315eb3623a7212b786fb20975eab7aede9e29e Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 1 Jun 2024 22:41:32 -0500 Subject: [PATCH 19/73] Removes weaknesses and banes (#2974) ## About The Pull Request Removes checks and multiplier for devil banes and species weaknesses ## Why It's Good For The Game Cruft, The only species weakness does is make flyswatters 1 shot some species ## Changelog :cl: del: Removed moths getting one shot by a flyswatter /:cl: --- code/__DEFINES/contracts.dm | 8 ---- code/game/objects/items/toys.dm | 1 - code/modules/antagonists/devil/devil.dm | 25 +------------ .../antagonists/devil/devil_helpers.dm | 37 ------------------- .../devil/true_devil/_true_devil.dm | 10 +---- code/modules/library/lib_codex_gigas.dm | 2 +- .../mob/living/carbon/carbon_defense.dm | 4 -- code/modules/mob/living/carbon/human/human.dm | 5 --- .../mob/living/carbon/human/species.dm | 6 +-- .../carbon/human/species_types/flypeople.dm | 4 -- .../carbon/human/species_types/mothmen.dm | 5 --- .../carbon/human/species_types/spider.dm | 5 --- .../carbon/human/species_types/vampire.dm | 5 --- code/modules/mob/living/living.dm | 9 ----- .../simple_animal/friendly/mothroach.dm | 5 --- .../chemistry/reagents/food_reagents.dm | 6 --- .../chemistry/reagents/other_reagents.dm | 11 ------ shiptest.dme | 1 - 18 files changed, 4 insertions(+), 145 deletions(-) delete mode 100644 code/modules/antagonists/devil/devil_helpers.dm diff --git a/code/__DEFINES/contracts.dm b/code/__DEFINES/contracts.dm index c6e23394ba2d..0e80652f4f52 100644 --- a/code/__DEFINES/contracts.dm +++ b/code/__DEFINES/contracts.dm @@ -7,14 +7,6 @@ #define CONTRACT_KNOWLEDGE "knowledge" #define CONTRACT_UNWILLING "unwilling" -#define BANE_SALT "salt" -#define BANE_LIGHT "light" -#define BANE_IRON "iron" -#define BANE_WHITECLOTHES "whiteclothes" -#define BANE_SILVER "silver" -#define BANE_HARVEST "harvest" -#define BANE_TOOLBOX "toolbox" - #define OBLIGATION_FOOD "food" #define OBLIGATION_FIDDLE "fiddle" #define OBLIGATION_DANCEOFF "danceoff" diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 361358892520..b1dfb479b66c 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -562,7 +562,6 @@ var/datum/fakeDevil/devil = new var/list/messages = list() messages += "Some fun facts about: [devil.truename]" - messages += "[GLOB.lawlorify[LORE][devil.bane]]" messages += "[GLOB.lawlorify[LORE][devil.obligation]]" messages += "[GLOB.lawlorify[LORE][devil.ban]]" messages += "[GLOB.lawlorify[LORE][devil.banish]]" diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index 9b9ba7c4d69d..ace534f94dfa 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -24,13 +24,6 @@ GLOBAL_LIST_INIT(lawlorify, list ( OBLIGATION_SAYNAME = "He will always chant his name upon killing someone.", OBLIGATION_ANNOUNCEKILL = "This devil always loudly announces his kills for the world to hear.", OBLIGATION_ANSWERTONAME = "This devil always responds to his truename.", - BANE_SILVER = "Silver seems to gravely injure this devil.", - BANE_SALT = "Throwing salt at this devil will hinder his ability to use infernal powers temporarily.", - BANE_LIGHT = "Bright flashes will disorient the devil, likely causing him to flee.", - BANE_IRON = "Cold iron will slowly injure him, until he can purge it from his system.", - BANE_WHITECLOTHES = "Wearing clean white clothing will help ward off this devil.", - BANE_HARVEST = "Presenting the labors of a harvest will disrupt the devil.", - BANE_TOOLBOX = "That which holds the means of creation also holds the means of the devil's undoing.", BAN_HURTWOMAN = "This devil seems to prefer hunting men.", BAN_CHAPEL = "This devil avoids holy ground.", BAN_HURTPRIEST = "The annointed clergy appear to be immune to his powers.", @@ -62,13 +55,6 @@ GLOBAL_LIST_INIT(lawlorify, list ( BAN_STRIKEUNCONSCIOUS = "You must never strike an unconscious person.", BAN_HURTlizard = "You must never harm a lizardman outside of self defense.", BAN_HURTANIMAL = "You must never harm a non-sentient creature or robot outside of self defense.", - BANE_SILVER = "Silver, in all of its forms shall be your downfall.", - BANE_SALT = "Salt will disrupt your magical abilities.", - BANE_LIGHT = "Blinding lights will prevent you from using offensive powers for a time.", - BANE_IRON = "Cold wrought iron shall act as poison to you.", - BANE_WHITECLOTHES = "Those clad in pristine white garments will strike you true.", - BANE_HARVEST = "The fruits of the harvest shall be your downfall.", - BANE_TOOLBOX = "Toolboxes are bad news for you, for some reason.", BANISH_WATER = "If your corpse is filled with holy water, you will be unable to resurrect.", BANISH_COFFIN = "If your corpse is in a coffin, you will be unable to resurrect.", BANISH_FORMALDYHIDE = "If your corpse is embalmed, you will be unable to resurrect.", @@ -94,7 +80,6 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", show_to_ghosts = TRUE var/obligation var/ban - var/bane var/banish var/truename var/list/datum/mind/soulsOwned = new @@ -171,9 +156,6 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", /proc/randomdevilban() return pick(BAN_HURTWOMAN, BAN_CHAPEL, BAN_HURTPRIEST, BAN_AVOIDWATER, BAN_STRIKEUNCONSCIOUS, BAN_HURTLIZARD, BAN_HURTANIMAL) -/proc/randomdevilbane() - return pick(BANE_SALT, BANE_LIGHT, BANE_IRON, BANE_WHITECLOTHES, BANE_SILVER, BANE_HARVEST, BANE_TOOLBOX) - /proc/randomdevilbanish() return pick(BANISH_WATER, BANISH_COFFIN, BANISH_FORMALDYHIDE, BANISH_RUNES, BANISH_CANDLES, BANISH_DESTRUCTION, BANISH_FUNERAL_GARB) @@ -489,7 +471,6 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", to_chat(owner.current, "However, your infernal form is not without weaknesses.") to_chat(owner.current, "You may not use violence to coerce someone into selling their soul.") to_chat(owner.current, "You may not directly and knowingly physically harm a devil, other than yourself.") - to_chat(owner.current, GLOB.lawlorify[LAW][bane]) to_chat(owner.current, GLOB.lawlorify[LAW][ban]) to_chat(owner.current, GLOB.lawlorify[LAW][obligation]) to_chat(owner.current, GLOB.lawlorify[LAW][banish]) @@ -499,12 +480,11 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", /datum/antagonist/devil/on_gain() truename = randomDevilName() ban = randomdevilban() - bane = randomdevilbane() obligation = randomdevilobligation() banish = randomdevilbanish() GLOB.allDevils[lowertext(truename)] = src - antag_memory += "Your devilic true name is [truename]
[GLOB.lawlorify[LAW][ban]]
You may not use violence to coerce someone into selling their soul.
You may not directly and knowingly physically harm a devil, other than yourself.
[GLOB.lawlorify[LAW][bane]]
[GLOB.lawlorify[LAW][obligation]]
[GLOB.lawlorify[LAW][banish]]
" + antag_memory += "Your devilic true name is [truename]
[GLOB.lawlorify[LAW][ban]]
You may not use violence to coerce someone into selling their soul.
You may not directly and knowingly physically harm a devil, other than yourself.
[GLOB.lawlorify[LAW][obligation]]
[GLOB.lawlorify[LAW][banish]]
" if(issilicon(owner.current)) var/mob/living/silicon/robot_devil = owner.current var/laws = list("You may not use violence to coerce someone into selling their soul.", "You may not directly and knowingly physically harm a devil, other than yourself.", GLOB.lawlorify[LAW][ban], GLOB.lawlorify[LAW][obligation], "Accomplish your objectives at all costs.") @@ -541,7 +521,6 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", parts += "The devil's true name is: [truename]" parts += "The devil's bans were:" parts += "[FOURSPACES][GLOB.lawlorify[LORE][ban]]" - parts += "[FOURSPACES][GLOB.lawlorify[LORE][bane]]" parts += "[FOURSPACES][GLOB.lawlorify[LORE][obligation]]" parts += "[FOURSPACES][GLOB.lawlorify[LORE][banish]]" return parts.Join("
") @@ -556,7 +535,6 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", //A simple super light weight datum for the codex gigas. /datum/fakeDevil var/truename - var/bane var/obligation var/ban var/banish @@ -564,7 +542,6 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", /datum/fakeDevil/New(name = randomDevilName()) truename = name - bane = randomdevilbane() obligation = randomdevilobligation() ban = randomdevilban() banish = randomdevilbanish() diff --git a/code/modules/antagonists/devil/devil_helpers.dm b/code/modules/antagonists/devil/devil_helpers.dm deleted file mode 100644 index 3be8320a001f..000000000000 --- a/code/modules/antagonists/devil/devil_helpers.dm +++ /dev/null @@ -1,37 +0,0 @@ -/mob/living/proc/check_devil_bane_multiplier(obj/item/weapon, mob/living/attacker) - var/datum/antagonist/devil/devilInfo = mind.has_antag_datum(/datum/antagonist/devil) - switch(devilInfo.bane) - if(BANE_WHITECLOTHES) - if(ishuman(attacker)) - var/mob/living/carbon/human/H = attacker - if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under)) - var/obj/item/clothing/under/U = H.w_uniform - var/static/list/whiteness = list ( - /obj/item/clothing/under/color/white = 2, - /obj/item/clothing/under/rank/civilian/bartender = 1, - /obj/item/clothing/under/rank/civilian/chef = 1, - /obj/item/clothing/under/rank/engineering/chief_engineer = 1, - /obj/item/clothing/under/rank/rnd/scientist = 1, - /obj/item/clothing/under/rank/medical/chemist = 1, - /obj/item/clothing/under/rank/medical/chief_medical_officer = 1, - /obj/item/clothing/under/rank/medical/geneticist = 1, - /obj/item/clothing/under/rank/medical/virologist = 1, - /obj/item/clothing/under/rank/medical/doctor/nurse = 1, - /obj/item/clothing/under/rank/medical/doctor = 1, - /obj/item/clothing/under/rank/security/detective = 1, - /obj/item/clothing/under/suit/white = 0.5, - ) - if(U && whiteness[U.type]) - src.visible_message("[src] seems to have been harmed by the purity of [attacker]'s clothes.", "Unsullied white clothing is disrupting your form.") - return whiteness[U.type] + 1 - if(BANE_TOOLBOX) - if(istype(weapon, /obj/item/storage/toolbox)) - src.visible_message("The [weapon] seems unusually robust this time.", "The [weapon] is your unmaking!") - return 2.5 // Will take four hits with a normal toolbox to crit. - if(BANE_HARVEST) - if(istype(weapon, /obj/item/reagent_containers/food/snacks/grown/)) - visible_message("The spirits of the harvest aid in the exorcism.", "The harvest spirits are harming you.") - Paralyze(40) - qdel(weapon) - return 2 - return 1 diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index 0faab8e003cf..4703f95263f7 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -113,11 +113,6 @@ /mob/living/carbon/true_devil/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) return 666 -/mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0) - if(mind && has_bane(BANE_LIGHT)) - mind.disrupt_spells(-500) - return ..() //flashes don't stop devils UNLESS it's their bane. - /mob/living/carbon/true_devil/soundbang_act() return 0 @@ -126,8 +121,7 @@ /mob/living/carbon/true_devil/attacked_by(obj/item/I, mob/living/user, def_zone) - var/weakness = check_weakness(I, user) - apply_damage(I.force * weakness, I.damtype, def_zone) + apply_damage(I.force, I.damtype, def_zone) var/message_verb = "" if(I.attack_verb && I.attack_verb.len) message_verb = "[pick(I.attack_verb)]" @@ -213,8 +207,6 @@ b_loss = 150 if (EXPLODE_LIGHT) b_loss = 30 - if(has_bane(BANE_LIGHT)) - b_loss *=2 adjustBruteLoss(b_loss) return ..() diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm index c4263a771b0d..707f7a7647b7 100644 --- a/code/modules/library/lib_codex_gigas.dm +++ b/code/modules/library/lib_codex_gigas.dm @@ -59,7 +59,7 @@ inUse = FALSE /obj/item/book/codex_gigas/proc/display_devil(datum/antagonist/devil/devil, mob/reader, devilName) - reader << browse("Information on [devilName]


[GLOB.lawlorify[LORE][devil.ban]]
[GLOB.lawlorify[LORE][devil.bane]]
[GLOB.lawlorify[LORE][devil.obligation]]
[GLOB.lawlorify[LORE][devil.banish]]
[devil.ascendable?"This devil may ascend given enough souls.":""]", "window=book[window_size != null ? ";size=[window_size]" : ""]") + reader << browse("Information on [devilName]


[GLOB.lawlorify[LORE][devil.ban]]
[GLOB.lawlorify[LORE][devil.obligation]]
[GLOB.lawlorify[LORE][devil.banish]]
[devil.ascendable?"This devil may ascend given enough souls.":""]", "window=book[window_size != null ? ";size=[window_size]" : ""]") /obj/item/book/codex_gigas/proc/ask_name(mob/reader) ui_interact(reader) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 9b50d1827724..8377fc0833d6 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -554,14 +554,10 @@ else to_chat(src, "Your eyes are really starting to hurt. This can't be good for you!") - if(has_bane(BANE_LIGHT)) - mind.disrupt_spells(-500) return 1 else if(damage == 0) // just enough protection if(prob(20)) to_chat(src, "Something bright flashes in the corner of your vision!") - if(has_bane(BANE_LIGHT)) - mind.disrupt_spells(0) /mob/living/carbon/soundbang_act(intensity = 1, stun_pwr = 20, damage_pwr = 5, deafen_pwr = 15) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 99864f2eba42..528d8500ea46 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -896,11 +896,6 @@ dna.remove_mutation(HM.name) ..() -/mob/living/carbon/human/check_weakness(obj/item/weapon, mob/living/attacker) - . = ..() - if (dna && dna.species) - . += dna.species.check_species_weakness(weapon, attacker) - /mob/living/carbon/human/is_literate() return TRUE diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 9d0617a513bd..c276b44947c2 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1289,9 +1289,6 @@ GLOBAL_LIST_EMPTY(roundstart_races) /datum/species/proc/get_spans() return list() -/datum/species/proc/check_species_weakness(obj/item, mob/living/attacker) - return 0 //This is not a boolean, it's the multiplier for the damage that the user takes from the item.It is added onto the check_weakness value of the mob, and then the force of the item is multiplied by this value - /** * Equip the outfit required for life. Replaces items currently worn. */ @@ -1608,8 +1605,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) var/armor_block = H.run_armor_check(affecting, "melee", I.armour_penetration, FALSE, "Your armor has protected your [hit_area]!", "Your armor has softened a hit to your [hit_area]!") armor_block = min(90,armor_block) //cap damage reduction at 90% - var/weakness = H.check_weakness(I, user) - apply_damage(I.force * weakness, I.damtype, def_zone, armor_block, H) + apply_damage(I.force, I.damtype, def_zone, armor_block, H) H.send_item_attack_message(I, user, hit_area) diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index af19f1316ce2..f5de9f873b3b 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -35,7 +35,3 @@ "You throw up on the floor!") return ..() -/datum/species/fly/check_species_weakness(obj/item/weapon, mob/living/attacker) - if(istype(weapon, /obj/item/melee/flyswatter)) - return 29 //Flyswatters deal 30x damage to flypeople. - return 0 diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index b20b27efc928..91169299afba 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -73,11 +73,6 @@ H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) return ..() -/datum/species/moth/check_species_weakness(obj/item/weapon, mob/living/attacker) - if(istype(weapon, /obj/item/melee/flyswatter)) - return 9 //flyswatters deal 10x damage to moths - return 0 - /datum/species/space_move(mob/living/carbon/human/H) . = ..() if(H.loc && !isspaceturf(H.loc) && H.getorganslot(ORGAN_SLOT_WINGS) && !flying_species) //"flying_species" is exclusive to the potion of flight, which has its flying mechanics. If they want to fly they can use that instead diff --git a/code/modules/mob/living/carbon/human/species_types/spider.dm b/code/modules/mob/living/carbon/human/species_types/spider.dm index 847d6ad74f3f..9c0f58dc8312 100644 --- a/code/modules/mob/living/carbon/human/species_types/spider.dm +++ b/code/modules/mob/living/carbon/human/species_types/spider.dm @@ -97,11 +97,6 @@ GLOBAL_LIST_INIT(spider_last, world.file2list("strings/names/spider_last.txt")) H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) return ..() -/datum/species/spider/check_species_weakness(obj/item/weapon, mob/living/attacker) - if(istype(weapon, /obj/item/melee/flyswatter)) - return 9 //flyswatters deal 10x damage to spiders - return 0 - /mob/living/carbon/human/species/spider race = /datum/species/spider diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 070894a92bee..5caf871a7f23 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -53,11 +53,6 @@ C.adjust_fire_stacks(6) C.IgniteMob() -/datum/species/vampire/check_species_weakness(obj/item/weapon, mob/living/attacker) - if(istype(weapon, /obj/item/nullrod/whip)) - return 1 //Whips deal 2x damage to vampires. Vampire killer. - return 0 - /obj/item/organ/tongue/vampire name = "vampire tongue" actions_types = list(/datum/action/item_action/organ_action/vampire) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index b240836b55e7..4e220fd18cff 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1144,15 +1144,6 @@ devilInfo.remove_soul(mind) mind.soulOwner = mind -/mob/living/proc/has_bane(banetype) - var/datum/antagonist/devil/devilInfo = is_devil(src) - return devilInfo && banetype == devilInfo.bane - -/mob/living/proc/check_weakness(obj/item/weapon, mob/living/attacker) - if(mind && mind.has_antag_datum(/datum/antagonist/devil)) - return check_devil_bane_multiplier(weapon, attacker) - return 1 //This is not a boolean, it's the multiplier for the damage the weapon does. - /mob/living/proc/check_acedia() if(mind && mind.has_objective(/datum/objective/sintouched/acedia)) return TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/mothroach.dm b/code/modules/mob/living/simple_animal/friendly/mothroach.dm index 2002ef3b5d8d..881e64d2a70f 100644 --- a/code/modules/mob/living/simple_animal/friendly/mothroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/mothroach.dm @@ -64,8 +64,3 @@ qdel(I) // this sucks else return ..() - -/mob/living/simple_animal/pet/mothroach/check_weakness(obj/item/weapon, mob/living/attacker) - if(istype(weapon, /obj/item/melee/flyswatter)) - return 9 // flyswatters deal 10x damage to mothroaches - return 0 diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 2c0ecef181a1..09812ef20cf3 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -327,12 +327,6 @@ color = "#FFFFFF" // rgb: 255,255,255 taste_description = "salt" -/datum/reagent/consumable/sodiumchloride/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(!istype(M)) - return - if(M.has_bane(BANE_SALT)) - M.mind.disrupt_spells(-200) - /datum/reagent/consumable/sodiumchloride/expose_turf(turf/T, reac_volume) //Creates an umbra-blocking salt pile if(!istype(T)) return diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index d727cbfd0fa6..02d8850f8776 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -795,12 +795,6 @@ C.blood_volume += 0.5 ..() -/datum/reagent/iron/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(M.has_bane(BANE_IRON)) //If the target is weak to cold iron, then poison them. - if(holder && holder.chem_temp < 100) // COLD iron. - M.reagents.add_reagent(/datum/reagent/toxin, reac_volume) - ..() - /datum/reagent/gold name = "Gold" description = "Gold is a dense, soft, shiny metal and the most malleable and ductile metal known." @@ -817,11 +811,6 @@ taste_description = "expensive yet reasonable metal" material = /datum/material/silver -/datum/reagent/silver/expose_mob(mob/living/M, method=TOUCH, reac_volume) - if(M.has_bane(BANE_SILVER)) - M.reagents.add_reagent(/datum/reagent/toxin, reac_volume) - ..() - /datum/reagent/uranium name ="Uranium" description = "A jade-green metallic chemical element in the actinide series, weakly radioactive." diff --git a/shiptest.dme b/shiptest.dme index ddd627701643..6574a98b5a1e 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1685,7 +1685,6 @@ #include "code\modules\antagonists\cult\rune_spawn_action.dm" #include "code\modules\antagonists\cult\runes.dm" #include "code\modules\antagonists\devil\devil.dm" -#include "code\modules\antagonists\devil\devil_helpers.dm" #include "code\modules\antagonists\devil\imp\imp.dm" #include "code\modules\antagonists\devil\sintouched\objectives.dm" #include "code\modules\antagonists\devil\sintouched\sintouched.dm" From 59e2fdd946ef554480afa5f827d46fc21f93fcf1 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sat, 1 Jun 2024 23:50:43 -0500 Subject: [PATCH 20/73] Automatic changelog generation for PR #2974 [ci skip] --- html/changelogs/AutoChangeLog-pr-2974.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2974.yml diff --git a/html/changelogs/AutoChangeLog-pr-2974.yml b/html/changelogs/AutoChangeLog-pr-2974.yml new file mode 100644 index 000000000000..a1f122bf66b8 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2974.yml @@ -0,0 +1,4 @@ +author: FalloutFalcon +changes: + - {rscdel: Removed moths getting one shot by a flyswatter} +delete-after: true From 5b939c348a9d2b8f663c57cff62a17f358e802e5 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sat, 1 Jun 2024 22:41:42 -0500 Subject: [PATCH 21/73] stops free circut board from drying rack (#2983) ## About The Pull Request crowbar drying rack, get all wood back plus a smart fridge board. ## Why It's Good For The Game ## Changelog :cl: fix: fixed free smart fridge circuit board from drying rack /:cl: --------- Signed-off-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index d2e919f00882..5852ea34742b 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -245,6 +245,7 @@ icon = 'icons/obj/hydroponics/equipment.dmi' icon_state = "drying_rack" use_power = IDLE_POWER_USE + circuit = null idle_power_usage = IDLE_DRAW_MINIMAL active_power_usage = ACTIVE_DRAW_MINIMAL visible_contents = FALSE @@ -258,7 +259,6 @@ /obj/machinery/smartfridge/drying_rack/on_deconstruction() new /obj/item/stack/sheet/mineral/wood(drop_location(), 10) - ..() /obj/machinery/smartfridge/drying_rack/RefreshParts() /obj/machinery/smartfridge/drying_rack/default_deconstruction_screwdriver() From 3f8ab9a9d31917670970d47a95b591d709639bfb Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 00:03:39 -0500 Subject: [PATCH 22/73] Automatic changelog generation for PR #2983 [ci skip] --- html/changelogs/AutoChangeLog-pr-2983.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2983.yml diff --git a/html/changelogs/AutoChangeLog-pr-2983.yml b/html/changelogs/AutoChangeLog-pr-2983.yml new file mode 100644 index 000000000000..82c90b8aed8f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2983.yml @@ -0,0 +1,4 @@ +author: FalloutFalcon +changes: + - {bugfix: fixed free smart fridge circuit board from drying rack} +delete-after: true From 51159125c2bc5087760efd667d131b3ca8ec62e5 Mon Sep 17 00:00:00 2001 From: Hardly3D <66234359+Hardly3D@users.noreply.github.com> Date: Sun, 2 Jun 2024 01:15:10 -0300 Subject: [PATCH 23/73] Minor fixes and improvement to Flavor Text (#2952) ## About The Pull Request Improves and fixes issues where flavor text would sanitize certain characters and refuse new lines while also giving new looks to the flavor text page. Bits of codes for the popup was taken from MapleStation but I can't find the specific PR for it. Flavor text's length was also chopped from a whooping 4096 to 1024 for the sake of keeping it lag free, it should still allow you to make a pretty robust flavor text and it shouldn't really impact anyone as the average flavor text length I've seen on a round was around 362 characters, with the highest being 645 characters. ![dreamseeker_RBS1nF48VM](https://github.com/shiptest-ss13/Shiptest/assets/66234359/8b541cf1-c51f-4893-b388-fe01b6f413fc) Additionally changes the text a bit on the flavor text's edit popup so it leads to less confusion. I'm intending to do a full refactor for flavor text itself and hopefully make use of TGUI but this might take quite a bit and I can't really make any guarantees, so hopefully this helps for now. ## Why It's Good For The Game Flavor text has been buggy and limiting for quite a while, while this PR doesn't solve many code shenanigans it should at least help people describe how their characters a lot better and with less wall of texts. As for the text changes; I believe this might make more sense and hopefully lead to less confusion that I'd see some have when it comes to flavor text. ## Changelog :cl: Hardly add: Added some style to the flavor text popup fix: Fixed flavor text not accepting certain characters or new lines tweak: Changed up Flavor Text editing text a bit tweak: Flavor text's max length has been chopped from 4096 to 1024 /:cl: --------- Co-authored-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- check_regex.yaml | 2 +- code/__DEFINES/say.dm | 2 ++ code/modules/client/preferences.dm | 4 ++-- code/modules/mob/mob.dm | 6 ++++-- code/modules/mob/say_vr.dm | 6 +++--- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/check_regex.yaml b/check_regex.yaml index 538d570daea4..e01c41995e8e 100644 --- a/check_regex.yaml +++ b/check_regex.yaml @@ -38,7 +38,7 @@ standards: - exactly: [ - 269, + 268, "non-bitwise << uses", '(?[][]", name, replacetext(flavor_text, "\n", "
")), text("window=[];size=500x200", name)) - onclose(usr, "[name]") + var/datum/browser/popup = new(usr, "[name]'s flavor text", "[name]'s Flavor Text (expanded)", 500, 200) + popup.set_content(text("[][]", "[name]'s flavor text (expanded)", replacetext(flavor_text, "\n", "
"))) + popup.open() + return if(user != src) if(href_list["item"] && user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index d2e6a4f0dda2..01e3a4d33b1a 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -11,7 +11,7 @@ if(usr != src) to_chat(usr, span_warning("You can't set someone else's flavour text!")) - var/msg = sanitize(input(usr,"Set the flavor text in your 'examine' verb. Can also be used for OOC notes about your character.","Flavor Text",html_decode(flavor_text)) as message|null) + var/msg = input(usr, "A snippet of text shown when others examine you, describing what you may look like. This can also be used for OOC notes.", "Flavor Text", html_decode("flavor_text")) as message|null if(msg) msg = copytext(msg, 1, MAX_MESSAGE_LEN) @@ -22,10 +22,10 @@ /mob/proc/print_flavor_text() if(flavor_text && flavor_text != "") var/msg = replacetext(flavor_text, "\n", " ") - if(length(msg) <= 100) + if(length(msg) <= MAX_SHORTFLAVOR_LEN) return "[msg]" else - return "[copytext(msg, 1, 97)]... More..." + return "[copytext(msg, 1, MAX_SHORTFLAVOR_LEN)]... More..." /mob/proc/get_top_level_mob() if(istype(src.loc,/mob)&&src.loc!=src) From c8ef93cdc209903fc21ce0bc7b2443155af8274d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 00:27:48 -0500 Subject: [PATCH 24/73] Automatic changelog generation for PR #2952 [ci skip] --- html/changelogs/AutoChangeLog-pr-2952.yml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2952.yml diff --git a/html/changelogs/AutoChangeLog-pr-2952.yml b/html/changelogs/AutoChangeLog-pr-2952.yml new file mode 100644 index 000000000000..9f5ebacb2d05 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2952.yml @@ -0,0 +1,7 @@ +author: Hardly +changes: + - {rscadd: Added some style to the flavor text popup} + - {bugfix: Fixed flavor text not accepting certain characters or new lines} + - {tweak: Changed up Flavor Text editing text a bit} + - {tweak: Flavor text's max length has been chopped from 4096 to 1024} +delete-after: true From 9bb6b54e1f1b0eb5d44c52652fc0bee0b906dfda Mon Sep 17 00:00:00 2001 From: Sadhorizon <108196626+Sadhorizon@users.noreply.github.com> Date: Sun, 2 Jun 2024 08:31:17 +0200 Subject: [PATCH 25/73] Moves most vendor items out of contraband. (#3007) ## About The Pull Request Moves a shit ton of vendor items out of contraband alongside a bunch of misc tweaks. ## Why It's Good For The Game Hacking kinda sucks as a mechanic. It brings nothing interesting and kinda just locks some perfectly normal items behind a pointless roadblock. ## Changelog :cl: tweak: Moved most of contraband items out of vendor contraband. add: Added DromaderyCo packets to the cigarette vendors. tweak: Increased nicotine amount to three in the cigarette vendors. /:cl: --- code/modules/vending/assist.dm | 3 +-- code/modules/vending/autodrobe.dm | 3 +-- code/modules/vending/cigarette.dm | 10 +++++----- code/modules/vending/clothesmate.dm | 11 ++++------- code/modules/vending/coffee.dm | 4 ++-- code/modules/vending/cola.dm | 3 +-- code/modules/vending/drinnerware.dm | 7 ++----- code/modules/vending/engivend.dm | 4 ++-- code/modules/vending/games.dm | 1 - code/modules/vending/medical.dm | 9 +++------ code/modules/vending/medical_wall.dm | 4 ++-- code/modules/vending/megaseed.dm | 4 ++-- code/modules/vending/nutrimax.dm | 3 +-- code/modules/vending/plasmaresearch.dm | 4 ++-- code/modules/vending/security.dm | 3 +-- code/modules/vending/snack.dm | 3 +-- code/modules/vending/sovietsoda.dm | 5 +++-- code/modules/vending/toys.dm | 7 +++---- code/modules/vending/youtool.dm | 5 +++-- 19 files changed, 39 insertions(+), 54 deletions(-) diff --git a/code/modules/vending/assist.dm b/code/modules/vending/assist.dm index 8a1c86cc9536..cb3cd0053d8a 100644 --- a/code/modules/vending/assist.dm +++ b/code/modules/vending/assist.dm @@ -10,8 +10,7 @@ /obj/item/stock_parts/manipulator = 3, /obj/item/stock_parts/micro_laser = 3, /obj/item/stock_parts/scanning_module = 3, - /obj/item/stock_parts/capacitor = 3) - contraband = list( + /obj/item/stock_parts/capacitor = 3, /obj/item/assembly/timer = 2, /obj/item/assembly/voice = 2, /obj/item/assembly/health = 2, diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index c1bbe7c2d337..04ae257730f2 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -109,8 +109,7 @@ /obj/item/clothing/suit/changshan_blue = 1, /obj/item/clothing/suit/cheongsam_red = 1, /obj/item/clothing/suit/cheongsam_blue = 1, - /obj/item/gohei = 1) - contraband = list( + /obj/item/gohei = 1, /obj/item/clothing/suit/judgerobe = 1, /obj/item/clothing/head/powdered_wig = 1, /obj/item/gun/magic/wand/nothing = 2, diff --git a/code/modules/vending/cigarette.dm b/code/modules/vending/cigarette.dm index 7dd0b6004ea7..3cff7d3c361d 100644 --- a/code/modules/vending/cigarette.dm +++ b/code/modules/vending/cigarette.dm @@ -11,19 +11,19 @@ /obj/item/storage/fancy/cigarettes/cigpack_robust = 3, /obj/item/storage/fancy/cigarettes/cigpack_carp = 3, /obj/item/storage/fancy/cigarettes/cigpack_midori = 3, + /obj/item/storage/fancy/cigarettes/dromedaryco = 3, + /obj/item/clothing/mask/vape = 5, /obj/item/storage/box/matches = 10, /obj/item/lighter/greyscale = 4, /obj/item/storage/fancy/rollingpapers = 5) - contraband = list( - /obj/item/clothing/mask/vape = 5, - /obj/item/clothing/mask/vape/cigar = 3) //WS edit - E-Cigars premium = list( /obj/item/storage/fancy/cigarettes/cigpack_robustgold = 3, - /obj/item/storage/box/gum/nicotine = 2, + /obj/item/storage/box/gum/nicotine = 3, /obj/item/lighter = 3, /obj/item/storage/fancy/cigarettes/cigars = 1, /obj/item/storage/fancy/cigarettes/cigars/havana = 1, - /obj/item/storage/fancy/cigarettes/cigars/cohiba = 1) + /obj/item/storage/fancy/cigarettes/cigars/cohiba = 1, + /obj/item/clothing/mask/vape/cigar = 3) refill_canister = /obj/item/vending_refill/cigarette default_price = 75 extra_price = 250 diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 8a7199968774..e9eef49a0e3a 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -104,19 +104,16 @@ /obj/item/clothing/suit/apron/purple_bartender = 2, /obj/item/clothing/under/rank/civilian/bartender/purple = 2, /obj/item/clothing/suit/toggle/suspenders/blue = 2, - /obj/item/clothing/suit/toggle/suspenders/gray = 2) - contraband = list( - /obj/item/clothing/under/syndicate/tacticool = 1, - /obj/item/clothing/under/syndicate/tacticool/skirt = 1, + /obj/item/clothing/suit/toggle/suspenders/gray = 2, + /obj/item/clothing/under/syndicate/tacticool = 2, + /obj/item/clothing/under/syndicate/tacticool/skirt = 2, /obj/item/clothing/mask/balaclava = 1, /obj/item/clothing/head/trapper = 1, /obj/item/storage/belt/fannypack/black = 2, /obj/item/clothing/suit/jacket/letterman_syndie = 1, /obj/item/clothing/under/costume/jabroni = 1, /obj/item/clothing/suit/vapeshirt = 1, - /obj/item/clothing/under/costume/geisha = 1, - /obj/item/clothing/under/rank/centcom/officer/replica = 1, - /obj/item/clothing/under/rank/centcom/officer_skirt/replica = 1) + /obj/item/clothing/under/costume/geisha = 1) premium = list( /obj/item/clothing/under/suit/checkered = 1, /obj/item/clothing/suit/jacket/leather = 1, diff --git a/code/modules/vending/coffee.dm b/code/modules/vending/coffee.dm index 3e45b431b16d..9c4851c134a5 100644 --- a/code/modules/vending/coffee.dm +++ b/code/modules/vending/coffee.dm @@ -7,11 +7,11 @@ products = list( /obj/item/reagent_containers/food/drinks/coffee = 6, /obj/item/reagent_containers/food/drinks/mug/tea = 6, - /obj/item/reagent_containers/food/drinks/mug/coco = 3) + /obj/item/reagent_containers/food/drinks/mug/coco = 3, + /obj/item/reagent_containers/food/drinks/ice = 6) premium = list( /obj/item/reagent_containers/food/drinks/cafelatte = 3, /obj/item/reagent_containers/food/drinks/soylatte = 3) - contraband = list(/obj/item/reagent_containers/food/drinks/ice = 12) refill_canister = /obj/item/vending_refill/coffee default_price = 45 extra_price = 150 diff --git a/code/modules/vending/cola.dm b/code/modules/vending/cola.dm index 2ce937979e74..4a9f4a456eee 100644 --- a/code/modules/vending/cola.dm +++ b/code/modules/vending/cola.dm @@ -15,8 +15,7 @@ /obj/item/reagent_containers/food/drinks/soda_cans/lemon_lime = 10, /obj/item/reagent_containers/food/drinks/soda_cans/sol_dry = 10, /obj/item/reagent_containers/food/drinks/waterbottle = 10, - /obj/item/reagent_containers/food/drinks/soda_cans/efuel = 5) - contraband = list( + /obj/item/reagent_containers/food/drinks/soda_cans/efuel = 5, /obj/item/reagent_containers/food/drinks/soda_cans/thirteenloko = 6, /obj/item/reagent_containers/food/drinks/soda_cans/shamblers = 6) premium = list( diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm index 7ff7d80ddccd..5dbd8ea733db 100644 --- a/code/modules/vending/drinnerware.dm +++ b/code/modules/vending/drinnerware.dm @@ -17,11 +17,8 @@ /obj/item/kitchen/rollingpin = 2, /obj/item/kitchen/knife = 2, /obj/item/kitchen/knife/pizza_cutter = 2, - /obj/item/book/granter/crafting_recipe/cooking_sweets_101 = 2) - contraband = list( - /obj/item/kitchen/rollingpin = 2, - /obj/item/kitchen/knife/butcher = 2, - /obj/item/shovel/spoon = 2) // ST - Only a spoonfull + /obj/item/book/granter/crafting_recipe/cooking_sweets_101 = 2, + /obj/item/kitchen/knife/butcher = 1) refill_canister = /obj/item/vending_refill/dinnerware default_price = 50 extra_price = 250 diff --git a/code/modules/vending/engivend.dm b/code/modules/vending/engivend.dm index 096bffb1adf7..fb096656c1c3 100644 --- a/code/modules/vending/engivend.dm +++ b/code/modules/vending/engivend.dm @@ -16,8 +16,8 @@ /obj/item/electronics/airalarm = 10, /obj/item/electronics/advanced_airlock_controller = 10, /obj/item/electronics/firealarm = 10, - /obj/item/electronics/firelock = 10) - contraband = list(/obj/item/stock_parts/cell/potato = 3) + /obj/item/electronics/firelock = 10, + /obj/item/stock_parts/cell/potato = 3) premium = list(/obj/item/storage/belt/utility = 3, /obj/item/construction/rcd/loaded = 2, /obj/item/storage/box/smart_metal_foam = 1) diff --git a/code/modules/vending/games.dm b/code/modules/vending/games.dm index d209c93eae8e..d27a1f6ffe6e 100644 --- a/code/modules/vending/games.dm +++ b/code/modules/vending/games.dm @@ -14,7 +14,6 @@ /obj/item/instrument/piano_synth/headphones = 4, /obj/item/camera = 3, /obj/item/dyespray = 3) - contraband = list(/obj/item/dice/fudge = 9) premium = list( /obj/item/melee/skateboard/pro = 3, /obj/item/melee/skateboard/hoverboard = 1) diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index 1fff1bd03398..5a35a75a4495 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -27,15 +27,12 @@ /obj/item/reagent_containers/medigel/sterilizine = 1, /obj/item/sensor_device = 1, /obj/item/pinpointer/crew = 1) - contraband = list( - /obj/item/reagent_containers/pill/tox = 2, - /obj/item/reagent_containers/pill/morphine = 2, - /obj/item/reagent_containers/pill/charcoal = 4, - /obj/item/storage/box/hug/medical = 1) + contraband = list(/obj/item/reagent_containers/pill/tox = 2) premium = list( /obj/item/clothing/glasses/hud/health = 1, /obj/item/clothing/glasses/hud/health/prescription = 1, - /obj/item/shears = 1) + /obj/item/shears = 1, + /obj/item/storage/box/hug/medical = 1) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/medical diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index cf0bca7c3bdb..dd498ffded07 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -11,11 +11,11 @@ /obj/item/reagent_containers/pill/charcoal = 1, /obj/item/reagent_containers/medigel/styptic = 1, /obj/item/reagent_containers/medigel/silver_sulf = 1, - /obj/item/reagent_containers/medigel/sterilizine = 1 + /obj/item/reagent_containers/medigel/sterilizine = 1, + /obj/item/reagent_containers/pill/morphine = 1 ) contraband = list( /obj/item/reagent_containers/pill/tox = 1, - /obj/item/reagent_containers/pill/morphine = 1, /obj/item/storage/box/gum/happiness = 1 ) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm index 899bbac5ea87..4d59628f5fd2 100644 --- a/code/modules/vending/megaseed.dm +++ b/code/modules/vending/megaseed.dm @@ -42,12 +42,12 @@ /obj/item/seeds/tower = 3, /obj/item/seeds/watermelon = 3, /obj/item/seeds/wheat = 3, - /obj/item/seeds/whitebeet = 3) + /obj/item/seeds/whitebeet = 3, + /obj/item/seeds/plump = 3) contraband = list(/obj/item/seeds/amanita = 2, /obj/item/seeds/glowshroom = 2, /obj/item/seeds/liberty = 2, /obj/item/seeds/nettle = 2, - /obj/item/seeds/plump = 2, /obj/item/seeds/reishi = 2, /obj/item/seeds/cannabis = 3, /obj/item/seeds/starthistle = 2, diff --git a/code/modules/vending/nutrimax.dm b/code/modules/vending/nutrimax.dm index 1849750d3fce..0aaa47461406 100644 --- a/code/modules/vending/nutrimax.dm +++ b/code/modules/vending/nutrimax.dm @@ -15,8 +15,7 @@ /obj/item/storage/bag/plants = 5, /obj/item/cultivator = 3, /obj/item/shovel/spade = 3, - /obj/item/plant_analyzer = 4) - contraband = list( + /obj/item/plant_analyzer = 4, /obj/item/reagent_containers/glass/bottle/ammonia = 10, /obj/item/reagent_containers/glass/bottle/diethylamine = 5) refill_canister = /obj/item/vending_refill/hydronutrients diff --git a/code/modules/vending/plasmaresearch.dm b/code/modules/vending/plasmaresearch.dm index 650d9878ad36..a638bfc81d8a 100644 --- a/code/modules/vending/plasmaresearch.dm +++ b/code/modules/vending/plasmaresearch.dm @@ -10,7 +10,7 @@ /obj/item/assembly/timer = 6, /obj/item/assembly/signaler = 6, /obj/item/assembly/prox_sensor = 6, - /obj/item/assembly/igniter = 6) - contraband = list(/obj/item/assembly/health = 3) + /obj/item/assembly/igniter = 6, + /obj/item/assembly/health = 3) default_price = 400 extra_price = 600 diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index 0141967beff3..95afc6f2eb92 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -14,8 +14,7 @@ /obj/item/flashlight/seclite = 4, /obj/item/ammo_box/c9mm/rubbershot = 3, /obj/item/ammo_box/c9mm = 1, - /obj/item/stock_parts/cell/gun = 3) - contraband = list( + /obj/item/stock_parts/cell/gun = 3, /obj/item/clothing/glasses/sunglasses = 2) premium = list( /obj/item/storage/belt/security/webbing = 5, diff --git a/code/modules/vending/snack.dm b/code/modules/vending/snack.dm index 0785df82f14d..d0130d7358fc 100644 --- a/code/modules/vending/snack.dm +++ b/code/modules/vending/snack.dm @@ -14,8 +14,7 @@ /obj/item/reagent_containers/food/snacks/no_raisin = 6, /obj/item/reagent_containers/food/drinks/dry_ramen = 3, /obj/item/storage/box/gum = 3, - /obj/item/reagent_containers/food/snacks/energybar = 6) - contraband = list( + /obj/item/reagent_containers/food/snacks/energybar = 6, /obj/item/reagent_containers/food/snacks/syndicake = 6, /obj/item/reagent_containers/food/snacks/candy/bronx = 1) refill_canister = /obj/item/vending_refill/snack diff --git a/code/modules/vending/sovietsoda.dm b/code/modules/vending/sovietsoda.dm index f9eff36e5e6c..213a3d01df0a 100644 --- a/code/modules/vending/sovietsoda.dm +++ b/code/modules/vending/sovietsoda.dm @@ -4,8 +4,9 @@ icon_state = "sovietsoda" light_mask = "soviet-light-mask" product_ads = "Have you fulfilled your nutrition quota today?;Very nice!;We are simple people, for this is all we eat.;If there is a person, there is a problem. If there is no person, then there is no problem." - products = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/soda = 30) - contraband = list(/obj/item/reagent_containers/food/drinks/drinkingglass/filled/cola = 20) + products = list( + /obj/item/reagent_containers/food/drinks/drinkingglass/filled/soda = 30, + /obj/item/reagent_containers/food/drinks/drinkingglass/filled/cola = 20) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/sovietsoda default_price = 1 diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm index c86049ab75ef..8fefa1015536 100644 --- a/code/modules/vending/toys.dm +++ b/code/modules/vending/toys.dm @@ -16,11 +16,10 @@ /obj/item/toy/foamblade = 10, /obj/item/toy/balloon/syndicate = 10, /obj/item/clothing/suit/syndicatefake = 5, - /obj/item/clothing/head/syndicatefake = 5) - contraband = list( + /obj/item/clothing/head/syndicatefake = 5, /obj/item/gun/ballistic/shotgun/toy/crossbow = 10, - /obj/item/gun/ballistic/automatic/smg/c20r/toy = 10, - /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy = 10, + /obj/item/gun/ballistic/automatic/smg/c20r/toy = 5, + /obj/item/gun/ballistic/automatic/hmg/l6_saw/toy = 5, /obj/item/toy/katana = 10, /obj/item/dualsaber/toy = 5) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) diff --git a/code/modules/vending/youtool.dm b/code/modules/vending/youtool.dm index 6e75c75c7eae..98a5331b2744 100644 --- a/code/modules/vending/youtool.dm +++ b/code/modules/vending/youtool.dm @@ -15,8 +15,9 @@ /obj/item/flashlight/glowstick = 3, /obj/item/flashlight/glowstick/red = 3, /obj/item/flashlight = 3, - /obj/item/clothing/ears/earmuffs = 1) - contraband = list(/obj/item/clothing/gloves/color/fyellow = 2) + /obj/item/clothing/ears/earmuffs = 1, + /obj/item/clothing/gloves/color/fyellow = 2 + ) premium = list(/obj/item/storage/belt/utility = 2, /obj/item/multitool = 2, /obj/item/weldingtool/hugetank = 1, From ebdcea24d47e312f012ab08ac6b33a239df50574 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 01:42:21 -0500 Subject: [PATCH 26/73] Automatic changelog generation for PR #3007 [ci skip] --- html/changelogs/AutoChangeLog-pr-3007.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3007.yml diff --git a/html/changelogs/AutoChangeLog-pr-3007.yml b/html/changelogs/AutoChangeLog-pr-3007.yml new file mode 100644 index 000000000000..0dbec57f99ce --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3007.yml @@ -0,0 +1,6 @@ +author: Sadhorizon +changes: + - {tweak: Moved most of contraband items out of vendor contraband.} + - {rscadd: Added DromaderyCo packets to the cigarette vendors.} + - {tweak: Increased nicotine amount to three in the cigarette vendors.} +delete-after: true From c8475ba8afcb98738832ffe743897d043bff09d4 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sun, 2 Jun 2024 01:31:50 -0500 Subject: [PATCH 27/73] Cleans up CODEOWNERS and adds myself to it (#3010) ## About The Pull Request Organized it and copied TG's formatting of it Added files i wrote and guns to me ## Why It's Good For The Game Im a maint now c: ## Changelog :cl: code: sorted code owner stuff and added me to some files /:cl: --- .github/CODEOWNERS | 33 +++++++++++++++++++++++++-------- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 8e73f4427152..d456e8d2ddd2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -4,22 +4,39 @@ # In the event that multiple org members are to be informed of changes # to the same file or dir, add them to the end under Multiple Owners -# MarkSuckerberg -/code/controllers/subsystem/shuttle.dm @MarkSuckerberg -/code/modules/shuttle/ @MarkSuckerberg -/code/modules/overmap/ @MarkSuckerberg - -# Teams +# TEAMS # Map Maintainers /_maps/ @shiptest-ss13/maptainers # Sprite Maintainers /icons/ @shiptest-ss13/spritetainers -/whitesands/icons/ @shiptest-ss13/spritetainers # CI and tool chains /tools/ @shiptest-ss13/admins -#SIC SEMPER TYRANNIS + +# MAINTAINERS + +# FalloutFalcon + +/code/game/objects/items/storage/ration.dm @FalloutFalcon +/code/modules/food_and_drinks/drinks/drinks/breakawayflask.dm @FalloutFalcon +/code/modules/food_and_drinks/food/ration.dm @FalloutFalcon +/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @FalloutFalcon +/code/modules/projectiles @FalloutFalcon +/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm @FalloutFalcon +/code/modules/unit_tests/icons @FalloutFalcon + +# MarkSuckerberg + +/code/controllers/subsystem/shuttle.dm @MarkSuckerberg +/code/modules/shuttle/ @MarkSuckerberg +/code/modules/overmap/ @MarkSuckerberg /_maps/RandomRuins/LavaRuins/lavaland_surface_sloth.dmm @MarkSuckerberg + + +# CONTRIBUTORS + + +# MULTIPLE OWNERS From 582471f0d5a37d2a92eead6ed7e68a06d452c472 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 01:55:54 -0500 Subject: [PATCH 28/73] Automatic changelog generation for PR #3010 [ci skip] --- html/changelogs/AutoChangeLog-pr-3010.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3010.yml diff --git a/html/changelogs/AutoChangeLog-pr-3010.yml b/html/changelogs/AutoChangeLog-pr-3010.yml new file mode 100644 index 000000000000..f150b34715fd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3010.yml @@ -0,0 +1,4 @@ +author: FalloutFalcon +changes: + - {code_imp: sorted code owner stuff and added me to some files} +delete-after: true From 049925a9e7f7575bbc57a945c8900bcaec79264e Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sun, 2 Jun 2024 01:33:07 -0500 Subject: [PATCH 29/73] Fixes create and destory failure due to missing physiology (#2999) ## About The Pull Request Sometimes during unit tests (prob shouldn't happen in the first place) a human will get created and have electrocute act called by a tesla anomaly which causes a fail because it looks for a shock resist in physiology which doesn't yet exist. If humans are shocked during init and it does not have its physiology yet it now returns It may be better to just have an if physiology for fetching the physiology siemens but if its missing its physiology its prob missing other thing needed like generating organs or dna ## Why It's Good For The Game im tired of half my prs failing from this ## Changelog :cl: fix: fixed create and destroy test fail /:cl: --- code/modules/mob/living/carbon/human/human_defense.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 7091090f8877..3e3fd2209856 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -485,6 +485,9 @@ ///Calculates the siemens coeff based on clothing and species, can also restart hearts. /mob/living/carbon/human/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) + //If it doesnt have physiology its prob still initializing. + if(!physiology) + return //Calculates the siemens coeff based on clothing. Completely ignores the arguments if(flags & SHOCK_TESLA) //I hate this entire block. This gets the siemens_coeff for tesla shocks if(gloves && gloves.siemens_coefficient <= 0) From 55874dca5fca078e7a7a02987f5906d512b03905 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 02:09:12 -0500 Subject: [PATCH 30/73] Automatic changelog generation for PR #2999 [ci skip] --- html/changelogs/AutoChangeLog-pr-2999.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2999.yml diff --git a/html/changelogs/AutoChangeLog-pr-2999.yml b/html/changelogs/AutoChangeLog-pr-2999.yml new file mode 100644 index 000000000000..a3f72282d791 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2999.yml @@ -0,0 +1,4 @@ +author: FalloutFalcon +changes: + - {bugfix: fixed create and destroy test fail} +delete-after: true From 2395e99eb98b6571393ddab791752146dc0960e9 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sun, 2 Jun 2024 01:33:17 -0500 Subject: [PATCH 31/73] camera/autoname/LateInitialize() optimization (#3001) ## About The Pull Request copys https://github.com/tgstation/tgstation/pull/70969 ## Why It's Good For The Game I noticed we search glob.machines for every autoname camera which cannot be better then a static list ## Changelog :cl: code: camera/autoname/LateInitialize() optimization /:cl: --- code/game/machinery/camera/presets.dm | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/code/game/machinery/camera/presets.dm b/code/game/machinery/camera/presets.dm index 8f57ad09203a..d5f7e618c637 100644 --- a/code/game/machinery/camera/presets.dm +++ b/code/game/machinery/camera/presets.dm @@ -56,18 +56,11 @@ /obj/machinery/camera/autoname/LateInitialize() . = ..() - number = 1 - var/area/A = get_area(src) - if(A) - for(var/obj/machinery/camera/autoname/C in GLOB.machines) - if(C == src) - continue - var/area/CA = get_area(C) - if(CA.type == A.type) - if(C.number) - number = max(number, C.number+1) - c_tag = "[A.name] #[number]" - + var/static/list/autonames_in_areas = list() + var/area/camera_area = get_area(src) + number = autonames_in_areas[camera_area] + 1 + autonames_in_areas[camera_area] = number + c_tag = "[format_text(camera_area.name)] #[number]" // UPGRADE PROCS From b9d7efdb15c5d415c4f1da84582ce417a3344db3 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 02:22:25 -0500 Subject: [PATCH 32/73] Automatic changelog generation for PR #3001 [ci skip] --- html/changelogs/AutoChangeLog-pr-3001.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3001.yml diff --git a/html/changelogs/AutoChangeLog-pr-3001.yml b/html/changelogs/AutoChangeLog-pr-3001.yml new file mode 100644 index 000000000000..bc00e83e6f16 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3001.yml @@ -0,0 +1,4 @@ +author: FalloutFalcon +changes: + - {code_imp: camera/autoname/LateInitialize() optimization} +delete-after: true From c55275fb4b3680bc22e2314e68bec0f6699c9820 Mon Sep 17 00:00:00 2001 From: Gristlebee <56049844+Gristlebee@users.noreply.github.com> Date: Sat, 1 Jun 2024 23:34:22 -0700 Subject: [PATCH 33/73] Asteroid ore veins (#3012) ## About The Pull Request Adds asteroid ore veins to asteroid generation, with the spawning weighted toward higher tier veins ## Why It's Good For The Game Since the mining rework, there hasn't been much reason to visit asteroids anymore as their ore generation has been slashed and ore veins present a much more efficient way to mine. Having high tier ore veins on the asteroids should make them desirable places to mine again, and a reliable if dangerous option to find sites the higher tier drilling missions at the outpost. Having to contend with zero gravity and EVA should present an interesting challenge while drilling. ## Changelog :cl: add: Asteroid ore veins /:cl: --- .../mapgen/planetary/AsteroidGenerator.dm | 12 +++++-- code/modules/mining/ore_veins.dm | 33 +++++++++++++++++++ 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/code/datums/mapgen/planetary/AsteroidGenerator.dm b/code/datums/mapgen/planetary/AsteroidGenerator.dm index c2f7a5340097..737194b5ee28 100644 --- a/code/datums/mapgen/planetary/AsteroidGenerator.dm +++ b/code/datums/mapgen/planetary/AsteroidGenerator.dm @@ -114,7 +114,10 @@ /obj/structure/geyser/random = 1, /obj/structure/spawner/mining/goliath = 1, /obj/structure/spawner/mining = 1, - /obj/structure/spawner/mining/hivelord = 1 + /obj/structure/spawner/mining/hivelord = 1, + /obj/structure/vein/asteroid = 5, + /obj/structure/vein/classtwo/asteroid = 10, + /obj/structure/vein/classthree/asteroid = 5 ) mob_spawn_list = list( @@ -157,8 +160,11 @@ ) feature_spawn_list = list( - /obj/structure/geyser/random = 1, - /obj/structure/spawner/mining/carp = 1 + /obj/structure/geyser/random = 5, + /obj/structure/spawner/mining/carp = 5, + /obj/structure/vein/asteroid = 10, + /obj/structure/vein/classtwo/asteroid = 15, + /obj/structure/vein/classthree/asteroid = 12 ) mob_spawn_list = list( diff --git a/code/modules/mining/ore_veins.dm b/code/modules/mining/ore_veins.dm index 3e5e20053a77..0df6cd187d03 100644 --- a/code/modules/mining/ore_veins.dm +++ b/code/modules/mining/ore_veins.dm @@ -209,3 +209,36 @@ GLOBAL_LIST_EMPTY(ore_veins) ) max_mobs = 6 spawn_time = 80 + +// Asteroid veins are the same as the base planetary ones yield wise, but with the asteroid mobs. + +/obj/structure/vein/asteroid + mob_types = list( + /mob/living/simple_animal/hostile/asteroid/goliath = 60, + /mob/living/simple_animal/hostile/asteroid/basilisk = 30, + /mob/living/simple_animal/hostile/asteroid/hivelord = 30, + /mob/living/simple_animal/hostile/asteroid/brimdemon = 20, + /mob/living/simple_animal/hostile/carp = 20, + ) + +/obj/structure/vein/classtwo/asteroid + mob_types = list( + /mob/living/simple_animal/hostile/asteroid/goliath = 60, + /mob/living/simple_animal/hostile/asteroid/basilisk = 30, + /mob/living/simple_animal/hostile/asteroid/hivelord = 30, + /mob/living/simple_animal/hostile/asteroid/brimdemon = 20, + /mob/living/simple_animal/hostile/carp = 20, + /mob/living/simple_animal/hostile/carp/megacarp = 15, + /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient = 5 + ) + +/obj/structure/vein/classthree/asteroid + mob_types = list( + /mob/living/simple_animal/hostile/asteroid/goliath = 60, + /mob/living/simple_animal/hostile/asteroid/basilisk = 30, + /mob/living/simple_animal/hostile/asteroid/hivelord = 30, + /mob/living/simple_animal/hostile/asteroid/brimdemon = 20, + /mob/living/simple_animal/hostile/carp/megacarp = 20, + /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient = 10 + ) + From 121fea0e1cd42fe152f354ca17a45f21ccfdf555 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 02:38:44 -0500 Subject: [PATCH 34/73] Automatic changelog generation for PR #3012 [ci skip] --- html/changelogs/AutoChangeLog-pr-3012.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3012.yml diff --git a/html/changelogs/AutoChangeLog-pr-3012.yml b/html/changelogs/AutoChangeLog-pr-3012.yml new file mode 100644 index 000000000000..3e0eb8f71b2f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3012.yml @@ -0,0 +1,4 @@ +author: Gristlebee +changes: + - {rscadd: Asteroid ore veins} +delete-after: true From f4b6f59cd370965b9b79f8a58ae88b51b04a72c7 Mon Sep 17 00:00:00 2001 From: Theos Date: Sun, 2 Jun 2024 02:35:42 -0400 Subject: [PATCH 35/73] Makes the brimstone shoot faster (#3055) ## About The Pull Request Reduces the cooldown time between pumps from 0.5 seconds to 0.2 seconds on the brimstone, allowing it to run through its 5 shells faster than a li teg can respond to a junker ## Why It's Good For The Game The fast shooting shotgun is now objectively faster rather than marginally faster compared to other shotguns ## Changelog :cl: balance: the brimstone can now be pumped faster. Enjoy your rilena. /:cl: Signed-off-by: Theos --- code/modules/projectiles/guns/ballistic/shotgun.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 4502f7fe9b2c..0e07e9473cd4 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -64,6 +64,7 @@ mag_type = /obj/item/ammo_box/magazine/internal/shot/lethal manufacturer = MANUFACTURER_HUNTERSPRIDE fire_delay = 1 + rack_delay = 2 can_be_sawn_off = TRUE From 99325ce533efcee82dc9359caff0f4b87f3b511d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 02:53:40 -0500 Subject: [PATCH 36/73] Automatic changelog generation for PR #3055 [ci skip] --- html/changelogs/AutoChangeLog-pr-3055.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3055.yml diff --git a/html/changelogs/AutoChangeLog-pr-3055.yml b/html/changelogs/AutoChangeLog-pr-3055.yml new file mode 100644 index 000000000000..ae7527866d8c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3055.yml @@ -0,0 +1,4 @@ +author: SomeguyManperson +changes: + - {balance: the brimstone can now be pumped faster. Enjoy your rilena.} +delete-after: true From dc5c4da633ee62c9bc6a99d90061da5a74a3a999 Mon Sep 17 00:00:00 2001 From: Sun-Soaked <45698967+Sun-Soaked@users.noreply.github.com> Date: Sun, 2 Jun 2024 02:35:55 -0400 Subject: [PATCH 37/73] fixes shotgun casing bounce sounds (#3057) ## About The Pull Request I ![image](https://github.com/shiptest-ss13/Shiptest/assets/45698967/5ec6ffa1-219a-4ada-b83c-fbdecab5231f) may have accidentally pr'd this to retlaw's branch before here ## Why It's Good For The Game shotgun ## Changelog :cl: fix: shoutgun casing bounce sfx now plays as intended. oopsies. /:cl: --- code/datums/components/movable_physics.dm | 2 +- code/modules/projectiles/ammunition/_ammunition.dm | 2 +- code/modules/projectiles/guns/ballistic.dm | 2 +- code/modules/projectiles/guns/ballistic/revolver.dm | 4 ++-- code/modules/projectiles/guns/ballistic/shotgun.dm | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/datums/components/movable_physics.dm b/code/datums/components/movable_physics.dm index 55686bb1e259..114cac29f24b 100644 --- a/code/datums/components/movable_physics.dm +++ b/code/datums/components/movable_physics.dm @@ -69,7 +69,7 @@ /datum/component/movable_physics/proc/z_floor_bounce(atom/movable/moving_atom) angle_of_movement += rand(-3000, 3000) / 100 var/turf/a_turf = get_turf(moving_atom) - if(istype(moving_atom, /obj/item/ammo_casing)) + if(istype(moving_atom, /obj/item/ammo_casing) && !bounce_sound) playsound(moving_atom, a_turf.bullet_bounce_sound, 50, TRUE) else playsound(moving_atom, bounce_sound, 50, TRUE) diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammunition.dm index 2bcd961427db..26597a64f33b 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammunition.dm @@ -109,7 +109,7 @@ pixel_y = rand(-4, 4) pixel_z = 8 //bounce time var/angle_of_movement = !isnull(shooter) ? (rand(-3000, 3000) / 100) + dir2angle(turn(shooter.dir, 180)) : rand(-3000, 3000) / 100 - AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(400, 450) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement) + AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(400, 450) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement, _bounce_sound = bounce_sfx_override) /obj/item/ammo_casing/proc/bounce_away(still_warm = FALSE, bounce_delay = 3) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 13acf16c0ff2..559b7daa643a 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -366,7 +366,7 @@ CB.forceMove(drop_location()) var/angle_of_movement =(rand(-3000, 3000) / 100) + dir2angle(turn(user.dir, 180)) - CB.AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(350, 450) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement) + CB.AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(350, 450) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement, _bounce_sound = CB.bounce_sfx_override) num_unloaded++ SSblackbox.record_feedback("tally", "station_mess_created", 1, CB.name) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index dc6f184e4a0b..7fcc3c4b500c 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -85,7 +85,7 @@ continue casing_to_eject.forceMove(drop_location()) var/angle_of_movement =(rand(-3000, 3000) / 100) + dir2angle(turn(user.dir, 180)) - casing_to_eject.AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(450, 550) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement) + casing_to_eject.AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(450, 550) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement, _bounce_sound = casing_to_eject.bounce_sfx_override) num_unloaded++ SSblackbox.record_feedback("tally", "station_mess_created", 1, casing_to_eject.name) @@ -124,7 +124,7 @@ playsound(src, eject_sound, eject_sound_volume, eject_sound_vary) casing_to_eject.forceMove(drop_location()) var/angle_of_movement =(rand(-3000, 3000) / 100) + dir2angle(turn(user.dir, 180)) - casing_to_eject.AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(350, 450) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement) + casing_to_eject.AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(350, 450) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement, _bounce_sound = casing_to_eject.bounce_sfx_override) SSblackbox.record_feedback("tally", "station_mess_created", 1, casing_to_eject.name) if(!gate_loaded) diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 0e07e9473cd4..9d257821344b 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -305,7 +305,7 @@ for(var/obj/item/ammo_casing/casing_bullet in get_ammo_list(FALSE, TRUE)) casing_bullet.forceMove(drop_location()) var/angle_of_movement =(rand(-3000, 3000) / 100) + dir2angle(turn(user.dir, 180)) - casing_bullet.AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(450, 550) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement) + casing_bullet.AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(450, 550) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement, _bounce_sound = casing_bullet.bounce_sfx_override) num_unloaded++ SSblackbox.record_feedback("tally", "station_mess_created", 1, casing_bullet.name) From 456843133f706d06f2dbe4ab98aed88a3e9de4c3 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 03:06:57 -0500 Subject: [PATCH 38/73] Automatic changelog generation for PR #3057 [ci skip] --- html/changelogs/AutoChangeLog-pr-3057.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3057.yml diff --git a/html/changelogs/AutoChangeLog-pr-3057.yml b/html/changelogs/AutoChangeLog-pr-3057.yml new file mode 100644 index 000000000000..cfc1bc9340ba --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3057.yml @@ -0,0 +1,4 @@ +author: Sun-Soaked +changes: + - {bugfix: shoutgun casing bounce sfx now plays as intended. oopsies.} +delete-after: true From f959e96639ffc557cbbaba2a3dc1ca4baf59e7a9 Mon Sep 17 00:00:00 2001 From: Sun-Soaked <45698967+Sun-Soaked@users.noreply.github.com> Date: Sun, 2 Jun 2024 02:36:05 -0400 Subject: [PATCH 39/73] Tweak Death (#3058) it's over ## About The Pull Request For some reason the runner hates "tweak" changelog entries now. So we have to stop doing them ## Why It's Good For The Game It's not ## Changelog :cl: config: tweak option removed from changelog template /:cl: --- .github/PULL_REQUEST_TEMPLATE.md | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index d8e1a4830773..168b9038b246 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -15,7 +15,6 @@ add: Added new things add: Added more things del: Removed old things -tweak: tweaked a few things balance: rebalanced something fix: fixed a few things soundadd: added a new sound thingy From f79339a09b65041358a2675ababaeb2c36b4d26e Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 03:20:02 -0500 Subject: [PATCH 40/73] Automatic changelog generation for PR #3058 [ci skip] --- html/changelogs/AutoChangeLog-pr-3058.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3058.yml diff --git a/html/changelogs/AutoChangeLog-pr-3058.yml b/html/changelogs/AutoChangeLog-pr-3058.yml new file mode 100644 index 000000000000..1bd6f57c0a9a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3058.yml @@ -0,0 +1,4 @@ +author: Sun-Soaked +changes: + - {config: tweak option removed from changelog template} +delete-after: true From 9f591a1c276efe15e47902575b47a5e91995eac4 Mon Sep 17 00:00:00 2001 From: Theos Date: Sun, 2 Jun 2024 02:37:28 -0400 Subject: [PATCH 41/73] Hallucination anomalies now affect people who don't have research scanners rather than people who do (#3023) ## About The Pull Request Yipee ## Changelog :cl: fix: hallucination anomalies now trigger if you aren't wearing proper protection (as opposed to only triggering if you are) /:cl: Signed-off-by: Theos --- code/game/objects/effects/anomalies/anomalies_hallucination.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/effects/anomalies/anomalies_hallucination.dm b/code/game/objects/effects/anomalies/anomalies_hallucination.dm index fc7e4e3c9859..ab859a3b3215 100644 --- a/code/game/objects/effects/anomalies/anomalies_hallucination.dm +++ b/code/game/objects/effects/anomalies/anomalies_hallucination.dm @@ -28,7 +28,7 @@ /obj/effect/anomaly/hallucination/proc/hallucination_pulse(turf/open/location, effectrange) for(var/mob/living/carbon/human/user in view(location, effectrange)) // If they are immune to the anomaly - if (iscarbon(user) && !user.research_scanner) + if (user.research_scanner) continue // Blind people don't get hallucinations. From eaddde18c8a4ba035c4a9411a1e62eb9dee93440 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 03:33:17 -0500 Subject: [PATCH 42/73] Automatic changelog generation for PR #3023 [ci skip] --- html/changelogs/AutoChangeLog-pr-3023.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3023.yml diff --git a/html/changelogs/AutoChangeLog-pr-3023.yml b/html/changelogs/AutoChangeLog-pr-3023.yml new file mode 100644 index 000000000000..97226db250d0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3023.yml @@ -0,0 +1,5 @@ +author: SomeguyManperson +changes: + - {bugfix: hallucination anomalies now trigger if you aren't wearing proper protection + (as opposed to only triggering if you are)} +delete-after: true From a1c53bcf38c6a252bfa244830d2e90c45b98a691 Mon Sep 17 00:00:00 2001 From: Gristlebee <56049844+Gristlebee@users.noreply.github.com> Date: Sat, 1 Jun 2024 23:38:57 -0700 Subject: [PATCH 43/73] Granularizes defib crate at the outpost (#3040) ## About The Pull Request Defib crates now contain a single defib, and desc and price changed accordingly. ## Why It's Good For The Game Fine control over your orders are good, and you can always buy that second defib anyways if you really need it. ## Changelog :cl: tweak: Defib crate now contains a single defib, priced 750 /:cl: --- code/modules/cargo/packs/medical.dm | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm index d49e9760da81..08b576937138 100644 --- a/code/modules/cargo/packs/medical.dm +++ b/code/modules/cargo/packs/medical.dm @@ -61,10 +61,9 @@ /datum/supply_pack/medical/defibs name = "Defibrillator Crate" - desc = "Contains two defibrillators for bringing the recently deceased back to life." - cost = 1500 - contains = list(/obj/item/defibrillator/loaded, - /obj/item/defibrillator/loaded) + desc = "Contains a defibrillator for bringing the recently deceased back to life." + cost = 750 + contains = list(/obj/item/defibrillator/loaded) crate_name = "defibrillator crate" /datum/supply_pack/medical/surgery From 8677096e7f1dc0b3b45e32dcc4516db27c5e1d4d Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 03:46:05 -0500 Subject: [PATCH 44/73] Automatic changelog generation for PR #3040 [ci skip] --- html/changelogs/AutoChangeLog-pr-3040.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3040.yml diff --git a/html/changelogs/AutoChangeLog-pr-3040.yml b/html/changelogs/AutoChangeLog-pr-3040.yml new file mode 100644 index 000000000000..b39e705418cd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3040.yml @@ -0,0 +1,4 @@ +author: Gristlebee +changes: + - {tweak: 'Defib crate now contains a single defib, priced 750'} +delete-after: true From 4bda1054850faca7e9b68de98a7db866c14dacf9 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sun, 2 Jun 2024 01:39:24 -0500 Subject: [PATCH 45/73] granularizes a handfully of supply packs (#3044) ## About The Pull Request granularizes a handful of tool and machine supply packs! ## Why It's Good For The Game Not everyone needs or can afford two pairs insulated gloves! ## Changelog :cl: tweak: granularizes a handful of tool and machine supply packs! /:cl: --- code/modules/cargo/packs/machinery.dm | 25 +++++++----------- code/modules/cargo/packs/spacesuit_armor.dm | 3 +-- code/modules/cargo/packs/tools.dm | 29 +++++++++------------ 3 files changed, 23 insertions(+), 34 deletions(-) diff --git a/code/modules/cargo/packs/machinery.dm b/code/modules/cargo/packs/machinery.dm index 825329e97c80..56ed7130738b 100644 --- a/code/modules/cargo/packs/machinery.dm +++ b/code/modules/cargo/packs/machinery.dm @@ -66,25 +66,22 @@ /datum/supply_pack/machinery/thermomachine name = "Thermomachine Crate" desc = "Freeze or heat your air." - cost = 2000 - contains = list(/obj/item/circuitboard/machine/thermomachine, - /obj/item/circuitboard/machine/thermomachine) + cost = 1000 + contains = list(/obj/item/circuitboard/machine/thermomachine) crate_name = "thermomachine crate" /datum/supply_pack/machinery/portapump name = "Portable Air Pump Crate" - desc = "Want to drain a room of air without losing a drop? We've got you covered. Contains two portable air pumps." - cost = 3000 - contains = list(/obj/machinery/portable_atmospherics/pump, - /obj/machinery/portable_atmospherics/pump) + desc = "Want to drain a room of air without losing a drop? We've got you covered. Contains a portable air pump." + cost = 1500 + contains = list(/obj/machinery/portable_atmospherics/pump) crate_name = "portable air pump crate" /datum/supply_pack/machinery/portascrubber name = "Portable Scrubber Crate" - desc = "Clean up that pesky plasma leak with your very own set of two portable scrubbers." - cost = 3000 - contains = list(/obj/machinery/portable_atmospherics/scrubber, - /obj/machinery/portable_atmospherics/scrubber) + desc = "Clean up that pesky plasma leak with your very own portable scrubber." + cost = 1500 + contains = list(/obj/machinery/portable_atmospherics/scrubber) crate_name = "portable scrubber crate" /datum/supply_pack/machinery/hugescrubber @@ -155,11 +152,9 @@ /datum/supply_pack/machinery/wall_shield_gen name = "Shield Generator Crate" - desc = "These four shield wall generators are guaranteed to keep any unwanted lifeforms on the outside, where they belong! Not rated for containing singularities or tesla balls." - cost = 2000 + desc = "These two shield wall generators are guaranteed to keep any unwanted lifeforms on the outside, where they belong! Not rated for containing singularities or tesla balls." + cost = 1000 contains = list(/obj/machinery/power/shieldwallgen, - /obj/machinery/power/shieldwallgen, - /obj/machinery/power/shieldwallgen, /obj/machinery/power/shieldwallgen) crate_name = "shield generators crate" crate_type = /obj/structure/closet/crate/secure/plasma diff --git a/code/modules/cargo/packs/spacesuit_armor.dm b/code/modules/cargo/packs/spacesuit_armor.dm index 78e7d0fb1ff0..8346ea00b06e 100644 --- a/code/modules/cargo/packs/spacesuit_armor.dm +++ b/code/modules/cargo/packs/spacesuit_armor.dm @@ -34,8 +34,7 @@ name = "Medical Hardsuit Crate" desc = "One medical hardsuit, resistant to diseases and useful for retrieving patients in space." cost = 1500 - contains = list(/obj/item/clothing/suit/space/hardsuit/medical, - /obj/item/clothing/suit/space/hardsuit/medical) + contains = list(/obj/item/clothing/suit/space/hardsuit/medical) crate_name = "medical hardsuit crate" crate_type = /obj/structure/closet/crate/medical diff --git a/code/modules/cargo/packs/tools.dm b/code/modules/cargo/packs/tools.dm index 92726a3ab6a6..6b43448a5d81 100644 --- a/code/modules/cargo/packs/tools.dm +++ b/code/modules/cargo/packs/tools.dm @@ -67,14 +67,11 @@ ) crate_name = "basic mining crate" -/datum/supply_pack/tools/jackhammers +/datum/supply_pack/tools/jackhammer name = "Jackhammer Crate" - desc = "Contains two jackhammers, ideal for breaking rocks and breaking hull." - cost = 3500 - contains = list( - /obj/item/pickaxe/drill/jackhammer, - /obj/item/pickaxe/drill/jackhammer, - ) + desc = "Contains a jackhammer, ideal for breaking rocks and breaking hull." + cost = 1750 + contains = list(/obj/item/pickaxe/drill/jackhammer) crate_name = "jackhammer crate" @@ -87,10 +84,9 @@ /datum/supply_pack/tools/insulated_gloves name = "Insulated Gloves Crate" - desc = "The backbone of modern society. Barely ever ordered for actual engineering. Contains two insulated gloves." - cost = 1500 - contains = list(/obj/item/clothing/gloves/color/yellow, - /obj/item/clothing/gloves/color/yellow) + desc = "The backbone of modern society. Barely ever ordered for actual engineering. Contains a pair of insulated gloves." + cost = 750 + contains = list(/obj/item/clothing/gloves/color/yellow) crate_name = "insulated gloves crate" /datum/supply_pack/tools/jetpack @@ -101,13 +97,12 @@ crate_name = "jetpack crate" crate_type = /obj/structure/closet/crate/secure/plasma -/datum/supply_pack/tools/transfer_valves +/datum/supply_pack/tools/transfer_valve name = "Tank Transfer Valves Crate" - desc = "The key ingredient for making a lot of people very angry very fast. Contains two tank transfer valves." - cost = 6000 - contains = list(/obj/item/transfer_valve, - /obj/item/transfer_valve) - crate_name = "tank transfer valves crate" + desc = "The key ingredient for making a lot of people very angry very fast. Contains a tank transfer valve." + cost = 3000 + contains = list(/obj/item/transfer_valve) + crate_name = "tank transfer valve crate" crate_type = /obj/structure/closet/crate/secure/science /* From 12d8b17d2502f969826ce49a8b4932addd101160 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 03:59:10 -0500 Subject: [PATCH 46/73] Automatic changelog generation for PR #3044 [ci skip] --- html/changelogs/AutoChangeLog-pr-3044.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3044.yml diff --git a/html/changelogs/AutoChangeLog-pr-3044.yml b/html/changelogs/AutoChangeLog-pr-3044.yml new file mode 100644 index 000000000000..9b9f10f99b29 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3044.yml @@ -0,0 +1,4 @@ +author: FalloutFalcon +changes: + - {tweak: granularizes a handful of tool and machine supply packs!} +delete-after: true From e97cee3c1eca131afd1eed4141a3247a06bd368d Mon Sep 17 00:00:00 2001 From: Gristlebee <56049844+Gristlebee@users.noreply.github.com> Date: Sat, 1 Jun 2024 23:40:12 -0700 Subject: [PATCH 47/73] Granularizes mech equipment (#3039) ## About The Pull Request Granularizes mech equipment in the outpost catalogue and adjusts some of the descs. ## Why It's Good For The Game More fine control how much you need to order at the outpost is good. And honestly? Who needs three drills? ## Changelog :cl: tweak: Granularizes mech equipment tweak: mech cargo pack descs /:cl: --------- Signed-off-by: Gristlebee <56049844+Gristlebee@users.noreply.github.com> Co-authored-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/modules/cargo/packs/mechs.dm | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/code/modules/cargo/packs/mechs.dm b/code/modules/cargo/packs/mechs.dm index b28d16359d5e..376c22fc0db8 100644 --- a/code/modules/cargo/packs/mechs.dm +++ b/code/modules/cargo/packs/mechs.dm @@ -103,21 +103,17 @@ Mech Equipment /datum/supply_pack/mech/equipment/drill name = "Mech drill kit" - desc = "A trio of mechanized drills" - cost = 1500 + desc = "Contains one mechanized drill for heavy duty digging." + cost = 500 contains = list( - /obj/item/mecha_parts/mecha_equipment/drill, - /obj/item/mecha_parts/mecha_equipment/drill, /obj/item/mecha_parts/mecha_equipment/drill ) -/datum/supply_pack/mech/equipment/scanners +/datum/supply_pack/mech/equipment/scanner name = "Mech scanner kit" - desc = "A trio of electronic mining scanners, graded to interface with a mech" - cost = 1000 + desc = "An electronic mining scanner, graded to interface with a mech." + cost = 350 contains = list( - /obj/item/mecha_parts/mecha_equipment/mining_scanner, - /obj/item/mecha_parts/mecha_equipment/mining_scanner, /obj/item/mecha_parts/mecha_equipment/mining_scanner ) @@ -131,10 +127,9 @@ Mech Equipment /datum/supply_pack/mech/equipment/clamp name = "Mech clamp kit" - desc = "Two clamps designed for mechanized freight hauling." - cost = 700 + desc = "Contains a clamp designed for mechanized freight hauling." + cost = 350 contains = list( - /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp, /obj/item/mecha_parts/mecha_equipment/hydraulic_clamp ) @@ -148,7 +143,7 @@ Mech Equipment /datum/supply_pack/mech/equipment/ripley_upgrade name = "APLU upgrade kit" - desc = "The components needed to upgrade an APLU MK-I to be spaceworthy" + desc = "Contains an APLU MK II upgrade kit. The upgrade will replace the cockpit with a spaceworthy canopy, but the added weight makes it slower." cost = 1500 contains = list( /obj/item/mecha_parts/mecha_equipment/conversion_kit/ripley @@ -159,7 +154,7 @@ weapons */ /datum/supply_pack/mech/equipment/pka - name = "Proto-Kinetic Accelerator kit" + name = "Mech Mounted Proto-Kinetic Accelerator kit" desc = "A ranged mining attachment for any mech." cost = 1500 contains = list( From a9d83ca8d34b62f0df119ce5b3904f3ebec1395e Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 04:12:27 -0500 Subject: [PATCH 48/73] Automatic changelog generation for PR #3039 [ci skip] --- html/changelogs/AutoChangeLog-pr-3039.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3039.yml diff --git a/html/changelogs/AutoChangeLog-pr-3039.yml b/html/changelogs/AutoChangeLog-pr-3039.yml new file mode 100644 index 000000000000..d875092276eb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3039.yml @@ -0,0 +1,5 @@ +author: Gristlebee +changes: + - {tweak: Granularizes mech equipment} + - {tweak: mech cargo pack descs} +delete-after: true From 94534f36b617c4aa2e2cef6c2962a10c6f6d48c3 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sun, 2 Jun 2024 01:40:56 -0500 Subject: [PATCH 49/73] Examine text improvments to humans and id cards (#3031) ## About The Pull Request fixes a bug introduced by guest book that shows "this person is ." improve id examines and attack self to be a bit clearer adds a way to quickly figure out the faction of a ship ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/40847538-f696-4861-92a8-a3b5a39fd535) ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/529d41ce-d142-4893-8d7d-6ce9a1310576) ## Why It's Good For The Game bug fix and makes it much easier to read id cards ## Changelog :cl: tweak: tweaked id card examine information and formating fix: human examine bug when middle aged /:cl: --- code/__HELPERS/names.dm | 100 ++++++++---------- code/game/objects/items/cards_ids.dm | 48 ++++++--- .../mob/living/carbon/human/examine.dm | 3 +- .../mob/living/carbon/human/human_helpers.dm | 31 +++--- .../overmap/ships/controlled_ship_datum.dm | 3 + 5 files changed, 101 insertions(+), 84 deletions(-) diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm index 7cdaf32b0531..7054c051f707 100644 --- a/code/__HELPERS/names.dm +++ b/code/__HELPERS/names.dm @@ -233,64 +233,52 @@ GLOBAL_DATUM(syndicate_code_response_regex, /regex) else . += ", " +#define FACTION_SYNDICATE "Syndicate" + #define FACTION_NGR "New Gorlex Republic" + #define FACTION_CYBERSUN "CyberSun" + #define FACTION_SUNS "Student-Union of Naturalistic Sciences" +#define FACTION_SOLGOV "SolGov" +#define FACTION_SRM "Saint-Roumain Militia" +#define FACTION_INTEQ "Inteq Risk Management Group" +#define FACTION_CLIP "CLIP Minutemen" +#define FACTION_NT "Nanotrasen" + #define FACTION_NS_LOGI "N+S Logistics" + #define FACTION_VIGILITAS "Vigilitas Interstellar" +#define FACTION_FRONTIER "Frontiersmen Fleet" +#define FACTION_PGF "Pan-Gezenan Federation" +#define FACTION_INDEPENDENT "Independent" + +#define PREFIX_SYNDICATE list("SEV", "SSV") + #define PREFIX_NGR list("NGRV") + #define PREFIX_CYBERSUN list("CSSV") + #define PREFIX_SUNS list("SUNS") +#define PREFIX_SOLGOV list("SCSV") +#define PREFIX_SRM list("SRSV") +#define PREFIX_INTEQ list("IRMV") +#define PREFIX_CLIP list("CMSV", "CMGSV") +#define PREFIX_NT list("NTSV") + #define PREFIX_NS_LOGI list("NSSV") + #define PREFIX_VIGILITAS list("VISV") +#define PREFIX_FRONTIER list("FFV") +#define PREFIX_PGF list("PGF", "PGFMC", "PGFN") +#define PREFIX_INDEPENDENT list("SV", "IMV", "ISV") + /// List of all ship factions to their prefixes. GLOBAL_LIST_INIT(ship_faction_to_prefixes, list( - "Syndicate" = list( - "SEV", - "SSV", - ), - "New Gorlex Republic" = list( - "NGRV", - ), - "CyberSun" = list( - "CSSV", - ), - "Student-Union of Naturalistic Sciences" = list( - "SUNS", - ), - "SolGov" = list( - "SCSV", - ), - "Saint-Roumain Militia" = list( - "SRSV", - ), - "Independent" = list( - "SV", - "IMV", - "ISV", - "XSV", - ), - "Inteq Risk Management Group" = list( - "IRMV", - ), - "CLIP Minutemen" = list( - "CMSV", - "CMGSV", - ), - "CLIP Government" = list( - "LGSV", - "CGSV", - ), - "Nanotrasen" = list( - "NTSV", - ), - "N+S Logistics" = list( - "NSSV", - ), - "Vigilitas Interstellar" = list( - "VISV", - ), - "Frontiersmen Fleet" = list( - "FFV", - ), - "Saint-Roumaine Militia" = list( - "SRSV", - ), - "Pan-Gezenan Federation" = list( - "PGF", - "PGFMC", - "PGFN", - ), + FACTION_SYNDICATE = PREFIX_SYNDICATE, + FACTION_NGR = PREFIX_NGR, + FACTION_CYBERSUN = PREFIX_CYBERSUN, + FACTION_SUNS = PREFIX_SUNS, + FACTION_SOLGOV = PREFIX_SOLGOV, + FACTION_SRM = PREFIX_SRM, + FACTION_INTEQ = PREFIX_INTEQ, + FACTION_CLIP = PREFIX_CLIP, + FACTION_NT = PREFIX_NT, + FACTION_NS_LOGI = PREFIX_NS_LOGI, + FACTION_VIGILITAS = PREFIX_VIGILITAS, + FACTION_FRONTIER = PREFIX_FRONTIER, + FACTION_PGF = PREFIX_PGF, + FACTION_INDEPENDENT = PREFIX_INDEPENDENT )) /proc/ship_prefix_to_faction(prefix) diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 2e93b662799a..9d5623498733 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -180,7 +180,18 @@ /obj/item/card/id/attack_self(mob/user) if(Adjacent(user)) - user.visible_message("[user] shows you: [icon2html(src, viewers(user))] \the [initial(name)] [(!registered_name) ? "(" : "([registered_name]"][(!assignment) ? ")" : ", [assignment])"].", "You show \the [initial(name)] [(!registered_name) ? "(" : "([registered_name],"] [(!assignment) ? ")" : "[assignment])"].") + var/id_message = "\the [initial(name)] " + var/list/id_info = list() + if(assignment) + id_info += "JOB: [assignment]" + if(registered_name) + id_info += "NAME: [registered_name]" + if(id_info) + id_message += id_info.Join(", ") + var/self_message = span_notice("You show [id_message]") + var/other_message = span_notice("[user] shows you: [icon2html(src, viewers(user))] [id_message]") + + user.visible_message(other_message, self_message) add_fingerprint(user) /obj/item/card/id/vv_edit_var(var_name, var_value) @@ -320,33 +331,42 @@ /obj/item/card/id/examine(mob/user) . = ..() - if(registered_account) - . += "The account linked to the card belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr." . += "There's more information below, you can look again to take a closer look..." /obj/item/card/id/examine_more(mob/user) var/list/msg = list("You examine [src] closer, and note the following...") if(registered_name) - msg += "This access card is assigned to [registered_name]." + msg += "NAME:" + msg += "[registered_name]" if(registered_age) - msg += "The card indicates that the holder is [registered_age] years old. [(registered_age < AGE_MINOR) ? "There's a holographic stripe that reads 'MINOR: DO NOT SERVE ALCOHOL OR TOBACCO' along the bottom of the card." : ""]" - if(mining_points) - msg += "There's [mining_points] mining equipment redemption point\s loaded onto this card." + msg += "AGE:" + msg += "[registered_age] years old [(registered_age < AGE_MINOR) ? "There's a holographic stripe that reads 'MINOR: DO NOT SERVE ALCOHOL OR TOBACCO' along the bottom of the card." : ""]" if(length(ship_access)) + msg += "SHIP ACCESS:" + + var/list/ship_factions = list() + for(var/datum/overmap/ship/controlled/ship in ship_access) + var/faction = ship.get_faction() + if(!(faction in ship_factions)) + ship_factions += faction + msg += "[ship_factions.Join(", ")]" + var/list/ship_names = list() for(var/datum/overmap/ship/controlled/ship in ship_access) ship_names += ship.name - msg += "The card has access to the following ships: [ship_names.Join(", ")]" + msg += "[ship_names.Join(", ")]" + if(registered_account) - msg += "The account linked to the ID belongs to '[registered_account.account_holder]' and reports a balance of [registered_account.account_balance] cr." - msg += "Alt-Click the ID to pull money from the linked account in the form of holochips." - msg += "You can insert credits into the linked account by pressing holochips, cash, or coins against the ID." + msg += "ACCOUNT:" + msg += "LINKED ACCOUNT HOLDER: '[registered_account.account_holder]'" + msg += "BALANCE: [registered_account.account_balance] cr." + msg += "Alt-click the ID to pull money from the account in the form of holochips." + msg += "You can insert credits into the account by pressing holochips, cash, or coins against the ID." if(registered_account.account_holder == user.real_name) - msg += "If you lose this ID card, you can reclaim your account by Alt-Clicking a blank ID card while holding it and entering your account ID number." + msg += "If you lose this ID card, you can reclaim your account by Alt-click a blank ID card and entering your account ID number." else - msg += "There is no registered account linked to this card. Alt-Click to add one." - + msg += "There is no registered account. Alt-click to add one." return msg /obj/item/card/id/GetAccess() diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 59f97d172ad1..64882c75ec4e 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -416,4 +416,5 @@ . = ..() if ((wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE))) return - . += list(span_notice("[p_they(TRUE)] appear[p_s()] to be [get_age()].")) + if(get_age()) + . += list(span_notice("[p_they(TRUE)] appear[p_s()] to be [get_age()].")) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index b98466301f63..5d8264c14ac3 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -34,7 +34,7 @@ /mob/living/carbon/human/get_visible_name() if(name_override) return name_override - return get_generic_name(lowercase = TRUE) + return get_generic_name(TRUE, lowercase = TRUE) //Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when Fluacided or when updating a human's name variable /mob/living/carbon/human/proc/get_face_name(if_no_face = get_generic_name(lowercase = TRUE)) @@ -177,7 +177,7 @@ var/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) if((obscured & ITEM_SLOT_ICLOTHING) && skipface || isipc(src)) - return "" + return FALSE switch(age) if(70 to INFINITY) return "Geriatric" @@ -188,27 +188,35 @@ if(40 to 50) return "Middle-Aged" if(24 to 40) - return "" //not necessary because this is basically the most common age range + return FALSE //not necessary because this is basically the most common age range if(18 to 24) return "Young" else return "Puzzling" /mob/living/carbon/human/proc/get_generic_name(prefixed = FALSE, lowercase = FALSE) + var/final_string = "" var/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) var/hide_features = (obscured & ITEM_SLOT_ICLOTHING) && skipface - var/visible_adjective + if(generic_adjective && !hide_features) - visible_adjective = "[generic_adjective] " + final_string += "[generic_adjective] " + var/visible_age = get_age() if(visible_age) - visible_age = "[visible_age] " - var/visible_gender = get_gender() - var/final_string = "[visible_adjective][visible_age][dna.species.name] [visible_gender]" + final_string += "[visible_age] " + + final_string += "[dna.species.name] " + + final_string += get_gender() + if(prefixed) final_string = "\A [final_string]" - return lowercase ? lowertext(final_string) : final_string + + if(lowercase) + final_string = lowertext(final_string) + return final_string /mob/living/carbon/human/proc/get_gender() var/visible_gender = p_they() @@ -218,10 +226,7 @@ if("she") visible_gender = "Woman" if("they") - if(ishuman(src)) - visible_gender = "Person" - else - visible_gender = "Creature" + visible_gender = "Person" else visible_gender = "Thing" return visible_gender diff --git a/code/modules/overmap/ships/controlled_ship_datum.dm b/code/modules/overmap/ships/controlled_ship_datum.dm index b87d3efda187..ec4b78629027 100644 --- a/code/modules/overmap/ships/controlled_ship_datum.dm +++ b/code/modules/overmap/ships/controlled_ship_datum.dm @@ -436,6 +436,9 @@ SStgui.close_uis(helm) helm.say(helm_locked ? "Helm console is now locked." : "Helm console has been unlocked.") +/datum/overmap/ship/controlled/proc/get_faction() + return source_template.faction_name + /obj/item/key/ship name = "ship key" desc = "A key for locking and unlocking the helm of a ship, comes with a ball chain so it can be worn around the neck. Comes with a cute little shuttle-shaped keychain." From 8a5ca882e10b952f52af329db67db9078402190e Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 04:25:51 -0500 Subject: [PATCH 50/73] Automatic changelog generation for PR #3031 [ci skip] --- html/changelogs/AutoChangeLog-pr-3031.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3031.yml diff --git a/html/changelogs/AutoChangeLog-pr-3031.yml b/html/changelogs/AutoChangeLog-pr-3031.yml new file mode 100644 index 000000000000..86d97b66eb88 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3031.yml @@ -0,0 +1,5 @@ +author: FalloutFalcon +changes: + - {tweak: tweaked id card examine information and formating} + - {bugfix: human examine bug when middle aged} +delete-after: true From caf30140ef62654c1eac29a92993e970fad6e748 Mon Sep 17 00:00:00 2001 From: Apogee-dev <60533805+Apogee-dev@users.noreply.github.com> Date: Sat, 1 Jun 2024 23:45:42 -0700 Subject: [PATCH 51/73] Enables ship-specific access by default & updates some ship configs (#2989) ## About The Pull Request See title. By default, ship airlocks will now only open if you have access for that specific ship. Two ships that specialize in service (Boyardee and Lagoon) have this disabled by default. Additionally, pirate ships have been updated to utilize the unused space_spawn config setting. ## Why It's Good For The Game players have been requesting this for like a year straight and letting features go totally unused sucks ## Changelog :cl: tweak: Ship-specific access restrictions have been enabled. tweak: Pirate ships no longer spawn docked to the outpost. /:cl: --- _maps/configs/independent_boyardee.json | 1 + _maps/configs/independent_lagoon.json | 1 + _maps/configs/pirate_libertatia.json | 1 + _maps/configs/pirate_noderider.json | 1 + code/datums/shuttles.dm | 3 ++- 5 files changed, 6 insertions(+), 1 deletion(-) diff --git a/_maps/configs/independent_boyardee.json b/_maps/configs/independent_boyardee.json index f099b23952e9..d4659b14e0ac 100644 --- a/_maps/configs/independent_boyardee.json +++ b/_maps/configs/independent_boyardee.json @@ -16,6 +16,7 @@ "starting_funds": 5000, "map_short_name": "Boyardee-class", "map_path": "_maps/shuttles/independent/independent_boyardee.dmm", + "unique_ship_access": false, "job_slots": { "Bartender": { "outfit": "/datum/outfit/job/independent/bartender", diff --git a/_maps/configs/independent_lagoon.json b/_maps/configs/independent_lagoon.json index 017850eef555..313b4cd71d95 100644 --- a/_maps/configs/independent_lagoon.json +++ b/_maps/configs/independent_lagoon.json @@ -13,6 +13,7 @@ ], "map_short_name": "Lagoon-class", "map_path": "_maps/shuttles/independent/independent_lagoon.dmm", + "unique_ship_access": false, "starting_funds": 3000, "job_slots": { "Captain": { diff --git a/_maps/configs/pirate_libertatia.json b/_maps/configs/pirate_libertatia.json index f61e421b0952..4ed426746512 100644 --- a/_maps/configs/pirate_libertatia.json +++ b/_maps/configs/pirate_libertatia.json @@ -12,6 +12,7 @@ "PIRATES", "NATURAL_AGGRESSIVE" ], + "space_spawn": true, "job_slots": { "Captain": { "outfit": "/datum/outfit/job/independent/captain/pirate", diff --git a/_maps/configs/pirate_noderider.json b/_maps/configs/pirate_noderider.json index 1341a6197635..7863a9d96896 100644 --- a/_maps/configs/pirate_noderider.json +++ b/_maps/configs/pirate_noderider.json @@ -15,6 +15,7 @@ "Riot", "Combat" ], + "space_spawn": true, "job_slots": { "Command Node": { "outfit": "/datum/outfit/job/independent/captain/pirate/jupiter", diff --git a/code/datums/shuttles.dm b/code/datums/shuttles.dm index 1da1dcd04554..d7b60476d977 100644 --- a/code/datums/shuttles.dm +++ b/code/datums/shuttles.dm @@ -21,7 +21,8 @@ var/prefix = "ISV" /// The full name of the ship's faction. var/faction_name = "Independent" - var/unique_ship_access = FALSE + /// Whether or not players from other ships can open airlocks. + var/unique_ship_access = TRUE /// Set by config JSON. If true, the template's ships' "default" spawn location (when bought by a player or loaded at roundstart) /// will be in the middle of space, instead of at an outpost. var/space_spawn = FALSE From 7df98b51589bea31ab9dc9c8145ae75c40299678 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 04:39:31 -0500 Subject: [PATCH 52/73] Automatic changelog generation for PR #2989 [ci skip] --- html/changelogs/AutoChangeLog-pr-2989.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2989.yml diff --git a/html/changelogs/AutoChangeLog-pr-2989.yml b/html/changelogs/AutoChangeLog-pr-2989.yml new file mode 100644 index 000000000000..3b05bc0045ed --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2989.yml @@ -0,0 +1,5 @@ +author: Apogee-dev +changes: + - {tweak: Ship-specific access restrictions have been enabled.} + - {tweak: Pirate ships no longer spawn docked to the outpost.} +delete-after: true From 786028f513857b585aada11a485c6bcbf163d779 Mon Sep 17 00:00:00 2001 From: Skies-Of-Blue <86762641+Skies-Of-Blue@users.noreply.github.com> Date: Sun, 2 Jun 2024 03:56:36 -0700 Subject: [PATCH 53/73] Mindbreaker Tweak (#3052) ## About The Pull Request A small followup to https://github.com/shiptest-ss13/Shiptest/pull/3017, this considerably slows the metabolism on chemical mindbreaker. ## Why It's Good For The Game With the old implementation, chemical mindbreaker could hardly be used to treat RDS. A 50u dose would last only a few minutes, and destroy your liver in the process. This makes RDS actually viable to treat. Also, if you're taking chemical mindbreaker recreationally, you naughty dog you, this allows you the chance to hallucinate for more than a brief moment, given how hallucinations are weighted. Not a very useful recreational substance if it exits your system within thirty seconds. ## Changelog :cl: balance: chemical mindbreaker is now ten times as potent! Be gay, do crime, and hallucinate in the process /:cl: --- code/modules/reagents/chemistry/reagents/toxin_reagents.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index ab0be2930324..e03c84dd7840 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -255,6 +255,7 @@ name = "Mindbreaker Toxin" description = "A powerful hallucinogen. Not a thing to be messed with. For some mental patients. it counteracts their symptoms and anchors them to reality." color = "#B31008" // rgb: 139, 166, 233 + metabolization_rate = 0.1 * REAGENTS_METABOLISM toxpwr = 0 taste_description = "sourness" From 861735d77be89dd0f904fff01cba1e6efa86f58b Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 06:16:16 -0500 Subject: [PATCH 54/73] Automatic changelog generation for PR #3052 [ci skip] --- html/changelogs/AutoChangeLog-pr-3052.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3052.yml diff --git a/html/changelogs/AutoChangeLog-pr-3052.yml b/html/changelogs/AutoChangeLog-pr-3052.yml new file mode 100644 index 000000000000..b94e9be0f721 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3052.yml @@ -0,0 +1,5 @@ +author: Skies-Of-Blue +changes: + - {balance: 'chemical mindbreaker is now ten times as potent! Be gay, do crime, + and hallucinate in the process'} +delete-after: true From 41aedd0971f142cd50ec68bce80aa2ab3625d75c Mon Sep 17 00:00:00 2001 From: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com> Date: Sun, 2 Jun 2024 07:37:23 -0400 Subject: [PATCH 55/73] Ports timed_action_flags & centralizes do_afters (#2865) Ports: - https://github.com/tgstation/tgstation/pull/54409 - https://github.com/tgstation/tgstation/pull/55172 - https://github.com/BeeStation/BeeStation-Hornet/pull/8635 - https://github.com/BeeStation/BeeStation-Hornet/pull/8678 Fix to #2899 - https://github.com/tgstation/tgstation/pull/82413 ## About The Pull Request This PR moves unique do_after behavior under a flag system. It also deletes do_mob & do_atom, and centralizes them under do_after ## Why It's Good For The Game Makes do_after behavior much more granular and easy to edit. Flag systems are straight forward, and the docs I added tell you exactly what their behavior is. do_mob and do_atom are essentially just snowflake versions of do_after, its much cleaner just to put em under the same umbrella. ## Changelog :cl: rkz, Benjamin(benbot16), Rohesie, Qustinnus, jlsnow301 refactor: refactored do_afters to use timed_action_flags for unique args code: centralized do_mob and do_atom into do_after /:cl: --------- Signed-off-by: Sun-Soaked <45698967+Sun-Soaked@users.noreply.github.com> Co-authored-by: Sun-Soaked <45698967+Sun-Soaked@users.noreply.github.com> --- code/__DEFINES/do_afters.dm | 4 + code/__DEFINES/mobs.dm | 6 +- code/__DEFINES/timed_action.dm | 10 + code/__HELPERS/mobs.dm | 213 ++++-------------- code/__HELPERS/unsorted.dm | 38 ---- code/datums/components/butchering.dm | 8 +- code/datums/components/edible.dm | 4 +- code/datums/components/storage/storage.dm | 2 +- code/datums/status_effects/gas.dm | 2 +- code/game/atoms.dm | 10 +- code/game/machinery/doors/airlock.dm | 8 +- code/game/machinery/doors/poddoor.dm | 2 +- code/game/machinery/suit_storage_unit.dm | 2 +- code/game/mecha/equipment/mecha_equipment.dm | 4 +- code/game/objects/buckling.dm | 2 +- code/game/objects/items.dm | 4 +- code/game/objects/items/cardboard_cutouts.dm | 2 +- code/game/objects/items/dna_injector.dm | 2 +- code/game/objects/items/eightball.dm | 2 +- code/game/objects/items/handcuffs.dm | 3 +- code/game/objects/items/implants/implanter.dm | 2 +- code/game/objects/items/pet_carrier.dm | 2 +- code/game/objects/items/stacks/medical.dm | 8 +- .../items/stacks/sheets/sheet_types.dm | 5 +- code/game/objects/items/stacks/tape.dm | 8 +- code/game/objects/items/survery_handheld.dm | 2 +- code/game/objects/structures.dm | 2 +- .../structures/crates_lockers/closets.dm | 2 +- code/game/objects/structures/kitchen_spike.dm | 2 +- code/game/objects/structures/loom.dm | 8 +- code/game/objects/structures/mineral_doors.dm | 2 +- code/game/objects/structures/tables_racks.dm | 2 +- code/game/objects/structures/watercloset.dm | 2 +- .../abductor/equipment/abduction_gear.dm | 8 +- code/modules/antagonists/borer/borer.dm | 2 +- .../antagonists/changeling/powers/absorb.dm | 2 +- .../antagonists/changeling/powers/linglink.dm | 4 +- code/modules/antagonists/cult/blood_magic.dm | 2 +- .../revenant/revenant_abilities.dm | 8 +- code/modules/antagonists/swarmer/swarmer.dm | 10 +- code/modules/clothing/shoes/_shoes.dm | 16 +- code/modules/food_and_drinks/drinks/drinks.dm | 2 +- .../modules/food_and_drinks/food/condiment.dm | 2 +- code/modules/food_and_drinks/food/snacks.dm | 2 +- code/modules/hydroponics/grown/kudzu.dm | 2 +- code/modules/library/lib_codex_gigas.dm | 2 +- code/modules/mob/living/brain/brain_item.dm | 2 +- .../living/carbon/alien/humanoid/humanoid.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 8 +- code/modules/mob/living/carbon/human/human.dm | 17 +- .../mob/living/carbon/human/species.dm | 2 +- .../carbon/human/species_types/ethereal.dm | 2 +- .../carbon/human/species_types/jellypeople.dm | 2 +- .../mob/living/carbon/monkey/combat.dm | 2 +- code/modules/mob/living/living.dm | 6 +- code/modules/mob/living/living_defense.dm | 2 +- .../mob/living/simple_animal/bot/medbot.dm | 5 +- .../friendly/drone/interaction.dm | 2 +- .../simple_animal/guardian/types/support.dm | 2 +- code/modules/mob/mob.dm | 2 +- code/modules/mob/mob_defines.dm | 2 +- code/modules/overmap/helm.dm | 4 +- code/modules/power/cable.dm | 2 +- .../boxes_magazines/_box_magazine.dm | 2 +- .../boxes_magazines/internal/_cylinder.dm | 2 +- code/modules/projectiles/gun.dm | 13 +- .../modules/projectiles/guns/ballistic/hmg.dm | 2 +- .../projectiles/guns/ballistic/revolver.dm | 12 +- .../reagents/reagent_containers/glass.dm | 2 +- .../reagents/reagent_containers/hypospray.dm | 8 +- .../reagents/reagent_containers/medigel.dm | 4 +- .../reagents/reagent_containers/pill.dm | 4 +- .../reagents/reagent_containers/syringes.dm | 4 +- code/modules/recycling/disposal/bin.dm | 2 +- code/modules/religion/rites.dm | 2 +- .../xenobiology/crossbreeding/regenerative.dm | 4 +- code/modules/spells/spell_types/devil.dm | 4 +- code/modules/spells/spell_types/lichdom.dm | 2 +- code/modules/spells/spell_types/lightning.dm | 2 +- code/modules/surgery/surgery_helpers.dm | 2 +- code/modules/vehicles/cars/car.dm | 2 +- code/modules/vehicles/sealed.dm | 2 +- shiptest.dme | 2 + 83 files changed, 230 insertions(+), 348 deletions(-) create mode 100644 code/__DEFINES/do_afters.dm create mode 100644 code/__DEFINES/timed_action.dm diff --git a/code/__DEFINES/do_afters.dm b/code/__DEFINES/do_afters.dm new file mode 100644 index 000000000000..456cf9404004 --- /dev/null +++ b/code/__DEFINES/do_afters.dm @@ -0,0 +1,4 @@ +#define DOAFTER_SOURCE_SURGERY "doafter_surgery" +#define DOAFTER_SOURCE_MECHADRILL "doafter_mechadrill" +#define DOAFTER_SOURCE_SURVIVALPEN "doafter_survivalpen" +#define DOAFTER_SOURCE_GETTING_UP "doafter_gettingup" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index d1d782c84876..8026f9635a97 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -396,7 +396,11 @@ #define WABBAJACK (1<<6) #define SLEEP_CHECK_DEATH(X) sleep(X); if(QDELETED(src) || stat == DEAD) return; -#define INTERACTING_WITH(X, Y) (Y in X.do_afters) + +#define DOING_INTERACTION(user, interaction_key) (LAZYACCESS(user.do_afters, interaction_key)) +#define DOING_INTERACTION_LIMIT(user, interaction_key, max_interaction_count) ((LAZYACCESS(user.do_afters, interaction_key) || 0) >= max_interaction_count) +#define DOING_INTERACTION_WITH_TARGET(user, target) (LAZYACCESS(user.do_afters, target)) +#define DOING_INTERACTION_WITH_TARGET_LIMIT(user, target, max_interaction_count) ((LAZYACCESS(user.do_afters, target) || 0) >= max_interaction_count) /// If you examine the same atom twice in this timeframe, we call examine_more() instead of examine() #define EXAMINE_MORE_TIME 1 SECONDS diff --git a/code/__DEFINES/timed_action.dm b/code/__DEFINES/timed_action.dm new file mode 100644 index 000000000000..90572cdc5416 --- /dev/null +++ b/code/__DEFINES/timed_action.dm @@ -0,0 +1,10 @@ +// timed_action_flags parameter for 'proc/do_after' + +// The user can move freely without canceling the do_after +#define IGNORE_USER_LOC_CHANGE (1<<0) +// The target can move freely without canceling the do_after +#define IGNORE_TARGET_LOC_CHANGE (1<<1) +/// Can do the action even if the item is no longer being held +#define IGNORE_HELD_ITEM (1<<2) +/// Can do the action even if the mob is incapacitated +#define IGNORE_INCAPACITATED (1<<3) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 81ba9ec06dd2..63990e61ee33 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -241,66 +241,6 @@ GLOBAL_LIST_EMPTY(species_list) else return "unknown" -///Timed action involving two mobs, the user and the target. -/proc/do_mob(mob/user , mob/target, time = 3 SECONDS, uninterruptible = FALSE, progress = TRUE, datum/callback/extra_checks = null, ignore_loc_change = FALSE, hidden = FALSE) - if(!user || !target) - return FALSE - - if(target && INTERACTING_WITH(user, target)) - to_chat(user, "You're already interacting with [target]!") - return - - var/user_loc = user.loc - - var/drifting = FALSE - if(!user.Process_Spacemove(0) && user.inertia_dir) - drifting = TRUE - - var/target_loc = target.loc - - LAZYADD(user.do_afters, target) - LAZYADD(target.targeted_by, user) - var/holding = user.get_active_held_item() - var/datum/progressbar/progbar - var/datum/cogbar/cog - if (progress) - progbar = new(user, time, target) - if(!hidden && time >= 1 SECONDS) - cog = new(user) - - var/endtime = world.time+time - var/starttime = world.time - . = TRUE - while (world.time < endtime) - stoplag(1) - if(!QDELETED(progbar)) - progbar.update(world.time - starttime) - if(QDELETED(user) || QDELETED(target)) - . = FALSE - break - if(uninterruptible) - continue - - if(drifting && !user.inertia_dir) - drifting = FALSE - user_loc = user.loc - - - if(!ignore_loc_change && ((!drifting && user.loc != user_loc) || target.loc != target_loc)) - . = FALSE - break - - if(user.get_active_held_item() != holding || user.incapacitated() || (extra_checks && !extra_checks.Invoke())) - . = FALSE - break - if(!QDELETED(progbar)) - progbar.end_progress() - - cog?.remove() - if(!QDELETED(target)) - LAZYREMOVE(user.do_afters, target) - LAZYREMOVE(target.targeted_by, user) - //some additional checks as a callback for for do_afters that want to break on losing health or on the mob taking action /mob/proc/break_do_after_checks(list/checked_health, check_clicks) if(check_clicks && next_move > world.time) @@ -315,24 +255,40 @@ GLOBAL_LIST_EMPTY(species_list) checked_health["health"] = health return ..() -///Timed action involving one mob user. Target is optional. -/proc/do_after(mob/user, delay, needhand = TRUE, atom/target = null, progress = TRUE, datum/callback/extra_checks = null, hidden = FALSE) +/** + * Timed action involving one mob user. A target can also be specified, but it is optional. + * + * Checks that `user` does not move, change hands, get stunned, etc. for the + * given `delay`. Returns `TRUE` on success or `FALSE` on failure. + * + * Arguments: + * * user - the primary "user" of the do_after. + * * delay - how long the do_after takes. Defaults to 3 SECONDS. + * * target - the (optional) target mob of the do_after. If they move/cease to exist, the do_after is cancelled. + * * timed_action_flags - optional flags to override certain do_after checks (see DEFINES/timed_action.dm). + * * progress - if TRUE, a progress bar is displayed. + * * extra_checks - a callback that can be used to add extra checks to the do_after. Returning false in this callback will cancel the do_after. + */ +/proc/do_after(mob/user, delay = 3 SECONDS, atom/target, timed_action_flags = NONE, progress = TRUE, datum/callback/extra_checks, interaction_key, max_interact_count = 1, hidden = FALSE) if(!user) return FALSE + if(!isnum(delay)) + CRASH("do_after was passed a non-number delay: [delay || "null"].") - if(target && INTERACTING_WITH(user, target)) + if(target && DOING_INTERACTION_WITH_TARGET(user, target)) to_chat(user, "You're already interacting with [target]!") return - var/atom/Tloc = null - if(target && !isturf(target)) - Tloc = target.loc - - if(target) - LAZYADD(user.do_afters, target) - LAZYADD(target.targeted_by, user) + if(!interaction_key && target) + interaction_key = target //Use the direct ref to the target + if(interaction_key) //Do we have a interaction_key now? + var/current_interaction_count = LAZYACCESS(user.do_afters, interaction_key) || 0 + if(current_interaction_count >= max_interact_count) //We are at our peak + return + LAZYSET(user.do_afters, interaction_key, current_interaction_count + 1) - var/atom/Uloc = user.loc + var/atom/user_loc = user.loc + var/atom/target_loc = target?.loc var/drifting = FALSE if(!user.Process_Spacemove(0) && user.inertia_dir) @@ -340,136 +296,59 @@ GLOBAL_LIST_EMPTY(species_list) var/holding = user.get_active_held_item() - var/holdingnull = TRUE //User's hand started out empty, check for an empty hand - if(holding) - holdingnull = FALSE //Users hand started holding something, check to see if it's still holding that - delay *= user.do_after_coefficent() var/datum/progressbar/progbar var/datum/cogbar/cog + if(progress) - progbar = new(user, delay, target || user) + if(user.client) + progbar = new(user, delay, target || user) + if(!hidden && delay >= 1 SECONDS) cog = new(user) + var/endtime = world.time + delay var/starttime = world.time . = TRUE while (world.time < endtime) stoplag(1) + if(!QDELETED(progbar)) progbar.update(world.time - starttime) if(drifting && !user.inertia_dir) drifting = FALSE - Uloc = user.loc + user_loc = user.loc - if(QDELETED(user) || user.stat || (!drifting && user.loc != Uloc) || (extra_checks && !extra_checks.Invoke())) + // Check flags + if(QDELETED(user) \ + || (!(timed_action_flags & IGNORE_USER_LOC_CHANGE) && !drifting && user.loc != user_loc) \ + || (!(timed_action_flags & IGNORE_HELD_ITEM) && user.get_active_held_item() != holding) \ + || (!(timed_action_flags & IGNORE_INCAPACITATED) && HAS_TRAIT(user, TRAIT_INCAPACITATED)) \ + || (extra_checks && !extra_checks.Invoke())) . = FALSE break - if(isliving(user)) - var/mob/living/L = user - if(L.IsStun() || L.IsParalyzed()) - . = FALSE - break - - if(!QDELETED(Tloc) && (QDELETED(target) || Tloc != target.loc)) - if((Uloc != Tloc || Tloc != user) && !drifting) - . = FALSE - break - - if(target && !(target in user.do_afters)) + // If we have a target, we check for them moving here. We don't care about it if we're drifting or we ignore target loc change + if(target && (user != target) && \ + (QDELETED(target) \ + || (!(timed_action_flags & IGNORE_TARGET_LOC_CHANGE) && target.loc != target_loc))) . = FALSE break - if(needhand) - //This might seem like an odd check, but you can still need a hand even when it's empty - //i.e the hand is used to pull some item/tool out of the construction - if(!holdingnull) - if(!holding) - . = FALSE - break - if(user.get_active_held_item() != holding) - . = FALSE - break if(!QDELETED(progbar)) progbar.end_progress() cog?.remove() - if(!QDELETED(target)) - LAZYREMOVE(user.do_afters, target) - LAZYREMOVE(target.targeted_by, user) + if(interaction_key) + LAZYREMOVE(user.do_afters, interaction_key) /mob/proc/do_after_coefficent() // This gets added to the delay on a do_after, default 1 . = 1 return -///Timed action involving at least one mob user and a list of targets. -/proc/do_after_mob(mob/user, list/targets, time = 3 SECONDS, uninterruptible = FALSE, progress = TRUE, datum/callback/extra_checks) - if(!user) - return FALSE - if(!islist(targets)) - targets = list(targets) - if(!length(targets)) - return FALSE - - for(var/i in targets) - var/mob/living/target = i - if(INTERACTING_WITH(user, target)) - to_chat(user, "You're already interacting with [target]!") - return - - - var/user_loc = user.loc - - var/drifting = FALSE - if(!user.Process_Spacemove(0) && user.inertia_dir) - drifting = TRUE - - var/list/originalloc = list() - for(var/atom/target in targets) - originalloc[target] = target.loc - LAZYADD(user.do_afters, target) - LAZYADD(target.targeted_by, user) - - var/holding = user.get_active_held_item() - var/datum/progressbar/progbar - if(progress) - progbar = new(user, time, targets[1]) - - var/endtime = world.time + time - var/starttime = world.time - . = TRUE - mainloop: - while(world.time < endtime) - stoplag(1) - if(!QDELETED(progbar)) - progbar.update(world.time - starttime) - if(QDELETED(user) || !targets) - . = FALSE - break - if(uninterruptible) - continue - - if(drifting && !user.inertia_dir) - drifting = FALSE - user_loc = user.loc - - for(var/atom/target in targets) - if((!drifting && user_loc != user.loc) || QDELETED(target) || originalloc[target] != target.loc || user.get_active_held_item() != holding || user.incapacitated() || (extra_checks && !extra_checks.Invoke())) - . = FALSE - break mainloop - if(!QDELETED(progbar)) - progbar.end_progress() - - for(var/thing in targets) - var/atom/target = thing - if(!QDELETED(target)) - LAZYREMOVE(user.do_afters, target) - LAZYREMOVE(target.targeted_by, user) - /proc/is_species(A, species_datum) . = FALSE if(ishuman(A)) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 8e9a1dbc9979..c8c7b63d0a09 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1329,44 +1329,6 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) temp = ((temp + (temp>>3))&29127) % 63 //070707 return temp -//same as do_mob except for movables and it allows both to drift and doesn't draw progressbar -/proc/do_atom(atom/movable/user , atom/movable/target, time = 30, uninterruptible = 0,datum/callback/extra_checks = null) - if(!user || !target) - return TRUE - var/user_loc = user.loc - - var/drifting = FALSE - if(!user.Process_Spacemove(0) && user.inertia_dir) - drifting = TRUE - - var/target_drifting = FALSE - if(!target.Process_Spacemove(0) && target.inertia_dir) - target_drifting = TRUE - - var/target_loc = target.loc - - var/endtime = world.time+time - . = TRUE - while (world.time < endtime) - stoplag(1) - if(QDELETED(user) || QDELETED(target)) - . = 0 - break - if(uninterruptible) - continue - - if(drifting && !user.inertia_dir) - drifting = FALSE - user_loc = user.loc - - if(target_drifting && !target.inertia_dir) - target_drifting = FALSE - target_loc = target.loc - - if((!drifting && user.loc != user_loc) || (!target_drifting && target.loc != target_loc) || (extra_checks && !extra_checks.Invoke())) - . = FALSE - break - //returns a GUID like identifier (using a mostly made up record format) //guids are not on their own suitable for access or security tokens, as most of their bits are predictable. // (But may make a nice salt to one) diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index 6923760a7705..55ba84fb5f7d 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -51,10 +51,14 @@ /datum/component/butchering/proc/startButcher(obj/item/source, mob/living/M, mob/living/user) to_chat(user, "You begin to butcher [M]...") playsound(M.loc, butcher_sound, 50, TRUE, -1) - if(do_mob(user, M, speed) && M.Adjacent(source)) + if(do_after(user, speed, M) && M.Adjacent(source)) Butcher(user, M) /datum/component/butchering/proc/startNeckSlice(obj/item/source, mob/living/carbon/human/H, mob/living/user) + if(DOING_INTERACTION_WITH_TARGET(user, H)) + to_chat(user, "You're already interacting with [H]!") + return + user.visible_message("[user] is slitting [H]'s throat!", \ "You start slicing [H]'s throat!", \ "You hear a cutting noise!", ignored_mobs = H) @@ -63,7 +67,7 @@ log_combat(user, H, "starts slicing the throat of") playsound(H.loc, butcher_sound, 50, TRUE, -1) - if(do_mob(user, H, clamp(500 / source.force, 30, 100)) && H.Adjacent(source)) + if(do_after(user, clamp(500 / source.force, 30, 100), H) && H.Adjacent(source)) if(H.has_status_effect(/datum/status_effect/neck_slice)) user.show_message("[H]'s neck has already been already cut, you can't make the bleeding any worse!", MSG_VISUAL, \ "Their neck has already been already cut, you can't make the bleeding any worse!") diff --git a/code/datums/components/edible.dm b/code/datums/components/edible.dm index 3a047d082868..cf0199d05e18 100644 --- a/code/datums/components/edible.dm +++ b/code/datums/components/edible.dm @@ -115,7 +115,7 @@ Behavior that's still missing from this component that original food items had t . = COMPONENT_ITEM_NO_ATTACK //Point of no return I suppose if(eater == feeder)//If you're eating it yourself. - if(!do_mob(feeder, eater, eat_time)) //Gotta pass the minimal eat time + if(!do_after(feeder, eat_time, eater)) //Gotta pass the minimal eat time return var/eatverb = pick(eatverbs) if(junkiness && eater.satiety < -150 && eater.nutrition > NUTRITION_LEVEL_STARVING + 50 && !HAS_TRAIT(eater, TRAIT_VORACIOUS)) @@ -143,7 +143,7 @@ Behavior that's still missing from this component that original food items had t eater.visible_message("[feeder] cannot force any more of [parent] down [eater]'s throat!", \ "[feeder] cannot force any more of [parent] down your throat!") return - if(!do_mob(feeder, eater)) //Wait 3 seconds before you can feed + if(!do_after(feeder, target = eater)) //Wait 3 seconds before you can feed return log_combat(feeder, eater, "fed", owner.reagents.log_list()) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 4728e15cc205..5724d4327bee 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -316,7 +316,7 @@ var/turf/T = get_turf(A) var/list/things = contents() var/datum/progressbar/progress = new(M, length(things), T) - while (do_after(M, 10, TRUE, T, FALSE, CALLBACK(src, PROC_REF(mass_remove_from_storage), T, things, progress))) + while (do_after(M, 1 SECONDS, T, NONE, FALSE, CALLBACK(src, PROC_REF(mass_remove_from_storage), T, things, progress))) stoplag(1) progress.end_progress() diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index 11037374b9b3..cc6a91b2f267 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -38,7 +38,7 @@ /datum/status_effect/freon/proc/do_resist() to_chat(owner, "You start breaking out of the ice cube...") - if(do_mob(owner, owner, 40)) + if(do_after(owner, 40)) if(!QDELETED(src)) to_chat(owner, "You break out of the ice cube!") owner.remove_status_effect(/datum/status_effect/freon) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 44d5de773f94..7ffa3255ada1 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -84,9 +84,6 @@ var/list/alternate_appearances - ///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy() - var/list/targeted_by - /// Last appearance of the atom for demo saving purposes var/image/demo_last_appearance @@ -310,11 +307,6 @@ LAZYCLEARLIST(overlays) LAZYCLEARLIST(managed_overlays) - for(var/i in targeted_by) - var/mob/M = i - LAZYREMOVE(M.do_afters, src) - - targeted_by = null QDEL_NULL(light) if(smoothing_flags & SMOOTH_QUEUED) @@ -976,7 +968,7 @@ var/list/things = src_object.contents() var/datum/progressbar/progress = new(user, things.len, src) var/datum/component/storage/STR = GetComponent(/datum/component/storage) - while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(STR, TYPE_PROC_REF(/datum/component/storage, handle_mass_item_insertion), things, src_object, user, progress))) + while (do_after(user, 1 SECONDS, src, NONE, FALSE, CALLBACK(STR, TYPE_PROC_REF(/datum/component/storage, handle_mass_item_insertion), things, src_object, user, progress))) stoplag(1) progress.end_progress() to_chat(user, "You dump as much of [src_object.parent]'s contents [STR.insert_preposition]to [src] as you can.") diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 6bb5a4bab561..121c93a07353 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -958,7 +958,7 @@ to_chat(user, "You need at least 2 metal sheets to reinforce [src].") return to_chat(user, "You start reinforcing [src].") - if(do_after(user, 20, TRUE, src)) + if(do_after(user, 20, src)) if(!panel_open || !S.use(2)) return user.visible_message("[user] reinforces \the [src] with metal.", @@ -972,7 +972,7 @@ to_chat(user, "You need at least 2 plasteel sheets to reinforce [src].") return to_chat(user, "You start reinforcing [src].") - if(do_after(user, 20, TRUE, src)) + if(do_after(user, 20, src)) if(!panel_open || !S.use(2)) return user.visible_message("[user] reinforces \the [src] with plasteel.", @@ -1226,7 +1226,7 @@ var/time_to_open = 50 playsound(src, pry_sound, 100, TRUE, mono_adj = TRUE) //is it aliens or just the CE being a dick? prying_so_hard = TRUE - if(do_after(user, time_to_open, TRUE, src)) + if(do_after(user, time_to_open, src)) open(2) if(density && !open(2)) to_chat(user, "Despite your attempts, [src] refuses to open.") @@ -1414,7 +1414,7 @@ playsound(src, 'sound/machines/creaking.ogg', 100, TRUE, mono_adj = TRUE) - if(do_after(user, time_to_open, TRUE, src)) + if(do_after(user, time_to_open, src)) if(density && !open(2)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!) to_chat(user, "Despite your efforts, [src] managed to resist your attempts to open it!") diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index ce705c71e434..7e3febcc482c 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -157,7 +157,7 @@ if(hasPower()) time_to_open = 15 SECONDS - if(do_after(user, time_to_open, TRUE, src)) + if(do_after(user, time_to_open, src)) if(density && !open(TRUE)) //The airlock is still closed, but something prevented it opening. (Another player noticed and bolted/welded the airlock in time!) to_chat(user, span_warning("Despite your efforts, [src] managed to resist your attempts to open it!")) diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index ed734453202b..7db02250ce94 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -406,7 +406,7 @@ else target.visible_message(span_warning("[user] starts shoving [target] into [src]!"), span_userdanger("[user] starts shoving you into [src]!")) - if(do_mob(user, target, 30)) + if(do_after(user, 30, target)) if(occupant || helmet || suit || storage) return if(target == user) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 63d308f69558..3882fe8d5a6f 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -101,13 +101,13 @@ chassis.use_power(energy_drain) addtimer(CALLBACK(src, PROC_REF(set_ready_state), 1), equip_cooldown) -/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(atom/target) +/obj/item/mecha_parts/mecha_equipment/proc/do_after_cooldown(atom/target, mob/user, interaction_key) if(!chassis) return var/C = chassis.loc set_ready_state(0) chassis.use_power(energy_drain) - . = do_after(chassis.occupant, equip_cooldown, target=target) + . = do_after(user, equip_cooldown, target=target, interaction_key = interaction_key) set_ready_state(1) if(!chassis || chassis.loc != C || src != chassis.selected || !(get_dir(chassis, target)&chassis.dir)) return 0 diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 42c32e04fa98..fbe90058fc3e 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -210,7 +210,7 @@ M.visible_message("[user] starts buckling [M] to [src]!",\ "[user] starts buckling you to [src]!",\ "You hear metal clanking.") - if(!do_after(user, 2 SECONDS, TRUE, M)) + if(!do_after(user, 2 SECONDS, M)) return FALSE // Sanity check before we attempt to buckle. Is everything still in a kosher state for buckling after the 3 seconds have elapsed? diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 7e64ce658e8b..033307e5472f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -395,7 +395,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb if(grav > STANDARD_GRAVITY) var/grav_power = min(3,grav - STANDARD_GRAVITY) to_chat(user,"You start picking up [src]...") - if(!do_mob(user,src,30*grav_power)) + if(!do_after(user, 30*grav_power, src)) return @@ -926,7 +926,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb var/datum/callback/tool_check = CALLBACK(src, PROC_REF(tool_check_callback), user, amount, extra_checks) if(ismob(target)) - if(!do_mob(user, target, delay, extra_checks=tool_check)) + if(!do_after(user, delay, target, extra_checks=tool_check)) return else diff --git a/code/game/objects/items/cardboard_cutouts.dm b/code/game/objects/items/cardboard_cutouts.dm index f44359ca656c..31af53aa3fc7 100644 --- a/code/game/objects/items/cardboard_cutouts.dm +++ b/code/game/objects/items/cardboard_cutouts.dm @@ -104,7 +104,7 @@ var/new_appearance = show_radial_menu(user, src, possible_appearances, custom_check = CALLBACK(src, PROC_REF(check_menu), user, crayon), radius = 36, require_near = TRUE) if(!new_appearance) return FALSE - if(!do_after(user, 10, FALSE, src, TRUE)) + if(!do_after(user, 10, src, progress = TRUE)) return FALSE if(!check_menu(user, crayon)) return FALSE diff --git a/code/game/objects/items/dna_injector.dm b/code/game/objects/items/dna_injector.dm index 34563d5e649c..1f78839ae40f 100644 --- a/code/game/objects/items/dna_injector.dm +++ b/code/game/objects/items/dna_injector.dm @@ -62,7 +62,7 @@ if(target != user) target.visible_message("[user] is trying to inject [target] with [src]!", \ "[user] is trying to inject you with [src]!") - if(!do_mob(user, target) || used) + if(!do_after(user, target = target) || used) return target.visible_message("[user] injects [target] with the syringe with [src]!", \ "[user] injects you with the syringe with [src]!") diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm index 111dd3aa96bc..1396521aaf9a 100644 --- a/code/game/objects/items/eightball.dm +++ b/code/game/objects/items/eightball.dm @@ -59,7 +59,7 @@ shaking = TRUE start_shaking(user) - if(do_after(user, shake_time, needhand=TRUE, target=user, progress=TRUE)) + if(do_after(user, shake_time, target=user)) var/answer = get_answer() say(answer) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index f41deb5598a6..9fece4feedd4 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -57,7 +57,8 @@ "[user] is trying to put [src.name] on you!") playsound(loc, cuffsound, 30, TRUE, -2) - if(do_mob(user, C, 30) && C.canBeHandcuffed()) + log_combat(user, C, "attempted to handcuff") + if(do_after(user, 3 SECONDS, C) && C.canBeHandcuffed()) if(iscyborg(user)) apply_cuffs(C, user, TRUE) else diff --git a/code/game/objects/items/implants/implanter.dm b/code/game/objects/items/implants/implanter.dm index 5b8db550a87d..6de461954cb2 100644 --- a/code/game/objects/items/implants/implanter.dm +++ b/code/game/objects/items/implants/implanter.dm @@ -27,7 +27,7 @@ M.visible_message("[user] is attempting to implant [M].") var/turf/T = get_turf(M) - if(T && (M == user || do_mob(user, M, 50))) + if(T && (M == user || do_after(user, 5 SECONDS, M))) if(src && imp) if(imp.implant(M, user)) if (M == user) diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index d9311f5e2b43..a08b1398aad8 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -165,7 +165,7 @@ user.visible_message("[user] starts loading [target] into [src].", \ "You start loading [target] into [src]...", null, null, target) to_chat(target, "[user] starts loading you into [user.p_their()] [name]!") - if(!do_mob(user, target, 30)) + if(!do_after(user, 3 SECONDS, target)) return if(target in occupants) return diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 32d923eef985..ca3b1e184168 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -31,17 +31,17 @@ return if(target == user) playsound(src, islist(apply_sounds) ? pick(apply_sounds) : apply_sounds, 25) - if(!do_mob(user, target, self_delay, extra_checks=CALLBACK(target, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE))) - return if(!silent) user.visible_message("[user] starts to apply \the [src] on [user.p_them()]self...", "You begin applying \the [src] on yourself...") + if(!do_after(user, self_delay, target, extra_checks=CALLBACK(target, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE))) + return else if(other_delay) playsound(src, islist(apply_sounds) ? pick(apply_sounds) : apply_sounds, 25) - if(!do_mob(user, target, other_delay, extra_checks=CALLBACK(target, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE))) - return if(!silent) user.visible_message("[user] starts to apply \the [src] on [target].", "You begin applying \the [src] on [target]...") + if(!do_after(user, other_delay, target, extra_checks=CALLBACK(target, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE))) + return if(heal(target, user)) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 68a6772bb4e4..ead6b8aeb8f1 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -221,9 +221,9 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \ force = 0 throwforce = 0 merge_type = /obj/item/stack/sheet/cotton - var/pull_effort = 30 - var/loom_result = /obj/item/stack/sheet/cotton/cloth grind_results = list(/datum/reagent/cellulose = 20) + var/pull_effort = 10 + var/loom_result = /obj/item/stack/sheet/cotton/cloth GLOBAL_LIST_INIT(cloth_recipes, list ( \ new/datum/stack_recipe("white jumpskirt", /obj/item/clothing/under/color/jumpskirt/white, 3), /*Ladies first*/ \ @@ -339,7 +339,6 @@ GLOBAL_LIST_INIT(durathread_recipes, list ( \ singular_name = "raw durathread ball" icon_state = "sheet-durathreadraw" merge_type = /obj/item/stack/sheet/cotton/durathread - pull_effort = 70 loom_result = /obj/item/stack/sheet/durathread grind_results = list() diff --git a/code/game/objects/items/stacks/tape.dm b/code/game/objects/items/stacks/tape.dm index d22b1be85344..6a984c021a26 100644 --- a/code/game/objects/items/stacks/tape.dm +++ b/code/game/objects/items/stacks/tape.dm @@ -114,7 +114,7 @@ return if(use(1)) playsound(loc, usesound, 30, TRUE, -2) - if(do_mob(user, C, other_delay) && (!C.is_mouth_covered() || !C.is_muzzled())) + if(do_after(user, other_delay, C) && (!C.is_mouth_covered() || !C.is_muzzled())) apply_gag(C, user) C.visible_message("[user] tapes [C]s mouth shut.", \ "[user] taped your mouth shut!") @@ -134,7 +134,7 @@ "[user] is trying to put [src.name] on you!") playsound(loc, usesound, 30, TRUE, -2) - if(do_mob(user, C, self_delay) && (C.canBeHandcuffed())) + if(do_after(user, self_delay, C) && (C.canBeHandcuffed())) apply_tapecuffs(C, user) C.visible_message("[user] tapecuffs [C].", \ "[user] tapecuffs you.") @@ -152,11 +152,11 @@ if(C == user) playsound(loc, usesound, 30, TRUE, -2) user.visible_message("[user] starts to apply \the [src] on [user.p_them()]self...", "You begin applying \the [src] on yourself...") - if(!do_mob(user, C, self_delay, extra_checks=CALLBACK(C, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE))) + if(!do_after(user, self_delay, C, extra_checks=CALLBACK(C, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE))) return else if(other_delay) user.visible_message("[user] starts to apply \the [src] on [C].", "You begin applying \the [src] on [C]...") - if(!do_mob(user, C, other_delay, extra_checks=CALLBACK(C, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE))) + if(!do_after(user, other_delay, C, extra_checks=CALLBACK(C, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE))) return if(heal(C, user)) diff --git a/code/game/objects/items/survery_handheld.dm b/code/game/objects/items/survery_handheld.dm index 79523b574030..547bdc150237 100644 --- a/code/game/objects/items/survery_handheld.dm +++ b/code/game/objects/items/survery_handheld.dm @@ -51,7 +51,7 @@ src_turf.visible_message("Warning: unable to locate valuable information in current sector.") break - if(!do_after_mob(user, list(src), survey_delay / penalty)) + if(!do_after(user, list(src), survey_delay / penalty)) flick(icon_state + "-corrupted", src) playsound(src, 'sound/machines/buzz-sigh.ogg', 20) src_turf.visible_message("Warning: results corrupted. Please try again.") diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 69efcd42af15..971ba3cbedce 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -93,7 +93,7 @@ if(HAS_TRAIT(user, TRAIT_FREERUNNING)) //do you have any idea how fast I am??? adjusted_climb_time *= 0.8 structureclimber = user - if(do_mob(user, user, adjusted_climb_time)) + if(do_after(user, adjusted_climb_time)) if(src.loc) //Checking if structure has been destroyed if(do_climb(user)) user.visible_message("[user] climbs onto [src].", \ diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 417a1f8d86a6..714129498e4c 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -343,7 +343,7 @@ "You [actuallyismob ? "try to ":""]stuff [O] into [src].", \ "You hear clanging.") if(actuallyismob) - if(do_after_mob(user, targets, 40)) + if(do_after(user, 40, targets)) user.visible_message( "[user] stuffs [O] into [src].", \ "You stuff [O] into [src].", \ diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm index d863b693604f..6512a0683947 100644 --- a/code/game/objects/structures/kitchen_spike.dm +++ b/code/game/objects/structures/kitchen_spike.dm @@ -64,7 +64,7 @@ /obj/structure/kitchenspike/attack_hand(mob/user) if(VIABLE_MOB_CHECK(user.pulling) && user.a_intent == INTENT_GRAB && !has_buckled_mobs()) var/mob/living/L = user.pulling - if(do_mob(user, src, 120)) + if(do_after(user, 12 SECONDS, src)) if(has_buckled_mobs()) //to prevent spam/queing up attacks return if(L.buckled) diff --git a/code/game/objects/structures/loom.dm b/code/game/objects/structures/loom.dm index 28ff5a8de732..e2c3b8909913 100644 --- a/code/game/objects/structures/loom.dm +++ b/code/game/objects/structures/loom.dm @@ -31,11 +31,9 @@ user.show_message("You need at least [FABRIC_PER_SHEET] units of fabric before using this.", MSG_VISUAL) return FALSE user.show_message("You start weaving \the [W.name] through the loom..", MSG_VISUAL) - if(W.use_tool(src, user, W.pull_effort)) - if(W.amount >= FABRIC_PER_SHEET) - new W.loom_result(drop_location()) - W.use(FABRIC_PER_SHEET) - user.show_message("You weave \the [W.name] into a workable fabric.", MSG_VISUAL) + while(W.use_tool(src, user, W.pull_effort) && W.use(FABRIC_PER_SHEET)) + new W.loom_result(drop_location()) + user.show_message("You weave \the [W.name] into a workable fabric.", MSG_VISUAL) return TRUE #undef FABRIC_PER_SHEET diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index fa964a55619b..ffd4e021086a 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -336,7 +336,7 @@ if((user.a_intent != INTENT_HARM) && istype(I, /obj/item/paper) && (obj_integrity < max_integrity)) user.visible_message("[user] starts to patch the holes in [src].", "You start patching some of the holes in [src]!") - if(do_after(user, 20, TRUE, src)) + if(do_after(user, 20, src)) obj_integrity = min(obj_integrity+4,max_integrity) qdel(I) user.visible_message("[user] patches some of the holes in [src].", "You patch some of the holes in [src]!") diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 2257a3c10c3a..27c10f244c37 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -746,7 +746,7 @@ return building = TRUE to_chat(user, "You start assembling [src]...") - if(do_after(user, 50, target = user, progress=TRUE)) + if(do_after(user, 50, target = user)) if(!user.temporarilyRemoveItemFromInventory(src)) return var/obj/structure/R = new construction_type(user.loc) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 377c40d4e7ce..c22858ea591d 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -40,7 +40,7 @@ GM.visible_message("[user] starts to give [GM] a swirlie!", "[user] starts to give you a swirlie...") swirlie = GM var/was_alive = (swirlie.stat != DEAD) - if(do_after(user, 30, 0, target = src)) + if(do_after(user, 30, target = src, timed_action_flags = IGNORE_HELD_ITEM)) GM.visible_message("[user] gives [GM] a swirlie!", "[user] gives you a swirlie!", "You hear a toilet flushing.") if(iscarbon(GM)) var/mob/living/carbon/C = GM diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 5efddfb3cf8c..1245e2585462 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -577,9 +577,11 @@ Congratulations! You are now trained for invasive xenobiology research!"} if(!C.handcuffed) if(C.canBeHandcuffed()) playsound(src, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2) - C.visible_message("[user] begins restraining [C] with [src]!", \ - "[user] begins shaping an energy field around your hands!") - if(do_mob(user, C, time_to_cuff) && C.canBeHandcuffed()) + C.visible_message( + "[user] begins restraining [C] with [src]!", \ + "[user] begins shaping an energy field around your hands!" + ) + if(do_after(user, time_to_cuff, C) && C.canBeHandcuffed()) if(!C.handcuffed) C.set_handcuffed(new /obj/item/restraints/handcuffs/energy/used(C)) C.update_handcuffed() diff --git a/code/modules/antagonists/borer/borer.dm b/code/modules/antagonists/borer/borer.dm index 511bbbec1fd5..92a1e728dc8b 100644 --- a/code/modules/antagonists/borer/borer.dm +++ b/code/modules/antagonists/borer/borer.dm @@ -422,7 +422,7 @@ GLOBAL_VAR_INIT(total_borer_hosts_needed, 3) "[src] tears [H.ears] off of your ear!") //coz, you know, they go in the ear holes to_chat(src, "You slither up [H] and begin probing at their ear canal...") - if(!do_mob(src, H, 30)) + if(!do_after(src, 3 SECONDS, H)) to_chat(src, "As [H] moves away, you are dislodged and fall to the ground.") return diff --git a/code/modules/antagonists/changeling/powers/absorb.dm b/code/modules/antagonists/changeling/powers/absorb.dm index 33e0a8f75d48..a54cdc4cd09c 100644 --- a/code/modules/antagonists/changeling/powers/absorb.dm +++ b/code/modules/antagonists/changeling/powers/absorb.dm @@ -43,7 +43,7 @@ target.take_overall_damage(40) SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("Absorb DNA", "[i]")) - if(!do_mob(user, target, 150)) + if(!do_after(user, 15 SECONDS, target)) to_chat(user, "Our absorption of [target] has been interrupted!") changeling.isabsorbing = 0 return diff --git a/code/modules/antagonists/changeling/powers/linglink.dm b/code/modules/antagonists/changeling/powers/linglink.dm index a0008dec26de..6036ae1d00f6 100644 --- a/code/modules/antagonists/changeling/powers/linglink.dm +++ b/code/modules/antagonists/changeling/powers/linglink.dm @@ -58,7 +58,7 @@ target.say("[MODE_TOKEN_CHANGELING] AAAAARRRRGGGGGHHHHH!!") to_chat(target, "You can now communicate in the changeling hivemind, say \"[MODE_TOKEN_CHANGELING] message\" to communicate!") SSblackbox.record_feedback("nested tally", "changeling_powers", 1, list("[name]", "[i]")) - if(!do_mob(user, target, 20)) + if(!do_after(user, 2 SECONDS, target)) to_chat(user, "Our link with [target] has ended!") changeling.islinking = 0 target.mind.linglink = 0 @@ -67,7 +67,7 @@ to_chat(user, "We must keep holding on to [target] to sustain the link. ") while(user.pulling && user.grab_state >= GRAB_NECK) target.reagents.add_reagent(/datum/reagent/medicine/salbutamol, 0.5) // So they don't choke to death while you interrogate them - do_mob(user, target, 100, TRUE) + do_after(user, 10 SECONDS, target, TRUE) changeling.islinking = 0 target.mind.linglink = 0 diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 00dc550c11ce..cf1562d8c289 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -535,7 +535,7 @@ playsound(loc, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2) C.visible_message("[user] begins restraining [C] with dark magic!", \ "[user] begins shaping dark magic shackles around your wrists!") - if(do_mob(user, C, 30)) + if(do_after(user, 3 SECONDS, C)) if(!C.handcuffed) C.set_handcuffed(new /obj/item/restraints/handcuffs/energy/cult/used(C)) C.update_handcuffed() diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index b235199ed750..ca568bce6316 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -34,7 +34,7 @@ draining = TRUE essence_drained += rand(15, 20) to_chat(src, "You search for the soul of [target].") - if(do_after(src, rand(10, 20), 0, target)) //did they get deleted in that second? + if(do_after(src, rand(10, 20), target, timed_action_flags = IGNORE_HELD_ITEM)) //did they get deleted in that second? if(target.ckey) to_chat(src, "[target.p_their(TRUE)] soul burns with intelligence.") essence_drained += rand(20, 30) @@ -43,7 +43,7 @@ essence_drained += rand(40, 50) else to_chat(src, "[target.p_their(TRUE)] soul is weak and faltering.") - if(do_after(src, rand(15, 20), 0, target)) //did they get deleted NOW? + if(do_after(src, rand(15, 20), target, timed_action_flags = IGNORE_HELD_ITEM)) //did they get deleted NOW? switch(essence_drained) if(1 to 30) to_chat(src, "[target] will not yield much essence. Still, every bit counts.") @@ -53,7 +53,7 @@ to_chat(src, "Such a feast! [target] will yield much essence to you.") if(90 to INFINITY) to_chat(src, "Ah, the perfect soul. [target] will yield massive amounts of essence to you.") - if(do_after(src, rand(15, 25), 0, target)) //how about now + if(do_after(src, rand(15, 25), target, timed_action_flags = IGNORE_HELD_ITEM)) //how about now if(!target.stat) to_chat(src, "[target.p_theyre(TRUE)] now powerful enough to fight off your draining.") to_chat(target, "You feel something tugging across your body before subsiding.") @@ -76,7 +76,7 @@ draining = FALSE return var/datum/beam/B = Beam(target,icon_state="drain_life",time=INFINITY) - if(do_after(src, 46, 0, target)) //As one cannot prove the existance of ghosts, ghosts cannot prove the existance of the target they were draining. + if(do_after(src, 46, target, timed_action_flags = IGNORE_HELD_ITEM)) //As one cannot prove the existence of ghosts, ghosts cannot prove the existence of the target they were draining. change_essence_amount(essence_drained, FALSE, target) if(essence_drained <= 90 && target.stat != DEAD) essence_regen_cap += 5 diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm index 6fec09373797..ea6fe83c8a07 100644 --- a/code/modules/antagonists/swarmer/swarmer.dm +++ b/code/modules/antagonists/swarmer/swarmer.dm @@ -456,7 +456,7 @@ to_chat(src, "Attempting to remove this being from our presence.") - if(!do_mob(src, target, 30)) + if(!do_after(src, 3 SECONDS, target)) return var/turf/open/floor/F @@ -491,7 +491,7 @@ D.pixel_x = target.pixel_x D.pixel_y = target.pixel_y D.pixel_z = target.pixel_z - if(do_mob(src, target, 100)) + if(do_after(src, 10 SECONDS, target)) to_chat(src, "Dismantling complete.") var/atom/Tsec = target.drop_location() new /obj/item/stack/sheet/metal(Tsec, 5) @@ -604,7 +604,7 @@ if(resources < 5) to_chat(src, "We do not have the resources for this!") return - if(do_mob(src, src, 10)) + if(do_after(src, 1 SECONDS)) Fabricate(/obj/structure/swarmer/blockade, 5) @@ -633,7 +633,7 @@ if(!isturf(loc)) to_chat(src, "This is not a suitable location for replicating ourselves. We need more room.") return - if(do_mob(src, src, 100)) + if(do_after(src, 10 SECONDS)) var/createtype = SwarmerTypeToCreate() if(createtype && Fabricate(createtype, 50)) playsound(loc,'sound/items/poster_being_created.ogg',50, TRUE, -1) @@ -650,7 +650,7 @@ if(!isturf(loc)) return to_chat(src, "Attempting to repair damage to our body, stand by...") - if(do_mob(src, src, 100)) + if(do_after(src, 10 SECONDS)) adjustHealth(-100) to_chat(src, "We successfully repaired ourselves.") diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 1b5f0ae58fae..336ac43c7d4d 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -134,9 +134,12 @@ return if(user == loc && tied != SHOES_TIED) // if they're our own shoes, go tie-wards + if(DOING_INTERACTION_WITH_TARGET(user, our_guy)) + to_chat(user, span_warning("You're already interacting with [src]!")) + return user.visible_message("[user] begins [tied ? "unknotting" : "tying"] the laces of [user.p_their()] [src.name].", "You begin [tied ? "unknotting" : "tying"] the laces of your [src.name]...") - if(do_after(user, lace_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, PROC_REF(still_shoed), our_guy))) + if(do_after(user, lace_time, target = our_guy, extra_checks = CALLBACK(src, PROC_REF(still_shoed), our_guy))) to_chat(user, "You [tied ? "unknot" : "tie"] the laces of your [src.name].") if(tied == SHOES_UNTIED) adjust_laces(SHOES_TIED, user) @@ -151,13 +154,16 @@ if(tied == SHOES_KNOTTED) to_chat(user, "The laces on [loc]'s [src.name] are already a hopelessly tangled mess!") return + if(DOING_INTERACTION_WITH_TARGET(user, our_guy)) + to_chat(user, span_warning("You're already interacting with [src]!")) + return var/mod_time = lace_time to_chat(user, "You quietly set to work [tied ? "untying" : "knotting"] [loc]'s [src.name]...") if(HAS_TRAIT(user, TRAIT_CLUMSY)) // based clowns trained their whole lives for this mod_time *= 0.75 - if(do_after(user, mod_time, needhand=TRUE, target=our_guy, extra_checks=CALLBACK(src, PROC_REF(still_shoed), our_guy), hidden = TRUE)) + if(do_after(user, mod_time, target = our_guy, extra_checks = CALLBACK(src, PROC_REF(still_shoed), our_guy))) to_chat(user, "You [tied ? "untie" : "knot"] the laces on [loc]'s [src.name].") if(tied == SHOES_UNTIED) adjust_laces(SHOES_KNOTTED, user) @@ -232,8 +238,12 @@ /obj/item/clothing/shoes/attack_self(mob/user) . = ..() + if(DOING_INTERACTION_WITH_TARGET(user, src)) + to_chat(user, "You're already interacting with [src]!") + return + to_chat(user, "You begin [tied ? "untying" : "tying"] the laces on [src]...") - if(do_after(user, lace_time, needhand=TRUE, target=src,extra_checks=CALLBACK(src, PROC_REF(still_shoed), user))) + if(do_after(user, lace_time, target = src,extra_checks = CALLBACK(src, PROC_REF(still_shoed), user))) to_chat(user, "You [tied ? "untie" : "tie"] the laces on [src].") adjust_laces(tied ? SHOES_TIED : SHOES_UNTIED, user) diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index aa2830daee92..d6a281a2b925 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -39,7 +39,7 @@ else M.visible_message("[user] attempts to feed [M] the contents of [src].", \ "[user] attempts to feed you the contents of [src].") - if(!do_mob(user, M)) + if(!do_after(user, target = M)) return if(!reagents || !reagents.total_volume) return // The drink might be empty after the delay, such as by spam-feeding diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index 589e986aaeeb..615ec2785f82 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -79,7 +79,7 @@ else M.visible_message("[user] attempts to feed [M] from [src].", \ "[user] attempts to feed you from [src].") - if(!do_mob(user, M)) + if(!do_after(user, target = M)) return if(!reagents || !reagents.total_volume) return // The condiment might be empty after the delay. diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 2dd04174ba85..b64d52eea54a 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -126,7 +126,7 @@ All foods are distributed among various categories. Use common sense. "[user] cannot force any more of [src] down your throat!") return FALSE - if(!do_mob(user, M)) + if(!do_after(user, target = M)) return log_combat(user, M, "fed", reagents.log_list()) M.visible_message("[user] forces [M] to eat [src]!", \ diff --git a/code/modules/hydroponics/grown/kudzu.dm b/code/modules/hydroponics/grown/kudzu.dm index a8b9d5f8d034..a93d706a99b9 100644 --- a/code/modules/hydroponics/grown/kudzu.dm +++ b/code/modules/hydroponics/grown/kudzu.dm @@ -39,7 +39,7 @@ /obj/item/seeds/kudzu/attack_self(mob/user) user.visible_message("[user] begins throwing seeds on the ground...") - if(do_after(user, 50, needhand = TRUE, target = user.drop_location(), progress = TRUE)) + if(do_after(user, 50, target = user.drop_location(), progress = TRUE)) plant(user) to_chat(user, "You plant the kudzu. You monster.") diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm index 707f7a7647b7..69155c9230d8 100644 --- a/code/modules/library/lib_codex_gigas.dm +++ b/code/modules/library/lib_codex_gigas.dm @@ -48,7 +48,7 @@ correctness = 100 correctness -= U.getOrganLoss(ORGAN_SLOT_BRAIN) * 0.5 //Brain damage makes researching hard. speed += U.getOrganLoss(ORGAN_SLOT_BRAIN) * 3 - if(do_after(user, speed, 0, user)) + if(do_after(user, speed, user, timed_action_flags = IGNORE_HELD_ITEM)) var/usedName = devilName if(!prob(correctness)) usedName += "x" diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index a70520462f39..8629d01650d4 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -113,7 +113,7 @@ return user.visible_message("[user] starts to pour the contents of [O] onto [src].", "You start to slowly pour the contents of [O] onto [src].") - if(!do_after(user, 60, TRUE, src)) + if(!do_after(user, 60, src)) to_chat(user, "You failed to pour [O] onto [src]!") return diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm index 651ea4c6d0ee..dcb44af19cca 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm @@ -63,7 +63,7 @@ if(href_list["pouches"] && usr.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) visible_message("[usr] tries to empty [src]'s pouches.", \ "[usr] tries to empty your pouches.") - if(do_mob(usr, src, POCKET_STRIP_DELAY * 0.5)) + if(do_after(usr, POCKET_STRIP_DELAY * 0.5, src)) dropItemToGround(r_store) dropItemToGround(l_store) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 36fd8e1e6704..dd5b29059085 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -202,7 +202,7 @@ visible_message("[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].", \ "[usr] tries to [internal ? "close" : "open"] the valve on your [ITEM.name].", null, null, usr) to_chat(usr, "You try to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name]...") - if(do_mob(usr, src, POCKET_STRIP_DELAY)) + if(do_after(usr, POCKET_STRIP_DELAY, src)) if(internal) internal = null update_internals_hud_icon(0) @@ -255,7 +255,7 @@ buckle_cd = O.breakouttime visible_message("[src] attempts to unbuckle [p_them()]self!", \ "You attempt to unbuckle yourself... (This will take around [round(buckle_cd/600,1)] minute\s, and you need to stay still.)") - if(do_after(src, buckle_cd, 0, target = src, hidden = TRUE)) + if(do_after(src, buckle_cd, target = src, timed_action_flags = IGNORE_HELD_ITEM)) if(!buckled) return buckled.user_unbuckle_mob(src,src) @@ -306,7 +306,7 @@ if(!cuff_break) visible_message("[src] attempts to remove [I]!") to_chat(src, "You attempt to remove [I]... (This will take around [DisplayTimeText(breakouttime)] and you need to stand still.)") - if(do_after(src, breakouttime, 0, target = src)) + if(do_after(src, breakouttime, target = src, timed_action_flags = IGNORE_HELD_ITEM)) . = clear_cuffs(I, cuff_break) else to_chat(src, "You fail to remove [I]!") @@ -315,7 +315,7 @@ breakouttime = 50 visible_message("[src] is trying to break [I]!") to_chat(src, "You attempt to break [I]... (This will take around 5 seconds and you need to stand still.)") - if(do_after(src, breakouttime, 0, target = src)) + if(do_after(src, breakouttime, target = src, timed_action_flags = IGNORE_HELD_ITEM)) . = clear_cuffs(I, cuff_break) else to_chat(src, "You fail to break [I]!") diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 528d8500ea46..27fa569de7cd 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -245,7 +245,7 @@ else return - if(do_mob(usr, src, POCKET_STRIP_DELAY/delay_denominator, hidden = TRUE)) //placing an item into the pocket is 4 times faster + if(do_after(usr, POCKET_STRIP_DELAY/delay_denominator, src, hidden = TRUE)) //placing an item into the pocket is 4 times faster if(pocket_item) if(pocket_item == (pocket_id == ITEM_SLOT_RPOCKET ? r_store : l_store)) //item still in the pocket we search dropItemToGround(pocket_item) @@ -263,7 +263,7 @@ if(href_list["toggle_uniform"] && usr.canUseTopic(src, BE_CLOSE, NO_DEXTERITY)) var/obj/item/clothing/under/U = get_item_by_slot(ITEM_SLOT_ICLOTHING) to_chat(src, "[usr.name] is trying to adjust your [U].") - if(do_mob(usr, src, U.strip_delay/2)) + if(do_after(usr, U.strip_delay/2, src)) to_chat(src, "[usr.name] successfully adjusted your [U].") U.toggle_jumpsuit_adjust() update_inv_w_uniform() @@ -612,10 +612,13 @@ /mob/living/carbon/human/proc/do_cpr(mob/living/carbon/target) var/panicking = FALSE + if(target == src) //Sanity check, in case spacetime crumbles and allows us to perform cpr on ourselves + return + do CHECK_DNA_AND_SPECIES(target) - if (INTERACTING_WITH(src, target)) + if (DOING_INTERACTION_WITH_TARGET(src,target)) return FALSE if (target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH)) @@ -641,7 +644,7 @@ visible_message("[src] is trying to perform CPR on [target.name]!", \ "You try to perform CPR on [target.name]... Hold still!") - if (!do_mob(src, target, time = panicking ? CPR_PANIC_SPEED : (3 SECONDS))) + if (!do_after(src, delay = panicking ? CPR_PANIC_SPEED : (3 SECONDS), target = target)) to_chat(src, "You fail to perform CPR on [target]!") return FALSE @@ -1063,7 +1066,7 @@ if(!src.is_busy && (src.zone_selected == BODY_ZONE_HEAD || src.zone_selected == BODY_ZONE_PRECISE_GROIN) && get_turf(src) == get_turf(T) && !(T.mobility_flags & MOBILITY_STAND) && src.a_intent != INTENT_HELP) //all the stars align, time to curbstomp src.is_busy = TRUE - if (!do_mob(src,T,25) || get_turf(src) != get_turf(T) || (T.mobility_flags & MOBILITY_STAND) || src.a_intent == INTENT_HELP || src == T) //wait 30ds and make sure the stars still align (Body zone check removed after PR #958) + if (!do_after(src, 2.5 SECONDS, T) || get_turf(src) != get_turf(T) || (T.mobility_flags & MOBILITY_STAND) || src.a_intent == INTENT_HELP || src == T) //wait 30ds and make sure the stars still align (Body zone check removed after PR #958) src.is_busy = FALSE return @@ -1151,7 +1154,7 @@ //Joe Medic starts quickly/expertly lifting Grey Tider onto their back.. "[carrydelay < 35 ? "Using your gloves' nanochips, you" : "You"] [skills_space] start to lift [target] onto your back[carrydelay == 40 ? ", while assisted by the nanochips in your gloves.." : "..."]") //(Using your gloves' nanochips, you/You) (/quickly/expertly) start to lift Grey Tider onto your back(, while assisted by the nanochips in your gloves../...) - if(do_after(src, carrydelay, TRUE, target)) + if(do_after(src, carrydelay, target)) //Second check to make sure they're still valid to be carried if(can_be_firemanned(target) && !incapacitated(FALSE, TRUE) && !target.buckled) buckle_mob(target, TRUE, TRUE, 90, 1, 0) @@ -1174,7 +1177,7 @@ //Joe Medic starts quickly/expertly scooping Grey Tider into their arms.. "[carrydelay < 11 ? "Using your gloves' nanochips, you" : "You"] [skills_space] start to scoop [target] into your arms[carrydelay == 15 ? ", while assisted by the nanochips in your gloves.." : "..."]") //(Using your gloves' nanochips, you/You) ( /quickly/expertly) start to scoop Grey Tider into your arms(, while assisted by the nanochips in your gloves../...) - if(do_after(src, carrydelay, TRUE, target)) + if(do_after(src, carrydelay, target)) //Second check to make sure they're still valid to be carried if(!incapacitated(FALSE, TRUE) && !target.buckled) buckle_mob(target, TRUE, TRUE, 90, 1, 0) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index c276b44947c2..166d2d4e83a0 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1445,7 +1445,7 @@ GLOBAL_LIST_EMPTY(roundstart_races) user.visible_message("[user] starts stealing [target]'s [I.name]!", "You start stealing [target]'s [I.name]...", null, null, target) to_chat(target, "[user] starts stealing your [I.name]!") - if(do_after(user, I.strip_delay, TRUE, target, TRUE)) + if(do_after(user, I.strip_delay, target)) target.dropItemToGround(I, TRUE) user.put_in_hands(I) user.visible_message("[user] stole [target]'s [I.name]!", diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index 12b824f5eac4..4ad5297b73d9 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -271,7 +271,7 @@ var/static/mutable_appearance/overcharge //shameless copycode from lightning spell overcharge = overcharge || mutable_appearance('icons/effects/effects.dmi', "electricity", EFFECTS_LAYER) _human.add_overlay(overcharge) - if(do_mob(_human, _human, 50, 1)) + if(do_after(_human, 50, _human, 1)) _human.flash_lighting_fx(5, 7, current_color) var/obj/item/organ/stomach/ethereal/stomach = _human.getorganslot(ORGAN_SLOT_STOMACH) playsound(_human, 'sound/magic/lightningshock.ogg', 100, TRUE, extrarange = 5) diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index eb78ef131644..30f3d5f74b58 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -313,7 +313,7 @@ H.notransform = TRUE - if(do_after(owner, delay=60, needhand=FALSE, target=owner, progress=TRUE)) + if(do_after(owner, delay=60, target=owner, progress=TRUE, timed_action_flags = IGNORE_HELD_ITEM)) if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT) make_dupe() else diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 1f730de799d0..8fd4e89566c7 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -296,7 +296,7 @@ return IsStandingStill() /mob/living/carbon/monkey/proc/pickpocket(mob/M) - if(do_mob(src, M, MONKEY_ITEM_SNATCH_DELAY) && pickupTarget) + if(do_after(src, MONKEY_ITEM_SNATCH_DELAY, M) && pickupTarget) for(var/obj/item/I in M.held_items) if(I == pickupTarget) M.visible_message("[src] snatches [pickupTarget] from [M].", "[src] snatched [pickupTarget]!") diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 4e220fd18cff..cb0ec02ced34 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -507,7 +507,7 @@ /mob/living/proc/get_up(instant = FALSE) set waitfor = FALSE - if(!instant && !do_mob(src, src, 2 SECONDS, uninterruptible = TRUE, extra_checks = CALLBACK(src, TYPE_PROC_REF(/mob/living, rest_checks_callback)))) + if(!instant && !do_after(src, 1 SECONDS, src, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM), extra_checks = CALLBACK(src, TYPE_PROC_REF(/mob/living, rest_checks_callback)), interaction_key = DOAFTER_SOURCE_GETTING_UP)) return if(resting || body_position == STANDING_UP || HAS_TRAIT(src, TRAIT_FLOORED)) return @@ -977,7 +977,7 @@ "[src] tries to remove your [what.name].", null, null, src) to_chat(src, "You try to remove [who]'s [what.name]...") what.add_fingerprint(src) - if(do_mob(src, who, what.strip_delay)) + if(do_after(src, what.strip_delay, who, interaction_key = what)) if(what && Adjacent(who)) if(islist(where)) var/list/L = where @@ -1024,7 +1024,7 @@ who.visible_message("[src] tries to put [what] on [who].", \ "[src] tries to put [what] on you.", null, null, src) to_chat(src, "You try to put [what] on [who]...") - if(do_mob(src, who, what.equip_delay_other)) + if(do_after(src, what.equip_delay_other, who)) if(what && Adjacent(who) && what.mob_can_equip(who, src, final_where, TRUE, TRUE)) if(temporarilyRemoveItemFromInventory(what)) if(where_list) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 977cb220568e..c1c4cd668792 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -182,7 +182,7 @@ log_combat(user, src, "attempted to neck grab", addition="neck grab") if(GRAB_NECK) log_combat(user, src, "attempted to strangle", addition="kill grab") - if(!do_mob(user, src, grab_upgrade_time)) + if(!do_after(user, grab_upgrade_time, src)) return 0 if(!user.pulling || user.pulling != src || user.grab_state != old_grab_state) return 0 diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 3a07ffc4cb8d..22d68c8a6190 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -488,6 +488,9 @@ return TRUE /mob/living/simple_animal/bot/medbot/attack_hand(mob/living/carbon/human/H) + if(DOING_INTERACTION_WITH_TARGET(H, src)) + to_chat(H, "You're already interacting with [src].") + return if(H.a_intent == INTENT_DISARM && mode != BOT_TIPPED) H.visible_message("[H] begins tipping over [src].", "You begin tipping over [src]...") @@ -574,7 +577,7 @@ C.visible_message("[src] is trying to tend the wounds of [patient]!", \ "[src] is trying to tend your wounds!") - if(do_mob(src, patient, 20)) //Slightly faster than default tend wounds, but does less HPS + if(do_after(src, 2 SECONDS, patient)) //Slightly faster than default tend wounds, but does less HPS if((get_dist(src, patient) <= 1) && (on) && assess_patient(patient)) var/healies = heal_amount var/obj/item/storage/firstaid/FA = firstaid diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index 8aeb3b64a8cd..104d4363bc3b 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -79,7 +79,7 @@ to_chat(user, "You can't seem to find the [pick(faux_gadgets)]! Without it, [src] [pick(faux_problems)].") return user.visible_message("[user] begins to reactivate [src].", "You begin to reactivate [src]...") - if(do_after(user, 30, 1, target = src)) + if(do_after(user, 30, target = src)) revive(full_heal = TRUE, admin_revive = FALSE) user.visible_message("[user] reactivates [src]!", "You reactivate [src].") alert_drones(DRONE_NET_CONNECT) diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index 1e02c89c81f7..57f1b1892f9d 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -134,7 +134,7 @@ "You start to faintly glow, and you feel strangely weightless!") do_attack_animation(A) - if(!do_mob(src, A, 60)) //now start the channel + if(!do_after(src, 6 SECONDS, A)) //now start the channel to_chat(src, "You need to hold still!") return diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 2f79b2a13d69..c7070a66bcdf 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -522,7 +522,7 @@ to_chat(src, "You don't have a free hand to examine this!") return FALSE //can only queue up one examine on something at a time - if(examined_thing in do_afters) + if(DOING_INTERACTION_WITH_TARGET(src, examined_thing)) return FALSE to_chat(src, "You start feeling around for something...") diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 6873ee602dac..def2bde930e0 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -191,7 +191,7 @@ ///List of progress bars this mob is currently seeing for actions var/list/progressbars = null //for stacking do_after bars - ///For storing what do_after's someone has, in case we want to restrict them to only one of a certain do_after at a time + ///For storing what do_after's someone has, key = string, value = amount of interactions of that type happening. var/list/do_afters ///Allows a datum to intercept all click calls this mob is the source of diff --git a/code/modules/overmap/helm.dm b/code/modules/overmap/helm.dm index 59fdee827907..5b1f27fa2cb9 100644 --- a/code/modules/overmap/helm.dm +++ b/code/modules/overmap/helm.dm @@ -388,11 +388,11 @@ return to_chat(user, "You begin to manually override the local database...") - if(!do_after_mob(user, list(src), 2 SECONDS)) + if(!do_after(user, 2 SECONDS, list(src))) return COMPONENT_BLOCK_TOOL_ATTACK priority_announce("Illegal access to local ship database detected.", sender_override="[src.name]", zlevel=virtual_z()) - if(!do_after_mob(user, list(src), 10 SECONDS)) + if(!do_after(user, 10 SECONDS, list(src))) return COMPONENT_BLOCK_TOOL_ATTACK say("Warning, database corruption present, resetting local database state.") diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 3f85acdddfe6..283d41524f79 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -542,7 +542,7 @@ GLOBAL_LIST_INIT(cable_coil_recipes, list(new/datum/stack_recipe("cable restrain if(affecting && (!IS_ORGANIC_LIMB(affecting))) if(user == H) user.visible_message("[user] starts to fix some of the wires in [H]'s [parse_zone(affecting.body_zone)].", "You start fixing some of the wires in [H == user ? "your" : "[H]'s"] [parse_zone(affecting.body_zone)].") - if(!do_mob(user, H, 50)) + if(!do_after(user, 0.5 SECONDS, H)) return if(item_heal_robotic(H, user, 0, 15)) use(1) diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index 08a87e017aad..4c3c8b736c4d 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -98,7 +98,7 @@ if(istype(attacking_obj, /obj/item/ammo_box)) var/obj/item/ammo_box/attacking_box = attacking_obj for(var/obj/item/ammo_casing/casing_to_insert in attacking_box.stored_ammo) - if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after_mob(user, list(attacking_box), 1 SECONDS))) + if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after(user, 1 SECONDS, list(attacking_box)))) break var/did_load = give_round(casing_to_insert, replace_spent) if(!did_load) diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm index 160e1bd5066d..f8ce8223748d 100644 --- a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm +++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm @@ -66,7 +66,7 @@ var/list/ammo_list_no_empty = ammo_list(FALSE) listclearnulls(ammo_list_no_empty) for(var/obj/item/ammo_casing/casing_to_insert in attacking_box.stored_ammo) - if(!((instant_load && attacking_box.instant_load) || (ammo_list_no_empty.len >= max_ammo) || do_after_mob(user, list(attacking_box), 1 SECONDS))) //stupid work around for revolvers + if(!((instant_load && attacking_box.instant_load) || (ammo_list_no_empty.len >= max_ammo) || do_after(user, 1 SECONDS, list(attacking_box)))) //stupid work around for revolvers break var/did_load = give_round(casing_to_insert, replace_spent) if(!did_load) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index ca4d0217b380..892a914b88c5 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -141,7 +141,16 @@ user.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/gun, multiplicative_slowdown = wield_slowdown) wield_time = world.time + wield_delay if(wield_time > 0) - if(do_mob(user, user, wield_delay, FALSE, TRUE, CALLBACK(src, PROC_REF(is_wielded)), ignore_loc_change = TRUE)) + if(do_after( + user, + wield_delay, + user, + FALSE, + TRUE, + CALLBACK(src, PROC_REF(is_wielded)), + timed_action_flags = IGNORE_USER_LOC_CHANGE + ) + ) wielded_fully = TRUE else wielded_fully = TRUE @@ -673,7 +682,7 @@ semicd = TRUE - if(!bypass_timer && (!do_mob(user, target, 100) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)) + if(!bypass_timer && (!do_after(user, 100, target) || user.zone_selected != BODY_ZONE_PRECISE_MOUTH)) if(user) if(user == target) user.visible_message(span_notice("[user] decided not to shoot.")) diff --git a/code/modules/projectiles/guns/ballistic/hmg.dm b/code/modules/projectiles/guns/ballistic/hmg.dm index 3bd143e98b43..359a9e13e31e 100644 --- a/code/modules/projectiles/guns/ballistic/hmg.dm +++ b/code/modules/projectiles/guns/ballistic/hmg.dm @@ -85,7 +85,7 @@ if(!can_deploy) to_chat(user, "You need to brace against something to deploy [src]'s bipod! Either lie on the floor or stand next to a waist high object like a table!") return - if(!do_mob(user, src, deploy_time, FALSE, TRUE, CALLBACK(src, PROC_REF(is_wielded)))) + if(!do_after(user, deploy_time, src, FALSE, TRUE, CALLBACK(src, PROC_REF(is_wielded)))) to_chat(user, "You need to hold still to deploy [src]'s bipod!") return playsound(src, 'sound/machines/click.ogg', 75, TRUE) diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 7fcc3c4b500c..6579e3077734 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -98,13 +98,13 @@ for(var/i in 1 to num_to_unload) var/doafter_time = 0.4 SECONDS - if(!do_mob(user,user,doafter_time)) + if(!do_after(user, doafter_time, user)) break if(!eject_casing(user)) doafter_time = 0 SECONDS else num_unloaded++ - if(!do_mob(user,user,doafter_time)) + if(!do_after(user, doafter_time, user)) break chamber_round(TRUE, TRUE) @@ -170,7 +170,7 @@ else if(slot) if(!slot.BB && allow_ejection) - if(do_mob(user,user,doafter_time)) + if(!do_after(user, doafter_time, user)) eject_casing(user) rounds = magazine.ammo_list() @@ -214,7 +214,7 @@ var/doafter_time = 0.8 SECONDS if(magazine.instant_load && attacking_box.instant_load) doafter_time = 0 SECONDS - if(!do_mob(user,user,doafter_time)) + if(!do_after(user, doafter_time, user)) break if(!insert_casing(user, casing_to_insert, FALSE)) break @@ -231,7 +231,7 @@ if(!casing_to_insert || (magazine.caliber && casing_to_insert.caliber != magazine.caliber) || (!magazine.caliber && casing_to_insert.type != magazine.ammo_type)) break var/doafter_time = 0.4 SECONDS - if(!do_mob(user,user,doafter_time)) + if(!do_after(user, doafter_time, user)) break if(!insert_casing(null, casing_to_insert, FALSE)) doafter_time = 0 SECONDS @@ -239,7 +239,7 @@ num_loaded++ attacking_box.update_appearance() attacking_box.stored_ammo -= casing_to_insert - if(!do_mob(user,user,doafter_time)) + if(!do_after(user, doafter_time, user)) break switch(gate_load_direction) if(REVOLVER_AUTO_ROTATE_RIGHT_LOADING) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 58e46dcb1048..b0c949d122f9 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -40,7 +40,7 @@ if(M != user) M.visible_message("[user] attempts to feed [M] something from [src].", \ "[user] attempts to feed you something from [src].") - if(!do_mob(user, M)) + if(!do_after(user, target = M)) return if(!reagents || !reagents.total_volume) return // The drink might be empty after the delay, such as by spam-feeding diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 7efe82893918..11cbd03c9787 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -490,7 +490,7 @@ if(L != user) L.visible_message("[user] is trying to inject [L] with [src]!", \ "[user] is trying to inject [L] with [src]!") - if(!do_mob(user, L, inject_wait)) + if(!do_after(user, inject_wait, L)) return if(!penetrates && !L.can_inject(user, 1)) return @@ -501,7 +501,7 @@ L.visible_message("[user] uses the [src] on [L]!", \ "[user] uses the [src] on [L]!") else - if(!do_mob(user, L, inject_self)) + if(!do_after(user, inject_self, L)) return if(!penetrates && !L.can_inject(user, 1)) return @@ -526,7 +526,7 @@ if(L != user) L.visible_message("[user] is trying to spray [L] with [src]!", \ "[user] is trying to spray [L] with [src]!") - if(!do_mob(user, L, spray_wait)) + if(!do_after(user, spray_wait, L)) return if(!penetrates && !L.can_inject(user, 1)) return @@ -537,7 +537,7 @@ L.visible_message("[user] uses the [src] on [L]!", \ "[user] uses the [src] on [L]!") else - if(!do_mob(user, L, spray_self)) + if(!do_after(user, spray_self, L)) return if(!penetrates && !L.can_inject(user, 1)) return diff --git a/code/modules/reagents/reagent_containers/medigel.dm b/code/modules/reagents/reagent_containers/medigel.dm index 193d588bcbb5..7e85c0c6d1ca 100644 --- a/code/modules/reagents/reagent_containers/medigel.dm +++ b/code/modules/reagents/reagent_containers/medigel.dm @@ -48,7 +48,7 @@ if(M == user) M.visible_message("[user] attempts to [apply_method] [src] on [user.p_them()]self.") if(self_delay) - if(!do_mob(user, M, self_delay)) + if(!do_after(user, self_delay, M)) return if(!reagents || !reagents.total_volume) return @@ -58,7 +58,7 @@ log_combat(user, M, "attempted to apply", src, reagents.log_list()) M.visible_message("[user] attempts to [apply_method] [src] on [M].", \ "[user] attempts to [apply_method] [src] on you.") - if(!do_mob(user, M)) + if(!do_after(user, target = M)) return if(!reagents || !reagents.total_volume) return diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 77b8bc8f318c..9cac6c3a52a2 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -34,14 +34,14 @@ if(M == user) M.visible_message("[user] attempts to [apply_method] [src].") if(self_delay) - if(!do_mob(user, M, self_delay)) + if(!do_after(user, self_delay, M)) return FALSE to_chat(M, "You [apply_method] [src].") else M.visible_message("[user] attempts to force [M] to [apply_method] [src].", \ "[user] attempts to force you to [apply_method] [src].") - if(!do_mob(user, M)) + if(!do_after(user, target = M)) return FALSE M.visible_message("[user] forces [M] to [apply_method] [src].", \ "[user] forces you to [apply_method] [src].") diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index f0901e416b25..5d11dcb720ee 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -86,7 +86,7 @@ target.visible_message("[user] is trying to take a blood sample from [target]!", \ "[user] is trying to take a blood sample from you!") busy = TRUE - if(!do_mob(user, target, extra_checks=CALLBACK(L, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE))) + if(!do_after(user, target = target, extra_checks=CALLBACK(L, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE))) busy = FALSE return if(reagents.total_volume >= reagents.maximum_volume) @@ -136,7 +136,7 @@ if(L != user) L.visible_message("[user] is trying to inject [L]!", \ "[user] is trying to inject you!") - if(!do_mob(user, L, extra_checks=CALLBACK(L, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE))) + if(!do_after(user, target = L, extra_checks=CALLBACK(L, TYPE_PROC_REF(/mob/living, can_inject), user, TRUE))) return if(!reagents.total_volume) return diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index 9f2861218418..111428528242 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -131,7 +131,7 @@ user.visible_message("[user] starts climbing into [src].", "You start climbing into [src]...") else target.visible_message("[user] starts putting [target] into [src].", "[user] starts putting you into [src]!") - if(do_mob(user, target, 20)) + if(do_after(user, 2 SECONDS, target)) if (!loc) return target.forceMove(src) diff --git a/code/modules/religion/rites.dm b/code/modules/religion/rites.dm index 1c1caa5de1d6..67b337400315 100644 --- a/code/modules/religion/rites.dm +++ b/code/modules/religion/rites.dm @@ -18,7 +18,7 @@ return FALSE to_chat(user, "You begin to perform the rite of [name]...") if(!ritual_invocations) - if(do_after(user, target = user, delay = ritual_length)) + if(do_after(user, ritual_length)) return TRUE return FALSE var/first_invoke = TRUE diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm index 7cb7f8677408..75a1201d924a 100644 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ b/code/modules/research/xenobiology/crossbreeding/regenerative.dm @@ -41,12 +41,12 @@ Regenerative extracts: to_chat(user, "[src] will not work on the dead!") return if(H != user) - if(!do_mob(user, H, slime_delay)) // 1 second delay + if(!do_after(user, slime_delay, H)) // 1 second delay return FALSE user.visible_message("[user] crushes the [src] over [H], the milky goo quickly regenerating some of [H.p_their()] injuries!", "You squeeze the [src], and it bursts over [H], the milky goo regenerating some of [H.p_their()] injuries.") else - if(!do_mob(user, H, (slime_delay * 1.5))) // 1.5 second delay + if(!do_after(user, (slime_delay * 1.5), H)) // 1.5 second delay return FALSE user.visible_message("[user] crushes the [src] over [user.p_them()]self, the milky goo quickly regenerating some of [user.p_their()] injuries!", "You squeeze the [src], and it bursts in your hand, splashing you with milky goo which quickly regenerates some of your injuries!") diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm index 6631d943a3aa..b7da88dfe790 100644 --- a/code/modules/spells/spell_types/devil.dm +++ b/code/modules/spells/spell_types/devil.dm @@ -107,7 +107,7 @@ if(istype(user.loc, /obj/effect/dummy/phased_mob/slaughter/)) if(valid_location(user)) to_chat(user, "You are now phasing in.") - if(do_mob(user,user,150)) + if(do_after(user, 1.5 SECONDS, user)) if(valid_location(user)) user.infernalphasein() else @@ -121,7 +121,7 @@ user.notransform = TRUE user.fakefire() to_chat(src, "You begin to phase back into sinful flames.") - if(do_mob(user,user,150)) + if(do_after(user, 1.5 SECONDS, user)) user.infernalphaseout() else to_chat(user, "You must remain still while exiting.") diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm index c8d1c4a7c027..720670e3fc21 100644 --- a/code/modules/spells/spell_types/lichdom.dm +++ b/code/modules/spells/spell_types/lichdom.dm @@ -49,7 +49,7 @@ playsound(user, 'sound/effects/pope_entry.ogg', 100) - if(!do_after(M, 50, needhand=FALSE, target=marked_item)) + if(!do_after(M, 50, target=marked_item, timed_action_flags = IGNORE_HELD_ITEM)) to_chat(M, "Your soul snaps back to your body as you stop ensouling [marked_item]!") return diff --git a/code/modules/spells/spell_types/lightning.dm b/code/modules/spells/spell_types/lightning.dm index 3231d22170e1..85f211511135 100644 --- a/code/modules/spells/spell_types/lightning.dm +++ b/code/modules/spells/spell_types/lightning.dm @@ -28,7 +28,7 @@ halo = halo || mutable_appearance('icons/effects/effects.dmi', "electricity", EFFECTS_LAYER) user.add_overlay(halo) playsound(get_turf(user), Snd, 50, FALSE) - if(do_mob(user,user,100,1)) + if(do_after(user, 10 SECONDS, user, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM))) if(ready && cast_check(skipcharge=1)) choose_targets() else diff --git a/code/modules/surgery/surgery_helpers.dm b/code/modules/surgery/surgery_helpers.dm index c4a769c43ed5..c28ce0855933 100644 --- a/code/modules/surgery/surgery_helpers.dm +++ b/code/modules/surgery/surgery_helpers.dm @@ -85,7 +85,7 @@ /proc/attempt_cancel_surgery(datum/surgery/S, obj/item/I, mob/living/M, mob/user) var/selected_zone = user.zone_selected to_chat(user, "You begin to cancel \the [S].") - if (!do_mob(user, M, 3 SECONDS)) + if (!do_after(user, 3 SECONDS, M)) return if(S.status == 1) diff --git a/code/modules/vehicles/cars/car.dm b/code/modules/vehicles/cars/car.dm index 6b53fa9a02c3..d3040f862863 100644 --- a/code/modules/vehicles/cars/car.dm +++ b/code/modules/vehicles/cars/car.dm @@ -80,7 +80,7 @@ if(occupant_amount() >= max_occupants) return FALSE var/atom/old_loc = loc - if(do_mob(forcer, M, get_enter_delay(M), extra_checks=CALLBACK(src, TYPE_PROC_REF(/obj/vehicle/sealed/car, is_car_stationary), old_loc))) + if(do_after(forcer, get_enter_delay(M), M, extra_checks=CALLBACK(src, TYPE_PROC_REF(/obj/vehicle/sealed/car, is_car_stationary), old_loc))) mob_forced_enter(M, silent) return TRUE return FALSE diff --git a/code/modules/vehicles/sealed.dm b/code/modules/vehicles/sealed.dm index 6751ddfe3580..22b1eb42becb 100644 --- a/code/modules/vehicles/sealed.dm +++ b/code/modules/vehicles/sealed.dm @@ -29,7 +29,7 @@ return FALSE if(occupant_amount() >= max_occupants) return FALSE - if(do_after(M, get_enter_delay(M), FALSE, src, TRUE)) + if(do_after(M, get_enter_delay(M), src, progress = TRUE, timed_action_flags = IGNORE_HELD_ITEM)) mob_enter(M) return TRUE return FALSE diff --git a/shiptest.dme b/shiptest.dme index 6574a98b5a1e..67c643cd7977 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -52,6 +52,7 @@ #include "code\__DEFINES\directional.dm" #include "code\__DEFINES\diseases.dm" #include "code\__DEFINES\DNA.dm" +#include "code\__DEFINES\do_afters.dm" #include "code\__DEFINES\dye_keys.dm" #include "code\__DEFINES\economy.dm" #include "code\__DEFINES\events.dm" @@ -142,6 +143,7 @@ #include "code\__DEFINES\tgs.dm" #include "code\__DEFINES\tgui.dm" #include "code\__DEFINES\time.dm" +#include "code\__DEFINES\timed_action.dm" #include "code\__DEFINES\tools.dm" #include "code\__DEFINES\traits.dm" #include "code\__DEFINES\turfs.dm" From 850f969066c4d03f00af542af64fe88a380fbfcf Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 06:48:10 -0500 Subject: [PATCH 56/73] Automatic changelog generation for PR #2865 [ci skip] --- html/changelogs/AutoChangeLog-pr-2865.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2865.yml diff --git a/html/changelogs/AutoChangeLog-pr-2865.yml b/html/changelogs/AutoChangeLog-pr-2865.yml new file mode 100644 index 000000000000..ee743e8134c5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2865.yml @@ -0,0 +1,5 @@ +author: rkz, Benjamin(benbot16), Rohesie, Qustinnus, jlsnow301 +changes: + - {refactor: refactored do_afters to use timed_action_flags for unique args} + - {code_imp: centralized do_mob and do_atom into do_after} +delete-after: true From aaae765b86772054919fd272ef1129dcfee3f5ba Mon Sep 17 00:00:00 2001 From: Apogee-dev <60533805+Apogee-dev@users.noreply.github.com> Date: Sun, 2 Jun 2024 04:57:35 -0700 Subject: [PATCH 57/73] Removes bulk ammo boxes from webbing storage (#3062) ## About The Pull Request Security belts and webbings can no longer store bulk ammo boxes, only magazines, stripper clips, and speed loaders. ## Why It's Good For The Game It's a buff to the bandolier ; the more limited storage means bandoliers can be a better choice for weapons that don't use magazines or have very small clips, such as most shotguns or loading gate revolvers. Given bandoliers were designed for that anyway, it only helps push them into their niche. ## Changelog :cl: balance: security belts and webbings can no longer store bulk ammo boxes, only magazines /:cl: --- code/game/objects/items/storage/belt.dm | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 3214f4915c72..c578c318e73a 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -270,7 +270,15 @@ /obj/item/assembly/flash/handheld, /obj/item/clothing/glasses, /obj/item/ammo_casing/shotgun, - /obj/item/ammo_box, + /obj/item/ammo_box/magazine, + /obj/item/ammo_box/c38, //speed loaders don't have a common path like magazines. pain. + /obj/item/ammo_box/a357, //some day we should refactor these into an ammo_box/speedloader type + /obj/item/ammo_box/a4570, //but not today + /obj/item/ammo_box/a858, //oh boy stripper clips too + /obj/item/ammo_box/vickland_a308, + /obj/item/ammo_box/a300, + /obj/item/ammo_box/aac_300blk_stripper, + /obj/item/ammo_box/amagpellet_claris, //that's the last of the clips /obj/item/reagent_containers/food/snacks/donut, /obj/item/kitchen/knife/combat, /obj/item/flashlight/seclite, From c01a0e5d889056df8eba07418f8e08360d0b3da1 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 07:08:37 -0500 Subject: [PATCH 58/73] Automatic changelog generation for PR #3062 [ci skip] --- html/changelogs/AutoChangeLog-pr-3062.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3062.yml diff --git a/html/changelogs/AutoChangeLog-pr-3062.yml b/html/changelogs/AutoChangeLog-pr-3062.yml new file mode 100644 index 000000000000..8fb74c99ea3d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3062.yml @@ -0,0 +1,5 @@ +author: Apogee-dev +changes: + - {balance: 'security belts and webbings can no longer store bulk ammo boxes, only + magazines'} +delete-after: true From 2408bc21e1f72eadd98468ae3a7cb611721176b6 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sun, 2 Jun 2024 06:59:10 -0500 Subject: [PATCH 59/73] Kills legion disease cause its bad and weird (#3047) ## About The Pull Request see title atomization of https://github.com/shiptest-ss13/Shiptest/pull/2848 ## Why It's Good For The Game see title ## Changelog :cl: del: Removed goofball legion disease /:cl: Co-authored-by: Sun-Soaked <45698967+Sun-Soaked@users.noreply.github.com> --- code/datums/diseases/advance/presets.dm | 8 -- .../diseases/advance/symptoms/necropolis.dm | 113 ------------------ .../hostile/mining_mobs/hivelord.dm | 5 - .../reagents/reagent_containers/bottle.dm | 7 -- shiptest.dme | 1 - 5 files changed, 134 deletions(-) delete mode 100644 code/datums/diseases/advance/symptoms/necropolis.dm diff --git a/code/datums/diseases/advance/presets.dm b/code/datums/diseases/advance/presets.dm index da8ad0d69a59..1924d92428e4 100644 --- a/code/datums/diseases/advance/presets.dm +++ b/code/datums/diseases/advance/presets.dm @@ -16,14 +16,6 @@ symptoms = list(new/datum/symptom/cough) ..() -/datum/disease/advance/necropolis - copy_type = /datum/disease/advance - -/datum/disease/advance/necropolis/New() - name = "Necropolis Seed" - symptoms = list(new/datum/symptom/necroseed) - ..() - //Randomly generated Disease, for virus crates and events /datum/disease/advance/random name = "Experimental Disease" diff --git a/code/datums/diseases/advance/symptoms/necropolis.dm b/code/datums/diseases/advance/symptoms/necropolis.dm deleted file mode 100644 index 9626b944124d..000000000000 --- a/code/datums/diseases/advance/symptoms/necropolis.dm +++ /dev/null @@ -1,113 +0,0 @@ -/datum/symptom/necroseed - name = "Necropolis Seed" - desc = "An infantile form of the root of Lavaland's tendrils. Forms a symbiotic bond with the host, making them stronger and hardier, at the cost of speed. Should the disease be cured, the host will be severely weakened." - stealth = 0 - resistance = 3 - stage_speed = -10 - transmittable = -3 - level = 9 - base_message_chance = 3 - severity = 0 - symptom_delay_min = 1 - symptom_delay_max = 1 - var/color = "#302f20" - var/tendrils = FALSE - var/chest = FALSE - var/fireproof = FALSE - threshold_descs = list( - "Resistance 15" = "The area near the host roils with paralyzing tendrils.", - "Resistance 20" = "Host becomes immune to heat, ash, and lava. Removes movespeed debuff. Hail to the necropolis!", - ) - var/list/cached_tentacle_turfs - var/turf/last_location - var/tentacle_recheck_cooldown = 100 - -/datum/symptom/necroseed/Start(datum/disease/advance/A) - . = ..() - if(!.) - return - if(A.totalResistance() >= 15) - tendrils = TRUE - if(A.totalResistance() >= 20) - fireproof = TRUE - -/datum/symptom/necroseed/Activate(datum/disease/advance/A) - . = ..() - if(!.) - return - var/mob/living/carbon/M = A.affected_mob - switch(A.stage) - if(1, 2) - if(tendrils) - tendril(A) - if(prob(base_message_chance)) - to_chat(M, "Your skin feels scaly.") - if(3, 4) - if(tendrils) - tendril(A) - if(prob(base_message_chance)) - to_chat(M, "[pick("Your skin is hard.", "You feel stronger.", "You feel powerful.", "You feel your muscles growing stiff.", "You feel warm.")]") - if(5) - if(tendrils) - tendril(A) - M.dna.species.punchdamagelow = 15 - M.dna.species.punchdamagehigh = 20 - M.dna.species.punchstunthreshold = 18 - M.dna.species.brutemod = 0.6 - M.dna.species.burnmod = 0.6 - M.dna.species.heatmod = 0.6 - M.add_atom_colour(color, FIXED_COLOUR_PRIORITY) - M.add_movespeed_modifier(/datum/movespeed_modifier/necropolis, update=TRUE) - ADD_TRAIT(M, TRAIT_PIERCEIMMUNE, DISEASE_TRAIT) - if(fireproof) - to_chat(M, "[pick("You taste primordial ash.", "The necropolis whispers sweet nothings to you.", "You feel like a god.")]") - ADD_TRAIT(M, TRAIT_RESISTHEAT, DISEASE_TRAIT) - ADD_TRAIT(M, TRAIT_RESISTHIGHPRESSURE, DISEASE_TRAIT) - M.weather_immunities |= "ash" - M.weather_immunities |= "lava" - M.remove_movespeed_modifier(/datum/movespeed_modifier/necropolis) - else - if(prob(base_message_chance)) - to_chat(M, "[pick("Your skin has become a hardened carapace.", "Your strength is superhuman.", "You feel invincible.")]") - if(tendrils) - tendril(A) - return - -/datum/symptom/necroseed/proc/tendril(datum/disease/advance/A) - . = A.affected_mob - var/mob/living/loc = A.affected_mob.loc - if(isturf(loc)) - if(!LAZYLEN(cached_tentacle_turfs) || loc != last_location || tentacle_recheck_cooldown <= world.time) - LAZYCLEARLIST(cached_tentacle_turfs) - last_location = loc - tentacle_recheck_cooldown = world.time + initial(tentacle_recheck_cooldown) - for(var/turf/open/T in orange(4, loc)) - LAZYADD(cached_tentacle_turfs, T) - for(var/t in cached_tentacle_turfs) - if(isopenturf(t)) - if(prob(10)) - new /obj/effect/temp_visual/goliath_tentacle(t, .) - else - cached_tentacle_turfs -= t - -/datum/symptom/necroseed/End(datum/disease/advance/A) - . = ..() - if(!.) - return - var/mob/living/carbon/M = A.affected_mob - to_chat(M, "You feel weakened as the necropolis' blessing leaves your body.") - M.remove_movespeed_modifier(/datum/movespeed_modifier/necropolis) - M.dna.species.punchdamagelow = initial(M.dna.species.punchdamagelow) - M.dna.species.punchdamagehigh = initial(M.dna.species.punchdamagehigh) - M.dna.species.punchstunthreshold = initial(M.dna.species.punchstunthreshold) - M.remove_atom_colour(color, FIXED_COLOUR_PRIORITY) - M.dna.species.brutemod /= 0.6 - M.dna.species.burnmod /= 0.6 - M.dna.species.heatmod /= 0.6 - REMOVE_TRAIT(M, TRAIT_PIERCEIMMUNE, DISEASE_TRAIT) - if(fireproof) - REMOVE_TRAIT(M, TRAIT_RESISTHIGHPRESSURE, DISEASE_TRAIT) - REMOVE_TRAIT(M, TRAIT_RESISTHEAT, DISEASE_TRAIT) - M.weather_immunities -= "ash" - M.weather_immunities -= "lava" - diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm index e0c0d8a801ab..6e6c521fe445 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm @@ -316,14 +316,9 @@ move_resist = MOVE_RESIST_DEFAULT pull_force = PULL_FORCE_DEFAULT visible_message("[src] falls over with a mighty crash, the remaining legions within it falling apart!") - new /obj/item/crusher_trophy/legion_skull(loc) - new /obj/item/crusher_trophy/legion_skull(loc) - new /obj/item/crusher_trophy/legion_skull(loc) new /mob/living/simple_animal/hostile/asteroid/hivelord/legion(loc) new /mob/living/simple_animal/hostile/asteroid/hivelord/legion(loc) new /mob/living/simple_animal/hostile/asteroid/hivelord/legion(loc) - if(prob(45)) - new /obj/item/reagent_containers/glass/bottle/necropolis_seed(loc) ..(gibbed) /mob/living/simple_animal/hostile/big_legion/Initialize() diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 5916fee4b44a..9a29efe1a381 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -275,13 +275,6 @@ desc = "A small bottle containing Bio Virus Antidote Kit." list_reagents = list(/datum/reagent/vaccine/fungal_tb = 30) -/obj/item/reagent_containers/glass/bottle/necropolis_seed - name = "bowl of blood" - desc = "A clay bowl containing a fledgling spire, preserved in blood. When consumed, allows the user to transform into an avatar of the Necropolis. A robust virologist may be able to unlock its full potential..." - icon = 'icons/obj/chemical/mortar.dmi' - icon_state = "mortar_bone" - spawned_disease = /datum/disease/advance/necropolis - //Oldstation.dmm chemical storage bottles /obj/item/reagent_containers/glass/bottle/hydrogen diff --git a/shiptest.dme b/shiptest.dme index 67c643cd7977..dc3ec1ce5b8b 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -617,7 +617,6 @@ #include "code\datums\diseases\advance\symptoms\itching.dm" #include "code\datums\diseases\advance\symptoms\nanites.dm" #include "code\datums\diseases\advance\symptoms\narcolepsy.dm" -#include "code\datums\diseases\advance\symptoms\necropolis.dm" #include "code\datums\diseases\advance\symptoms\oxygen.dm" #include "code\datums\diseases\advance\symptoms\sensory.dm" #include "code\datums\diseases\advance\symptoms\shedding.dm" From a7079a841dac11815474982df8befb109bf55734 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 07:22:22 -0500 Subject: [PATCH 60/73] Automatic changelog generation for PR #3047 [ci skip] --- html/changelogs/AutoChangeLog-pr-3047.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3047.yml diff --git a/html/changelogs/AutoChangeLog-pr-3047.yml b/html/changelogs/AutoChangeLog-pr-3047.yml new file mode 100644 index 000000000000..2653f9257998 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3047.yml @@ -0,0 +1,4 @@ +author: FalloutFalcon +changes: + - {rscdel: Removed goofball legion disease} +delete-after: true From 74238ebad136f09b939b9ef6c05b333556332827 Mon Sep 17 00:00:00 2001 From: zevo <95449138+Zevotech@users.noreply.github.com> Date: Sun, 2 Jun 2024 08:08:52 -0400 Subject: [PATCH 61/73] Adds a salve that allows elzuose to change color (#2995) ## About The Pull Request To be merged after #2993. Adds a Kalixcian beauty product that allows Elzuose to (temporarily (for the duration of the round or until used again)) change their glow color. Available in the loadout next to hair dye. https://github.com/shiptest-ss13/Shiptest/assets/95449138/01060ea1-4b6b-490f-9bf2-83b69cf7efd7 ## Why It's Good For The Game People wanted to keep the ability to change the glow color of an elzuose using an item. Fits better than just using a multitool without the potential for grief/shenanigans. Lore approved too! ## Changelog :cl: add: Adds the Elzuose color salve, a product that allows Elzuose to change their glow color upon application. /:cl: --- code/game/objects/items/dyekit.dm | 27 ++++++++++++++++++ .../modules/client/loadout/loadout_general.dm | 4 +++ icons/obj/dyespray.dmi | Bin 407 -> 597 bytes 3 files changed, 31 insertions(+) diff --git a/code/game/objects/items/dyekit.dm b/code/game/objects/items/dyekit.dm index 2cbfbca6332b..86c6e90a3290 100644 --- a/code/game/objects/items/dyekit.dm +++ b/code/game/objects/items/dyekit.dm @@ -38,3 +38,30 @@ return playsound(src, 'sound/effects/spray.ogg', 5, TRUE, 5) human_target.update_hair() + +/obj/item/colorsalve + name = "Elzuose color salve" + desc = "A Kalixcian beauty product for Elzuose that comes in the form of a salve packaged with various color additives. Used to temporarily change the pigment color of light emitting cells in the skin, requiring an extensive amount of time to prepare and apply. Wears off after a few hours." + icon = 'icons/obj/dyespray.dmi' + icon_state = "colorsalve" + +/obj/item/colorsalve/attack_self(mob/living/user) + if(!iselzuose(user)) + return + + var/mob/living/carbon/human/H = user + var/datum/species/elzuose/species_datum = H.dna.species + // select new color + var/new_etherealcolor = input(user, "Choose your Elzuose color:", "Character Preference", species_datum.default_color) as color|null + if(new_etherealcolor) + var/temp_hsv = RGBtoHSV(new_etherealcolor) + if(ReadHSV(temp_hsv)[3] >= ReadHSV("#505050")[3]) // elzu colors should be bright ok?? + if(!do_after(usr, 30 SECONDS, user)) + return + playsound(src, 'sound/effects/ointment.ogg', 5, TRUE, 5) + species_datum.default_color = sanitize_hexcolor(new_etherealcolor, 6, TRUE) + species_datum.current_color = species_datum.health_adjusted_color(user, species_datum.default_color) + species_datum.spec_updatehealth(user) + user.visible_message(span_notice("[user] applies the salve, changing [user.p_their()] color to [new_etherealcolor]")) + else + to_chat(user, span_danger("Invalid color. Your color is not bright enough.")) diff --git a/code/modules/client/loadout/loadout_general.dm b/code/modules/client/loadout/loadout_general.dm index 265a7728d2ab..4c081a67e92f 100644 --- a/code/modules/client/loadout/loadout_general.dm +++ b/code/modules/client/loadout/loadout_general.dm @@ -146,6 +146,10 @@ display_name = "hair dye" path = /obj/item/dyespray +/datum/gear/colorsalve + display_name = "Elzuose color salve" + path = /obj/item/colorsalve + /datum/gear/tablebell display_name = "table bell, brass" path = /obj/item/table_bell/brass diff --git a/icons/obj/dyespray.dmi b/icons/obj/dyespray.dmi index eb056036799a8ee5f09b00474bf8ea7a6899410a..1d1813f38c5035c0f9a16e304d493083b8da8bfb 100644 GIT binary patch delta 510 zcmVs|Nk~NHrUwMr>CbcLxeRxd)e&nWt7c;X;?>rt+o8ZFvZmWov5CNXft1? ztJ3H{dBIZUuI7Qt{_Luj!{N@rowcWk=GwFW-Bib6>M1}XXYl9AO@+v6M7aOHe_toL zu>b%70d!JMQvg8b*k%9#0D6&tV}HXHCgK(!rL3AQT4RK*WX;Q9(d4dH<*E0H|Gc1=%Qycp zgq-YCdQNBvYt8}e9MCXA+7m*zhBCCj=oDV05Qcg#Z8m07*qoM6N<$f_2~P Ap#T5? delta 319 zcmV-F0l@y%1eXJUiBL{Q4GJ0x0000DNk~Le0000W0000W2m=5B07RsU#sB~SLQqUp zMZmzoXJ=>s|Nk~NHrUwMr>CbiK6}~h?q!tCwfw>`#nk_us6TnZQsu7Zfy(~us+Pmy z|J_u_Vd_nV$ZABm|Gs}p6}-v-0004WQchC}a3e=94v`niBj1^}O( z8+;x4VgvvH0Eki& z7Y3}^1G@*t0=SJZ7M-)Y@Bu8MgO}HOL|99th#U}0qDtKIeUHeg_BtZniX3=7aE>`d z0gcOfbz)I~q&nvuHLQTI80(MyzAsRvP~k4xAub_Zv@@)E-`2d^KV+MqyEmNS2Elox ROTGXA002ovPDHLkV1mQSjB@}0 From 7763fb61077c4b851391c830c0a7aa52386ced69 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 07:36:49 -0500 Subject: [PATCH 62/73] Automatic changelog generation for PR #2995 [ci skip] --- html/changelogs/AutoChangeLog-pr-2995.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2995.yml diff --git a/html/changelogs/AutoChangeLog-pr-2995.yml b/html/changelogs/AutoChangeLog-pr-2995.yml new file mode 100644 index 000000000000..f94c7350f558 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2995.yml @@ -0,0 +1,5 @@ +author: Zevotech +changes: + - {rscadd: 'Adds the Elzuose color salve, a product that allows Elzuose to change + their glow color upon application.'} +delete-after: true From 3d79ed47e2dc8b92b83f365a93e72a9492b11ac7 Mon Sep 17 00:00:00 2001 From: zevo <95449138+Zevotech@users.noreply.github.com> Date: Sun, 2 Jun 2024 08:13:02 -0400 Subject: [PATCH 63/73] Removes the nonfunctioning coffee machines (#3015) ## About The Pull Request Undoes most of the changes from #2584 pertaining to coffee machines. The coffee machines didn't work, the coffee pot had missing sprites, and every sprite was shoved into the same dmi instead of being put into the proper files. ## Why It's Good For The Game Bad untested PR's go to Weewish. ## Changelog :cl: del: Removed nonfunctioning coffee machines and their cargo packs /:cl: --------- Signed-off-by: Sun-Soaked <45698967+Sun-Soaked@users.noreply.github.com> Co-authored-by: Sun-Soaked <45698967+Sun-Soaked@users.noreply.github.com> --- .../circuitboards/machine_circuitboards.dm | 20 - code/game/objects/items/storage/boxes.dm | 50 -- code/modules/cargo/packs/food.dm | 37 - .../modules/food_and_drinks/food/condiment.dm | 11 - .../kitchen_machinery/coffeemaker.dm | 692 ------------------ .../reagents/reagent_containers/bottle.dm | 36 - icons/obj/machines/coffeemaker.dmi | Bin 5538 -> 0 bytes shiptest.dme | 1 - sound/machines/coffeemaker_brew.ogg | Bin 94906 -> 0 bytes 9 files changed, 847 deletions(-) delete mode 100644 code/modules/food_and_drinks/kitchen_machinery/coffeemaker.dm delete mode 100644 icons/obj/machines/coffeemaker.dmi delete mode 100644 sound/machines/coffeemaker_brew.ogg diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 1a4a57d5cbb1..4fbe06343ae5 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -1524,26 +1524,6 @@ /obj/item/stock_parts/manipulator = 2, ) -/obj/item/circuitboard/machine/coffeemaker - name = "Modello 3 Coffeemaker" - build_path = /obj/machinery/coffeemaker - req_components = list( - /obj/item/stack/sheet/glass = 1, - /obj/item/reagent_containers/glass/beaker = 2, - /obj/item/stock_parts/capacitor = 1, - /obj/item/stock_parts/micro_laser = 2, - ) - -/obj/item/circuitboard/machine/coffeemaker/impressa - name = "Impressa Coffeemaker" - build_path = /obj/machinery/coffeemaker/impressa - req_components = list( - /obj/item/stack/sheet/glass = 1, - /obj/item/reagent_containers/glass/beaker = 2, - /obj/item/stock_parts/capacitor = 1, - /obj/item/stock_parts/micro_laser = 2, - ) - /obj/item/circuitboard/machine/suit_storage_unit name = "Suit Storage Unit" icon_state = "engineering" diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index a7fdbc05691a..5b817cbba675 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1520,53 +1520,3 @@ ) generate_items_inside(items_inside,src) -/obj/item/storage/box/coffeepack - icon_state = "arabica_beans" - name = "arabica beans" - desc = "A bag containing fresh, dry coffee arabica beans. Ethically sourced and packaged by Donk! Co." - illustration = null - icon = 'icons/obj/food/containers.dmi' - var/beantype = /obj/item/reagent_containers/food/snacks/grown/coffee - -/obj/item/storage/box/cofeepack/Initialize(mapload) - . = ..() - var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_items = 5 - STR.set_holdable(list(/obj/item/reagent_containers/food/snacks/grown/coffee)) - -/obj/item/storage/box/coffeepack/PopulateContents() - var/static/items_inside = list( - /obj/item/reagent_containers/food/snacks/grown/coffee = 5, - /obj/item/reagent_containers/food/snacks/grown/coffee/robusta = 5) - generate_items_inside(items_inside,src) - -/obj/item/storage/box/coffeepack/robusta - icon_state = "robusta_beans" - name = "robusta beans" - desc = "A bag containing fresh, dry coffee robusta beans. Ethically sourced and packaged by Donk! Co." - beantype = /obj/item/reagent_containers/food/snacks/grown/coffee/robusta - - -/* - * Coffee condiments display -- someone can make this fancy eventually, i cant fucking figure it out for the life of me -- it exists in TG - */ - -/obj/item/storage/box/coffee_condi_display - name = "coffee condiments display" - desc = "A neat small box, holding all your favorite coffee condiments." - -/obj/item/storage/box/coffee_condi_display/Initialize(mapload) - . = ..() - var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_items = 14 - STR.set_holdable(list( - /obj/item/reagent_containers/food/condiment/pack/sugar, - /obj/item/reagent_containers/food/condiment/pack/creamer, - /obj/item/reagent_containers/food/condiment/pack/astrotame, - )) - -/obj/item/storage/box/coffee_condi_display/PopulateContents() - for(var/i in 1 to 4) - new /obj/item/reagent_containers/food/condiment/pack/sugar(src) - new /obj/item/reagent_containers/food/condiment/pack/creamer(src) - new /obj/item/reagent_containers/food/condiment/pack/astrotame(src) diff --git a/code/modules/cargo/packs/food.dm b/code/modules/cargo/packs/food.dm index f383e4e706f1..bf16fb592e21 100644 --- a/code/modules/cargo/packs/food.dm +++ b/code/modules/cargo/packs/food.dm @@ -317,40 +317,3 @@ crate_name = "ration crate" crate_type = /obj/structure/closet/crate -/datum/supply_pack/food/syrup - name = "Coffee Syrups Box" - desc = "A packaged box of various syrups, perfect for making your delicious coffee even more diabetic." - cost = 200 - contains = list( - /obj/item/reagent_containers/food/drinks/bottle/syrup_bottle/caramel, - /obj/item/reagent_containers/food/drinks/bottle/syrup_bottle/liqueur, - ) - crate_name = "coffee syrups box" - crate_type = /obj/structure/closet/crate - -/datum/supply_pack/food/coffeekit - name = "Coffee Equipment Crate" - desc = "A complete kit to setup your own cozy coffee shop, the coffeemaker is for some reason not included." - cost = 1000 - contains = list( - /obj/item/storage/box/coffeepack/robusta, - /obj/item/storage/box/coffeepack, - /obj/item/reagent_containers/food/drinks/bottle/coffeepot, - /obj/item/storage/box/coffee_condi_display, - /obj/item/reagent_containers/food/condiment/milk, - /obj/item/reagent_containers/food/condiment/soymilk, - /obj/item/reagent_containers/food/condiment/sugar, - /obj/item/reagent_containers/food/drinks/bottle/syrup_bottle/caramel, //one extra syrup as a treat - ) - crate_name = "coffee equipment crate" - -/datum/supply_pack/food/coffeemaker - name = "Impressa Coffeemaker Crate" - desc = "An assembled Impressa model coffeemaker." - cost = 500 - contains = list( - /obj/machinery/coffeemaker/impressa, - /obj/item/reagent_containers/food/drinks/bottle/coffeepot, - ) - crate_name = "coffeemaker crate" - crate_type = /obj/structure/closet/crate diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm index 615ec2785f82..0adf98ba5666 100644 --- a/code/modules/food_and_drinks/food/condiment.dm +++ b/code/modules/food_and_drinks/food/condiment.dm @@ -322,14 +322,3 @@ desc = "A delicious oil used in cooking" icon_state = "oliveoil" list_reagents = list(/datum/reagent/consumable/cornoil = 50) - -/obj/item/reagent_containers/food/condiment/pack/sugar - name = "sugar pack" - originalname = "sugar" - list_reagents = list(/datum/reagent/consumable/sugar = 5) - -/obj/item/reagent_containers/food/condiment/pack/creamer - name = "creamer" /// dont laugh you child - originalname = "cream" - list_reagents = list(/datum/reagent/consumable/cream = 5) - diff --git a/code/modules/food_and_drinks/kitchen_machinery/coffeemaker.dm b/code/modules/food_and_drinks/kitchen_machinery/coffeemaker.dm deleted file mode 100644 index bebf3dda83a4..000000000000 --- a/code/modules/food_and_drinks/kitchen_machinery/coffeemaker.dm +++ /dev/null @@ -1,692 +0,0 @@ -#define BEAN_CAPACITY 10 //amount of coffee beans that can fit inside the impressa coffeemaker - -/obj/machinery/coffeemaker - name = "coffeemaker" - desc = "A Modello 3 Coffeemaker that brews coffee and holds it at the perfect temperature of 176 fahrenheit. Made by Piccionaia Home Appliances." - icon = 'icons/obj/machines/coffeemaker.dmi' - icon_state = "coffeemaker_nopot_nocart" - base_icon_state = "coffeemaker" - idle_power_usage = IDLE_DRAW_MINIMAL - active_power_usage = ACTIVE_DRAW_MINIMAL - resistance_flags = FIRE_PROOF | ACID_PROOF - circuit = /obj/item/circuitboard/machine/coffeemaker - var/obj/item/reagent_containers/food/drinks/bottle/coffeepot/coffeepot = null - var/brewing = FALSE - var/brew_time = 20 SECONDS - var/speed = 1 - /// The coffee cartridge to make coffee from. In the future, coffee grounds are like printer ink. - var/obj/item/coffee_cartridge/cartridge = null - /// The type path to instantiate for the coffee cartridge the device initially comes with, eg. /obj/item/coffee_cartridge - var/initial_cartridge = /obj/item/coffee_cartridge - /// The number of cups left - var/coffee_cups = 15 - var/max_coffee_cups = 15 - /// The amount of sugar packets left - var/sugar_packs = 10 - var/max_sugar_packs = 10 - /// The amount of sweetener packets left - var/sweetener_packs = 10 - var/max_sweetener_packs = 10 - /// The amount of creamer packets left - var/creamer_packs = 10 - var/max_creamer_packs = 10 - - var/static/radial_examine = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_examine") - var/static/radial_brew = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_brew") - var/static/radial_eject_pot = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject_pot") - var/static/radial_eject_cartridge = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_eject_cartridge") - var/static/radial_take_cup = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_take_cup") - var/static/radial_take_sugar = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_take_sugar") - var/static/radial_take_sweetener = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_take_sweetener") - var/static/radial_take_creamer = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_take_creamer") - -/obj/machinery/coffeemaker/Initialize(mapload) - . = ..() - if(mapload) - coffeepot = new /obj/item/reagent_containers/food/drinks/bottle/coffeepot(src) - cartridge = new /obj/item/coffee_cartridge(src) - -/obj/machinery/coffeemaker/deconstruct() - coffeepot?.forceMove(drop_location()) - cartridge?.forceMove(drop_location()) - return ..() - -/obj/machinery/coffeemaker/Destroy() - QDEL_NULL(coffeepot) - QDEL_NULL(cartridge) - return ..() - -/obj/machinery/coffeemaker/Exited(atom/movable/gone, direction) - . = ..() - if(gone == coffeepot) - coffeepot = null - update_appearance(UPDATE_OVERLAYS) - if(gone == cartridge) - cartridge = null - update_appearance(UPDATE_OVERLAYS) -/obj/machinery/coffeemaker/examine(mob/user) - . = ..() - if(!in_range(user, src) && !issilicon(user) && !isobserver(user)) - . += span_warning("You're too far away to examine [src]'s contents and display!") - return - - if(brewing) - . += span_warning("\The [src] is brewing.") - return - - if(panel_open) - . += span_notice("[src]'s maintenance hatch is open!") - return - - if(coffeepot || cartridge) - . += span_notice("\The [src] contains:") - if(coffeepot) - . += span_notice("- \A [coffeepot].") - if(cartridge) - . += span_notice("- \A [cartridge].") - return - - if(!(machine_stat & (NOPOWER|BROKEN))) - . += "[span_notice("The status display reads:")]\n"+\ - span_notice("- Brewing coffee at [speed*100]%.") - if(coffeepot) - for(var/datum/reagent/consumable/cawfee as anything in coffeepot.reagents.reagent_list) - . += span_notice("- [cawfee.volume] units of coffee in pot.") - if(cartridge) - if(cartridge.charges < 1) - . += span_notice("- grounds cartridge is empty.") - else - . += span_notice("- grounds cartridge has [cartridge.charges] charges remaining.") - - if (coffee_cups >= 1) - . += span_notice("There [coffee_cups == 1 ? "is" : "are"] [coffee_cups] coffee cup[coffee_cups != 1 && "s"] left.") - else - . += span_notice("There are no cups left.") - - if (sugar_packs >= 1) - . += span_notice("There [sugar_packs == 1 ? "is" : "are"] [sugar_packs] packet[sugar_packs != 1 && "s"] of sugar left.") - else - . += span_notice("There is no sugar left.") - - if (sweetener_packs >= 1) - . += span_notice("There [sweetener_packs == 1 ? "is" : "are"] [sweetener_packs] packet[sweetener_packs != 1 && "s"] of sweetener left.") - else - . += span_notice("There is no sweetener left.") - - if (creamer_packs > 1) - . += span_notice("There [creamer_packs == 1 ? "is" : "are"] [creamer_packs] packet[creamer_packs != 1 && "s"] of creamer left.") - else - . += span_notice("There is no creamer left.") - - -/obj/machinery/coffeemaker/update_overlays() - . = ..() - . += overlay_checks() - -/obj/machinery/coffeemaker/proc/overlay_checks() - . = list() - if(coffeepot) - . += "coffeemaker_pot" - if(cartridge) - . += "coffeemaker_cartidge" - return . - -/obj/machinery/coffeemaker/proc/replace_pot(mob/living/user, /obj/item/reagent_containers/food/drinks/bottle/coffeepot) - if(!user) - return FALSE - if(coffeepot) - try_put_in_hand(coffeepot, user) - balloon_alert(user, "replaced pot") - update_appearance(UPDATE_OVERLAYS) - return TRUE - -/obj/machinery/coffeemaker/proc/replace_cartridge(mob/living/user, obj/item/coffee_cartridge/new_cartridge) - if(!user) - return FALSE - if(cartridge) - try_put_in_hand(cartridge, user) - if(new_cartridge) - cartridge = new_cartridge - update_appearance(UPDATE_OVERLAYS) - return TRUE - -/obj/machinery/coffeemaker/wrench_act(mob/living/user, obj/item/tool) - . = ..() - default_unfasten_wrench(user, tool) - return TOOL_ACT_TOOLTYPE_SUCCESS - -/obj/machinery/coffeemaker/attackby(obj/item/attack_item, mob/living/user, params) - //You can only screw open empty grinder - if(!coffeepot && default_deconstruction_screwdriver(user, icon_state, icon_state, attack_item)) - return FALSE - - if(default_deconstruction_crowbar(attack_item)) - return - - if(panel_open) //Can't insert objects when its screwed open - return TRUE - - if (istype(attack_item, /obj/item/reagent_containers/food/drinks/bottle/coffeepot) && !(attack_item.item_flags & ABSTRACT) && attack_item.is_open_container()) - var/obj/item/reagent_containers/food/drinks/bottle/coffeepot/new_pot = attack_item - . = TRUE //no afterattack - if(!user.transferItemToLoc(new_pot, src)) - return TRUE - replace_pot(user, new_pot) - update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack - - if (istype(attack_item, /obj/item/reagent_containers/glass/coffee_cup) && !(attack_item.item_flags & ABSTRACT) && attack_item.is_open_container()) - var/obj/item/reagent_containers/glass/coffee_cup/new_cup = attack_item - if(new_cup.reagents.total_volume > 0) - balloon_alert(user, "the cup must be empty!") - return - if(coffee_cups >= max_coffee_cups) - balloon_alert(user, "the cup holder is full!") - return - if(!user.transferItemToLoc(attack_item, src)) - return - coffee_cups++ - update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack - - if (istype(attack_item, /obj/item/reagent_containers/food/condiment/pack/sugar)) - var/obj/item/reagent_containers/food/condiment/pack/sugar/new_pack = attack_item - if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume) - balloon_alert(user, "the pack must be full!") - return - if(sugar_packs >= max_sugar_packs) - balloon_alert(user, "the sugar compartment is full!") - return - if(!user.transferItemToLoc(attack_item, src)) - return - sugar_packs++ - update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack - - if (istype(attack_item, /obj/item/reagent_containers/food/condiment/pack/creamer)) - var/obj/item/reagent_containers/food/condiment/pack/creamer/new_pack = attack_item - if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume) - balloon_alert(user, "the pack must be full!") - return - if(creamer_packs >= max_creamer_packs) - balloon_alert(user, "the creamer compartment is full!") - return - if(!user.transferItemToLoc(attack_item, src)) - return - creamer_packs++ - update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack - - if (istype(attack_item, /obj/item/reagent_containers/food/condiment/pack/astrotame)) - var/obj/item/reagent_containers/food/condiment/pack/astrotame/new_pack = attack_item - if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume) - balloon_alert(user, "the pack must be full!") - return - else if(sweetener_packs >= max_sweetener_packs) - balloon_alert(user, "the sweetener compartment is full!") - return - else if(!user.transferItemToLoc(attack_item, src)) - return - sweetener_packs++ - update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack - - if (istype(attack_item, /obj/item/coffee_cartridge) && !(attack_item.item_flags & ABSTRACT)) - var/obj/item/coffee_cartridge/new_cartridge = attack_item - if(!user.transferItemToLoc(new_cartridge, src)) - return - replace_cartridge(user, new_cartridge) - balloon_alert(user, "added cartridge") - update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack - -/obj/machinery/coffeemaker/proc/try_brew() - if(!cartridge) - balloon_alert(usr, "no coffee cartridge inserted!") - return FALSE - if(cartridge.charges < 1) - balloon_alert(usr, "coffee cartridge empty!") - return FALSE - if(!coffeepot) - balloon_alert(usr, "no coffeepot inside!") - return FALSE - if(machine_stat & (NOPOWER|BROKEN)) - balloon_alert(usr, "machine unpowered!") - return FALSE - if(coffeepot.reagents.total_volume >= coffeepot.reagents.maximum_volume) - balloon_alert(usr, "the coffeepot is already full!") - return FALSE - return TRUE - -/obj/machinery/coffeemaker/ui_interact(mob/user) // The microwave Menu //I am reasonably certain that this is not a microwave //I am positively certain that this is not a microwave - . = ..() - - if(brewing || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user))) - return - - var/list/options = list() - - if(coffeepot) - options["Eject Pot"] = radial_eject_pot - - if(cartridge) - options["Eject Cartridge"] = radial_eject_cartridge - - options["Brew"] = radial_brew //brew is always available as an option, when the machine is unable to brew the player is told by balloon alerts whats exactly wrong - - if(coffee_cups > 0) - options["Take Cup"] = radial_take_cup - - if(sugar_packs > 0) - options["Take Sugar"] = radial_take_sugar - - if(sweetener_packs > 0) - options["Take Sweetener"] = radial_take_sweetener - - if(creamer_packs > 0) - options["Take Creamer"] = radial_take_creamer - - if(isAI(user)) - if(machine_stat & NOPOWER) - return - options["Examine"] = radial_examine - - var/choice - - if(length(options) < 1) - return - if(length(options) == 1) - choice = options[1] - else - choice = show_radial_menu(user, src, options, require_near = !issilicon(user)) - - // post choice verification - if(brewing || panel_open || !anchored || !user.canUseTopic(src, !issilicon(user))) - return - - switch(choice) - if("Brew") - brew(user) - if("Eject Pot") - eject_pot(user) - if("Eject Cartridge") - eject_cartridge(user) - if("Examine") - examine(user) - if("Take Cup") - take_cup(user) - if("Take Sugar") - take_sugar(user) - if("Take Sweetener") - take_sweetener(user) - if("Take Creamer") - take_creamer(user) - -/obj/machinery/coffeemaker/proc/eject_pot(mob/user) - if(coffeepot) - replace_pot(user) - -/obj/machinery/coffeemaker/proc/eject_cartridge(mob/user) - if(cartridge) - replace_cartridge(user) - -/obj/machinery/coffeemaker/proc/take_cup(mob/user) - if(!coffee_cups) //shouldn't happen, but we all know how stuff manages to break - balloon_alert(user, "no cups left!") - return - var/obj/item/reagent_containers/glass/coffee_cup/new_cup = new(get_turf(src)) - user.put_in_hands(new_cup) - coffee_cups-- - update_appearance(UPDATE_OVERLAYS) - -/obj/machinery/coffeemaker/proc/take_sugar(mob/user) - if(!sugar_packs) - balloon_alert(user, "no sugar left!") - return - var/obj/item/reagent_containers/food/condiment/pack/sugar/new_pack = new(get_turf(src)) - user.put_in_hands(new_pack) - sugar_packs-- - update_appearance(UPDATE_OVERLAYS) - -/obj/machinery/coffeemaker/proc/take_sweetener(mob/user) - if(!sweetener_packs) - balloon_alert(user, "no sweetener left!") - return - var/obj/item/reagent_containers/food/condiment/pack/astrotame/new_pack = new(get_turf(src)) - user.put_in_hands(new_pack) - sweetener_packs-- - update_appearance(UPDATE_OVERLAYS) - -/obj/machinery/coffeemaker/proc/take_creamer(mob/user) - if(!creamer_packs) - balloon_alert(user, "no creamer left!") - return - var/obj/item/reagent_containers/food/condiment/pack/creamer/new_pack = new(drop_location()) - user.put_in_hands(new_pack) - creamer_packs-- - update_appearance(UPDATE_OVERLAYS) - -///Updates the smoke state to something else, setting particles if relevant -/obj/machinery/coffeemaker/proc/toggle_steam() - QDEL_NULL(particles) - if(brewing) - particles.position = list(-6, 0, 0) - -/obj/machinery/coffeemaker/proc/operate_for(time, silent = FALSE) - brewing = TRUE - if(!silent) - playsound(src, 'sound/machines/coffeemaker_brew.ogg', 20, vary = TRUE) - toggle_steam() - set_active_power() - addtimer(CALLBACK(src, PROC_REF(stop_operating)), time / speed) - -/obj/machinery/coffeemaker/proc/stop_operating() - brewing = FALSE - set_idle_power() - toggle_steam() - -/obj/machinery/coffeemaker/proc/brew() - power_change() - if(!try_brew()) - return - operate_for(brew_time) - coffeepot.reagents.add_reagent_list(cartridge.drink_type) - cartridge.charges-- - -//Coffee Cartridges: like toner, but for your coffee! -/obj/item/coffee_cartridge - name = "coffeemaker cartridge- Caffè Generico" - desc = "A coffee cartridge manufactured by Piccionaia Coffee, for use with the Modello 3 system." - icon = 'icons/obj/machines/coffeemaker.dmi' - icon_state = "cartridge_basic" - var/charges = 4 - var/list/drink_type = list(/datum/reagent/consumable/coffee = 120) - -/obj/item/coffee_cartridge/examine(mob/user) - . = ..() - if(charges) - . += span_warning("The cartridge has [charges] portions of grounds remaining.") - else - . += span_warning("The cartridge has no unspent grounds remaining.") - -/obj/item/coffee_cartridge/fancy - name = "coffeemaker cartridge - Caffè Fantasioso" - desc = "A fancy coffee cartridge manufactured by Piccionaia Coffee, for use with the Modello 3 system." - icon_state = "cartridge_blend" - -//Here's the joke before I get 50 issue reports: they're all the same, and that's intentional -/obj/item/coffee_cartridge/fancy/Initialize(mapload) - . = ..() - var/coffee_type = pick("blend", "blue_mountain", "kilimanjaro", "mocha") - switch(coffee_type) - if("blend") - name = "coffeemaker cartridge - Miscela di Piccione" - icon_state = "cartridge_blend" - if("blue_mountain") - name = "coffeemaker cartridge - Montagna Blu" - icon_state = "cartridge_blue_mtn" - if("kilimanjaro") - name = "coffeemaker cartridge - Kilimangiaro" - icon_state = "cartridge_kilimanjaro" - if("mocha") - name = "coffeemaker cartridge - Moka Arabica" - icon_state = "cartridge_mocha" - -/obj/item/coffee_cartridge/decaf - name = "coffeemaker cartridge - Caffè Decaffeinato" - desc = "A decaf coffee cartridge manufactured by Piccionaia Coffee, for use with the Modello 3 system." - icon_state = "cartridge_decaf" - -// no you can't just squeeze the juice bag into a glass! -/obj/item/coffee_cartridge/bootleg - name = "coffeemaker cartridge - Botany Blend" - desc = "A jury-rigged coffee cartridge. Should work with a Modello 3 system, though it might void the warranty." - icon_state = "cartridge_bootleg" - -// blank cartridge for crafting's sake, can be made at the service lathe -/obj/item/blank_coffee_cartridge - name = "blank coffee cartridge" - desc = "A blank coffee cartridge, ready to be filled with coffee paste." - icon = 'icons/obj/machines/coffeemaker.dmi' - icon_state = "cartridge_blank" - -//now, how do you store coffee carts? well, in a rack, of course! -/obj/item/storage/box/coffee_cart_rack - name = "coffeemaker cartridge box" - desc = "A small rack for storing coffeemaker cartridges." - var/cartridge_type = /obj/item/coffee_cartridge - -/obj/item/storage/box/coffee_cart_rack/Initialize(mapload) - . = ..() - var/datum/component/storage/STR = GetComponent(/datum/component/storage) - STR.max_items = 8 - STR.can_hold = typecacheof(list(/obj/item/coffee_cartridge)) - - -/obj/item/storage/box/coffee_cart_rack/PopulateContents() - for(var/i in 1 to 4) - new cartridge_type(src) - new /obj/item/coffee_cartridge/decaf(src) - new /obj/item/coffee_cartridge/fancy(src) - new /obj/item/coffee_cartridge(src) - -/* - * impressa coffee maker - * its supposed to be a premium line product, so its cargo-only, the board cant be therefore researched - */ - -/obj/machinery/coffeemaker/impressa - name = "impressa coffeemaker" - desc = "An industry-grade Impressa Modello 5 Coffeemaker of the Piccionaia Home Appliances premium coffeemakers product line. Makes coffee from fresh dried whole beans." - icon = 'icons/obj/machines/coffeemaker.dmi' - icon_state = "coffeemaker_impressa" - circuit = /obj/item/circuitboard/machine/coffeemaker/impressa - initial_cartridge = null //no cartridge, just coffee beans - brew_time = 15 SECONDS //industrial grade, its faster than the regular one - density = TRUE - pass_flags = PASSTABLE - /// Current amount of coffee beans stored - var/coffee_amount = 0 - /// List of coffee bean objects are stored - var/list/coffee = list() - -/obj/machinery/coffeemaker/impressa/Initialize(mapload) - . = ..() - if(mapload) - coffeepot = new /obj/item/reagent_containers/food/drinks/bottle/coffeepot(src) - cartridge = null - -/obj/machinery/coffeemaker/impressa/Destroy() - QDEL_NULL(coffeepot) - QDEL_NULL(coffee) - return ..() - -/obj/machinery/coffeemaker/impressa/examine(mob/user) - . = ..() - if(coffee) - . += span_notice("The internal grinder contains [length(coffee)] scoop\s of coffee beans") - -/obj/machinery/coffeemaker/impressa/update_overlays() - . = ..() - . += overlay_checks() - -/obj/machinery/coffeemaker/impressa/overlay_checks() - . = list() - if(coffeepot) - if(coffeepot.reagents.total_volume > 0) - . += "pot_full" - else - . += "pot_empty" - if(coffee_cups > 0) - if(coffee_cups >= max_coffee_cups/3) - if(coffee_cups > max_coffee_cups/1.5) - . += "cups_3" - else - . += "cups_2" - else - . += "cups_1" - if(sugar_packs) - . += "extras_1" - if(creamer_packs) - . += "extras_2" - if(sweetener_packs) - . += "extras_3" - if(coffee_amount) - if(coffee_amount < 0.7*BEAN_CAPACITY) - . += "grinder_half" - else - . += "grinder_full" - return . - -/obj/machinery/coffeemaker/impressa/Exited(atom/movable/gone, direction) - . = ..() - if(gone in coffee) - coffee -= gone - update_appearance(UPDATE_OVERLAYS) - -/obj/machinery/coffeemaker/impressa/try_brew(mob/living/user) - if(coffee_amount <= 0) - balloon_alert(user, "no coffee beans added!") - return FALSE - if(!coffeepot) - balloon_alert(user, "no coffeepot inside!") - return FALSE - if(machine_stat & (NOPOWER|BROKEN)) - balloon_alert(user, "machine unpowered!") - return FALSE - if(coffeepot.reagents.total_volume >= coffeepot.reagents.maximum_volume) - balloon_alert(user, "the coffeepot is already full!") - return FALSE - return TRUE - -/obj/machinery/coffeemaker/impressa/attackby(obj/item/attack_item, mob/living/user, params) - //You can only screw open empty grinder - if(!coffeepot && default_deconstruction_screwdriver(user, icon_state, icon_state, attack_item)) - return - - if(default_deconstruction_crowbar(attack_item)) - return - - if(panel_open) //Can't insert objects when its screwed open - return TRUE - - if (istype(attack_item, /obj/item/reagent_containers/food/drinks/bottle/coffeepot) && !(attack_item.item_flags & ABSTRACT) && attack_item.is_open_container()) - var/obj/item/reagent_containers/food/drinks/bottle/coffeepot/new_pot = attack_item - if(!user.transferItemToLoc(new_pot, src)) - return TRUE - replace_pot(user, new_pot) - update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack - - if (istype(attack_item, /obj/item/reagent_containers/glass/coffee_cup) && !(attack_item.item_flags & ABSTRACT) && attack_item.is_open_container()) - var/obj/item/reagent_containers/glass/coffee_cup/new_cup = attack_item //different type of cup - if(new_cup.reagents.total_volume > 0) - balloon_alert(user, "the cup must be empty!") - return - if(coffee_cups >= max_coffee_cups) - balloon_alert(user, "the cup holder is full!") - return - if(!user.transferItemToLoc(attack_item, src)) - return - coffee_cups++ - update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack - - if (istype(attack_item, /obj/item/reagent_containers/food/condiment/pack/sugar)) - var/obj/item/reagent_containers/food/condiment/pack/sugar/new_pack = attack_item - if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume) - balloon_alert(user, "the pack must be full!") - return - if(sugar_packs >= max_sugar_packs) - balloon_alert(user, "the sugar compartment is full!") - return - if(!user.transferItemToLoc(attack_item, src)) - return - sugar_packs++ - update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack - - if (istype(attack_item, /obj/item/reagent_containers/food/condiment/pack/creamer)) - var/obj/item/reagent_containers/food/condiment/pack/creamer/new_pack = attack_item - if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume) - balloon_alert(user, "the pack must be full!") - return - if(creamer_packs >= max_creamer_packs) - balloon_alert(user, "the creamer compartment is full!") - return - if(!user.transferItemToLoc(attack_item, src)) - return - creamer_packs++ - update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack - - if (istype(attack_item, /obj/item/reagent_containers/food/condiment/pack/astrotame)) - var/obj/item/reagent_containers/food/condiment/pack/astrotame/new_pack = attack_item - if(new_pack.reagents.total_volume < new_pack.reagents.maximum_volume) - balloon_alert(user, "the pack must be full!") - return - if(sweetener_packs >= max_sweetener_packs) - balloon_alert(user, "the sweetener compartment is full!") - return - if(!user.transferItemToLoc(attack_item, src)) - return - sweetener_packs++ - update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack - - if (istype(attack_item, /obj/item/reagent_containers/food/snacks/grown/coffee) && !(attack_item.item_flags & ABSTRACT)) - if(coffee_amount >= BEAN_CAPACITY) - balloon_alert(user, "the coffee container is full!") - return - var/obj/item/reagent_containers/food/snacks/grown/coffee/new_coffee = attack_item - if(!user.transferItemToLoc(new_coffee, src)) - return - coffee += new_coffee - coffee_amount++ - balloon_alert(user, "added coffee") - - - if (istype(attack_item, /obj/item/storage/box/coffeepack)) - if(coffee_amount >= BEAN_CAPACITY) - balloon_alert(user, "the coffee container is full!") - return - var/obj/item/storage/box/coffeepack/new_coffee_pack = attack_item - for(var/obj/item/reagent_containers/food/snacks/grown/coffee/new_coffee in new_coffee_pack.contents) - if(coffee_amount < BEAN_CAPACITY) - if(user.transferItemToLoc(new_coffee, src)) - coffee += new_coffee - coffee_amount++ - new_coffee.forceMove(src) - balloon_alert(user, "added coffee") - update_appearance(UPDATE_OVERLAYS) - else - return - update_appearance(UPDATE_OVERLAYS) - return TRUE //no afterattack - -/obj/machinery/coffeemaker/impressa/take_cup(mob/user) - if(!coffee_cups) //shouldn't happen, but we all know how stuff manages to break - balloon_alert(user, "no cups left!") - return - balloon_alert_to_viewers("took cup") - var/obj/item/reagent_containers/food/drinks/coffee/new_cup = new(get_turf(src)) - user.put_in_hands(new_cup) - coffee_cups-- - update_appearance(UPDATE_OVERLAYS) - -/obj/machinery/coffeemaker/impressa/toggle_steam() - QDEL_NULL(particles) - if(brewing) - particles.position = list(-2, 1, 0) - -/obj/machinery/coffeemaker/impressa/brew() - power_change() - if(!try_brew()) - return - operate_for(brew_time) - coffeepot.reagents.add_reagent_list(list(/datum/reagent/consumable/coffee = 120)) - coffee.Cut(1,2) //remove the first item from the list - coffee_amount-- - update_appearance(UPDATE_OVERLAYS) - -#undef BEAN_CAPACITY diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm index 9a29efe1a381..df7949c9c654 100644 --- a/code/modules/reagents/reagent_containers/bottle.dm +++ b/code/modules/reagents/reagent_containers/bottle.dm @@ -433,39 +433,3 @@ /obj/item/reagent_containers/glass/bottle/morphine/sleeper cap_on = FALSE - -//types of syrups - -/obj/item/reagent_containers/food/drinks/bottle/syrup_bottle/caramel - name = "bottle of caramel syrup" - desc = "A pump bottle containing caramalized sugar, also known as caramel. Do not lick." - list_reagents = list(/datum/reagent/consumable/caramel = 50) - -/obj/item/reagent_containers/food/drinks/bottle/syrup_bottle/liqueur - name = "bottle of coffee liqueur syrup" - desc = "A pump bottle containing mexican coffee-flavoured liqueur syrup. In production since 1936, HONK." - list_reagents = list(/datum/reagent/consumable/ethanol/kahlua = 50) - -//Coffeepots: for reference, a standard cup is 30u, to allow 20u for sugar/sweetener/milk/creamer -/obj/item/reagent_containers/food/drinks/bottle/coffeepot - icon = 'icons/obj/food/containers.dmi' - name = "coffeepot" - desc = "A large pot for dispensing that ambrosia of corporate life known to mortals only as coffee. Contains 4 standard cups." - volume = 120 - icon_state = "coffeepot" - fill_icon_state = "coffeepot" - fill_icon_thresholds = list(0, 1, 30, 60, 100) - -/obj/item/reagent_containers/glass/coffee_cup - name = "coffee cup" - desc = "A heat-formed plastic coffee cup. Can theoretically be used for other hot drinks, if you're feeling adventurous." - icon = 'icons/obj/machines/coffeemaker.dmi' - icon_state = "coffee_cup_e" - base_icon_state = "coffee_cup" - possible_transfer_amounts = list(10) - volume = 30 - spillable = TRUE - -/obj/item/reagent_containers/glass/coffee_cup/update_icon_state() - icon_state = reagents.total_volume ? base_icon_state : "[base_icon_state]_e" - return ..() diff --git a/icons/obj/machines/coffeemaker.dmi b/icons/obj/machines/coffeemaker.dmi deleted file mode 100644 index 246159f1c54f9eb357b555c821365ec35bce1931..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5538 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 K;s@!F#{U4qS=62Y From d8ec3fb3f7fc0a137a5f7ba8327e122796ba16f4 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 07:50:16 -0500 Subject: [PATCH 64/73] Automatic changelog generation for PR #3015 [ci skip] --- html/changelogs/AutoChangeLog-pr-3015.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3015.yml diff --git a/html/changelogs/AutoChangeLog-pr-3015.yml b/html/changelogs/AutoChangeLog-pr-3015.yml new file mode 100644 index 000000000000..75dab5505349 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3015.yml @@ -0,0 +1,4 @@ +author: Zevotech +changes: + - {rscdel: Removed nonfunctioning coffee machines and their cargo packs} +delete-after: true From bac506fac7f9015d1421be16ac775e560780d89c Mon Sep 17 00:00:00 2001 From: generalthrax <139387950+generalthrax@users.noreply.github.com> Date: Sun, 2 Jun 2024 05:19:55 -0700 Subject: [PATCH 65/73] .45-70 Specialty Ammo (#2991) ## About The Pull Request Adds .45-70 Match ammunition to cargo, where it used to only be available through R&D. ## Why It's Good For The Game I love the Beacon but someone raised the very valid point that with default ammunition it hits just barely harder than slugs out of a shotgun. Giving it some options would allow it to fit its own spot on the market and release more ammo from R&D hell. ## Changelog :cl: add: .45-70 Match ammunition added to cargo /:cl: --- code/modules/cargo/packs/ammo.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/modules/cargo/packs/ammo.dm b/code/modules/cargo/packs/ammo.dm index 5d94d25b61c4..ab521998f07c 100644 --- a/code/modules/cargo/packs/ammo.dm +++ b/code/modules/cargo/packs/ammo.dm @@ -341,6 +341,12 @@ contains = list(/obj/item/ammo_box/a4570) cost = 500 +/datum/supply_pack/ammo/a4570_box/match + name = ".45-70 Match Crate" + desc = "Contains a twelve-round box containing devastatingly powerful .45-70 caliber ammunition, that travels faster, pierces armour better, and ricochets off targets." + contains = list(/obj/item/ammo_box/a4570/match) + cost = 750 + /datum/supply_pack/ammo/ferropelletboxcrate name = "Ferromagnetic Pellet Box Crate" desc = "Contains a fifty-round ferromagnetic pellet ammo box for gauss guns such as the Claris." From 2d692fd0478ac1e0de7f8e3828503c0430c168a2 Mon Sep 17 00:00:00 2001 From: meem <75212565+meemofcourse@users.noreply.github.com> Date: Sun, 2 Jun 2024 14:14:10 -0400 Subject: [PATCH 66/73] Tweaks Runner-class and replaces weapons with factory subtype on the Elder (#3059) ## About The Pull Request Title. The Runner-class should now be able to dock, and the Elder's Illestrens + Arrows were replaced with factory variants. ## Why It's Good For The Game * Ship working good. * Elder is an SRM ship, which uses Hunter's Pride weapons. The factory variants are intended for SRM ships. ## Changelog :cl: balance: The Elder's Illesterns and Arrows are now factory-variant. fix: The Runner should be able to dock now. /:cl: --- _maps/shuttles/roumain/srm_elder.dmm | 45 ++++------- .../shuttles/subshuttles/syndicate_runner.dmm | 78 +++++++++++-------- 2 files changed, 58 insertions(+), 65 deletions(-) diff --git a/_maps/shuttles/roumain/srm_elder.dmm b/_maps/shuttles/roumain/srm_elder.dmm index ff5841d98df5..0fdb4827655a 100644 --- a/_maps/shuttles/roumain/srm_elder.dmm +++ b/_maps/shuttles/roumain/srm_elder.dmm @@ -273,7 +273,6 @@ dir = 1 }, /obj/machinery/door/poddoor/shutters{ - dir = 2; id = "elderatriumshuts" }, /turf/open/floor/plating, @@ -497,7 +496,6 @@ /obj/machinery/button/door{ id = "elderengineshuts"; name = "Engine Shutters"; - dir = 2; pixel_x = 7; pixel_y = 21 }, @@ -955,7 +953,6 @@ /obj/structure/grille, /obj/structure/window/reinforced/fulltile, /obj/machinery/door/poddoor/shutters{ - dir = 2; id = "elderatriumshuts" }, /turf/open/floor/plating, @@ -1170,7 +1167,6 @@ /obj/structure/window/reinforced/fulltile, /obj/structure/grille, /obj/machinery/door/poddoor/shutters{ - dir = 2; id = "elderatriumshuts" }, /turf/open/floor/plating, @@ -1242,7 +1238,6 @@ /obj/structure/window/reinforced/fulltile, /obj/structure/grille, /obj/machinery/door/poddoor/shutters{ - dir = 2; id = "elderatriumshuts" }, /turf/open/floor/plating, @@ -1259,15 +1254,13 @@ /obj/machinery/door/window/eastright{ dir = 8 }, -/obj/item/gun/ballistic/shotgun/flamingarrow{ - pixel_y = -5 - }, -/obj/item/gun/ballistic/shotgun/flamingarrow{ - pixel_y = 0 - }, +/obj/item/gun/ballistic/shotgun/flamingarrow/factory, /obj/item/gun/ballistic/shotgun/flamingarrow/bolt{ pixel_y = 5 }, +/obj/item/gun/ballistic/shotgun/flamingarrow/factory{ + pixel_y = -5 + }, /turf/open/floor/wood/ebony, /area/ship/storage) "oC" = ( @@ -1275,7 +1268,6 @@ /obj/structure/grille, /obj/machinery/door/firedoor/border_only, /obj/machinery/door/poddoor/shutters{ - dir = 2; id = "elderatriumshuts" }, /turf/open/floor/plating, @@ -1774,7 +1766,6 @@ /obj/structure/window/reinforced/fulltile, /obj/structure/grille, /obj/machinery/door/poddoor/shutters{ - dir = 2; id = "elderatriumshuts" }, /turf/open/floor/plating, @@ -2187,18 +2178,18 @@ /obj/machinery/door/window{ dir = 8 }, -/obj/item/gun/ballistic/rifle/illestren{ +/obj/item/gun/ballistic/rifle/illestren/factory{ + pixel_y = 3; + pixel_x = -4 + }, +/obj/item/gun/ballistic/rifle/illestren/factory{ pixel_x = -4; pixel_y = -5 }, -/obj/item/gun/ballistic/rifle/illestren{ +/obj/item/gun/ballistic/rifle/illestren/factory{ pixel_x = -4; pixel_y = -1 }, -/obj/item/gun/ballistic/rifle/illestren{ - pixel_x = -4; - pixel_y = 3 - }, /turf/open/floor/wood/ebony, /area/ship/storage) "Bq" = ( @@ -2278,7 +2269,6 @@ pixel_x = 4 }, /obj/item/reagent_containers/food/snacks/meat/steak{ - pixel_y = 0; pixel_x = -9 }, /obj/item/reagent_containers/food/snacks/meat/steak{ @@ -2542,9 +2532,7 @@ pixel_x = 3; pixel_y = -6 }, -/obj/item/storage/toolbox/fishing{ - pixel_y = 0 - }, +/obj/item/storage/toolbox/fishing, /turf/open/floor/wood/ebony, /area/ship/storage) "Fu" = ( @@ -2926,7 +2914,6 @@ pixel_x = -2 }, /obj/item/weldingtool{ - pixel_y = 0; pixel_x = -5 }, /turf/open/floor/wood/ebony, @@ -3015,8 +3002,7 @@ dir = 1 }, /obj/machinery/door/airlock/medical/glass{ - name = "Medical Bay"; - dir = 2 + name = "Medical Bay" }, /obj/effect/turf_decal/siding/blue/end{ dir = 1 @@ -3073,7 +3059,6 @@ pixel_x = 21 }, /obj/item/binoculars{ - pixel_y = 0; pixel_x = -4 }, /obj/item/megaphone{ @@ -3497,8 +3482,7 @@ pixel_x = 5 }, /obj/item/cultivator/rake{ - pixel_x = -4; - pixel_y = 0 + pixel_x = -4 }, /turf/open/floor/grass/ship/jungle, /area/ship/roumain) @@ -3763,8 +3747,7 @@ pixel_y = -4 }, /obj/item/pickaxe{ - pixel_x = 1; - pixel_y = 0 + pixel_x = 1 }, /obj/item/pickaxe{ pixel_x = 1; diff --git a/_maps/shuttles/subshuttles/syndicate_runner.dmm b/_maps/shuttles/subshuttles/syndicate_runner.dmm index 100a0d234000..69430bf09157 100644 --- a/_maps/shuttles/subshuttles/syndicate_runner.dmm +++ b/_maps/shuttles/subshuttles/syndicate_runner.dmm @@ -74,9 +74,7 @@ /obj/effect/turf_decal/trimline/opaque/bar/filled/corner, /obj/machinery/power/terminal, /obj/effect/landmark/ert_shuttle_spawn, -/obj/structure/cable{ - icon_state = "0-1" - }, +/obj/structure/cable, /obj/structure/cable{ icon_state = "1-4" }, @@ -168,15 +166,15 @@ "co" = ( /obj/effect/turf_decal/spline/fancy/opaque/black, /obj/effect/turf_decal/trimline/opaque/syndiered/filled/line, -/obj/effect/turf_decal/trimline/opaque/bar/filled/warning{ - dir = 1 - }, /obj/structure/cable{ icon_state = "4-8" }, /obj/structure/cable{ icon_state = "1-8" }, +/obj/effect/turf_decal/trimline/opaque/bar/line{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/ship/bridge) "cF" = ( @@ -213,9 +211,7 @@ dir = 4; id = "runner_sub_holo" }, -/obj/structure/cable{ - icon_state = "0-1" - }, +/obj/structure/cable, /turf/open/floor/plating, /area/ship/bridge) "fa" = ( @@ -228,6 +224,15 @@ /obj/machinery/light/directional/south, /turf/open/floor/plasteel/tech/grid, /area/ship/bridge) +"fQ" = ( +/obj/effect/turf_decal/trimline/opaque/bar/filled/warning{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ship/bridge) "gi" = ( /obj/item/storage/backpack/duffelbag/med/surgery{ pixel_x = -2; @@ -325,15 +330,32 @@ }, /turf/open/floor/plasteel/mono/dark, /area/ship/bridge) +"mN" = ( +/obj/docking_port/mobile{ + dir = 2; + name = "trauma team shuttle"; + port_direction = 8; + preferred_direction = 4 + }, +/obj/machinery/door/poddoor{ + id = "runner_sub_door" + }, +/obj/machinery/power/shieldwallgen/atmos/roundstart{ + dir = 8; + id = "runner_sub_holo" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/ship/bridge) "nP" = ( /obj/effect/turf_decal/spline/fancy/opaque/black, /obj/effect/turf_decal/trimline/opaque/syndiered/filled/line, -/obj/effect/turf_decal/trimline/opaque/bar/filled/warning{ - dir = 1 - }, /obj/structure/cable{ icon_state = "1-8" }, +/obj/effect/turf_decal/trimline/opaque/bar/line{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/ship/bridge) "rR" = ( @@ -389,13 +411,13 @@ /obj/effect/turf_decal/trimline/opaque/syndiered/filled/line{ dir = 1 }, -/obj/effect/turf_decal/trimline/opaque/bar/filled/warning, /obj/structure/cable{ icon_state = "2-8" }, /obj/structure/cable{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/opaque/bar/line, /turf/open/floor/plasteel/dark, /area/ship/bridge) "DP" = ( @@ -420,23 +442,11 @@ /turf/open/floor/engine/hull, /area/ship/external) "Or" = ( -/obj/docking_port/mobile{ - dir = 2; - name = "trauma team shuttle"; - port_direction = 8; - preferred_direction = 4 - }, -/obj/machinery/door/poddoor{ - id = "runner_sub_door" - }, -/obj/machinery/power/shieldwallgen/atmos/roundstart{ - dir = 8; - id = "runner_sub_holo" - }, /obj/structure/cable{ - icon_state = "0-1" + icon_state = "1-2" }, -/turf/open/floor/plating, +/obj/effect/turf_decal/trimline/opaque/bar/filled/warning, +/turf/open/floor/plasteel/dark, /area/ship/bridge) "Pq" = ( /turf/template_noop, @@ -568,29 +578,29 @@ gs te "} (4,1,1) = {" -Pq bz +fQ co gA SE ku zS +Or dB -Pq "} (5,1,1) = {" -Pq sl +fQ nP ZN kM iR zS Or -Pq +mN "} (6,1,1) = {" -Pq +PD PD cF hJ @@ -598,7 +608,7 @@ ac hB bG PD -Pq +PD "} (7,1,1) = {" Pq From 0365e81e2a359de736ee5de76acb32458f6a52e2 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 13:25:22 -0500 Subject: [PATCH 67/73] Automatic changelog generation for PR #3059 [ci skip] --- html/changelogs/AutoChangeLog-pr-3059.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3059.yml diff --git a/html/changelogs/AutoChangeLog-pr-3059.yml b/html/changelogs/AutoChangeLog-pr-3059.yml new file mode 100644 index 000000000000..d3408755fae5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3059.yml @@ -0,0 +1,5 @@ +author: meemofcourse +changes: + - {balance: The Elder's Illesterns and Arrows are now factory-variant.} + - {bugfix: The Runner should be able to dock now.} +delete-after: true From 1102dc0aebda2e2c624cbb1d1b751e2f9f664f13 Mon Sep 17 00:00:00 2001 From: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> Date: Sun, 2 Jun 2024 13:15:50 -0500 Subject: [PATCH 68/73] Admin and Debug Tab QOL (#2956) ## About The Pull Request I came here to capitalize cinematic and move Spawn Planet/Ruin to Admin.game... fixes "Debug verbs - Disable" from stealing a few admin verbs like regenerate because they were in the "debug-mapping" list as well as another default list. The extra debug verbs are enabled by default but I left in the option to disable them again. Organized the tabs a bit. Stuff for running events gets its own tab and admin preferences are put into normal preferences #### NEW ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/ad981169-1d33-4fd6-a52f-e19d790ee7dc) ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/3478954c-c200-420e-9521-bc888c96d5d6) ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/aabe073e-9cc2-4ee4-b1de-3f4aeb1e4dae) ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/e75a9687-3be1-4d89-b709-809aa8a2cc82) ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/f010b688-dfb7-4d95-b8cc-87f63a1a39b1) ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/7343471f-bc69-4a8c-8a07-6934863bb5f0) #### OLD ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/bf0b5e04-64f8-4162-9d92-508d72548ce9) ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/2ed1cdb3-0bfa-4655-b44e-5b1359cfb924) ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/b5591fa3-262e-42a5-8ff6-f67e67f57b17) ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/1ec2e476-af28-48ad-bbf2-c26b527601d0) ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/e2acf174-cb01-4e3c-824e-ea81957352f3) ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/6e97fdf9-206a-4f88-bc17-64cbac99b5ec) ![image](https://github.com/shiptest-ss13/Shiptest/assets/86381784/ff50e2e1-551c-41a5-8ec2-ff6b8ca636c3) ## Why It's Good For The Game ## Changelog :cl: admin: Improved the silly little menu, HA HA I have messed up your muscle memory!! u /:cl: --- code/controllers/subsystem/events.dm | 2 +- code/modules/admin/admin.dm | 21 +++++-- code/modules/admin/admin_verbs.dm | 41 ++++++++----- code/modules/admin/verbs/anonymousnames.dm | 2 +- code/modules/admin/verbs/atmosdebug.dm | 4 +- code/modules/admin/verbs/beakerpanel.dm | 2 +- code/modules/admin/verbs/cinematic.dm | 4 +- code/modules/admin/verbs/debug.dm | 39 ++++++------ code/modules/admin/verbs/mapping.dm | 68 +++++++++------------ code/modules/admin/verbs/one_click_antag.dm | 2 +- code/modules/admin/verbs/outpost.dm | 2 +- code/modules/admin/verbs/playsound.dm | 10 +-- code/modules/admin/verbs/randomverbs.dm | 50 +++++++-------- code/modules/admin/verbs/selectequipment.dm | 2 +- code/modules/admin/verbs/shuttlepanel.dm | 3 +- code/modules/admin/verbs/spawnobjasmob.dm | 6 +- code/modules/buildmode/buildmode.dm | 3 - code/modules/cargo/centcom_podlauncher.dm | 2 +- code/modules/client/preferences_toggles.dm | 16 ++--- code/modules/donator/_donator.dm | 4 +- code/modules/mob/dead/crew_manifest.dm | 2 +- 21 files changed, 145 insertions(+), 140 deletions(-) diff --git a/code/controllers/subsystem/events.dm b/code/controllers/subsystem/events.dm index 32f404c936a6..dc55c7ca0755 100644 --- a/code/controllers/subsystem/events.dm +++ b/code/controllers/subsystem/events.dm @@ -102,7 +102,7 @@ SUBSYSTEM_DEF(events) // Why the heck is this here! Took me so damn long to find! /client/proc/forceEvent() set name = "Trigger Event" - set category = "Admin.Events" + set category = "Event" if(!holder ||!check_rights(R_FUN)) return diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 5bb4b25cc1f1..7b147385c556 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -215,7 +215,7 @@ /datum/admins/proc/access_news_network() //MARKER - set category = "Admin.Events" + set category = "Event" set name = "Access Newscaster Network" set desc = "Allows you to view, add and edit news feeds." @@ -700,7 +700,7 @@ ////////////////////////////////////////////////////////////////////////////////////////////////ADMIN HELPER PROCS /datum/admins/proc/spawn_atom(object as text) - set category = "Debug" + set category = "Event.Spawning" set desc = "(atom path) Spawn an atom" set name = "Spawn" @@ -729,9 +729,9 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Spawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/podspawn_atom(object as text) - set category = "Debug" + set category = "Event.Spawning" set desc = "(atom path) Spawn an atom via supply drop" - set name = "Podspawn" + set name = "Supply drop spawn" if(!check_rights(R_SPAWN)) return @@ -753,7 +753,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Podspawn Atom") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /datum/admins/proc/spawn_cargo(object as text) - set category = "Debug" + set category = "Event.Spawning" set desc = "(atom path) Spawn a cargo crate" set name = "Spawn Cargo" @@ -1018,3 +1018,14 @@ dat += "Disable footsteps: [SSlag_switch.measures[DISABLE_FOOTSTEPS] ? "On" : "Off"] - trait applies to character
    " dat += "" usr << browse(dat.Join(), "window=lag_switch_panel;size=420x480") + +/datum/admins/proc/view_manifest() + set category = "Admin.Game" + set name = "View Manifest" + set desc = "Opens the Manifest UI." + + if(!GLOB.crew_manifest_tgui) + GLOB.crew_manifest_tgui = new /datum/crew_manifest(src) + + if(ismob(usr)) + GLOB.crew_manifest_tgui.ui_interact(usr) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index ef2bfae400e4..f4913b6be1e8 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -81,6 +81,7 @@ GLOBAL_PROTECT(admin_verbs_admin) /client/proc/overmap_datum_token_manager, /datum/admins/proc/open_borgopanel, /client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/ + /datum/admins/proc/view_manifest ) GLOBAL_LIST_INIT(admin_verbs_ban, list( @@ -121,7 +122,6 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/polymorph_all, /client/proc/show_tip, /client/proc/smite, - /client/proc/spawn_ruin, )) GLOBAL_PROTECT(admin_verbs_fun) GLOBAL_LIST_INIT(admin_verbs_spawn, list( @@ -130,7 +130,9 @@ GLOBAL_LIST_INIT(admin_verbs_spawn, list( /datum/admins/proc/spawn_cargo, /datum/admins/proc/spawn_objasmob, /datum/admins/proc/beaker_panel, - /datum/admins/proc/gift + /datum/admins/proc/gift, + /client/proc/spawn_ruin, + /client/proc/spawn_outpost /* Allows admins to spawn a new outpost. */ )) GLOBAL_PROTECT(admin_verbs_spawn) GLOBAL_LIST_INIT(admin_verbs_server, world.AVerbsServer()) @@ -169,10 +171,13 @@ GLOBAL_PROTECT(admin_verbs_debug) /client/proc/cmd_display_del_log, /client/proc/cmd_display_init_log, /client/proc/cmd_display_overlay_log, + /client/proc/cmd_admin_grantfullaccess, + /client/proc/cmd_assume_direct_control, //-errorage + /client/proc/cmd_give_direct_control, /client/proc/getserverlogs, /*for accessing server logs*/ /client/proc/getcurrentlogs, /*for accessing server logs for the current round*/ /client/proc/restart_controller, - /client/proc/enable_debug_verbs, + /client/proc/disable_debug_verbs, /client/proc/callproc, /client/proc/callproc_datum, /client/proc/SDQL2_query, @@ -205,12 +210,16 @@ GLOBAL_PROTECT(admin_verbs_debug) #endif /datum/admins/proc/create_or_modify_area, /datum/admins/proc/open_shuttlepanel, /* Opens shuttle manipulator UI */ - /client/proc/spawn_outpost, /* Allows admins to spawn a new outpost. */ /datum/admins/proc/open_borgopanel, /datum/admins/proc/overmap_view, /* Opens HTML overmap viewer UI */ /client/proc/toggle_AI_interact, /*toggle admin ability to interact with machines as an AI*/ /client/proc/toggle_cdn, - /client/proc/check_timer_sources + /client/proc/check_timer_sources, + /client/proc/air_status, //Air things + /client/proc/air_status_loc, //More air things + /client/proc/manipulate_organs, + /client/proc/set_server_fps, //allows you to set the ticklag. + /client/proc/start_singlo, ) GLOBAL_LIST_INIT(admin_verbs_possess, list(/proc/possess, /proc/release)) GLOBAL_PROTECT(admin_verbs_possess) @@ -269,10 +278,9 @@ GLOBAL_LIST_INIT(admin_verbs_hideable, list( /client/proc/Debug2, /client/proc/reload_admins, /client/proc/cmd_debug_make_powernets, - /client/proc/startSinglo, /client/proc/cmd_debug_mob_lists, /client/proc/cmd_debug_del_all, - /client/proc/enable_debug_verbs, + /client/proc/disable_debug_verbs, /proc/possess, /proc/release, /client/proc/reload_admins, @@ -305,7 +313,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) if(rights & R_SERVER) add_verb(src, GLOB.admin_verbs_server) if(rights & R_DEBUG) - add_verb(src, GLOB.admin_verbs_debug) + add_verb(src, list(GLOB.admin_verbs_debug, GLOB.admin_verbs_debug_extra)) if(rights & R_POSSESS) add_verb(src, GLOB.admin_verbs_possess) if(rights & R_PERMISSIONS) @@ -338,7 +346,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) /client/proc/play_web_sound, GLOB.admin_verbs_spawn, /*Debug verbs added by "show debug verbs"*/ - GLOB.admin_verbs_debug_mapping, + GLOB.admin_verbs_debug_extra, /client/proc/disable_debug_verbs, /client/proc/readmin )) @@ -505,7 +513,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) SSblackbox.record_feedback("tally", "admin_verb", 1, "Stealth Mode") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/drop_bomb() - set category = "Fun" + set category = "Event.Fun" set name = "Drop Bomb" set desc = "Cause an explosion of varying strength at your location." @@ -547,7 +555,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Bomb") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/drop_dynex_bomb() - set category = "Fun" + set category = "Event.Fun" set name = "Drop DynEx Bomb" set desc = "Cause an explosion of varying strength at your location." @@ -594,7 +602,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) message_admins("[key_name_admin(usr)] has modified Dynamic Explosion Scale: [ex_scale]") /client/proc/give_spell(mob/T in GLOB.mob_list) - set category = "Fun" + set category = "Event.Fun" set name = "Give Spell" set desc = "Gives a spell to a mob." @@ -618,7 +626,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) message_admins("Spells given to mindless mobs will not be transferred in mindswap or cloning!") /client/proc/remove_spell(mob/T in GLOB.mob_list) - set category = "Fun" + set category = "Event.Fun" set name = "Remove Spell" set desc = "Remove a spell from the selected mob." @@ -631,7 +639,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) SSblackbox.record_feedback("tally", "admin_verb", 1, "Remove Spell") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/give_disease(mob/living/T in GLOB.mob_living_list) - set category = "Fun" + set category = "Event.Fun" set name = "Give Disease" set desc = "Gives a Disease to a mob." if(!istype(T)) @@ -646,7 +654,7 @@ GLOBAL_PROTECT(admin_verbs_hideable) message_admins("[key_name_admin(usr)] gave [key_name_admin(T)] the disease [D].") /client/proc/object_say(obj/O in world) - set category = "Admin.Events" + set category = "Event" set name = "OSay" set desc = "Makes an object say something." var/message = input(usr, "What do you want the message to be?", "Make Sound") as text | null @@ -656,9 +664,10 @@ GLOBAL_PROTECT(admin_verbs_hideable) log_admin("[key_name(usr)] made [O] at [AREACOORD(O)] say \"[message]\"") message_admins("[key_name_admin(usr)] made [O] at [AREACOORD(O)]. say \"[message]\"") SSblackbox.record_feedback("tally", "admin_verb", 1, "Object Say") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + /client/proc/togglebuildmodeself() set name = "Toggle Build Mode Self" - set category = "Admin.Events" + set category = "Event" if (!(holder.rank.rights & R_BUILD)) return if(src.mob) diff --git a/code/modules/admin/verbs/anonymousnames.dm b/code/modules/admin/verbs/anonymousnames.dm index 62c48149af52..c880a74ba6f6 100644 --- a/code/modules/admin/verbs/anonymousnames.dm +++ b/code/modules/admin/verbs/anonymousnames.dm @@ -1,5 +1,5 @@ /client/proc/anon_names() - set category = "Admin.Events" + set category = "Event" set name = "Setup Anonymous Names" diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index 6fc5f8a4c709..56da851fdfd9 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -19,7 +19,7 @@ return list(y + 1 - min(bounds[2], bounds[4]), -(x - 1 - max(bounds[1], bounds[3]))) /client/proc/check_atmos() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Check Atmospherics Piping" if(!check_rights_for(src, R_DEBUG)) to_chat(src, "Only administrators may use this command.", confidential = TRUE) @@ -54,7 +54,7 @@ return results /client/proc/check_wiring() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Check Power" if(!check_rights_for(src, R_DEBUG)) to_chat(src, "Only administrators may use this command.", confidential = TRUE) diff --git a/code/modules/admin/verbs/beakerpanel.dm b/code/modules/admin/verbs/beakerpanel.dm index 1f523c9e4627..3ba2a51b2fe8 100644 --- a/code/modules/admin/verbs/beakerpanel.dm +++ b/code/modules/admin/verbs/beakerpanel.dm @@ -61,7 +61,7 @@ return container /datum/admins/proc/beaker_panel() - set category = "Admin.Events" + set category = "Event.Spawning" set name = "Spawn reagent container" if(!check_rights()) return diff --git a/code/modules/admin/verbs/cinematic.dm b/code/modules/admin/verbs/cinematic.dm index 722440e11b93..a8549c635966 100644 --- a/code/modules/admin/verbs/cinematic.dm +++ b/code/modules/admin/verbs/cinematic.dm @@ -1,6 +1,6 @@ /client/proc/cinematic() - set name = "cinematic" - set category = "Fun" + set name = "Cinematic" + set category = "Event.Fun" set desc = "Shows a cinematic." // Intended for testing but I thought it might be nice for events on the rare occasion Feel free to comment it out if it's not wanted. set hidden = TRUE if(!SSticker) diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 19ac8a0514d3..ae039c216120 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -26,7 +26,7 @@ Because if you select a player mob as owner it tries to do the proc for But you can call procs that are of type /mob/living/carbon/human/proc/ for that player. */ -/client/proc/Cell() +/client/proc/air_status_loc() set category = "Debug" set name = "Air Status in Location" if(!mob) @@ -38,7 +38,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that SSblackbox.record_feedback("tally", "admin_verb", 1, "Air Status In Location") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_robotize(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Event.Fun" set name = "Make Robot" if(!SSticker.HasRoundStarted()) @@ -53,7 +53,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that alert("Invalid mob") /client/proc/cmd_admin_blobize(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Event.Fun" set name = "Make Blob" if(!SSticker.HasRoundStarted()) @@ -68,7 +68,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that /client/proc/cmd_admin_animalize(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Event.Fun" set name = "Make Simple Animal" if(!SSticker.HasRoundStarted()) @@ -88,7 +88,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that /client/proc/makepAI(turf/T in GLOB.mob_list) - set category = "Fun" + set category = "Event.Fun" set name = "Make pAI" set desc = "Specify a location to spawn a pAI device, then specify a key to play that pAI" @@ -121,7 +121,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that SSblackbox.record_feedback("tally", "admin_verb", 1, "Make pAI") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_alienize(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Event.Fun" set name = "Make Alien" if(!SSticker.HasRoundStarted()) @@ -136,7 +136,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that alert("Invalid mob") /client/proc/cmd_admin_slimeize(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Event.Fun" set name = "Make slime" if(!SSticker.HasRoundStarted()) @@ -228,7 +228,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that message_admins("[key_name_admin(usr)] has granted [M.key] full access.") /client/proc/cmd_assume_direct_control(mob/M in GLOB.mob_list) - set category = "Admin.Game" + set category = "Debug" set name = "Assume direct control" set desc = "Direct intervention" @@ -249,7 +249,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that SSblackbox.record_feedback("tally", "admin_verb", 1, "Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_give_direct_control(mob/M in GLOB.mob_list) - set category = "Admin.Game" + set category = "Debug" set name = "Give direct control" if(!M) @@ -275,7 +275,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that SSblackbox.record_feedback("tally", "admin_verb", 1, "Give Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_test_atmos_controllers() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Test Atmos Monitoring Consoles" var/list/dat = list() @@ -311,7 +311,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that popup.open() /client/proc/cmd_admin_areatest() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Test Areas" var/list/dat = list() @@ -465,12 +465,12 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that /client/proc/cmd_admin_areatest_station() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Test Areas (STATION Z)" cmd_admin_areatest(TRUE) /client/proc/cmd_admin_areatest_all() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Test Areas (ALL)" cmd_admin_areatest(FALSE) @@ -529,8 +529,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that return dresscode -/client/proc/startSinglo() - +/client/proc/start_singlo() set category = "Debug" set name = "Start Singularity" set desc = "Sets up the singularity and all machines to get power flowing through the station" @@ -692,11 +691,11 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that to_chat(usr, "[template.description]", confidential = TRUE) /client/proc/fucky_wucky() - set category = "Debug" + set category = "Event.Fun" set name = "Fucky Wucky" set desc = "Inform the players that the code monkeys at our headquarters are working very hard to fix this." - if(!check_rights(R_DEBUG)) + if(!check_rights(R_FUN)) return remove_verb(/client/proc/fucky_wucky) message_admins("[key_name_admin(src)] did a fucky wucky.") @@ -750,7 +749,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that log_admin("[key_name(src)] pumped a random event.") /client/proc/start_line_profiling() - set category = "Profile" + set category = "Debug.Profile" set name = "Start Line Profiling" set desc = "Starts tracking line by line profiling for code lines that support it" @@ -761,7 +760,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that log_admin("[key_name(src)] started line by line profiling.") /client/proc/stop_line_profiling() - set category = "Profile" + set category = "Debug.Profile" set name = "Stops Line Profiling" set desc = "Stops tracking line by line profiling for code lines that support it" @@ -772,7 +771,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that log_admin("[key_name(src)] stopped line by line profiling.") /client/proc/show_line_profiling() - set category = "Profile" + set category = "Debug.Profile" set name = "Show Line Profiling" set desc = "Shows tracked profiling info from code lines that support it" diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 305cce363c8d..6d8bac8adcfc 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -19,42 +19,32 @@ //- Identify how hard it is to break into the area and where the weak points are //- Check if the area has too much empty space. If so, make it smaller and replace the rest with maintenance tunnels. -GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( +GLOBAL_LIST_INIT(admin_verbs_debug_extra, list( /client/proc/camera_view, //-errorage - /client/proc/sec_camera_report, //-errorage - /client/proc/intercom_view, //-errorage - /client/proc/air_status, //Air things - /client/proc/Cell, //More air things /client/proc/check_atmos, /client/proc/check_wiring, - /client/proc/count_objects_on_z_level, - /client/proc/count_objects_all, - /client/proc/cmd_assume_direct_control, //-errorage - /client/proc/cmd_give_direct_control, - /client/proc/startSinglo, - /client/proc/set_server_fps, //allows you to set the ticklag. - /client/proc/cmd_admin_grantfullaccess, /client/proc/cmd_admin_areatest_all, /client/proc/cmd_admin_areatest_station, - #ifdef TESTING - /client/proc/see_dirty_varedits, - #endif /client/proc/cmd_admin_test_atmos_controllers, - /client/proc/cmd_admin_rejuvenate, - /datum/admins/proc/show_traitor_panel, - /client/proc/disable_communication, /client/proc/cmd_show_at_list, /client/proc/cmd_show_at_markers, - /client/proc/manipulate_organs, - /client/proc/start_line_profiling, - /client/proc/stop_line_profiling, - /client/proc/show_line_profiling, + /client/proc/count_objects_all, + /client/proc/count_objects_on_z_level, /client/proc/create_mapping_job_icons, /client/proc/debug_z_levels, + /client/proc/disable_communication, + /client/proc/export_map, + /client/proc/intercom_view, //-errorage /client/proc/map_zones_info, - /client/proc/export_map + /client/proc/sec_camera_report, //-errorage + #ifdef TESTING + /client/proc/see_dirty_varedits, + #endif + /client/proc/show_line_profiling, + /client/proc/start_line_profiling, + /client/proc/stop_line_profiling, )) -GLOBAL_PROTECT(admin_verbs_debug_mapping) +GLOBAL_PROTECT(admin_verbs_debug_extra) /obj/effect/debugging/mapfix_marker name = "map fix marker" @@ -70,7 +60,7 @@ GLOBAL_PROTECT(admin_verbs_debug_mapping) return 0 /client/proc/camera_view() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Camera Range Display" var/on = FALSE @@ -93,7 +83,7 @@ GLOBAL_PROTECT(admin_verbs_debug_mapping) GLOBAL_LIST_EMPTY(dirty_vars) /client/proc/see_dirty_varedits() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Dirty Varedits" var/list/dat = list() @@ -107,7 +97,7 @@ GLOBAL_LIST_EMPTY(dirty_vars) #endif /client/proc/sec_camera_report() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Camera Report" if(!Master) @@ -147,7 +137,7 @@ GLOBAL_LIST_EMPTY(dirty_vars) SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Camera Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/intercom_view() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Intercom Range Display" var/static/intercom_range_display_status = FALSE @@ -165,7 +155,7 @@ GLOBAL_LIST_EMPTY(dirty_vars) SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Intercom Range") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_show_at_list() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Show roundstart AT list" set desc = "Displays a list of active turfs coordinates at roundstart" @@ -182,7 +172,7 @@ GLOBAL_LIST_EMPTY(dirty_vars) SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Roundstart Active Turfs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_show_at_markers() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Show roundstart AT markers" set desc = "Places a marker on all active-at-roundstart turfs" @@ -207,18 +197,18 @@ GLOBAL_LIST_EMPTY(dirty_vars) if(!check_rights(R_DEBUG)) return remove_verb(src, /client/proc/enable_debug_verbs) - add_verb(src, list(/client/proc/disable_debug_verbs, GLOB.admin_verbs_debug_mapping)) + add_verb(src, list(/client/proc/disable_debug_verbs, GLOB.admin_verbs_debug_extra)) SSblackbox.record_feedback("tally", "admin_verb", 1, "Enable Debug Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/disable_debug_verbs() set category = "Debug" set name = "Debug verbs - Disable" - remove_verb(src, list(/client/proc/disable_debug_verbs, GLOB.admin_verbs_debug_mapping)) + remove_verb(src, list(/client/proc/disable_debug_verbs, GLOB.admin_verbs_debug_extra)) add_verb(src, /client/proc/enable_debug_verbs) SSblackbox.record_feedback("tally", "admin_verb", 1, "Disable Debug Verbs") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/count_objects_on_z_level() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Count Objects On Level" var/level = input("Which z-level?","Level?") as text|null if(!level) @@ -257,7 +247,7 @@ GLOBAL_LIST_EMPTY(dirty_vars) SSblackbox.record_feedback("tally", "admin_verb", 1, "Count Objects Zlevel") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/count_objects_all() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Count Objects All" var/type_text = input("Which type path?","") as text|null @@ -280,7 +270,7 @@ GLOBAL_LIST_EMPTY(dirty_vars) //This proc is intended to detect lag problems relating to communication procs GLOBAL_VAR_INIT(say_disabled, FALSE) /client/proc/disable_communication() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Disable all communication verbs" GLOB.say_disabled = !GLOB.say_disabled @@ -292,7 +282,7 @@ GLOBAL_VAR_INIT(say_disabled, FALSE) //This generates the icon states for job starting location landmarks. /client/proc/create_mapping_job_icons() set name = "Generate job landmarks icons" - set category = "Mapping" + set category = "Debug.Mapping" var/icon/final = icon() var/mob/living/carbon/human/dummy/D = new(locate(1,1,1)) //spawn on 1,1,1 so we don't have runtimes when items are deleted D.setDir(SOUTH) @@ -319,7 +309,7 @@ GLOBAL_VAR_INIT(say_disabled, FALSE) /client/proc/debug_z_levels() set name = "Debug Z-Levels" - set category = "Mapping" + set category = "Debug.Mapping" var/list/z_list = SSmapping.z_list var/list/messages = list() @@ -350,7 +340,7 @@ GLOBAL_VAR_INIT(say_disabled, FALSE) /client/proc/map_zones_info() set name = "Map-Zones Info" - set category = "Mapping" + set category = "Debug.Mapping" var/list/dat = list() for(var/datum/map_zone/map_zone as anything in SSmapping.map_zones) @@ -405,7 +395,7 @@ GLOBAL_VAR_INIT(say_disabled, FALSE) #undef MAP_ZONE_INFO /client/proc/export_map() - set category = "Mapping" + set category = "Debug.Mapping" set name = "Export Map" var/z_level = input("Export Which Z-Level?", "Map Exporter", 2) as num diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index dff0335b7e9e..028c9729131a 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -4,7 +4,7 @@ /client/proc/one_click_antag() set name = "Create Antagonist" set desc = "Auto-create an antagonist of your choice" - set category = "Admin.Events" + set category = "Event" if(holder) holder.one_click_antag() diff --git a/code/modules/admin/verbs/outpost.dm b/code/modules/admin/verbs/outpost.dm index 358da03d2844..25632838f45f 100644 --- a/code/modules/admin/verbs/outpost.dm +++ b/code/modules/admin/verbs/outpost.dm @@ -19,7 +19,7 @@ /client/proc/spawn_outpost() set name = "Spawn Outpost" - set category = "Admin.Events" + set category = "Event.Spawning" set desc = "Spawns the selected /datum/overmap/outpost subtype." if(!holder) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 131dd55ad82b..e3e5bc8c1ede 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -1,5 +1,5 @@ /client/proc/play_sound(S as sound) - set category = "Fun" + set category = "Event.Fun" set name = "Play Global Sound" if(!check_rights(R_SOUND)) return @@ -40,7 +40,7 @@ /client/proc/play_local_sound(S as sound) - set category = "Fun" + set category = "Event.Fun" set name = "Play Local Sound" if(!check_rights(R_SOUND)) return @@ -52,7 +52,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Local Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/play_direct_mob_sound(S as sound, mob/M) - set category = "Fun" + set category = "Event.Fun" set name = "Play Direct Mob Sound" if(!check_rights(R_SOUND)) return @@ -67,7 +67,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Direct Mob Sound") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/play_web_sound() - set category = "Fun" + set category = "Event.Fun" set name = "Play Internet Sound" if(!check_rights(R_SOUND)) return @@ -151,7 +151,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Play Internet Sound") /client/proc/set_round_end_sound(S as sound) - set category = "Fun" + set category = "Event.Fun" set name = "Set Round End Sound" if(!check_rights(R_SOUND)) return diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index ae621e17d479..df5b1d6d18d3 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -20,7 +20,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Everything") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_subtle_message(mob/M in GLOB.mob_list) - set category = "Admin.Events" + set category = "Event" set name = "Subtle Message" if(!ismob(M)) @@ -46,7 +46,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Subtle Message") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_headset_message(mob/M in GLOB.mob_list) - set category = "Admin.Events" + set category = "Event" set name = "Headset Message" admin_headset_message(M) @@ -92,7 +92,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Headset Message") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_world_narrate() - set category = "Admin.Events" + set category = "Event" set name = "Global Narrate" if(!check_rights(R_ADMIN)) @@ -108,7 +108,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Global Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_direct_narrate(mob/M) - set category = "Admin.Events" + set category = "Event" set name = "Direct Narrate" if(!check_rights(R_ADMIN)) @@ -133,7 +133,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Direct Narrate") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_local_narrate(atom/A) - set category = "Admin.Events" + set category = "Event" set name = "Local Narrate" if(!check_rights(R_ADMIN)) @@ -295,7 +295,7 @@ return 1 /client/proc/cmd_admin_add_freeform_ai_law() - set category = "Admin.Events" + set category = "Event" set name = "Add Custom AI law" if(!check_rights(R_ADMIN)) @@ -318,7 +318,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Add Custom AI Law") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_admin_create_centcom_report() - set category = "Admin.Events" + set category = "Event" set name = "Create Command Report" if(!check_rights(R_FUN)) @@ -347,7 +347,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Create Command Report") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/cmd_change_command_name() - set category = "Admin.Events" + set category = "Event" set name = "Change Command Name" if(!check_rights(R_FUN)) @@ -370,7 +370,7 @@ admin_delete(A) /client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world) - set category = "Fun" + set category = "Event.Fun" set name = "Explosion" if(!check_rights(R_ADMIN)) @@ -406,7 +406,7 @@ return /client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world) - set category = "Fun" + set category = "Event.Fun" set name = "EM Pulse" if(!check_rights(R_ADMIN)) @@ -431,7 +431,7 @@ return /client/proc/cmd_admin_gib(mob/M in GLOB.mob_list) - set category = "Fun" + set category = "Event.Fun" set name = "Gib" if(!check_rights(R_ADMIN)) @@ -458,7 +458,7 @@ /client/proc/cmd_admin_gib_self() set name = "Gibself" - set category = "Fun" + set category = "Event.Fun" var/confirm = alert(src, "You sure?", "Confirm", "Yes", "No") if(confirm == "Yes") @@ -492,7 +492,7 @@ SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Change View Range", "[view]")) //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/admin_initiate_jump() - set category = "Admin.Events" + set category = "Event" set name = "Initiate Jump" if(!check_rights(R_ADMIN)) return @@ -510,7 +510,7 @@ message_admins("[key_name_admin(usr)] admin-initiated a bluespace jump.") /client/proc/admin_cancel_jump() - set category = "Admin.Events" + set category = "Event" set name = "Cancel Jump" if(!check_rights(0)) return @@ -528,7 +528,7 @@ message_admins("[key_name_admin(usr)] admin-cancelled a bluespace jump.") /client/proc/everyone_random() - set category = "Fun" + set category = "Event.Fun" set name = "Make Everyone Random" set desc = "Make everyone have a random appearance. You can only use this before rounds!" @@ -576,7 +576,7 @@ /client/proc/admin_change_sec_level() - set category = "Admin.Events" + set category = "Event" set name = "Set Security Level" set desc = "Changes the security level. Announcement only, i.e. setting to Delta won't activate nuke" @@ -593,7 +593,7 @@ /client/proc/toggle_nuke(obj/machinery/nuclearbomb/N in GLOB.nuke_list) set name = "Toggle Nuke" - set category = "Admin.Events" + set category = "Event" set popup_menu = 0 if(!check_rights(R_DEBUG)) return @@ -646,7 +646,7 @@ /client/proc/run_weather() - set category = "Admin.Events" + set category = "Event" set name = "Run Weather" set desc = "Triggers a weather on the z-level you choose." @@ -669,7 +669,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Run Weather") /client/proc/mass_zombie_infection() - set category = "Fun" + set category = "Event.Fun" set name = "Mass Zombie Infection" set desc = "Infects all humans with a latent organ that will zombify \ them on death." @@ -690,7 +690,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Mass Zombie Infection") /client/proc/mass_zombie_cure() - set category = "Fun" + set category = "Event.Fun" set name = "Mass Zombie Cure" set desc = "Removes the zombie infection from all humans, returning them to normal." if(!check_rights(R_ADMIN)) @@ -708,7 +708,7 @@ SSblackbox.record_feedback("tally", "admin_verb", 1, "Mass Zombie Cure") /client/proc/polymorph_all() - set category = "Fun" + set category = "Event.Fun" set name = "Polymorph All" set desc = "Applies the effects of the bolt of change to every single mob." @@ -819,7 +819,7 @@ /client/proc/spawn_ruin() set name = "Spawn Planet/Ruin" - set category = "Fun" + set category = "Event.Spawning" if(!check_rights(R_ADMIN) || !check_rights(R_SPAWN)) return @@ -880,7 +880,7 @@ /client/proc/smite(mob/living/target as mob) set name = "Smite" - set category = "Fun" + set category = "Event.Fun" if(!check_rights(R_ADMIN) || !check_rights(R_FUN)) return @@ -1068,8 +1068,8 @@ REMOVE_TRAIT(D,chosen_trait,source) /datum/admins/proc/gift(mob/living/carbon/human/target as mob, object as text) - set name = "Gift" - set category = "Fun" + set name = "Gift a mob" + set category = "Event.Spawning" set desc = "Give a mob an item directly." if(!check_rights(R_ADMIN) || !check_rights(R_FUN)) return diff --git a/code/modules/admin/verbs/selectequipment.dm b/code/modules/admin/verbs/selectequipment.dm index 9bc6ab3dcea9..03a560d5e712 100644 --- a/code/modules/admin/verbs/selectequipment.dm +++ b/code/modules/admin/verbs/selectequipment.dm @@ -1,5 +1,5 @@ /client/proc/cmd_select_equipment(mob/target in GLOB.mob_list) - set category = "Admin.Events" + set category = "Event" set name = "Select equipment" diff --git a/code/modules/admin/verbs/shuttlepanel.dm b/code/modules/admin/verbs/shuttlepanel.dm index b4e374f41cb8..bb3bd11b7f42 100644 --- a/code/modules/admin/verbs/shuttlepanel.dm +++ b/code/modules/admin/verbs/shuttlepanel.dm @@ -1,5 +1,5 @@ /datum/admins/proc/open_shuttlepanel() - set category = "Admin.Events" + set category = "Event" set name = "Shuttle Manipulator" set desc = "Opens the shuttle manipulator UI." @@ -8,7 +8,6 @@ SSshuttle.ui_interact(usr) - /obj/docking_port/mobile/proc/admin_fly_shuttle(mob/user) var/list/options = list() diff --git a/code/modules/admin/verbs/spawnobjasmob.dm b/code/modules/admin/verbs/spawnobjasmob.dm index f840516d49f1..e787ecfde664 100644 --- a/code/modules/admin/verbs/spawnobjasmob.dm +++ b/code/modules/admin/verbs/spawnobjasmob.dm @@ -1,7 +1,7 @@ /datum/admins/proc/spawn_objasmob(object as text) - set category = "Debug" - set desc = "(obj path) Spawn object-mob" - set name = "Spawn object-mob" + set category = "Event.Spawning" + set desc = "(obj path) Spawn object-mob from Object" + set name = "Spawn Living Mob" if(!check_rights(R_SPAWN)) return diff --git a/code/modules/buildmode/buildmode.dm b/code/modules/buildmode/buildmode.dm index 81c46eebd10c..d85929daa0a8 100644 --- a/code/modules/buildmode/buildmode.dm +++ b/code/modules/buildmode/buildmode.dm @@ -182,9 +182,6 @@ return TRUE // no doing underlying actions /proc/togglebuildmode(mob/M as mob in GLOB.player_list) - set name = "Toggle Build Mode" - set category = "Event" - if(M.client) if(istype(M.client.click_intercept,/datum/buildmode)) var/datum/buildmode/B = M.client.click_intercept diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index 61e416e9d4f1..dfec659e1644 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -19,7 +19,7 @@ /client/proc/centcom_podlauncher() //Creates a verb for admins to open up the ui set name = "Config/Launch Supplypod" set desc = "Configure and launch a CentCom supplypod full of whatever your heart desires!" - set category = "Admin.Events" + set category = "Event" new /datum/centcom_podlauncher(usr)//create the datum //Variables declared to change how items in the launch bay are picked and launched. (Almost) all of these are changed in the ui_act proc diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm index b12e7cdf3d00..b40e1702652e 100644 --- a/code/modules/client/preferences_toggles.dm +++ b/code/modules/client/preferences_toggles.dm @@ -443,7 +443,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS //Admin Preferences /client/proc/toggleadminhelpsound() set name = "Hear/Silence Adminhelps" - set category = "Prefs - Admin" + set category = "Preferences.Admin" set desc = "Toggle hearing a notification when admin PMs are received" if(!holder) return @@ -454,7 +454,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS /client/proc/toggleannouncelogin() set name = "Do/Don't Announce Login" - set category = "Prefs - Admin" + set category = "Preferences.Admin" set desc = "Toggle if you want an announcement to admins when you login during a round" if(!holder) return @@ -465,7 +465,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS /client/proc/toggle_hear_radio() set name = "Show/Hide Radio Chatter" - set category = "Prefs - Admin" + set category = "Preferences.Admin" set desc = "Toggle seeing radiochatter from nearby radios and speakers" if(!holder) return @@ -487,7 +487,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS /client/proc/deadchat() set name = "Show/Hide Deadchat" - set category = "Prefs - Admin" + set category = "Preferences.Admin" set desc ="Toggles seeing deadchat" if(!holder) return @@ -498,7 +498,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS /client/proc/toggleprayers() set name = "Show/Hide Prayers" - set category = "Prefs - Admin" + set category = "Preferences.Admin" set desc = "Toggles seeing prayers" if(!holder) return @@ -509,7 +509,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS /client/proc/toggle_prayer_sound() set name = "Hear/Silence Prayer Sounds" - set category = "Prefs - Admin" + set category = "Preferences.Admin" set desc = "Hear Prayer Sounds" if(!holder) return @@ -520,7 +520,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS /client/proc/colorasay() set name = "Set Admin Say Color" - set category = "Prefs - Admin" + set category = "Preferences.Admin" set desc = "Set the color of your ASAY messages" if(!holder) return @@ -537,7 +537,7 @@ GLOBAL_LIST_INIT(ghost_orbits, list(GHOST_ORBIT_CIRCLE,GHOST_ORBIT_TRIANGLE,GHOS /client/proc/resetasaycolor() set name = "Reset your Admin Say Color" set desc = "Returns your ASAY Color to default" - set category = "Prefs - Admin" + set category = "Preferences.Admin" if(!holder) return if(!CONFIG_GET(flag/allow_admin_asaycolor)) diff --git a/code/modules/donator/_donator.dm b/code/modules/donator/_donator.dm index b18dbe8f78b3..dd4df369cfea 100644 --- a/code/modules/donator/_donator.dm +++ b/code/modules/donator/_donator.dm @@ -23,7 +23,7 @@ GLOBAL_PROTECT(donators) /client/proc/do_donator_redemption() set name = "Redeem Donator Reward" - set category = "Donator" + set category = "OOC.Donator" set desc = "Redeem a reward" var/mob/client_mob = mob @@ -38,7 +38,7 @@ GLOBAL_PROTECT(donators) /client/proc/do_donator_wcir() set name = "What Can I Redeem" - set category = "Donator" + set category = "OOC.Donator" set desc = "Currently available redemptions" donator?.what_can_i_redeem(src.mob) diff --git a/code/modules/mob/dead/crew_manifest.dm b/code/modules/mob/dead/crew_manifest.dm index c7ca52968f86..da742342218c 100644 --- a/code/modules/mob/dead/crew_manifest.dm +++ b/code/modules/mob/dead/crew_manifest.dm @@ -4,7 +4,7 @@ return GLOB.always_state /datum/crew_manifest/ui_status(mob/user, datum/ui_state/state) - return (isnewplayer(user) || isobserver(user) || isAI(user) || ispAI(user)) ? UI_INTERACTIVE : UI_CLOSE + return (ismob(user)) ? UI_INTERACTIVE : UI_CLOSE /datum/crew_manifest/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) From d9fd6fe5d8909da5f6c6cf0ca2bf3499a63b71ba Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 13:40:43 -0500 Subject: [PATCH 69/73] Automatic changelog generation for PR #2956 [ci skip] --- html/changelogs/AutoChangeLog-pr-2956.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-2956.yml diff --git a/html/changelogs/AutoChangeLog-pr-2956.yml b/html/changelogs/AutoChangeLog-pr-2956.yml new file mode 100644 index 000000000000..fef27d633f99 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-2956.yml @@ -0,0 +1,5 @@ +author: FalloutFalcon +changes: + - {admin: 'Improved the silly little menu, HA HA I have messed up your muscle memory!! + u'} +delete-after: true From e188a2f3d601d05bc630f2c00ed6735c52dab924 Mon Sep 17 00:00:00 2001 From: Sun-Soaked <45698967+Sun-Soaked@users.noreply.github.com> Date: Sun, 2 Jun 2024 14:16:34 -0400 Subject: [PATCH 70/73] Ports a super small TG signal optimization (#3053) ## About The Pull Request Extremely tiny [port (tg pr #83244)](https://github.com/tgstation/tgstation/pull/83244) that allegedly has positive performance implications for signals ## Why It's Good For The Game ![image](https://github.com/shiptest-ss13/Shiptest/assets/45698967/1389fd50-5d25-4a88-9f44-a706cfd3ee68) ![image](https://github.com/shiptest-ss13/Shiptest/assets/45698967/660c44c5-4f40-4d6c-9f7f-2d21cbaa12ca) ## Changelog :cl: [Watermelon914](https://github.com/Watermelon914) code: ports little itty bitty sendsignal optimization from tg /:cl: --- code/datums/components/_component.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/code/datums/components/_component.dm b/code/datums/components/_component.dm index 1d16391a18e1..d76504787b04 100644 --- a/code/datums/components/_component.dm +++ b/code/datums/components/_component.dm @@ -321,10 +321,12 @@ // all the objects that are receiving the signal get the signal this final time. // AKA: No you can't cancel the signal reception of another object by doing an unregister in the same signal. var/list/queued_calls = list() - for(var/datum/listening_datum as anything in target) - queued_calls[listening_datum] = listening_datum.signal_procs[src][sigtype] - for(var/datum/listening_datum as anything in queued_calls) - . |= call(listening_datum, queued_calls[listening_datum])(arglist(arguments)) + // This should be faster than doing `var/datum/listening_datum as anything in target` as it does not implicitly copy the list + for(var/i in 1 to length(target)) + var/datum/listening_datum = target[i] + queued_calls.Add(listening_datum, listening_datum.signal_procs[src][sigtype]) + for(var/i in 1 to length(queued_calls) step 2) + . |= call(queued_calls[i], queued_calls[i + 1])(arglist(arguments)) // The type arg is casted so initial works, you shouldn't be passing a real instance into this /** From 191eefef6a7f9a33c2ba2200ae2be598da970e89 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 13:54:15 -0500 Subject: [PATCH 71/73] Automatic changelog generation for PR #3053 [ci skip] --- html/changelogs/AutoChangeLog-pr-3053.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3053.yml diff --git a/html/changelogs/AutoChangeLog-pr-3053.yml b/html/changelogs/AutoChangeLog-pr-3053.yml new file mode 100644 index 000000000000..4e3d1038ec11 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3053.yml @@ -0,0 +1,4 @@ +author: '[Watermelon914](https://github.com/Watermelon914)' +changes: + - {code_imp: ports little itty bitty sendsignal optimization from tg} +delete-after: true From e308fac6373d802dad98a4279e35b81998664c98 Mon Sep 17 00:00:00 2001 From: Sun-Soaked <45698967+Sun-Soaked@users.noreply.github.com> Date: Sun, 2 Jun 2024 17:12:11 -0400 Subject: [PATCH 72/73] Removes sexy clown & mime costumes from costume spawners (#3064) ## About The Pull Request How were these still spawnable Someone should do a bigger clown removal at some point ## Why It's Good For The Game Die ## Changelog :cl: del: Removes sexy clown costumes from spawners /:cl: --- code/game/objects/effects/spawners/bundle.dm | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/code/game/objects/effects/spawners/bundle.dm b/code/game/objects/effects/spawners/bundle.dm index 19e7b1c957fa..edab392613f3 100644 --- a/code/game/objects/effects/spawners/bundle.dm +++ b/code/game/objects/effects/spawners/bundle.dm @@ -141,18 +141,6 @@ /obj/item/clothing/head/wizard/fake, /obj/item/staff) -/obj/effect/spawner/bundle/costume/sexyclown - name = "sexy clown costume spawner" - items = list( - /obj/item/clothing/mask/gas/sexyclown, - /obj/item/clothing/under/rank/civilian/clown/sexy) - -/obj/effect/spawner/bundle/costume/sexymime - name = "sexy mime costume spawner" - items = list( - /obj/item/clothing/mask/gas/sexymime, - /obj/item/clothing/under/rank/civilian/mime/sexy) - /obj/effect/spawner/bundle/costume/mafia name = "black mafia outfit spawner" items = list( From 96d784f346092b3444a0877366747ac2b0157f0a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Sun, 2 Jun 2024 16:23:17 -0500 Subject: [PATCH 73/73] Automatic changelog generation for PR #3064 [ci skip] --- html/changelogs/AutoChangeLog-pr-3064.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3064.yml diff --git a/html/changelogs/AutoChangeLog-pr-3064.yml b/html/changelogs/AutoChangeLog-pr-3064.yml new file mode 100644 index 000000000000..a9d30099f54b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3064.yml @@ -0,0 +1,4 @@ +author: Sun-Soaked +changes: + - {rscdel: Removes sexy clown costumes from spawners} +delete-after: true