From 57938e7b1570b8c9264e585c86941e8659ca1012 Mon Sep 17 00:00:00 2001 From: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Tue, 20 Apr 2021 19:36:30 +0200 Subject: [PATCH 01/30] Adds the Recipe 2 Ash 1 Lizard Wine 1 Vitrium Froth --- code/modules/food_and_drinks/recipes/drinks_recipes.dm | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 972f9a8cc3..4e07424159 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -604,6 +604,14 @@ mix_message = "You hear faint sounds of gears turning as it mixes." mix_sound = 'sound/machines/clockcult/steam_whoosh.ogg' +/datum/chemical_reaction/pinotmort + name = "Pinot Mort" + id = /datum/reagent/consumable/ethanol/pinotmort + results = list(/datum/reagent/consumable/ethanol/pinotmort = 3) + required_reagents = list(/datum/reagent/ash = 2, /datum/reagent/consumable/ethanol/lizardwine = 1, /datum/reagent/consumable/vitfro = 1) + mix_message = "You hear an undescribable scream as it mixes... You're not sure how to feel about this." + mix_sound = 'sound/effects/tendril_destroyed.ogg' + /datum/chemical_reaction/quadruplesec name = "Quadruple Sec" id = /datum/reagent/consumable/ethanol/quadruple_sec From c25c502b355f93d7f4a9401de599a109a76363fb Mon Sep 17 00:00:00 2001 From: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Tue, 20 Apr 2021 19:39:40 +0200 Subject: [PATCH 02/30] The taste of Lavaland for you. It's really not that great. --- .../chemistry/reagents/alcohol_reagents.dm | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index aae21464b1..af331a2d87 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -1490,6 +1490,25 @@ All effects don't start immediately, but rather get worse over time; the rate is M.stuttering = min(M.stuttering + 3, 3) ..() +/datum/reagent/consumable/ethanol/pinotmort + name = "Pinot Mort" + description = "If you just can't get enough of lavaland." + color = rgb(167, 36, 36) + boozepwr = 20 + quality = DRINK_FANTASTIC + taste_description = "death, lizards and bubblegum" + glass_icon_state = "pinotmort" + glass_name = "Pinot Mort" + glass_desc = "The taste of lavaland in a small cup. A drink best served hot. You feel like you might regret drinking this." + value = REAGENT_VALUE_UNCOMMON + +/datum/reagent/consumable/ethanol/pinotmort/on_mob_life(mob/living/carbon/M) + if((islizard(M) && M.mind.assigned_role == "Ash Walker") || ispodperson(M) && M.mind.assigned_role == "Lifebringer" || isgolem(M)) + M.heal_bodypart_damage(1, 1) + M.adjustBruteLoss(-2,0) + . = 1 + return ..() + /datum/reagent/consumable/ethanol/triple_sec name = "Triple Sec" description = "A sweet and vibrant orange liqueur." From bbd8086f7b3280a5323e606e4fe5b196c0960018 Mon Sep 17 00:00:00 2001 From: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Wed, 21 Apr 2021 14:53:35 +0200 Subject: [PATCH 03/30] Updated description to fit more with the icon --- code/modules/reagents/chemistry/reagents/alcohol_reagents.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index af331a2d87..f53ac7ac40 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -1496,10 +1496,10 @@ All effects don't start immediately, but rather get worse over time; the rate is color = rgb(167, 36, 36) boozepwr = 20 quality = DRINK_FANTASTIC - taste_description = "death, lizards and bubblegum" + taste_description = "death, ash and lizards" glass_icon_state = "pinotmort" glass_name = "Pinot Mort" - glass_desc = "The taste of lavaland in a small cup. A drink best served hot. You feel like you might regret drinking this." + glass_desc = "The taste of Lavaland served in a legion skull. You feel like you might regret drinking this." value = REAGENT_VALUE_UNCOMMON /datum/reagent/consumable/ethanol/pinotmort/on_mob_life(mob/living/carbon/M) From b8292f7f56c19684a03f10ca9092b9ec68e67a2a Mon Sep 17 00:00:00 2001 From: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Wed, 21 Apr 2021 15:15:07 +0200 Subject: [PATCH 04/30] Small adjustment to quantity Oops, it only made 3 instead of 4 --- code/modules/food_and_drinks/recipes/drinks_recipes.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm index 4e07424159..943f421a64 100644 --- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm +++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm @@ -607,7 +607,7 @@ /datum/chemical_reaction/pinotmort name = "Pinot Mort" id = /datum/reagent/consumable/ethanol/pinotmort - results = list(/datum/reagent/consumable/ethanol/pinotmort = 3) + results = list(/datum/reagent/consumable/ethanol/pinotmort = 4) required_reagents = list(/datum/reagent/ash = 2, /datum/reagent/consumable/ethanol/lizardwine = 1, /datum/reagent/consumable/vitfro = 1) mix_message = "You hear an undescribable scream as it mixes... You're not sure how to feel about this." mix_sound = 'sound/effects/tendril_destroyed.ogg' From 5a7a4d39edcbf12fbd4233ed3f83e57cc4012f61 Mon Sep 17 00:00:00 2001 From: WanderingFox95 <75953558+WanderingFox95@users.noreply.github.com> Date: Wed, 21 Apr 2021 15:20:09 +0200 Subject: [PATCH 05/30] Actually adds the icon, too. Totally forgot to upload it. --- icons/obj/drinks.dmi | Bin 116299 -> 117952 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 1b28b910c1d5bcf496b663291d1432528e61e54b..1c3b10b9decf52895e4920824b1ab1ee6fbe97cd 100644 GIT binary patch delta 21966 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 C!dYqn delta 20207 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 Date: Sat, 24 Apr 2021 11:36:13 +0200 Subject: [PATCH 06/30] Cleaning up something annoying --- code/modules/mob/living/simple_animal/parrot.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index f7e586763b..d146bb855f 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -64,7 +64,7 @@ friendly_verb_simple = "groom" mob_size = MOB_SIZE_SMALL movement_type = FLYING - gold_core_spawnable = HOSTILE_SPAWN + gold_core_spawnable = FRIENDLY_SPAWN var/parrot_damage_upper = 10 var/parrot_state = PARROT_WANDER //Hunt for a perch when created From 181dcc347be0cfe7831cffdc5ccc36ec297ad196 Mon Sep 17 00:00:00 2001 From: zerothebigboy Date: Sun, 9 May 2021 04:34:25 -0400 Subject: [PATCH 07/30] cum sex balls penis --- .../new_player/sprite_accessories/ears.dm | 12 ++++++++++++ modular_citadel/icons/mob/mam_ears.dmi | Bin 10453 -> 10684 bytes 2 files changed, 12 insertions(+) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm index e09a0386ee..8fb735e10a 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm @@ -67,6 +67,13 @@ matrixed_sections = MATRIX_RED_GREEN icon = 'modular_citadel/icons/mob/mam_ears.dmi' +/datum/sprite_accessory/ears/bunnyalt + name = "Bunny (Vegas)" + icon_state = "bunnyalt" + color_src = MATRIXED + matrixed_sections = MATRIX_RED_GREEN + icon = 'modular_citadel/icons/mob/mam_ears.dmi' + /datum/sprite_accessory/ears/cat name = "Cat" icon_state = "cat" @@ -258,6 +265,11 @@ icon_state = "bunny" matrixed_sections = MATRIX_RED_GREEN +/datum/sprite_accessory/ears/mam_ears/bunnyalt + name = "Bunny (Vegas)" + icon_state = "bunnyalt" + matrixed_sections = MATRIX_RED_GREEN + /datum/sprite_accessory/ears/mam_ears/cat name = "Cat" icon_state = "cat" diff --git a/modular_citadel/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi index a3f09819f25890acbcc3d9dc2bff60b154efed80..7848e3c2febe9c68b506fb1b464d50f1306ae5ba 100644 GIT binary patch literal 10684 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 From 389617ac2f4dcb45652f9453005b958b38d5ab1c Mon Sep 17 00:00:00 2001 From: zerothebigboy Date: Sun, 9 May 2021 05:01:07 -0400 Subject: [PATCH 08/30] this looks marginally better --- modular_citadel/icons/mob/mam_ears.dmi | Bin 10684 -> 10745 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/modular_citadel/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi index 7848e3c2febe9c68b506fb1b464d50f1306ae5ba..352eb6a1e81aa5825385f431b1fcc767e73d18c4 100644 GIT binary patch delta 8798 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 F{~x9AL}ma0 delta 8747 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 From fe96caefdc373c03912e5fea0ffdd442d4d69157 Mon Sep 17 00:00:00 2001 From: zerothebigboy Date: Sun, 9 May 2021 19:15:31 -0400 Subject: [PATCH 09/30] this is layered correctly --- modular_citadel/icons/mob/mam_ears.dmi | Bin 10745 -> 10751 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/modular_citadel/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi index 352eb6a1e81aa5825385f431b1fcc767e73d18c4..1ed3d8fbbe98dd3808dc6a5e0e86c1e08812b38c 100644 GIT binary patch literal 10751 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 literal 10745 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 Ys-Sqx^wDua5b(HWYzZqfy!GHe0Bjl^EC2ui From 8c0911e9689edb439f5bfef2889452fc53e5b7f0 Mon Sep 17 00:00:00 2001 From: qweq12yt <45515587+qweq12yt@users.noreply.github.com> Date: Mon, 10 May 2021 15:56:50 -0300 Subject: [PATCH 10/30] fix hulks breaking cuffs/zipties --- code/modules/mob/living/carbon/carbon.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6f5109c90b..c1110af267 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -370,7 +370,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, 0, target = src, required_mobility_flags = MOBILITY_RESIST)) clear_cuffs(I, cuff_break) else to_chat(src, "You fail to break [I]!") From 3b234405c89318a070169fd3259dba06345c1299 Mon Sep 17 00:00:00 2001 From: qweq12yt <45515587+qweq12yt@users.noreply.github.com> Date: Mon, 10 May 2021 16:06:57 -0300 Subject: [PATCH 11/30] fixed disky comfort spam --- code/modules/antagonists/nukeop/equipment/nuclearbomb.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index 7d669e5c41..eb98635e65 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -633,7 +633,7 @@ This is here to make the tiles around the station mininuke change when it's arme AddComponent(/datum/component/stationloving, !fake) /obj/item/disk/nuclear/process() - ++process_tick + process_tick++ if(fake) STOP_PROCESSING(SSobj, src) CRASH("A fake nuke disk tried to call process(). Who the fuck and how the fuck") @@ -650,7 +650,7 @@ This is here to make the tiles around the station mininuke change when it's arme disk_comfort_level++ if(disk_comfort_level >= 2) //Sleep tight, disky. - if(process_tick % 30) + if(!(process_tick % 30)) visible_message("[src] sleeps soundly. Sleep tight, disky.") if(last_disk_move < world.time - 5000 && prob((world.time - 5000 - last_disk_move)*0.0001)) var/datum/round_event_control/operative/loneop = locate(/datum/round_event_control/operative) in SSevents.control From 59914250c3493da3b361bd1fdd4b8e422f3e18f0 Mon Sep 17 00:00:00 2001 From: Lin Date: Mon, 10 May 2021 17:04:48 -0500 Subject: [PATCH 12/30] spellcheck --- code/modules/mob/living/carbon/human/species_types/bugmen.dm | 2 +- .../mob/living/carbon/human/species_types/flypeople.dm | 2 +- .../mob/living/carbon/human/species_types/lizardpeople.dm | 2 +- .../mob/living/carbon/human/species_types/mushpeople.dm | 2 +- .../mob/living/carbon/human/species_types/podpeople.dm | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm index 773651d464..c649339fe3 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -1,5 +1,5 @@ /datum/species/insect - name = "Anthromorphic Insect" + name = "Anthropomorphic Insect" id = SPECIES_INSECT say_mod = "chitters" default_color = "00FF00" 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 c3e406244b..5a185cbeb8 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -1,5 +1,5 @@ /datum/species/fly - name = "Anthromorphic Fly" + name = "Anthropomorphic Fly" id = SPECIES_FLY say_mod = "buzzes" species_traits = list(NOEYES,HAS_FLESH,HAS_BONE) diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 40645b13d4..cfbb8c31c0 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -1,6 +1,6 @@ /datum/species/lizard // Reptilian humanoids with scaled skin and tails. - name = "Anthromorphic Lizard" + name = "Anthropomorphic Lizard" id = SPECIES_LIZARD say_mod = "hisses" default_color = "00FF00" diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index dcbdf91485..0655b28197 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -1,5 +1,5 @@ /datum/species/mush //mush mush codecuck - name = "Anthromorphic Mushroom" + name = "Anthropomorphic Mushroom" id = SPECIES_MUSHROOM mutant_bodyparts = list("caps" = "Round") diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index 697c3db35e..0fcafaa208 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -1,6 +1,6 @@ /datum/species/pod // A mutation caused by a human being ressurected in a revival pod. These regain health in light, and begin to wither in darkness. - name = "Anthromorphic Plant" + name = "Anthropomorphic Plant" id = SPECIES_POD default_color = "59CE00" species_traits = list(MUTCOLORS,EYECOLOR,CAN_SCAR,HAS_FLESH,HAS_BONE) @@ -71,7 +71,7 @@ H.emote("spin") /datum/species/pod/pseudo_weak - name = "Anthromorphic Plant" + name = "Anthropomorphic Plant" id = SPECIES_POD_WEAK species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS,CAN_SCAR,HAS_FLESH,HAS_BONE) mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs") From 4609d732f9b213800c99db4425b35a9976e9120e Mon Sep 17 00:00:00 2001 From: Linzolle Date: Mon, 10 May 2021 17:15:43 -0500 Subject: [PATCH 13/30] more spellcheck of anthropomorph --- .../human/species_types/{anthromorph.dm => anthropomorph.dm} | 4 ++-- tgstation.dme | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename code/modules/mob/living/carbon/human/species_types/{anthromorph.dm => anthropomorph.dm} (97%) diff --git a/code/modules/mob/living/carbon/human/species_types/anthromorph.dm b/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm similarity index 97% rename from code/modules/mob/living/carbon/human/species_types/anthromorph.dm rename to code/modules/mob/living/carbon/human/species_types/anthropomorph.dm index d718db818c..328a557931 100644 --- a/code/modules/mob/living/carbon/human/species_types/anthromorph.dm +++ b/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm @@ -1,5 +1,5 @@ /datum/species/mammal - name = "Anthromorph" + name = "Anthropomorph" id = SPECIES_MAMMAL default_color = "4B4B4B" species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE) @@ -20,7 +20,7 @@ allowed_limb_ids = list("mammal","aquatic","avian") /datum/species/mammal/synthetic - name = "Synthetic Anthromorph" + name = "Synthetic Anthropomorph" id = SPECIES_MAMMAL_SYNTHETIC species_traits = list(MUTCOLORS,NOTRANSSTING,EYECOLOR,LIPS,HAIR,ROBOTIC_LIMBS,HAS_FLESH,HAS_BONE,WINGCOLOR,HORNCOLOR) diff --git a/tgstation.dme b/tgstation.dme index 017bd393e7..be1fddaee2 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -2625,7 +2625,7 @@ #include "code\modules\mob\living\carbon\human\species_types\abductor.dm" #include "code\modules\mob\living\carbon\human\species_types\android.dm" #include "code\modules\mob\living\carbon\human\species_types\angel.dm" -#include "code\modules\mob\living\carbon\human\species_types\anthromorph.dm" +#include "code\modules\mob\living\carbon\human\species_types\anthropomorph.dm" #include "code\modules\mob\living\carbon\human\species_types\arachnid.dm" #include "code\modules\mob\living\carbon\human\species_types\bugmen.dm" #include "code\modules\mob\living\carbon\human\species_types\corporate.dm" From e7107af0a409c7a7b02414c8b799d9d3a435c2dc Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 12 May 2021 00:18:48 +0000 Subject: [PATCH 14/30] Automatic changelog compile [ci skip] --- html/changelog.html | 17 +++++++---------- html/changelogs/.all_changelog.yml | 7 +++++++ html/changelogs/AutoChangeLog-pr-14706.yml | 7 ------- 3 files changed, 14 insertions(+), 17 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-14706.yml diff --git a/html/changelog.html b/html/changelog.html index 61681621e7..b6b794f5ec 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,13 @@ -->
+

12 May 2021

+

DeltaFire15 updated:

+
    +
  • find_safe_turf no longer always fails on safe oxygen levels(??)
  • +
  • Heretic bladeshatters now actually take the heretic's z into account as intended, instead of always being station z tweak: Message for failing the bladeshatter despite succeeding the do_after tweak: Improves bladeshatter a bit by making it safer codewise
  • +
+

11 May 2021

LetterN updated:

    @@ -761,16 +768,6 @@
    • Adds Periods and moves some words around.
    - -

    10 March 2021

    -

    Hatterhat updated:

    -
      -
    • The femur breaker now actually breaks legs by applying a compound fracture.
    • -
    -

    Putnam3145 updated:

    -
      -
    • uncapped TEG power, buffing high-temp TEGs
    • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index ae29db429c..768a1cfda6 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -29276,3 +29276,10 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. bunny232: - rscadd: Delta station xenobiology department has received enhanced scrubbing and ventilation capabilities similar to box and meta +2021-05-12: + DeltaFire15: + - bugfix: find_safe_turf no longer always fails on safe oxygen levels(??) + - bugfix: 'Heretic bladeshatters now actually take the heretic''s z into account + as intended, instead of always being station z tweak: Message for failing the + bladeshatter despite succeeding the do_after tweak: Improves bladeshatter a + bit by making it safer codewise' diff --git a/html/changelogs/AutoChangeLog-pr-14706.yml b/html/changelogs/AutoChangeLog-pr-14706.yml deleted file mode 100644 index ecea6647ec..0000000000 --- a/html/changelogs/AutoChangeLog-pr-14706.yml +++ /dev/null @@ -1,7 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - bugfix: "find_safe_turf no longer always fails on safe oxygen levels(??)" - - bugfix: "Heretic bladeshatters now actually take the heretic's z into account as intended, instead of always being station z -tweak: Message for failing the bladeshatter despite succeeding the do_after -tweak: Improves bladeshatter a bit by making it safer codewise" From f5c4d9adf28f090e3673d41e880b30029f01561b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 12 May 2021 05:42:14 -0500 Subject: [PATCH 15/30] Automatic changelog generation for PR #14702 [ci skip] --- html/changelogs/AutoChangeLog-pr-14702.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-14702.yml diff --git a/html/changelogs/AutoChangeLog-pr-14702.yml b/html/changelogs/AutoChangeLog-pr-14702.yml new file mode 100644 index 0000000000..134122e668 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14702.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - rscadd: "vegas style bunny ears" From 72667c6485be56e597de9994bd424c7870a44c27 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 12 May 2021 05:42:25 -0500 Subject: [PATCH 16/30] Automatic changelog generation for PR #14708 [ci skip] --- html/changelogs/AutoChangeLog-pr-14708.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-14708.yml diff --git a/html/changelogs/AutoChangeLog-pr-14708.yml b/html/changelogs/AutoChangeLog-pr-14708.yml new file mode 100644 index 0000000000..b0b9e25b1f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14708.yml @@ -0,0 +1,5 @@ +author: "qweq12yt" +delete-after: True +changes: + - bugfix: "Fixed sleeping disky spam (it still sleeps soundly, but every minute instead of every two seconds)" + - bugfix: "Fixed Hulks not breaking cuffs, zipties, restraints." From 2b8fd131e00b7c936c1f754094c27900d22bede0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 12 May 2021 05:42:30 -0500 Subject: [PATCH 17/30] Automatic changelog generation for PR #14710 [ci skip] --- html/changelogs/AutoChangeLog-pr-14710.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-14710.yml diff --git a/html/changelogs/AutoChangeLog-pr-14710.yml b/html/changelogs/AutoChangeLog-pr-14710.yml new file mode 100644 index 0000000000..90dbe0cdac --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14710.yml @@ -0,0 +1,4 @@ +author: "Linzolle" +delete-after: True +changes: + - spellcheck: "anthromorphic -> anthropomorphic" From 5eb1f38f5efcb840cc9c4c3f89aa9a25589dd278 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 12 May 2021 05:43:13 -0500 Subject: [PATCH 18/30] Automatic changelog generation for PR #14650 [ci skip] --- html/changelogs/AutoChangeLog-pr-14650.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-14650.yml diff --git a/html/changelogs/AutoChangeLog-pr-14650.yml b/html/changelogs/AutoChangeLog-pr-14650.yml new file mode 100644 index 0000000000..0432473299 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14650.yml @@ -0,0 +1,4 @@ +author: "WanderingFox95" +delete-after: True +changes: + - rscadd: "Pinot Mort (Necropolis Wine), a new, (totally healthy) mixed drink!" From 5601badbffe0bdd32926a5c47b40c10425d27fc8 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Wed, 12 May 2021 04:44:53 -0600 Subject: [PATCH 19/30] deterministic explosion system (#13392) * wae explosions * okay * changes * fixes * fix * ok * ok * kills more dead code * okay * fix * ok * tiles * ok * okay * woops * ok * fix * okay * mob damage * fixes * insanity * more * more * fixes * more * woot * don't commit that * YES * fix --- code/__DEFINES/dcs/signals.dm | 2 + code/__DEFINES/explosion.dm | 86 ++++ code/__DEFINES/subsystems.dm | 2 +- code/controllers/subsystem/explosions.dm | 23 ++ code/datums/explosion2.dm | 378 ++++++++++++++++++ code/game/atoms.dm | 37 +- code/game/machinery/_machinery.dm | 4 + code/game/machinery/doors/airlock.dm | 2 + code/game/machinery/doors/door.dm | 10 + code/game/machinery/doors/passworddoor.dm | 3 + code/game/machinery/doors/poddoor.dm | 2 + code/game/machinery/doors/windowdoor.dm | 2 + code/game/machinery/doppler_array.dm | 38 ++ .../objects/effects/decals/cleanable/misc.dm | 12 + code/game/objects/items.dm | 8 + code/game/objects/obj_defense.dm | 13 + code/game/objects/structures/window.dm | 15 + code/game/turfs/closed.dm | 3 + code/game/turfs/simulated/floor.dm | 55 +++ code/game/turfs/simulated/wall/reinf_walls.dm | 5 + code/game/turfs/simulated/walls.dm | 17 + code/game/turfs/space/space.dm | 2 + code/game/turfs/turf.dm | 18 + code/modules/admin/admin_verbs.dm | 46 +++ code/modules/antagonists/revenant/revenant.dm | 3 + code/modules/holiday/halloween/halloween.dm | 3 + code/modules/mob/living/bloodcrawl.dm | 4 + code/modules/mob/living/brain/brain.dm | 3 + code/modules/mob/living/living_defense.dm | 6 + .../living/simple_animal/guardian/guardian.dm | 3 + .../hostile/megafauna/megafauna.dm | 3 + .../hostile/mining_mobs/basilisk.dm | 7 + .../spells/spell_types/ethereal_jaunt.dm | 3 + .../modules/spells/spell_types/shadow_walk.dm | 3 + tgstation.dme | 3 + 35 files changed, 822 insertions(+), 2 deletions(-) create mode 100644 code/__DEFINES/explosion.dm create mode 100644 code/controllers/subsystem/explosions.dm create mode 100644 code/datums/explosion2.dm diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 88f9759940..5e36abac15 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -83,6 +83,8 @@ #define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc) #define COMPONENT_ATOM_BLOCK_EXIT 1 #define COMSIG_ATOM_EXITED "atom_exited" //from base of atom/Exited(): (atom/movable/exiting, atom/newloc) +/// From base of atom/wave_ex_act(): (datum/wave_explosion/explosion, args) +#define COMSIG_ATOM_WAVE_EX_ACT "atom_wave_ex_act" ///from base of atom/ex_act(): (severity, target) #define COMSIG_ATOM_EX_ACT "atom_ex_act" ///from base of atom/emp_act(): (severity) diff --git a/code/__DEFINES/explosion.dm b/code/__DEFINES/explosion.dm new file mode 100644 index 0000000000..adba852ff1 --- /dev/null +++ b/code/__DEFINES/explosion.dm @@ -0,0 +1,86 @@ +// THIS IS INSANITY +// These are how wave explosions track when there's not only one direction to keep track of (diagonals, etc) +#define WEX_DIR_NORTH NORTH +#define WEX_DIR_SOUTH SOUTH +#define WEX_DIR_EAST EAST +#define WEX_DIR_WEST WEST +#define WEX_ALLDIRS (WEX_DIR_NORTH | WEX_DIR_SOUTH | WEX_DIR_EAST | WEX_DIR_WEST) + +/// Default explosion power to consider an explosion over +#define EXPLOSION_POWER_DEAD 2.5 +/// Default explosion falloff +#define EXPLOSION_DEFAULT_FALLOFF_MULTIPLY 0.98 +/// Default explosion constant falloff +#define EXPLOSION_DEFAULT_FALLOFF_SUBTRACT 5 +/// Block amount at which point having 0 block resistance will result in a full block +#define EXPLOSION_POWER_NO_RESIST_THRESHOLD 5 + +/// Explosion power quantization +#define EXPLOSION_POWER_QUANTIZATION_ACCURACY 0.1 + +// [explosion_flags] variable on /atom +/// No blocking if we're not dense +#define EXPLOSION_FLAG_DENSITY_DEPENDENT (1<<0) +/// If we survive the explosion, we block ALL the power and ignore the results of wave_ex_act(). +#define EXPLOSION_FLAG_HARD_OBSTACLE (1<<1) + +// Standardized explosion powers +/// Maxcap +#define EXPLOSION_POWER_MAXCAP 500 +/// erases shreds from explosions/item damage +#define EXPLOSION_POWER_ERASE_SHREDS 400 +/// Gibs most mobs +#define EXPLOSION_POWER_NORMAL_MOB_GIB 400 + +// Walls +#define EXPLOSION_POWER_WALL_SCRAPE 400 +#define EXPLOSION_POWER_WALL_DISMANTLE 300 +#define EXPLOSION_POWER_WALL_MINIMUM_DISMANTLE 200 + +#define EXPLOSION_POWER_RWALL_SCRAPE 450 +#define EXPLOSION_POWER_RWALL_DISMANTLE 400 +#define EXPLOSION_POWER_RWALL_MINIMUM_DISMANTLE 300 + +// Floors +#define EXPLOSION_POWER_FLOOR_TILE_BREAK 50 +#define EXPLOSION_POWER_FLOOR_MINIMUM_TURF_BREAK 125 +#define EXPLOSION_POWER_FLOOR_TURF_BREAK_BONUS 225 +#define EXPLOSION_POWER_FLOOR_TURF_BREAK 350 +#define EXPLOSION_POWER_FLOOR_TURF_SCRAPE 425 +#define EXPLOSION_POWER_FLOOR_SHIELDED_IMMUNITY 250 + +// Helpers +/// Explosion power to object damage (without taking into consideration armor) +#define EXPLOSION_POWER_STANDARD_SCALE_OBJECT_DAMAGE(power, multiplier) (power>500)?(10*(power**0.6)*multiplier):(0.1*(power**1.3)*multiplier) +/// Explosion power to object damage for hard obstacles +#define EXPLOSION_POWER_STANDARD_SCALE_HARD_OBSTACLE_DAMAGE(power, multiplier) (power>500)?(10*(power**0.6)*multiplier):(0.15*(power**1.3)*multiplier) +/// Explosion power to object damage for windows +#define EXPLOSION_POWER_STANDARD_SCALE_WINDOW_DAMAGE(power, multiplier) (power>500)?(10*(power**0.6)*multiplier):(0.2*(power**1.3)*multiplier) +/// Default brute damage to do to living things +#define EXPLOSION_POWER_STANDARD_SCALE_MOB_DAMAGE(power, multiplier) ((power / 2) * multiplier) + +// Damage factors +/// Factor to multiply damage to a door by if it's open (and therefore not blocking the explosion) +#define EXPLOSION_DAMAGE_OPEN_DOOR_FACTOR 0.25 + +// Standardized explosion constant blocks +#define EXPLOSION_BLOCK_WINDOW 10 +#define EXPLOSION_BLOCK_MACHINE 20 +#define EXPLOSION_BLOCK_SPACE 20 +#define EXPLOSION_BLOCK_REINFORCED_WINDOW 50 +#define EXPLOSION_BLOCK_DENSE_FILLER 50 +#define EXPLOSION_BLOCK_WALL 75 +#define EXPLOSION_BLOCK_BLAST_PROOF 250 +#define EXPLOSION_BLOCK_BOROSILICATE_WINDOW 250 +#define EXPLOSION_BLOCK_EXTREME 250 + +// Standardized explosion factor blocks +#define EXPLOSION_DAMPEN_MACHINE 0.95 +#define EXPLOSION_DAMPEN_SPACE 0.95 +#define EXPLOSION_DAMPEN_WINDOW 0.95 +#define EXPLOSION_DAMPEN_REINFORCED_WINDOW 0.9 +#define EXPLOSION_DAMPEN_DENSE_FILLER 0.85 +#define EXPLOSION_DAMPEN_WALL 0.8 +#define EXPLOSION_DAMPEN_BOROSILICATE_WINDOW 0.65 +#define EXPLOSION_DAMPEN_BLAST_PROOF 0.65 +#define EXPLOSION_DAMPEN_EXTREME 0.5 diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index deb578464f..2c8001b086 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -180,6 +180,7 @@ #define FIRE_PRIORITY_PROJECTILES 200 #define FIRE_PRIORITY_TICKER 200 #define FIRE_PRIORITY_ATMOS_ADJACENCY 300 +#define FIRE_PRIORITY_EXPLOSIONS 350 #define FIRE_PRIORITY_STATPANEL 390 #define FIRE_PRIORITY_CHAT 400 #define FIRE_PRIORITY_RUNECHAT 410 @@ -219,7 +220,6 @@ A.flags_1 &= ~OVERLAY_QUEUED_1;\ } while(FALSE) - /** Create a new timer and add it to the queue. * Arguments: diff --git a/code/controllers/subsystem/explosions.dm b/code/controllers/subsystem/explosions.dm new file mode 100644 index 0000000000..30a05a7505 --- /dev/null +++ b/code/controllers/subsystem/explosions.dm @@ -0,0 +1,23 @@ +SUBSYSTEM_DEF(explosions) + name = "Explosions" + wait = 1 + flags = SS_TICKER + priority = FIRE_PRIORITY_EXPLOSIONS + var/static/list/datum/wave_explosion/wave_explosions = list() + var/static/list/datum/wave_explosion/active_wave_explosions = list() + var/static/list/datum/wave_explosion/currentrun = list() + +/datum/controller/subsystem/explosions/fire(resumed) + if(!resumed) + currentrun = active_wave_explosions.Copy() + var/datum/wave_explosion/E + var/ran = 0 + while(length(currentrun) && !MC_TICK_CHECK) + ran = 0 + for(var/i in currentrun) + E = i + if(E.tick()) + currentrun -= E + ran++ + if(!ran) + break diff --git a/code/datums/explosion2.dm b/code/datums/explosion2.dm new file mode 100644 index 0000000000..75f65e4b23 --- /dev/null +++ b/code/datums/explosion2.dm @@ -0,0 +1,378 @@ +/// Creates a wave explosion at a certain place +/proc/wave_explosion(turf/target, power, factor = EXPLOSION_DEFAULT_FALLOFF_MULTIPLY, constant = EXPLOSION_DEFAULT_FALLOFF_SUBTRACT, flash = 0, fire = 0, atom/source, speed = 0, + silent = FALSE, bypass_logging = FALSE, block_resistance = 1, start_immediately = TRUE) + if(!istype(target) || (power <= EXPLOSION_POWER_DEAD)) + return + if(!bypass_logging) + var/logstring = "Wave explosion at [COORD(target)]: [power]/[factor]/[constant]/[flash]/[fire]/[speed] initial/factor/constant/flash/fire/speed" + log_game(logstring) + message_admins(logstring) + return new /datum/wave_explosion(target, power, factor, constant, flash, fire, source, speed, silent, start_immediately, block_resistance) + +/** + * New force-blastwave explosion system + */ +/datum/wave_explosion + /// Next unique numerical ID + var/static/next_id = 0 + /// Our unique nuumerical ID + var/id + /// world.time we started at + var/start_time + /// Are we currently running? + var/running = FALSE + /// Are we currently finished? + var/finished = FALSE + /// What atom we originated from, if any + var/atom/source + + /// Explosion power at which point to consider to be a dead expansion + var/power_considered_dead = EXPLOSION_POWER_DEAD + /// Explosion power we were initially at + var/power_initial + /// Base explosion power falloff multiplier (applied first) + var/power_falloff_factor = EXPLOSION_DEFAULT_FALLOFF_MULTIPLY + /// Base explosion power falloff subtract (applied second) + var/power_falloff_constant = EXPLOSION_DEFAULT_FALLOFF_SUBTRACT + /// Flash range + var/flash_range = 0 + /// Fire probability per tile + var/fire_probability = 0 + /// Are we silent/do we make the screenshake/sounds? + var/silent = FALSE + + // Modifications + /// Object damage mod + var/object_damage_mod = 1 + /// Hard obstcales get this mod INSTEAD of object damage mod + var/hard_obstacle_mod = 1 + /// Window shatter mod. Overrides both [hard_obstcale_mod] and [object_damage_mod] + var/window_shatter_mod = 1 + /// Wall destruction mod + var/wall_destroy_mod = 1 + /// Mob damage mod + var/mob_damage_mod = 1 + /// Mob gib mod + var/mob_gib_mod = 1 + /// Mob deafen mod + var/mob_deafen_mod = 1 + /// block = block / this, if 0 any block is absolute + var/block_resistance = 1 + + // Rewrite count: 2 + // Each cycle is a "perfect ring". + // We run into the problem that diagonal hitboxes don't exist on 2d grid games. + // How we deal with this is this: + // The first half of each cycle explodes cardinal directions awaiting expansion first + // Diagonals get added to a potential diagonals list. + // The second half of each cycle checks the potential diagonals list. If something isn't on the exploded list, + // we know it's a valid diagonal and explode it. + // Then all exploded turfs are flushed to exploded_last and it continues. + // Direction bitflags use the WEX_DIR_X flags so we can keep track of more than one direction in a single field + // The insanity begins when I realized that doing cardinals are easy but diagonals require: + // - Tallying the explosive power that should go into it + // - Exploding it afterwards using the tallied power rather than passed power (so corners aren't far weaker unless there's one side of it blocked) + // Expanding the explosion power of the now exploded diagonal into the two dirs its cardinals are in + // If this is done using a perfect algorithm it should be relatively efficient and result in a near-perfect shockwave simulation. + + /// The last ring that's been exploded. Any turfs in this will completely ignore the current cycle. Turf = TRUE + var/list/turf/exploded_last = list() + /// The "edges" + dirs that need to be processed this cycle. turf = dir flags + var/list/turf/edges = list() + /// The powers of the current turf edges. turf = power + var/list/turf/powers = list() + + /// What cycle are we on? + var/cycle + /// When we started the current cycle + var/cycle_start + /// Time to wait between cycles + var/cycle_speed = 0 + /// Current index for list + var/index = 1 + +/datum/wave_explosion/New(turf/initial, power, factor = EXPLOSION_DEFAULT_FALLOFF_MULTIPLY, constant = EXPLOSION_DEFAULT_FALLOFF_SUBTRACT, flash = 0, fire = 0, atom/source, speed = 0, silent = FALSE, autostart = TRUE, block_resistance = 1) + id = ++next_id + if(next_id > SHORT_REAL_LIMIT) + next_id = 0 + SSexplosions.wave_explosions += src + src.power_initial = power + src.power_falloff_factor = factor + src.power_falloff_constant = constant + src.flash_range = flash + src.fire_probability = fire + src.source = source + src.cycle_speed = speed + src.silent = silent + src.block_resistance = block_resistance + if(!istype(initial)) + stack_trace("Wave explosion created without a turf. This better be for debugging purposes.") + return + if(autostart) + start(initial) + +/datum/wave_explosion/Destroy() + if(running) + stop(FALSE) + return ..() + +/datum/wave_explosion/proc/start(list/turf/_starting) + if(running) + CRASH("Attempted to start() a running wave explosion") + if(!islist(_starting)) + _starting = list(_starting) + var/list/mob/to_flash = list() + var/list/feedback = list() + var/list/mob/mob_potential_shake = list() + var/list/mob/closest_to = list() + for(var/i in 1 to _starting.len) + var/turf/starting = _starting[i] + edges[starting] = WEX_ALLDIRS + powers[starting] = power_initial + var/x0 = starting.x + var/y0 = starting.y + var/z0 = starting.z + var/area/areatype = get_area(starting) + feedback += list(list("power" = power_initial, factor = "factor", constant = "constant", flash = "flash", fire = "fire", speed = "speed", "x" = x0, "y" = y0, "z" = z0, "area" = areatype.type, "time" = TIME_STAMP("YYYY-MM-DD hh:mm:ss", 1))) + // Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. + // Stereo users will also hear the direction of the explosion! + + // Calculate far explosion sound range. Only allow the sound effect for heavy/devastating explosions. + // 3/7/14 will calculate to 80 + 35 + + if(!silent) + for(var/mob/M in GLOB.player_list) + // Double check for client + var/turf/M_turf = get_turf(M) + if(M_turf && M_turf.z == z0) + var/dist = get_dist(M_turf, starting) + if(isnull(mob_potential_shake[M])) + mob_potential_shake[M] = dist + closest_to[M] = starting + else if(mob_potential_shake[M] < dist) + mob_potential_shake[M] = dist + closest_to[M] = starting + + for(var/array in GLOB.doppler_arrays) + var/obj/machinery/doppler_array/A = array + A.sense_wave_explosion(starting, power_initial, cycle_speed) + + // Flash mobs + if(flash_range) + for(var/mob/living/L in viewers(flash_range, starting)) + to_flash |= L + + if(!silent) + var/frequency = get_rand_frequency() + var/sound/explosion_sound = sound(get_sfx("explosion")) + var/sound/far_explosion_sound = sound('sound/effects/explosionfar.ogg') + + var/far_dist = sqrt(power_initial) * 7.5 + + for(var/mob/M in mob_potential_shake) + var/dist = mob_potential_shake[M] + var/baseshakeamount + if(sqrt(power_initial) - dist > 0) + baseshakeamount = sqrt((sqrt(power_initial) - dist)*0.1) + // If inside the blast radius + world.view - 2 + if(dist <= round(2 * sqrt(power_initial) + world.view - 2, 1)) + M.playsound_local(closest_to[M], null, 100, 1, frequency, max_distance = 5, S = explosion_sound) + if(baseshakeamount > 0) + shake_camera(M, 25, clamp(baseshakeamount, 0, 10)) + // You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station. + else if(dist <= far_dist) + var/far_volume = clamp(far_dist, 30, 50) // Volume is based on explosion size and dist + far_volume += (dist <= far_dist * 0.5 ? 50 : 0) // add 50 volume if the mob is pretty close to the explosion + M.playsound_local(closest_to[M], null, far_volume, 1, frequency, max_distance = 5, S = far_explosion_sound) + if(baseshakeamount > 0) + shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, 2.5)) + + for(var/i in 1 to to_flash.len) + var/mob/living/L = to_flash[i] + L.flash_act() + + SSblackbox.record_feedback("associative", "wave_explosion", 1, feedback) + + if(!cycle) + cycle = 1 + SSexplosions.active_wave_explosions += src + running = TRUE + cycle_start = world.time - cycle_speed + tick() + +/datum/wave_explosion/proc/stop(delete = TRUE) + SSexplosions.active_wave_explosions -= src + SSexplosions.currentrun -= src + edges = null + powers = null + exploded_last = null + cycle = null + running = FALSE + qdel(src) + +#define SHOULD_SUSPEND ((cycle_start + cycle_speed) > world.time) + +/** + * Called by SSexplosions to propagate this. + * Return TRUE if postponed + */ +/datum/wave_explosion/proc/tick() + /// Each tick goes through one full cycle. + // This can be changed to a "continuous process" system where indexes are tracked if needed. + if(!src.edges.len) + // we're done + finished = TRUE + stop(TRUE) + return TRUE + if(SHOULD_SUSPEND) + return TRUE + // Set up variables + var/turf/T + var/turf/expanding + var/power + var/returned + var/blocked + var/dir + // insanity define to explode a turf with a certain amount of power, direction, and set returned. +#define WEX_ACT(_T, _P, _D) \ + returned = max(0, _T.wave_explode(_P, src, _D)); \ + blocked = _P - returned; \ + if(!block_resistance) { \ + if(blocked > EXPLOSION_POWER_NO_RESIST_THRESHOLD) { \ + returned = 0; \ + } \ + } \ + else if(blocked) { \ + returned = _P - (blocked / block_resistance); \ + }; \ + returned = round((returned * power_falloff_factor) - power_falloff_constant, EXPLOSION_POWER_QUANTIZATION_ACCURACY); \ + if(prob(fire_probability)) { \ + new /obj/effect/hotspot(_T); \ + }; + + // Cache hot lists + var/list/turf/edges = src.edges + var/list/turf/powers = src.powers + var/list/turf/exploded_last = src.exploded_last + + // prepare expansions + var/list/turf/edges_next = list() + var/list/turf/powers_next = list() + var/list/turf/powers_returned = list() + var/list/turf/diagonals = list() + var/list/turf/diagonal_powers = list() + var/list/turf/diagonal_powers_max = list() + + // to_chat(world, "DEBUG: cycle start edges [english_list_assoc(edges)]") + + // Process cardinals: + // Explode all cardinals and expand in directions, gathering all cardinals it should go to. + // Power for when things meet in the middle should be the greatest of the two. + for(var/i in edges) + T = i + power = powers[T] + dir = edges[T] + WEX_ACT(T, power, dir) + if(returned < power_considered_dead) + continue + powers_returned[T] = returned + // diagonal power calc when multiple things hit one diagonal +#define CALCULATE_DIAGONAL_POWER(existing, adding, maximum) min(maximum, existing + adding) + // diagonal hitting cardinal expansion +#define CALCULATE_DIAGONAL_CROSS_POWER(existing, adding) max(existing, adding) + // insanity define to mark the next set of cardinals. +#define CARDINAL_MARK(ndir, cdir, edir) \ + if(edir & cdir) { \ + CARDINAL_MARK_NOCHECK(ndir, cdir, edir); \ + }; + +#define CARDINAL_MARK_NOCHECK(ndir, cdir, edir) \ + expanding = get_step(T,ndir); \ + if(expanding && !exploded_last[expanding] && !edges[expanding]) { \ + powers_next[expanding] = max(powers_next[expanding], returned); \ + edges_next[expanding] = (cdir | edges_next[expanding]); \ + }; + + // insanity define to do diagonal marking as 2 substeps +#define DIAGONAL_SUBSTEP(ndir, cdir, edir) \ + expanding = get_step(T,ndir); \ + if(expanding && !exploded_last[expanding] && !edges[expanding]) { \ + if(!edges_next[expanding]) { \ + diagonal_powers_max[expanding] = max(diagonal_powers_max[expanding], returned, powers[T]); \ + diagonal_powers[expanding] = CALCULATE_DIAGONAL_POWER(diagonal_powers[expanding], returned, diagonal_powers_max[expanding]); \ + diagonals[expanding] = (cdir | diagonals[expanding]); \ + }; \ + else { \ + powers_next[expanding] = CALCULATE_DIAGONAL_CROSS_POWER(powers_next[expanding], returned); \ + }; \ + }; + + // insanity define to mark the diagonals that would otherwise be missed +#define DIAGONAL_MARK(ndir, cdir, edir) \ + if(edir & cdir) { \ + DIAGONAL_MARK_NOCHECK(ndir, cdir, edir); \ + }; + + // this only works because right now, WEX_DIR_X is the same as a byond dir + // and we know we're only passing in one dir at a time. + // if this ever stops being the case, and explosions break when you touch this, now you know why. +#define DIAGONAL_MARK_NOCHECK(ndir, cdir, edir) \ + DIAGONAL_SUBSTEP(turn(ndir, 90), turn(cdir, 90), edir); \ + DIAGONAL_SUBSTEP(turn(ndir, -90), turn(cdir, -90), edir); + + // mark +#define MARK(ndir, cdir, edir) \ + if(edir & cdir) { \ + CARDINAL_MARK_NOCHECK(ndir, cdir, edir); \ + DIAGONAL_MARK_NOCHECK(ndir, cdir, edir); \ + }; + CARDINAL_MARK(NORTH, WEX_DIR_NORTH, dir) + CARDINAL_MARK(SOUTH, WEX_DIR_SOUTH, dir) + CARDINAL_MARK(EAST, WEX_DIR_EAST, dir) + CARDINAL_MARK(WEST, WEX_DIR_WEST, dir) + + // to_chat(world, "DEBUG: cycle mid edges_next [english_list_assoc(edges_next)]") + + // Sweep after cardinals for diagonals + for(var/i in edges) + T = i + power = powers[T] + dir = edges[T] + returned = powers_returned[T] + DIAGONAL_MARK(NORTH, WEX_DIR_NORTH, dir) + DIAGONAL_MARK(SOUTH, WEX_DIR_SOUTH, dir) + DIAGONAL_MARK(EAST, WEX_DIR_EAST, dir) + DIAGONAL_MARK(WEST, WEX_DIR_WEST, dir) + + // to_chat(world, "DEBUG: cycle mid diagonals [english_list_assoc(diagonals)]") + + // Process diagonals: + for(var/i in diagonals) + T = i + power = diagonal_powers[T] + dir = diagonals[T] + WEX_ACT(T, power, dir) + if(returned < power_considered_dead) + continue + CARDINAL_MARK(NORTH, WEX_DIR_NORTH, dir) + CARDINAL_MARK(SOUTH, WEX_DIR_SOUTH, dir) + CARDINAL_MARK(EAST, WEX_DIR_EAST, dir) + CARDINAL_MARK(WEST, WEX_DIR_WEST, dir) + + // to_chat(world, "DEBUG: cycle end edges_next [english_list_assoc(edges_next)]") + + // flush lists + src.exploded_last = edges + diagonals + src.edges = edges_next + src.powers = powers_next + cycle++ + cycle_start = world.time + +#undef SHOULD_SUSPEND + +#undef WEX_ACT + +#undef DIAGONAL_SUBSTEP +#undef DIAGONAL_MARK +#undef CARDINAL_MARK +#undef MARK diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 18674cdb17..3009831da7 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -36,6 +36,14 @@ ///Value used to increment ex_act() if reactionary_explosions is on var/explosion_block = 0 + /// Flags for explosions + var/explosion_flags = NONE + /// Amount to decrease wave explosions by + var/wave_explosion_block = 0 + /// Amount to multiply wave explosions by + var/wave_explosion_multiply = 1 + + //its inherent color, the colored paint applied on it, special color effect etc... /** * used to store the different colors on an atom * @@ -43,7 +51,6 @@ */ var/list/atom_colours - /// a very temporary list of overlays to remove var/list/remove_overlays /// a very temporary list of overlays to add @@ -556,6 +563,34 @@ contents_explosion(severity, target) SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target) +/** + * Called when a wave explosion hits this atom. Do not override this. + * + * Returns explosion power to "allow through". + */ +/atom/proc/wave_explode(power, datum/wave_explosion/explosion, dir) + set waitfor = FALSE + // SHOULD_NOT_SLEEP(TRUE) + SHOULD_NOT_OVERRIDE(TRUE) + SEND_SIGNAL(src, COMSIG_ATOM_WAVE_EX_ACT, args) + . = wave_ex_act(power, explosion, dir) // this must happen first for stuff like destruction/damage to tick. + if(isnull(.)) + stack_trace("wave_ex_act on [type] failed to return a number. defaulting to no blocking.") + return power + if((explosion_flags & EXPLOSION_FLAG_DENSITY_DEPENDENT) && !density) + return power // no block + else if((explosion_flags & EXPLOSION_FLAG_HARD_OBSTACLE) && !QDELETED(src)) + return 0 // fully blocked + +/** + * Called when a wave explosion hits this atom. + * + * Returns explosion power to "allow through". Standard handling and flag overrides in [wave_explode()]. + */ +/atom/proc/wave_ex_act(power, datum/wave_explosion/explosion, dir) + // SHOULD_NOT_SLEEP(TRUE) + return power * wave_explosion_multiply - wave_explosion_block + /atom/proc/blob_act(obj/structure/blob/B) SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B) return diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index d26f8c5639..2ccf7d317d 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -96,6 +96,10 @@ Class Procs: flags_ricochet = RICOCHET_HARD ricochet_chance_mod = 0.3 + explosion_flags = EXPLOSION_FLAG_DENSITY_DEPENDENT + wave_explosion_block = EXPLOSION_BLOCK_MACHINE + wave_explosion_multiply = EXPLOSION_DAMPEN_MACHINE + anchored = TRUE interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND | INTERACT_ATOM_UI_INTERACT diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index f4a65ce984..4eed168ad6 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -54,6 +54,8 @@ assemblytype = /obj/structure/door_assembly normalspeed = 1 explosion_block = 1 + wave_explosion_block = EXPLOSION_BLOCK_WALL + wave_explosion_multiply = EXPLOSION_DAMPEN_WALL hud_possible = list(DIAG_AIRLOCK_HUD) interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 63a8ad22d4..a20374f878 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -16,6 +16,11 @@ interaction_flags_atom = INTERACT_ATOM_UI_INTERACT + wave_explosion_block = EXPLOSION_BLOCK_DENSE_FILLER + wave_explosion_multiply = EXPLOSION_DAMPEN_DENSE_FILLER + + explosion_flags = EXPLOSION_FLAG_HARD_OBSTACLE | EXPLOSION_FLAG_DENSITY_DEPENDENT + var/secondsElectrified = 0 var/air_tight = FALSE //TRUE means density will be set as soon as the door begins to close var/shockedby @@ -412,3 +417,8 @@ /obj/machinery/door/GetExplosionBlock() return density ? real_explosion_block : 0 + +/obj/machinery/door/wave_explosion_damage(power, datum/wave_explosion/explosion) + . = ..() + if(!density) + return . * EXPLOSION_DAMAGE_OPEN_DOOR_FACTOR diff --git a/code/game/machinery/doors/passworddoor.dm b/code/game/machinery/doors/passworddoor.dm index 1ec5b3c373..0c64151bca 100644 --- a/code/game/machinery/doors/passworddoor.dm +++ b/code/game/machinery/doors/passworddoor.dm @@ -71,3 +71,6 @@ /obj/machinery/door/password/ex_act(severity, target) return + +/obj/machinery/door/password/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return 0 //no. diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 4226d8a439..8c7fc692bc 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -8,6 +8,8 @@ closingLayer = CLOSED_BLASTDOOR_LAYER sub_door = TRUE explosion_block = 3 + wave_explosion_block = EXPLOSION_BLOCK_BLAST_PROOF + wave_explosion_multiply = EXPLOSION_DAMPEN_BLAST_PROOF heat_proof = TRUE safe = FALSE max_integrity = 600 diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index dd885542c9..af7545d3c9 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -360,6 +360,8 @@ max_integrity = 300 //Stronger doors for prison (regular window door health is 200) reinf = 1 explosion_block = 1 + wave_explosion_block = EXPLOSION_BLOCK_REINFORCED_WINDOW + wave_explosion_multiply = EXPLOSION_DAMPEN_REINFORCED_WINDOW /obj/machinery/door/window/brigdoor/security/cell name = "cell door" diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 1cdb81ee1d..2066e88f85 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -114,6 +114,44 @@ GLOBAL_LIST_EMPTY(doppler_arrays) LAZYADD(message_log, messages.Join(" ")) return TRUE +/obj/machinery/doppler_array/proc/sense_wave_explosion(turf/epicenter, power, speed) + if(stat & NOPOWER) + return FALSE + var/turf/zone = get_turf(src) + if(zone.z != epicenter.z) + return FALSE + + if(next_announce > world.time) + return FALSE + next_announce = world.time + cooldown + + var/distance = get_dist(epicenter, zone) + var/direct = get_dir(zone, epicenter) + + if(distance > max_dist) + return FALSE + if(!(direct & dir) && !integrated) + return FALSE + + + var/list/messages = list("Explosive shockwave detected.", \ + "Epicenter at: grid ([epicenter.x],[epicenter.y]). Shockwave expanding at a theoretical speed of [speed] m/s.", \ + "Wave energy: [power]MJ.") + + if(integrated) + var/obj/item/clothing/head/helmet/space/hardsuit/helm = loc + if(!helm || !istype(helm, /obj/item/clothing/head/helmet/space/hardsuit)) + return FALSE + helm.display_visor_message("Waveform explosion detected! Wave energy: [power]MJ.") + else + for(var/message in messages) + say(message) + if(LAZYLEN(message_log) > list_limit) + say("Storage buffer is full! Clearing buffers...") + LAZYCLEARLIST(message_log) + LAZYADD(message_log, messages.Join(" ")) + return TRUE + /obj/machinery/doppler_array/examine(mob/user) . = ..() . += "Its dish is facing to the [dir2text(dir)]." diff --git a/code/game/objects/effects/decals/cleanable/misc.dm b/code/game/objects/effects/decals/cleanable/misc.dm index bb566f4d87..fe4ab20617 100644 --- a/code/game/objects/effects/decals/cleanable/misc.dm +++ b/code/game/objects/effects/decals/cleanable/misc.dm @@ -50,6 +50,10 @@ /obj/effect/decal/cleanable/glass/ex_act() qdel(src) +/obj/effect/decal/cleanable/glass/wave_ex_act(power, datum/wave_explosion/explosion, dir) + qdel(src) + return power + /obj/effect/decal/cleanable/glass/plasma icon_state = "plasmatiny" @@ -131,6 +135,9 @@ /obj/effect/decal/cleanable/greenglow/ex_act() return +/obj/effect/decal/cleanable/greenglow/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return power + /obj/effect/decal/cleanable/cobweb name = "cobweb" desc = "Somebody should remove that." @@ -253,6 +260,11 @@ if(severity == 1) //so shreds created during an explosion aren't deleted by the explosion. qdel(src) +/obj/effect/decal/cleanable/shreds/wave_ex_act(power, datum/wave_explosion/explosion, dir) + if(power > EXPLOSION_POWER_ERASE_SHREDS) + qdel(src) + return power // no block + /obj/effect/decal/cleanable/shreds/Initialize() pixel_x = rand(-10, 10) pixel_y = rand(-10, 10) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 8a09bca0bf..5089d26c88 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -248,6 +248,14 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb loc = null loc = T +/obj/item/wave_ex_act(power, datum/wave_explosion/explosion, dir) + . = ..() + if(!anchored) + var/throw_dist = round(rand(3, max(3, 2.5 * sqrt(power))), 1) + throw_speed = EXPLOSION_THROW_SPEED + var/turf/target = get_ranged_target_turf(src, dir, throw_dist) + throw_at(target, throw_dist, EXPLOSION_THROW_SPEED) + /obj/item/examine(mob/user) //This might be spammy. Remove? . = ..() diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 73a21e4a25..02f2009667 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -71,6 +71,19 @@ if(3) take_damage(rand(10, 90), BRUTE, "bomb", 0) +/obj/wave_ex_act(power, datum/wave_explosion/explosion, dir) + if(resistance_flags & INDESTRUCTIBLE) + return power + . = ..() + if(explosion.source == src) + obj_integrity = 0 + qdel(src) + return + take_damage(wave_explosion_damage(power, explosion), BRUTE, "bomb", 0) + +/obj/proc/wave_explosion_damage(power, datum/wave_explosion/explosion) + return (explosion_flags & EXPLOSION_FLAG_HARD_OBSTACLE)? EXPLOSION_POWER_STANDARD_SCALE_HARD_OBSTACLE_DAMAGE(power, explosion.hard_obstacle_mod) : EXPLOSION_POWER_STANDARD_SCALE_OBJECT_DAMAGE(power, explosion.object_damage_mod) + /obj/bullet_act(obj/item/projectile/P) . = ..() playsound(src, P.hitsound, 50, 1) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 53bcd28fa1..e40e158895 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -43,6 +43,10 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) attack_hand_speed = CLICK_CD_MELEE attack_hand_is_action = TRUE + explosion_flags = EXPLOSION_FLAG_HARD_OBSTACLE + wave_explosion_block = EXPLOSION_BLOCK_WINDOW + wave_explosion_multiply = EXPLOSION_DAMPEN_WINDOW + /// Electrochromatic status var/electrochromatic_status = NOT_ELECTROCHROMATIC /// Electrochromatic ID. Set the first character to ! to replace with a SSmapping generated pseudorandom obfuscated ID for mapping purposes. @@ -111,6 +115,9 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) return TRUE return FALSE +/obj/structure/window/wave_explosion_damage(power, datum/wave_explosion/explosion) + return EXPLOSION_POWER_STANDARD_SCALE_WINDOW_DAMAGE(power, explosion.window_shatter_mod) + /obj/structure/window/narsie_act() add_atom_colour(NARSIE_WINDOW_COLOUR, FIXED_COLOUR_PRIORITY) @@ -520,6 +527,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) armor = list("melee" = 50, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) max_integrity = 50 explosion_block = 1 + wave_explosion_block = EXPLOSION_BLOCK_REINFORCED_WINDOW + wave_explosion_multiply = EXPLOSION_DAMPEN_REINFORCED_WINDOW glass_type = /obj/item/stack/sheet/rglass rad_insulation = RAD_HEAVY_INSULATION ricochet_chance_mod = 0.8 @@ -545,6 +554,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) armor = list("melee" = 75, "bullet" = 5, "laser" = 0, "energy" = 0, "bomb" = 45, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100) max_integrity = 150 explosion_block = 1 + wave_explosion_block = EXPLOSION_BLOCK_BOROSILICATE_WINDOW + wave_explosion_multiply = EXPLOSION_DAMPEN_BOROSILICATE_WINDOW glass_type = /obj/item/stack/sheet/plasmaglass cleanable_type = /obj/effect/decal/cleanable/glass/plasma rad_insulation = RAD_NO_INSULATION @@ -570,6 +581,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) armor = list("melee" = 85, "bullet" = 20, "laser" = 0, "energy" = 0, "bomb" = 60, "bio" = 100, "rad" = 100, "fire" = 99, "acid" = 100) max_integrity = 500 explosion_block = 2 + wave_explosion_block = EXPLOSION_BLOCK_EXTREME + wave_explosion_multiply = EXPLOSION_BLOCK_EXTREME glass_type = /obj/item/stack/sheet/plasmarglass /obj/structure/window/plasma/reinforced/spawner/east @@ -742,6 +755,8 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) max_integrity = 80 armor = list("melee" = 60, "bullet" = 25, "laser" = 0, "energy" = 0, "bomb" = 25, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 100) explosion_block = 2 //fancy AND hard to destroy. the most useful combination. + wave_explosion_block = EXPLOSION_BLOCK_BOROSILICATE_WINDOW + wave_explosion_multiply = EXPLOSION_DAMPEN_BOROSILICATE_WINDOW decon_speed = 40 glass_type = /obj/item/stack/tile/brass glass_amount = 1 diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index be0c444541..91a8ba4f46 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -6,6 +6,8 @@ blocks_air = 1 rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE rad_insulation = RAD_MEDIUM_INSULATION + wave_explosion_block = 10 + wave_explosion_multiply = 0.75 /turf/closed/Initialize() . = ..() @@ -28,6 +30,7 @@ name = "wall" icon = 'icons/turf/walls.dmi' explosion_block = 50 + wave_explosion_block = INFINITY /turf/closed/indestructible/rust_heretic_act() return diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 565d5640e3..e5034e4b2f 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -12,6 +12,19 @@ clawfootstep = FOOTSTEP_HARD_CLAW heavyfootstep = FOOTSTEP_GENERIC_HEAVY + /// Minimum explosion power to break tile + var/explosion_power_break_tile = EXPLOSION_POWER_FLOOR_TILE_BREAK + /// Minimum explosion power to break turf + var/explosion_power_break_turf = EXPLOSION_POWER_FLOOR_TURF_BREAK + //// Minimum explosion power to scrape away the floor + var/explosion_power_turf_scrape = EXPLOSION_POWER_FLOOR_TURF_SCRAPE + //// Shielded turfs are completely protected from anything under this + var/explosion_power_protect_shielded = EXPLOSION_POWER_FLOOR_SHIELDED_IMMUNITY + /// Starting from here, there's a chance for this to break + var/explosion_power_minimum_chance_break = EXPLOSION_POWER_FLOOR_MINIMUM_TURF_BREAK + /// Starting from here, +20% chance to break turf. + var/explosion_power_break_turf_bonus = EXPLOSION_POWER_FLOOR_TURF_BREAK_BONUS + var/icon_regular_floor = "floor" //used to remember what icon the tile should have by default var/icon_plating = "plating" thermal_conductivity = 0.004 @@ -98,6 +111,48 @@ src.break_tile() src.hotspot_expose(1000,CELL_VOLUME) +/turf/open/floor/wave_ex_act(power, datum/wave_explosion/explosion, dir) + var/shielded = is_shielded() + . = ..() + if(shielded) + if(power < explosion_power_protect_shielded) + return + else + power -= explosion_power_protect_shielded + hotspot_expose(1000, CELL_VOLUME) + if(power < explosion_power_break_tile) + return + if(power < explosion_power_minimum_chance_break) + if(prob(33 + ((explosion_power_break_turf - power) / (explosion_power_break_turf - explosion_power_break_tile)))) + break_tile() + return + if((power < explosion_power_turf_scrape) && ((power >= explosion_power_break_turf) || prob((1 - ((explosion_power_break_turf - power) / (explosion_power_break_turf - explosion_power_minimum_chance_break))) * 100 + ((power > explosion_power_break_turf_bonus)? 20 : 0)))) + switch(pick(1, 2;75, 3)) + if(1) + if(!length(baseturfs) || !ispath(baseturfs[baseturfs.len-1], /turf/open/floor)) + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) + ReplaceWithLattice() + else + ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) + if(prob(33)) + new /obj/item/stack/sheet/metal(src) + return + if(2) + ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) + return + if(3) + if(prob(80)) + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) + return + else + break_tile() + hotspot_expose(1000,CELL_VOLUME) + if(prob(33)) + new /obj/item/stack/sheet/metal(src) + if(power >= explosion_power_turf_scrape) + ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) + return + /turf/open/floor/is_shielded() for(var/obj/structure/A in contents) if(A.level == 3) diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 03d5cecc26..620c9adfc8 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -12,6 +12,11 @@ sheet_amount = 1 girder_type = /obj/structure/girder/reinforced explosion_block = 2 + wave_explosion_block = EXPLOSION_BLOCK_BLAST_PROOF + wave_explosion_multiply = EXPLOSION_DAMPEN_BLAST_PROOF + explosion_power_to_scrape = EXPLOSION_POWER_RWALL_SCRAPE + explosion_power_to_dismantle = EXPLOSION_POWER_RWALL_DISMANTLE + explosion_power_minimum_chance_dismantle = EXPLOSION_POWER_RWALL_MINIMUM_DISMANTLE rad_insulation = RAD_HEAVY_INSULATION /turf/closed/wall/r_wall/deconstruction_hints(mob/user) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 79ca5add10..76dc6533b6 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -6,6 +6,8 @@ icon = 'icons/turf/walls/wall.dmi' icon_state = "wall" explosion_block = 1 + wave_explosion_block = EXPLOSION_BLOCK_WALL + wave_explosion_multiply = EXPLOSION_DAMPEN_WALL flags_1 = DEFAULT_RICOCHET_1 flags_ricochet = RICOCHET_HARD thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT @@ -15,6 +17,14 @@ baseturfs = /turf/open/floor/plating + explosion_flags = EXPLOSION_FLAG_HARD_OBSTACLE + /// Explosion power to disintegrate the wall + var/explosion_power_to_scrape = EXPLOSION_POWER_WALL_SCRAPE + /// Explosion power to dismantle the wall + var/explosion_power_to_dismantle = EXPLOSION_POWER_WALL_DISMANTLE + /// Explosion power to potentially dismantle the wall + var/explosion_power_minimum_chance_dismantle = EXPLOSION_POWER_WALL_MINIMUM_DISMANTLE + var/hardness = 40 //lower numbers are harder. Used to determine the probability of a hulk smashing through. var/slicing_duration = 100 //default time taken to slice the wall var/sheet_type = /obj/item/stack/sheet/metal @@ -91,6 +101,13 @@ if(!density) ..() +/turf/closed/wall/wave_ex_act(power, datum/wave_explosion/explosion, dir) + . = ..() + var/resultant_power = power * explosion.wall_destroy_mod + if(resultant_power >= explosion_power_to_scrape) + ScrapeAway() + else if((resultant_power >= explosion_power_to_dismantle) || ((resultant_power >= explosion_power_minimum_chance_dismantle) && prob(((resultant_power - explosion_power_minimum_chance_dismantle) / (explosion_power_to_dismantle - explosion_power_minimum_chance_dismantle)) * 100))) + dismantle_wall(prob((resultant_power - explosion_power_to_dismantle)/(explosion_power_to_scrape - explosion_power_to_dismantle)), TRUE) /turf/closed/wall/blob_act(obj/structure/blob/B) if(prob(50)) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 0905fb2e9c..b1a4efc97e 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -8,6 +8,8 @@ temperature = TCMB thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT heat_capacity = 700000 + wave_explosion_multiply = EXPLOSION_DAMPEN_SPACE + wave_explosion_block = EXPLOSION_BLOCK_SPACE var/destination_z var/destination_x diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 0808408192..93735f1079 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -462,6 +462,24 @@ GLOBAL_LIST_EMPTY(station_turfs) A.ex_act(severity, target) CHECK_TICK +/turf/wave_ex_act(power, datum/wave_explosion/explosion, dir) + . = ..() + var/affecting_level + if(is_shielded()) + affecting_level = 3 + else if(intact) + affecting_level = 2 + else + affecting_level = 1 + var/atom/A + for(var/i in contents) + if(. <= 0) + return 0 + A = i + if(!QDELETED(A) && A.level >= affecting_level) + . = A.wave_explode(., explosion, dir) + maptext = "[.]" + /turf/narsie_act(force, ignore_mobs, probability = 20) . = (prob(probability) || force) for(var/I in src) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 96eb4e4a0f..9e784e72cb 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -96,6 +96,7 @@ GLOBAL_LIST_INIT(admin_verbs_fun, list( /client/proc/cmd_select_equipment, /client/proc/cmd_admin_gib_self, /client/proc/drop_bomb, + /client/proc/drop_wave_explosion, /client/proc/set_dynex_scale, /client/proc/drop_dynex_bomb, /client/proc/cinematic, @@ -550,6 +551,51 @@ GLOBAL_PROTECT(admin_verbs_hideable) log_admin("[key_name(usr)] created an admin explosion at [epicenter.loc].") 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_wave_explosion() + set category = "Special Verbs" + set name = "Drop Wave Explosion" + set desc = "Cause an explosive shockwave at your location." + + var/power = input(src, "Wave initial power", "Power", 50) as num|null + if(isnull(power)) + return + var/falloff = input(src, "Wave innate falloff factor", "Falloff", EXPLOSION_DEFAULT_FALLOFF_MULTIPLY) as num|null + if(isnull(falloff)) + return + falloff = max(0, falloff) + if(falloff > 1) + to_chat(src, "Aborting: Falloff cannot be higher tahn 1.") + return + var/constant = input(src, "Wave innate falloff constant", "Constant", EXPLOSION_DEFAULT_FALLOFF_SUBTRACT) as num|null + if(isnull(constant)) + return + if(constant < 0) + to_chat(src, "Aborting: Falloff constant cannot be less than 0.") + return + var/fire = input(src, "Probability per tile of fire?", "Fire Probability", 0) as num|null + if(isnull(fire)) + return + var/speed = input(src, "Speed in ticks to wait between cycles? 0 for fast as possible", "Wait", 0) as num|null + if(isnull(speed)) + return + var/block_resistance = input(src, "DANGEROUS: Block resistance? USE 1 IF YOU DO NOT KNOW WHAT YOU ARE DOING.", "Block Negation", 1) as num|null + if(isnull(block_resistance)) + return + block_resistance = max(0, block_resistance) + if(power > 500) + var/sure = alert(src, "Explosion power is extremely high. Are you absolutely sure?", "Uhh...", "No", "Yes") + if(sure != "Yes") + return + // point of no return + var/turf/target = get_turf(mob) + if(!target) + to_chat(src, "Cannot proceed. Not on turf.") + return + message_admins("[ADMIN_LOOKUPFLW(usr)] creating an admin explosion at [target.loc].") + log_admin("[key_name(usr)] created an admin explosion at [target.loc].") + SSblackbox.record_feedback("tally", "admin_verb", 1, "Drop Wave Explosion") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + wave_explosion(target, power, falloff, constant, null, fire, speed = speed, block_resistance = block_resistance) + /client/proc/drop_dynex_bomb() set category = "Admin.Fun" set name = "Drop DynEx Bomb" diff --git a/code/modules/antagonists/revenant/revenant.dm b/code/modules/antagonists/revenant/revenant.dm index 7e4c5c5343..31989fe241 100644 --- a/code/modules/antagonists/revenant/revenant.dm +++ b/code/modules/antagonists/revenant/revenant.dm @@ -177,6 +177,9 @@ /mob/living/simple_animal/revenant/ex_act(severity, target) return 1 //Immune to the effects of explosions. +/mob/living/simple_animal/revenant/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return power + /mob/living/simple_animal/revenant/blob_act(obj/structure/blob/B) return //blah blah blobs aren't in tune with the spirit world, or something. diff --git a/code/modules/holiday/halloween/halloween.dm b/code/modules/holiday/halloween/halloween.dm index d44b94aaf3..f468022918 100644 --- a/code/modules/holiday/halloween/halloween.dm +++ b/code/modules/holiday/halloween/halloween.dm @@ -206,6 +206,9 @@ /mob/living/simple_animal/hostile/retaliate/clown/insane/ex_act() return +/mob/living/simple_animal/hostile/retaliate/clown/insane/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return power + /mob/living/simple_animal/hostile/retaliate/clown/insane/Life() timer-- if(target) diff --git a/code/modules/mob/living/bloodcrawl.dm b/code/modules/mob/living/bloodcrawl.dm index 24d456bf8f..b66158db8a 100644 --- a/code/modules/mob/living/bloodcrawl.dm +++ b/code/modules/mob/living/bloodcrawl.dm @@ -13,6 +13,10 @@ /obj/effect/dummy/phased_mob/slaughter/ex_act() return + +/obj/effect/dummy/phased_mob/slaughter/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return power + /obj/effect/dummy/phased_mob/slaughter/bullet_act() return BULLET_ACT_FORCE_PIERCE diff --git a/code/modules/mob/living/brain/brain.dm b/code/modules/mob/living/brain/brain.dm index be03827695..8ffcce248b 100644 --- a/code/modules/mob/living/brain/brain.dm +++ b/code/modules/mob/living/brain/brain.dm @@ -46,6 +46,9 @@ /mob/living/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up. return +/mob/living/brain/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return power + /mob/living/brain/blob_act(obj/structure/blob/B) return diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 5f3f530437..4c6ede3904 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -438,6 +438,12 @@ return ..() +/mob/living/wave_ex_act(power, datum/wave_explosion/explosion, dir) + if(power > EXPLOSION_POWER_NORMAL_MOB_GIB) + gib() + adjustBruteLoss(EXPLOSION_POWER_STANDARD_SCALE_MOB_DAMAGE(power, explosion.mob_damage_mod)) + return power + //Looking for irradiate()? It's been moved to radiation.dm under the rad_act() for mobs. /mob/living/acid_act(acidpwr, acid_volume) diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 012515d0e9..7c7ff3779c 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -280,6 +280,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians if(3) adjustBruteLoss(30) +/mob/living/simple_animal/hostile/guardian/wave_ex_act(power, datum/wave_explosion/explosion, dir) + adjustBruteLoss(EXPLOSION_POWER_STANDARD_SCALE_MOB_DAMAGE(power, explosion.mob_damage_mod * 0.33)) + /mob/living/simple_animal/hostile/guardian/gib() if(summoner) to_chat(summoner, "Your [src] was blown up!") diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index e2d6602a88..3940388625 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -149,6 +149,9 @@ if(EXPLODE_LIGHT) adjustBruteLoss(50) +/mob/living/simple_animal/hostile/megafauna/wave_ex_act(power, datum/wave_explosion/explosion, dir) + adjustBruteLoss(EXPLOSION_POWER_STANDARD_SCALE_MOB_DAMAGE(power, explosion.mob_damage_mod) / 2) + /// Sets the next time the megafauna can use a melee or ranged attack, in deciseconds /mob/living/simple_animal/hostile/megafauna/proc/SetRecoveryTime(buffer_time, ranged_buffer_time) recovery_time = world.time + buffer_time diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index cee7e2979d..bda898ef17 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -59,6 +59,13 @@ if(3) adjustBruteLoss(110) +/mob/living/simple_animal/hostile/asteroid/basilisk/wave_ex_act(power, datum/wave_explosion/explosion, dir) + . = ..() + if(power > EXPLOSION_POWER_NORMAL_MOB_GIB) + gib() + else + adjustBruteLoss(EXPLOSION_POWER_STANDARD_SCALE_MOB_DAMAGE(power, explosion.mob_damage_mod)) + //Watcher /mob/living/simple_animal/hostile/asteroid/basilisk/watcher name = "watcher" diff --git a/code/modules/spells/spell_types/ethereal_jaunt.dm b/code/modules/spells/spell_types/ethereal_jaunt.dm index 9d91b6534d..7a05583071 100644 --- a/code/modules/spells/spell_types/ethereal_jaunt.dm +++ b/code/modules/spells/spell_types/ethereal_jaunt.dm @@ -108,5 +108,8 @@ /obj/effect/dummy/phased_mob/spell_jaunt/ex_act(blah) return +/obj/effect/dummy/phased_mob/spell_jaunt/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return power + /obj/effect/dummy/phased_mob/spell_jaunt/bullet_act(blah) return BULLET_ACT_FORCE_PIERCE diff --git a/code/modules/spells/spell_types/shadow_walk.dm b/code/modules/spells/spell_types/shadow_walk.dm index 8436de2119..821bf73425 100644 --- a/code/modules/spells/spell_types/shadow_walk.dm +++ b/code/modules/spells/spell_types/shadow_walk.dm @@ -90,6 +90,9 @@ /obj/effect/dummy/phased_mob/shadow/ex_act() return +/obj/effect/dummy/phased_mob/shadow/wave_ex_act(power, datum/wave_explosion/explosion, dir) + return power + /obj/effect/dummy/phased_mob/shadow/bullet_act() return BULLET_ACT_FORCE_PIERCE diff --git a/tgstation.dme b/tgstation.dme index be1fddaee2..2e5bd87e51 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -51,6 +51,7 @@ #include "code\__DEFINES\economy.dm" #include "code\__DEFINES\events.dm" #include "code\__DEFINES\exosuit_fabs.dm" +#include "code\__DEFINES\explosion.dm" #include "code\__DEFINES\exports.dm" #include "code\__DEFINES\fantasy_affixes.dm" #include "code\__DEFINES\food.dm" @@ -320,6 +321,7 @@ #include "code\controllers\subsystem\disease.dm" #include "code\controllers\subsystem\economy.dm" #include "code\controllers\subsystem\events.dm" +#include "code\controllers\subsystem\explosions.dm" #include "code\controllers\subsystem\fail2topic.dm" #include "code\controllers\subsystem\fire_burning.dm" #include "code\controllers\subsystem\fluid.dm" @@ -410,6 +412,7 @@ #include "code\datums\emotes.dm" #include "code\datums\ert.dm" #include "code\datums\explosion.dm" +#include "code\datums\explosion2.dm" #include "code\datums\forced_movement.dm" #include "code\datums\holocall.dm" #include "code\datums\http.dm" From 70a48a13181cb68d0227ee4f41b1af1380b41664 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 12 May 2021 05:44:55 -0500 Subject: [PATCH 20/30] Automatic changelog generation for PR #13392 [ci skip] --- html/changelogs/AutoChangeLog-pr-13392.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-13392.yml diff --git a/html/changelogs/AutoChangeLog-pr-13392.yml b/html/changelogs/AutoChangeLog-pr-13392.yml new file mode 100644 index 0000000000..803c7ee3f5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-13392.yml @@ -0,0 +1,4 @@ +author: "silicons" +delete-after: True +changes: + - code_imp: "A deterministic wave explosion system has been added. Use it with wave_explosion()." From fa067a481a2996dc268c32b2b2968dd1ddfd95e7 Mon Sep 17 00:00:00 2001 From: keronshb Date: Wed, 12 May 2021 13:09:39 -0400 Subject: [PATCH 21/30] Removes VOG sleep command again Undocumented change. --- code/modules/surgery/organs/vocal_cords.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 0e6456e8b0..8145ed93e5 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -751,7 +751,6 @@ //phase 2 var/static/regex/awoo_words = regex("howl|awoo|bark") var/static/regex/nya_words = regex("nya|meow|mewl") - var/static/regex/sleep_words = regex("sleep|slumber|rest") var/static/regex/strip_words = regex("strip|derobe|nude|at ease|suit off") var/static/regex/walk_words = regex("slow down|walk") var/static/regex/run_words = regex("run|speed up") From 6e3e075ff9d650ffe65b703ea1f9813e71b911e8 Mon Sep 17 00:00:00 2001 From: keronshb Date: Wed, 12 May 2021 13:14:54 -0400 Subject: [PATCH 22/30] Oops forgot something --- code/modules/surgery/organs/vocal_cords.dm | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 8145ed93e5..12e282200c 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1095,17 +1095,6 @@ H.emote("me", EMOTE_VISIBLE, "lets out a nya!") E.cooldown += 1 - //SLEEP - else if((findtext(message, sleep_words))) - for(var/mob/living/carbon/C in listeners) - var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) - switch(E.phase) - if(2 to INFINITY) - C.Sleeping(45 * power_multiplier) - E.cooldown += 10 - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "Drowsiness suddenly overwhelms you as you fall asleep!"), 5) - to_chat(user, "You send [C] to sleep.") - //STRIP else if((findtext(message, strip_words))) for(var/V in listeners) From 82d11bce8135313ada8efa4b54dfcb64f0b01110 Mon Sep 17 00:00:00 2001 From: Changelogs Date: Thu, 13 May 2021 00:28:55 +0000 Subject: [PATCH 23/30] Automatic changelog compile [ci skip] --- html/changelog.html | 23 ++++++++++++++++++++++ html/changelogs/.all_changelog.yml | 13 ++++++++++++ html/changelogs/AutoChangeLog-pr-13392.yml | 4 ---- html/changelogs/AutoChangeLog-pr-14650.yml | 4 ---- html/changelogs/AutoChangeLog-pr-14702.yml | 4 ---- html/changelogs/AutoChangeLog-pr-14708.yml | 5 ----- html/changelogs/AutoChangeLog-pr-14710.yml | 4 ---- 7 files changed, 36 insertions(+), 21 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-13392.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-14650.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-14702.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-14708.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-14710.yml diff --git a/html/changelog.html b/html/changelog.html index b6b794f5ec..7fb086e159 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,29 @@ -->
+

13 May 2021

+

Linzolle updated:

+
    +
  • anthromorphic -> anthropomorphic
  • +
+

WanderingFox95 updated:

+
    +
  • Pinot Mort (Necropolis Wine), a new, (totally healthy) mixed drink!
  • +
+

qweq12yt updated:

+
    +
  • Fixed sleeping disky spam (it still sleeps soundly, but every minute instead of every two seconds)
  • +
  • Fixed Hulks not breaking cuffs, zipties, restraints.
  • +
+

silicons updated:

+
    +
  • A deterministic wave explosion system has been added. Use it with wave_explosion().
  • +
+

zeroisthebiggay updated:

+
    +
  • vegas style bunny ears
  • +
+

12 May 2021

DeltaFire15 updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 768a1cfda6..289a0176ee 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -29283,3 +29283,16 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. as intended, instead of always being station z tweak: Message for failing the bladeshatter despite succeeding the do_after tweak: Improves bladeshatter a bit by making it safer codewise' +2021-05-13: + Linzolle: + - spellcheck: anthromorphic -> anthropomorphic + WanderingFox95: + - rscadd: Pinot Mort (Necropolis Wine), a new, (totally healthy) mixed drink! + qweq12yt: + - bugfix: Fixed sleeping disky spam (it still sleeps soundly, but every minute instead + of every two seconds) + - bugfix: Fixed Hulks not breaking cuffs, zipties, restraints. + silicons: + - code_imp: A deterministic wave explosion system has been added. Use it with wave_explosion(). + zeroisthebiggay: + - rscadd: vegas style bunny ears diff --git a/html/changelogs/AutoChangeLog-pr-13392.yml b/html/changelogs/AutoChangeLog-pr-13392.yml deleted file mode 100644 index 803c7ee3f5..0000000000 --- a/html/changelogs/AutoChangeLog-pr-13392.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "silicons" -delete-after: True -changes: - - code_imp: "A deterministic wave explosion system has been added. Use it with wave_explosion()." diff --git a/html/changelogs/AutoChangeLog-pr-14650.yml b/html/changelogs/AutoChangeLog-pr-14650.yml deleted file mode 100644 index 0432473299..0000000000 --- a/html/changelogs/AutoChangeLog-pr-14650.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "WanderingFox95" -delete-after: True -changes: - - rscadd: "Pinot Mort (Necropolis Wine), a new, (totally healthy) mixed drink!" diff --git a/html/changelogs/AutoChangeLog-pr-14702.yml b/html/changelogs/AutoChangeLog-pr-14702.yml deleted file mode 100644 index 134122e668..0000000000 --- a/html/changelogs/AutoChangeLog-pr-14702.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "zeroisthebiggay" -delete-after: True -changes: - - rscadd: "vegas style bunny ears" diff --git a/html/changelogs/AutoChangeLog-pr-14708.yml b/html/changelogs/AutoChangeLog-pr-14708.yml deleted file mode 100644 index b0b9e25b1f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-14708.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "qweq12yt" -delete-after: True -changes: - - bugfix: "Fixed sleeping disky spam (it still sleeps soundly, but every minute instead of every two seconds)" - - bugfix: "Fixed Hulks not breaking cuffs, zipties, restraints." diff --git a/html/changelogs/AutoChangeLog-pr-14710.yml b/html/changelogs/AutoChangeLog-pr-14710.yml deleted file mode 100644 index 90dbe0cdac..0000000000 --- a/html/changelogs/AutoChangeLog-pr-14710.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Linzolle" -delete-after: True -changes: - - spellcheck: "anthromorphic -> anthropomorphic" From 040bcb155a9b602173efe735fbbb7076dbf7354c Mon Sep 17 00:00:00 2001 From: zeroisthebiggay <43571008+zeroisthebiggay@users.noreply.github.com> Date: Thu, 13 May 2021 05:03:09 -0400 Subject: [PATCH 24/30] Update uplink_stealth.dm --- code/modules/uplink/uplink_items/uplink_stealth.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/uplink/uplink_items/uplink_stealth.dm b/code/modules/uplink/uplink_items/uplink_stealth.dm index 63d70b9141..f401514542 100644 --- a/code/modules/uplink/uplink_items/uplink_stealth.dm +++ b/code/modules/uplink/uplink_items/uplink_stealth.dm @@ -9,7 +9,7 @@ /datum/uplink_item/stealthy_weapons/telescopicbat name = "Telescopic Baseball Bat" - desc = "A robust telescopic baseball bat that hits like a truck and can be consealed when collapsed." + desc = "A robust telescopic baseball bat that hits like a truck and can be concealed when collapsed." item = /obj/item/melee/baseball_bat/telescopic cost = 2 From 6faeca58d25ef6663968ac172db7f108d92e9c37 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 13 May 2021 04:03:44 -0500 Subject: [PATCH 25/30] Automatic changelog generation for PR #14718 [ci skip] --- html/changelogs/AutoChangeLog-pr-14718.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-14718.yml diff --git a/html/changelogs/AutoChangeLog-pr-14718.yml b/html/changelogs/AutoChangeLog-pr-14718.yml new file mode 100644 index 0000000000..75c6ea6287 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14718.yml @@ -0,0 +1,4 @@ +author: "zeroisthebiggay" +delete-after: True +changes: + - spellcheck: "consealed" From 04b1064cbfab74e477fc2e76bb51ccce13a1f35d Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 13 May 2021 17:50:19 -0500 Subject: [PATCH 26/30] Automatic changelog generation for PR #14715 [ci skip] --- html/changelogs/AutoChangeLog-pr-14715.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-14715.yml diff --git a/html/changelogs/AutoChangeLog-pr-14715.yml b/html/changelogs/AutoChangeLog-pr-14715.yml new file mode 100644 index 0000000000..3913586906 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14715.yml @@ -0,0 +1,4 @@ +author: "keronshb" +delete-after: True +changes: + - balance: "Removes VOG sleep command since it was an undocumented readd." From 4a5561d27324b58b8324f51fd7a19f739072eded Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 14 May 2021 00:31:50 +0000 Subject: [PATCH 27/30] Automatic changelog compile [ci skip] --- html/changelog.html | 16 ++++++++++------ html/changelogs/.all_changelog.yml | 5 +++++ html/changelogs/AutoChangeLog-pr-14715.yml | 4 ---- html/changelogs/AutoChangeLog-pr-14718.yml | 4 ---- 4 files changed, 15 insertions(+), 14 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-14715.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-14718.yml diff --git a/html/changelog.html b/html/changelog.html index 7fb086e159..7e3f24bf3b 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,16 @@ -->
    +

    14 May 2021

    +

    keronshb updated:

    +
      +
    • Removes VOG sleep command since it was an undocumented readd.
    • +
    +

    zeroisthebiggay updated:

    +
      +
    • consealed
    • +
    +

    13 May 2021

    Linzolle updated:

      @@ -785,12 +795,6 @@
      • Fixes cosmetic augments missing their foot sprites.
      - -

      12 March 2021

      -

      R3dtail updated:

      -
        -
      • Adds Periods and moves some words around.
      • -
    GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 289a0176ee..ca2426d1f0 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -29296,3 +29296,8 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - code_imp: A deterministic wave explosion system has been added. Use it with wave_explosion(). zeroisthebiggay: - rscadd: vegas style bunny ears +2021-05-14: + keronshb: + - balance: Removes VOG sleep command since it was an undocumented readd. + zeroisthebiggay: + - spellcheck: consealed diff --git a/html/changelogs/AutoChangeLog-pr-14715.yml b/html/changelogs/AutoChangeLog-pr-14715.yml deleted file mode 100644 index 3913586906..0000000000 --- a/html/changelogs/AutoChangeLog-pr-14715.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "keronshb" -delete-after: True -changes: - - balance: "Removes VOG sleep command since it was an undocumented readd." diff --git a/html/changelogs/AutoChangeLog-pr-14718.yml b/html/changelogs/AutoChangeLog-pr-14718.yml deleted file mode 100644 index 75c6ea6287..0000000000 --- a/html/changelogs/AutoChangeLog-pr-14718.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "zeroisthebiggay" -delete-after: True -changes: - - spellcheck: "consealed" From 739b7cea261b552275776b94b52e91bb375e1878 Mon Sep 17 00:00:00 2001 From: Timothy Teakettle <59849408+timothyteakettle@users.noreply.github.com> Date: Fri, 14 May 2021 16:47:40 +0100 Subject: [PATCH 28/30] borg spraycans have a five second delay before being able to knock someone down again (#14627) * Update crayons.dm * Update crayons.dm * kevin review changes * Update crayons.dm * Update code/game/objects/items/crayons.dm Co-authored-by: DeltaFire <46569814+DeltaFire15@users.noreply.github.com> --- code/game/objects/items/crayons.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm index e584cad9e8..aa48930d6c 100644 --- a/code/game/objects/items/crayons.dm +++ b/code/game/objects/items/crayons.dm @@ -649,6 +649,9 @@ pre_noise = TRUE post_noise = FALSE + var/stun_delay = 0 // how long it takes for you to be able to stun someone with the spraycan again + var/last_stun_time = 0 + /obj/item/toy/crayon/spraycan/isValidSurface(surface) return (istype(surface, /turf/open/floor) || istype(surface, /turf/closed/wall)) @@ -716,7 +719,8 @@ if(C.client) C.blur_eyes(3) C.blind_eyes(1) - if(C.get_eye_protection() <= 0) // no eye protection? ARGH IT BURNS. + if(C.get_eye_protection() <= 0 && (last_stun_time + stun_delay) <= world.time) // no eye protection? ARGH IT BURNS. + last_stun_time = world.time C.confused = max(C.confused, 3) C.DefaultCombatKnockdown(60) if(ishuman(C) && actually_paints) @@ -771,6 +775,7 @@ name = "cyborg spraycan" desc = "A metallic container containing shiny synthesised paint." charges = -1 + stun_delay = 5 SECONDS /obj/item/toy/crayon/spraycan/borg/draw_on(atom/target,mob/user,proximity, params) var/diff = ..() From a3c98920811507494d5a71accdcd6f0d5168b0a1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 14 May 2021 10:47:42 -0500 Subject: [PATCH 29/30] Automatic changelog generation for PR #14627 [ci skip] --- html/changelogs/AutoChangeLog-pr-14627.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-14627.yml diff --git a/html/changelogs/AutoChangeLog-pr-14627.yml b/html/changelogs/AutoChangeLog-pr-14627.yml new file mode 100644 index 0000000000..cde6b62174 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-14627.yml @@ -0,0 +1,4 @@ +author: "timothyteakettle" +delete-after: True +changes: + - balance: "borg spraycans have a five second delay before being able to knock someone down again" From 4ffec1dafa93364c758556cfa3ef3c13169e04a5 Mon Sep 17 00:00:00 2001 From: silicons <2003111+silicons@users.noreply.github.com> Date: Fri, 14 May 2021 09:50:27 -0600 Subject: [PATCH 30/30] Update gateway.dm (#14711) --- code/modules/awaymissions/gateway.dm | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 36ceabe3b4..551c1c5536 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -172,13 +172,15 @@ GLOBAL_LIST_EMPTY(gateway_destinations) /// bumper object, the thing that starts actual teleport var/obj/effect/gateway_portal_bumper/portal /// Visual object for handling the viscontents - var/obj/effect/gateway_portal_effect/portal_visuals + /// DISABLED DUE TO BYOND BUG CAUSING STACK OVERFLOWS OF ANY HUMAN INSTANTIATION NEAR AN ACTIVATED GATEWAY. + /// Probably due to it referencing each other through the gateway (there's a deep loop, maybe BYOND isn't catching something when it usually would) + // var/obj/effect/gateway_portal_effect/portal_visuals /obj/machinery/gateway/Initialize() generate_destination() update_icon() - portal_visuals = new - vis_contents += portal_visuals + // portal_visuals = new + // vis_contents += portal_visuals return ..() /obj/machinery/gateway/proc/generate_destination() @@ -195,7 +197,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations) if(use_power == ACTIVE_POWER_USE) use_power = IDLE_POWER_USE update_icon() - portal_visuals.reset_visuals() + // portal_visuals.reset_visuals() /obj/machinery/gateway/process() if((stat & (NOPOWER)) && use_power) @@ -215,7 +217,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations) return target = D target.activate(destination) - portal_visuals.setup_visuals(target) + // portal_visuals.setup_visuals(target) generate_bumper() use_power = ACTIVE_POWER_USE update_icon()