From 74d74aa7cb7fb07d66be0613614c0d7720870dba Mon Sep 17 00:00:00 2001 From: ThePooba <81843097+ThePooba@users.noreply.github.com> Date: Thu, 3 Oct 2024 11:04:02 -0600 Subject: [PATCH] bugfixes#5 (#3645) --- _maps/map_files/generic/CentCom.dmm | 157 +++++++++++------- code/datums/components/omen.dm | 72 +++++--- code/game/machinery/_machinery.dm | 3 + code/game/machinery/doors/door.dm | 36 ++-- code/game/objects/items/fireaxe.dm | 2 +- code/game/objects/structures/mirror.dm | 4 +- code/modules/admin/smites/bad_luck.dm | 12 +- .../changeling/powers/lesserform.dm | 3 +- code/modules/cargo/coupon.dm | 2 +- code/modules/clothing/head/helmet.dm | 6 +- code/modules/clothing/suits/armor.dm | 6 +- .../carbon/human/species_types/zombies.dm | 3 +- code/modules/mob/transform_procs.dm | 2 + .../religion/sparring/sparring_datum.dm | 2 +- code/modules/unit_tests/lesserform.dm | 4 + .../carbon/human/species_type/teratoma.dm | 2 +- .../spells/spell_types/pointed/smite.dm | 2 +- 17 files changed, 196 insertions(+), 122 deletions(-) diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 4005feeb5a66..bb2531712732 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -19375,12 +19375,13 @@ /turf/open/floor/sandy_dirt, /area/centcom/central_command_areas/admin) "blr" = ( -/obj/effect/mapping_helpers/airlock/access/any/admin/captain, -/obj/machinery/door/airlock/wood/glass{ - name = "Pooba's Bedroom" +/obj/machinery/door/airlock/centcom{ + name = "CentCom Supply" }, -/turf/open/floor/carpet/orange, -/area/centcom/central_command_areas/adminroom) +/obj/effect/mapping_helpers/airlock/access/any/supply/general, +/obj/effect/mapping_helpers/airlock/access/any/admin/general, +/turf/open/indestructible/plating, +/area/centcom/central_command_areas/admin) "blD" = ( /obj/effect/mapping_helpers/airlock/access/any/admin/captain, /obj/machinery/door/airlock/sandstone{ @@ -19561,6 +19562,14 @@ }, /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/admin) +"ccF" = ( +/obj/machinery/door/airlock/centcom{ + name = "CentCom Supply" + }, +/obj/effect/mapping_helpers/airlock/access/any/supply/general, +/obj/effect/mapping_helpers/airlock/access/any/admin/general, +/turf/open/indestructible/plating, +/area/centcom/central_command_areas/supply) "cdN" = ( /obj/machinery/light/directional/east{ dir = 1 @@ -19613,7 +19622,7 @@ /turf/open/floor/wood/large, /area/centcom/central_command_areas/evacuation) "cxr" = ( -/turf/open/misc/dirt, +/turf/open/misc/dirt/station, /area/centcom/central_command_areas/retirement_yard) "cyj" = ( /obj/machinery/suit_storage_unit/industrial/assault_operative, @@ -19731,11 +19740,12 @@ /turf/open/floor/carpet/donk, /area/centcom/central_command_areas/adminroom) "cSL" = ( -/obj/effect/turf_decal/siding/white{ - dir = 4 +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/fax{ + name = "Pooba's Fax Machine" }, -/turf/open/misc/dirt, -/area/centcom/central_command_areas/retirement_yard) +/turf/open/floor/carpet/donk, +/area/centcom/central_command_areas/adminroom) "cTB" = ( /obj/structure/flora/bush/style_3, /obj/effect/decal/cleanable/dirt/dust, @@ -19899,6 +19909,15 @@ /area/centcom/central_command_areas/adminroom) "dQc" = ( /obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/coffeemaker/impressa, +/obj/item/storage/box/coffeepack/robusta{ + pixel_y = -2; + pixel_x = -6 + }, +/obj/item/reagent_containers/cup/coffeepot/bluespace{ + pixel_y = 9; + pixel_x = 5 + }, /turf/open/floor/carpet/donk, /area/centcom/central_command_areas/adminroom) "dRD" = ( @@ -20068,11 +20087,9 @@ }, /area/centcom/central_command_areas/adminroom) "eNq" = ( -/obj/structure/railing{ - dir = 8; - layer = 4.1 - }, -/turf/open/floor/carpet/donk, +/obj/machinery/door/airlock/vault, +/obj/effect/mapping_helpers/airlock/access/any/admin/captain, +/turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/adminroom) "eNY" = ( /turf/open/floor/lowered/iron/pool/cobble/side{ @@ -20130,7 +20147,7 @@ /area/centcom/central_command_areas/evacuation) "fan" = ( /obj/machinery/light/floor/has_bulb, -/turf/open/floor/carpet/orange, +/turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/adminroom) "fcP" = ( /obj/machinery/light/neon_lining{ @@ -20413,11 +20430,7 @@ /area/centcom/central_command_areas/prison) "gzU" = ( /obj/effect/decal/cleanable/blood/innards, -/obj/effect/decal/cleanable/blood/particle, /obj/effect/decal/cleanable/blood/splatter, -/obj/effect/decal/cleanable/blood/hitsplatter{ - dir = 8 - }, /obj/effect/turf_decal/sand/plating, /turf/open/misc/asteroid, /area/centcom/central_command_areas/admin) @@ -20617,6 +20630,14 @@ }, /turf/open/floor/wood/tile, /area/centcom/central_command_areas/adminroom) +"hlg" = ( +/obj/machinery/button/door/directional/north{ + name = "Emergency Assistants Fuck Off Button"; + id = "donutstealthisid"; + req_access = "cent_captain" + }, +/turf/open/floor/carpet/orange, +/area/centcom/central_command_areas/adminroom) "hnC" = ( /obj/effect/turf_decal/weather/dirt{ dir = 4; @@ -20692,6 +20713,13 @@ /area/cruiser_dock) "hAP" = ( /obj/machinery/light/directional/west, +/obj/structure/closet/secure_closet/freezer/fridge/all_access, +/obj/item/food/burger/cheese, +/obj/item/food/cheese/firm_cheese, +/obj/item/food/ready_donk/mac_n_cheese, +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/sunset_sarsaparilla, +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/sunset_sarsaparilla, +/obj/item/reagent_containers/cup/glass/drinkingglass/filled/sunset_sarsaparilla, /turf/open/floor/carpet/orange, /area/centcom/central_command_areas/adminroom) "hAS" = ( @@ -21170,7 +21198,7 @@ /area/centcom/central_command_areas/admin) "jUj" = ( /obj/structure/fake_stairs/wood/directional/north, -/turf/open/misc/dirt, +/turf/open/misc/dirt/station, /area/centcom/central_command_areas/retirement_yard) "jVm" = ( /obj/effect/turf_decal/weather/dirt{ @@ -21202,9 +21230,10 @@ /obj/item/storage/fancy/cigarettes/cigpack_syndicate, /obj/item/lighter/skull, /obj/item/storage/box/donkpockets/donkpocketteriyaki, -/obj/item/radio/headset/syndicate/alt/leader, /obj/item/clothing/under/costume/syndie_pajamas, /obj/item/storage/backpack/duffelbag/syndie, +/obj/item/clothing/mask/breath/poob_mask, +/obj/item/mod/control/pre_equipped/elite/flamethrower, /turf/open/floor/carpet/orange, /area/centcom/central_command_areas/adminroom) "kcm" = ( @@ -21530,11 +21559,8 @@ /turf/open/floor/sandy_dirt, /area/centcom/central_command_areas/admin) "mkj" = ( -/obj/structure/railing{ - dir = 1 - }, -/turf/open/floor/carpet/donk, -/area/centcom/central_command_areas/adminroom) +/turf/open/indestructible/plating, +/area/centcom/central_command_areas/admin) "mkD" = ( /obj/structure/flora/bush/fullgrass/style_random, /obj/structure/flora/rock/pile/jungle/large/style_random, @@ -21631,9 +21657,8 @@ /turf/open/floor/iron/dark/smooth_large, /area/centcom/central_command_areas/admin) "nbv" = ( -/obj/effect/turf_decal/siding/white, -/turf/open/misc/dirt, -/area/centcom/central_command_areas/retirement_yard) +/turf/open/floor/iron/dark/herringbone, +/area/centcom/central_command_areas/adminroom) "ncQ" = ( /obj/effect/turf_decal/siding/thinplating_new/dark/corner, /turf/open/floor/iron/smooth, @@ -21806,8 +21831,9 @@ /turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/evacuation) "odD" = ( -/obj/structure/railing, -/obj/structure/chair/office/tactical, +/obj/structure/chair/office/tactical{ + dir = 1 + }, /turf/open/floor/carpet/donk, /area/centcom/central_command_areas/adminroom) "ofy" = ( @@ -21993,6 +22019,11 @@ }, /turf/open/floor/wood/large, /area/centcom/central_command_areas/adminroom) +"oYA" = ( +/obj/structure/table/reinforced/plastitaniumglass, +/obj/machinery/microwave, +/turf/open/floor/carpet/orange, +/area/centcom/central_command_areas/adminroom) "oZB" = ( /obj/machinery/door/airlock/centcom{ name = "Admin Retirement Home" @@ -22269,11 +22300,11 @@ /turf/open/floor/glass/plasma, /area/centcom/central_command_areas/evacuation) "qzu" = ( -/obj/effect/mapping_helpers/airlock/access/any/admin/captain, /obj/machinery/door/airlock/vault{ - name = "Pooba's Lair" + name = "Pooba's Office" }, -/turf/open/floor/carpet/orange, +/obj/effect/mapping_helpers/airlock/access/any/admin/captain, +/turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/adminroom) "qCL" = ( /obj/structure/closet/crate/cardboard, @@ -22651,9 +22682,12 @@ /turf/open/water, /area/centcom/central_command_areas/admin) "sxY" = ( -/turf/open/chasm{ - name = "Pooba's Hole of Dead Body Storage +1" - }, +/obj/structure/table/reinforced/plastitaniumglass, +/obj/item/paper/monitorkey, +/obj/item/card/id/advanced/chameleon, +/obj/item/clothing/mask/chameleon, +/obj/item/radio/headset/syndicate/alt/leader, +/turf/open/floor/carpet/donk, /area/centcom/central_command_areas/adminroom) "syU" = ( /obj/effect/turf_decal/sand/plating, @@ -22756,7 +22790,6 @@ /area/centcom/central_command_areas/adminroom) "tiz" = ( /obj/structure/table/reinforced/plastitaniumglass, -/obj/item/clothing/mask/breath/poob_mask, /obj/machinery/light/directional/east, /turf/open/floor/carpet/orange, /area/centcom/central_command_areas/adminroom) @@ -22961,7 +22994,7 @@ /obj/machinery/door/airlock/hatch{ name = "Pooba's Observatory" }, -/turf/open/floor/carpet/donk, +/turf/open/floor/iron/dark/herringbone, /area/centcom/central_command_areas/adminroom) "tYX" = ( /obj/effect/turf_decal/siding/thinplating_new/dark{ @@ -23528,9 +23561,8 @@ /turf/open/floor/grass, /area/centcom/central_command_areas/admin) "xkv" = ( -/obj/structure/railing{ - dir = 4; - layer = 4.1 +/obj/machinery/computer/message_monitor{ + dir = 1 }, /turf/open/floor/carpet/donk, /area/centcom/central_command_areas/adminroom) @@ -23587,9 +23619,6 @@ /turf/open/floor/grass, /area/centcom/central_command_areas/retirement_yard) "xGe" = ( -/obj/effect/decal/cleanable/blood/hitsplatter{ - dir = 8 - }, /obj/effect/turf_decal/sand/plating, /obj/effect/decal/cleanable/piss_stain, /turf/open/misc/sandy_dirt, @@ -50533,7 +50562,7 @@ kpH cQL aaW xkv -jAA +cSL kpH aaa aiF @@ -50790,7 +50819,7 @@ kpH dQc odD sxY -mkj +jAA kpH aaa aiF @@ -51046,7 +51075,7 @@ iOc kpH aKc jth -eNq +jAA jAA kpH aaa @@ -51559,8 +51588,8 @@ yhF yhF qzu fan -ayR -ayR +eNq +nbv fan kpH aaa @@ -51818,7 +51847,7 @@ kpH kpH kpH kpH -blr +tYn kpH aaa aiF @@ -52074,7 +52103,7 @@ egP kpH rYm hAP -ayR +oYA ayR kpH aaa @@ -52329,7 +52358,7 @@ mUv yhF dtE kpH -ayR +hlg ayR ayR ayR @@ -52848,9 +52877,9 @@ kpH kpH kpH kpH -aaa -aiF +aOn aiF +ccF aiN aiF aiF @@ -53103,6 +53132,11 @@ kjO erK erK erK +blr +mkj +mkj +mkj +mkj aOn aaa aaa @@ -53122,11 +53156,6 @@ aaa aaa aaa aaa -aaa -aaa -aaa -aaa -aaa akG atj atj @@ -53879,8 +53908,8 @@ acd acd bjH dwU -cSL -cSL +cxr +cxr azQ hxZ azQ @@ -56464,7 +56493,7 @@ aox aSy ayI cxr -nbv +cxr aYr acv aYr diff --git a/code/datums/components/omen.dm b/code/datums/components/omen.dm index d7ea8b18c6f2..e0bc45cded17 100644 --- a/code/datums/components/omen.dm +++ b/code/datums/components/omen.dm @@ -7,29 +7,44 @@ * Omens are removed once the victim is either maimed by one of the possible injuries, or if they receive a blessing (read: bashing with a bible) from the chaplain. */ /datum/component/omen - dupe_mode = COMPONENT_DUPE_UNIQUE + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS /// Whatever's causing the omen, if there is one. Destroying the vessel won't stop the omen, but we destroy the vessel (if one exists) upon the omen ending var/obj/vessel - /// If the omen is permanent, it will never go away - var/permanent = FALSE + /// How many incidents are left. If 0 exactly, it will get deleted. + var/incidents_left = INFINITY /// Base probability of negative events. Cursed are half as unlucky. var/luck_mod = 1 /// Base damage from negative events. Cursed take 25% less damage. var/damage_mod = 1 -/datum/component/omen/Initialize(obj/vessel, permanent, luck_mod, damage_mod) +/datum/component/omen/Initialize(obj/vessel, incidents_left, luck_mod, damage_mod) if(!isliving(parent)) return COMPONENT_INCOMPATIBLE if(istype(vessel)) src.vessel = vessel RegisterSignal(vessel, COMSIG_QDELETING, PROC_REF(vessel_qdeleting)) - src.permanent = permanent + if(!isnull(incidents_left)) + src.incidents_left = incidents_left if(!isnull(luck_mod)) src.luck_mod = luck_mod if(!isnull(damage_mod)) src.damage_mod = damage_mod +/datum/component/omen/InheritComponent(obj/vessel, incidents_left, luck_mod, damage_mod) + // If we have more incidents left the new one gets deleted. + if(src.incidents_left > incidents_left) + return // make slimes get nurtiton from plasmer + // Otherwise we set our incidents remaining to the higher, newer value. + src.incidents_left = incidents_left + // The new omen is weaker than our current omen? Let's split the difference. + if(src.luck_mod > luck_mod) + src.luck_mod += luck_mod * 0.5 + if(src.damage_mod > damage_mod) + src.luck_mod += luck_mod * 0.5 + // This means that if you had a strong temporary omen and it was replaced by a weaker but permanent omen, the latter is made worse. + // Feature! + /datum/component/omen/Destroy(force) var/mob/living/person = parent to_chat(person, span_nicegreen("You feel a horrible omen lifted off your shoulders!")) @@ -42,6 +57,11 @@ return ..() +/datum/component/omen/proc/consume_omen() + incidents_left-- + if(incidents_left < 1) + qdel(src) + /datum/component/omen/RegisterWithParent() RegisterSignal(parent, COMSIG_MOVABLE_MOVED, PROC_REF(check_accident)) RegisterSignal(parent, COMSIG_ON_CARBON_SLIP, PROC_REF(check_slip)) @@ -64,9 +84,21 @@ return var/mob/living/living_guy = our_guy - if(!prob(15 * luck_mod)) - return + var/effective_luck = luck_mod + // If there's nobody to witness the misfortune, make it less likely. + // This way, we allow for people to be able to get into hilarious situations without making the game nigh unplayable most of the time. + + var/has_watchers = FALSE + for(var/mob/viewer in viewers(our_guy, world.view)) + if(viewer.client) + has_watchers = TRUE + break + if(!has_watchers) + effective_luck *= 0.5 + + if(!prob(15 * effective_luck)) + return var/our_guy_pos = get_turf(living_guy) for(var/obj/machinery/door/airlock/darth_airlock in our_guy_pos) if(darth_airlock.locked || !darth_airlock.hasPower()) @@ -80,8 +112,7 @@ if(istype(our_guy_pos, /turf/open/floor/noslip/tram_plate/energized)) var/turf/open/floor/noslip/tram_plate/energized/future_tram_victim = our_guy_pos if(future_tram_victim.toast(living_guy)) - if(!permanent) - qdel(src) + consume_omen() return for(var/turf/the_turf as anything in get_adjacent_open_turfs(living_guy)) @@ -90,8 +121,7 @@ if(living_guy.can_z_move(DOWN, the_turf, z_move_flags = ZMOVE_FALL_FLAGS)) to_chat(living_guy, span_warning("A malevolent force guides you towards the edge...")) living_guy.throw_at(the_turf, 1, 10, force = MOVE_FORCE_EXTREMELY_STRONG) - if(!permanent) - qdel(src) + consume_omen() return for(var/obj/machinery/vending/darth_vendor in the_turf) @@ -99,14 +129,13 @@ continue to_chat(living_guy, span_warning("A malevolent force tugs at the [darth_vendor]...")) INVOKE_ASYNC(darth_vendor, TYPE_PROC_REF(/obj/machinery/vending, tilt), living_guy) - if(!permanent) - qdel(src) + consume_omen() return /datum/component/omen/proc/slam_airlock(obj/machinery/door/airlock/darth_airlock) . = darth_airlock.close(force_crush = TRUE) - if(. && !permanent && !prob(66.6)) - qdel(src) + if(.) + consume_omen() /// If we get knocked down, see if we have a really bad slip and bash our head hard /datum/component/omen/proc/check_slip(mob/living/our_guy, amount) @@ -124,8 +153,7 @@ our_guy.visible_message(span_danger("[our_guy] hits [our_guy.p_their()] head really badly falling down!"), span_userdanger("You hit your head really badly falling down!")) the_head.receive_damage(75 * damage_mod) our_guy.adjustOrganLoss(ORGAN_SLOT_BRAIN, 100 * damage_mod) - if(!permanent) - qdel(src) + consume_omen() return @@ -133,7 +161,7 @@ /datum/component/omen/proc/check_bless(mob/living/our_guy, category) SIGNAL_HANDLER - if(permanent) + if(incidents_left == INFINITY) return if(!("blessing" in our_guy.mob_mood.mood_events)) @@ -145,7 +173,7 @@ /datum/component/omen/proc/check_death(mob/living/our_guy) SIGNAL_HANDLER - if(permanent) + if(incidents_left == INFINITY) return qdel(src) @@ -170,7 +198,7 @@ /datum/component/omen/smite /datum/component/omen/smite/check_death(mob/living/our_guy) - if(!permanent) + if(incidents_left == INFINITY) return ..() death_explode(our_guy) @@ -181,8 +209,8 @@ * Has only a 50% chance of bad things happening, and takes only 25% of normal damage. */ /datum/component/omen/quirk - permanent = TRUE - luck_mod = 0.5 // 50% chance of bad things happening + incidents_left = INFINITY + luck_mod = 0.4 // 30% chance of bad things happening damage_mod = 0.25 // 25% of normal damage /datum/component/omen/quirk/RegisterWithParent() diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 728df8ba25cc..0d14697b7624 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -410,6 +410,9 @@ /obj/machinery/proc/close_machine(atom/movable/target, density_to_set = TRUE) state_open = FALSE set_density(density_to_set) + if (!density) + update_appearance() + return if(!target) for(var/atom in loc) if (!(can_be_occupant(atom))) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index a0d432cefd9a..559461bf5f6a 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -483,25 +483,29 @@ open() /obj/machinery/door/proc/crush() - for(var/mob/living/L in get_turf(src)) - L.visible_message(span_warning("[src] closes on [L], crushing [L.p_them()]!"), span_userdanger("[src] closes on you and crushes you!")) - SEND_SIGNAL(L, COMSIG_LIVING_DOORCRUSHED, src) - if(isalien(L)) //For xenos - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans. - L.emote("roar") - else if(ishuman(L)) //For humans - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) - L.emote("scream") - L.Paralyze(100) + for(var/mob/living/future_pancake in get_turf(src)) + future_pancake.visible_message(span_warning("[src] closes on [future_pancake], crushing [future_pancake.p_them()]!"), span_userdanger("[src] closes on you and crushes you!")) + SEND_SIGNAL(future_pancake, COMSIG_LIVING_DOORCRUSHED, src) + if(isalien(future_pancake)) //For xenos + future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE * 1.5) //Xenos go into crit after aproximately the same amount of crushes as humans. + future_pancake.emote("roar") + else if(ismonkey(future_pancake)) + future_pancake.emote("screech") + future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE) + future_pancake.Paralyze(100) + else if(ishuman(future_pancake)) //For humans + future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE) + future_pancake.emote("scream") + future_pancake.Paralyze(100) else //for simple_animals & borgs - L.adjustBruteLoss(DOOR_CRUSH_DAMAGE) + future_pancake.adjustBruteLoss(DOOR_CRUSH_DAMAGE) var/turf/location = get_turf(src) //add_blood doesn't work for borgs/xenos, but add_blood_floor does. - L.add_splatter_floor(location) - log_combat(src, L, "crushed") - for(var/obj/vehicle/sealed/mecha/M in get_turf(src)) - M.take_damage(DOOR_CRUSH_DAMAGE) - log_combat(src, M, "crushed") + future_pancake.add_splatter_floor(location) + log_combat(src, future_pancake, "crushed") + for(var/obj/vehicle/sealed/mecha/mech in get_turf(src)) + mech.take_damage(DOOR_CRUSH_DAMAGE) + log_combat(src, mech, "crushed") /obj/machinery/door/proc/autoclose() if(!QDELETED(src) && !density && !operating && !locked && !welded && autoclose) diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm index e6a9088fe1dc..391cfe06e2f2 100644 --- a/code/game/objects/items/fireaxe.dm +++ b/code/game/objects/items/fireaxe.dm @@ -85,7 +85,7 @@ name = "metallic hydrogen axe" desc = "A lightweight crowbar with an extreme sharp fire axe head attached. It trades it's hefty as a weapon by making it easier to carry around when holstered to suits without having to sacrifice your backpack." force_unwielded = 5 - force_wielded = 15 + force_wielded = 20 demolition_mod = 2 tool_behaviour = TOOL_CROWBAR toolspeed = 1 diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index fbf2ad8e2815..b046313eff72 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -80,7 +80,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) . = ..() if(broken) // breaking a mirror truly gets you bad luck! to_chat(user, span_warning("A chill runs down your spine as [src] shatters...")) - user.AddComponent(/datum/component/omen) + user.AddComponent(/datum/component/, incidents_left = 7) /obj/structure/mirror/bullet_act(obj/projectile/P) if(broken || !isliving(P.firer) || !P.damage) @@ -90,7 +90,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/structure/mirror, 28) if(broken) // breaking a mirror truly gets you bad luck! var/mob/living/unlucky_dude = P.firer to_chat(unlucky_dude, span_warning("A chill runs down your spine as [src] shatters...")) - unlucky_dude.AddComponent(/datum/component/omen) + unlucky_dude.AddComponent(/datum/component/omen, incidents_left = 7) /obj/structure/mirror/atom_break(damage_flag, mapload) . = ..() diff --git a/code/modules/admin/smites/bad_luck.dm b/code/modules/admin/smites/bad_luck.dm index c9f6a94b93a0..34592dd200d4 100644 --- a/code/modules/admin/smites/bad_luck.dm +++ b/code/modules/admin/smites/bad_luck.dm @@ -6,21 +6,23 @@ var/silent /// Is this permanent? - var/permanent + var/incidents /datum/smite/bad_luck/configure(client/user) silent = tgui_alert(user, "Do you want to apply the omen with a player notification?", "Notify Player?", list("Notify", "Silent")) == "Silent" - permanent = tgui_alert(user, "Would you like this to be permanent or removed automatically after the first accident?", "Permanent?", list("Permanent", "Temporary")) == "Permanent" + incidents = tgui_input_number(user, "For how many incidents will the omen last? 0 means permanent.", "Duration?", default = 0, round_value = 1) + if(incidents == 0) + incidents = INFINITY /datum/smite/bad_luck/effect(client/user, mob/living/target) . = ..() //if permanent, replace any existing omen - if(permanent) + if(incidents == INFINITY) var/existing_component = target.GetComponent(/datum/component/omen) qdel(existing_component) - target.AddComponent(/datum/component/omen/smite, permanent = permanent) + target.AddComponent(/datum/component/omen/smite, incidents_left = incidents) if(silent) return to_chat(target, span_warning("You get a bad feeling...")) - if(permanent) + if(incidents == INFINITY) to_chat(target, span_warning("A very bad feeling... As if malevolent forces are watching you...")) diff --git a/code/modules/antagonists/changeling/powers/lesserform.dm b/code/modules/antagonists/changeling/powers/lesserform.dm index 854234af965f..62fa60e2b974 100644 --- a/code/modules/antagonists/changeling/powers/lesserform.dm +++ b/code/modules/antagonists/changeling/powers/lesserform.dm @@ -3,7 +3,7 @@ desc = "We debase ourselves and become lesser. We become a monkey. Costs 5 chemicals." helptext = "The transformation greatly reduces our size, allowing us to slip out of cuffs and climb through vents." button_icon_state = "lesser_form" - chemical_cost = 5 + chemical_cost = 20 // monkestation edit dna_cost = 1 /// Whether to allow the transformation animation to play var/transform_instantly = FALSE @@ -25,6 +25,7 @@ ..() return ismonkey(user) ? unmonkey(user) : become_monkey(user) + /// Stop being a monkey /datum/action/changeling/lesserform/proc/unmonkey(mob/living/carbon/human/user) if(user.movement_type & VENTCRAWLING) diff --git a/code/modules/cargo/coupon.dm b/code/modules/cargo/coupon.dm index fc1c3a6cc659..19be541f150c 100644 --- a/code/modules/cargo/coupon.dm +++ b/code/modules/cargo/coupon.dm @@ -35,7 +35,7 @@ to_chat(cursed, span_warning("The coupon reads 'fuck you' in large, bold text... is- is that a prize, or?")) if(!cursed.GetComponent(/datum/component/omen)) - cursed.AddComponent(/datum/component/omen) + cursed.AddComponent(/datum/component/omen, incidents_left = 2) return TRUE if(HAS_TRAIT(cursed, TRAIT_CURSED)) to_chat(cursed, span_warning("What a horrible night... To have a curse!")) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 2b304c631a76..6d532ef584c6 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -535,12 +535,12 @@ flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH /datum/armor/helmet_elder_atmosian - melee = 25 - bullet = 20 + melee = 30 + bullet = 30 laser = 30 energy = 30 bomb = 85 bio = 10 - fire = 65 + fire = 100 acid = 40 wound = 15 diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index b6a8add54370..0e8b74b4b107 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -561,13 +561,13 @@ ) /datum/armor/armor_elder_atmosian - melee = 25 - bullet = 20 + melee = 30 + bullet = 30 laser = 30 energy = 30 bomb = 85 bio = 10 - fire = 65 + fire = 100 acid = 40 wound = 15 diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index b7f9b81de523..fe0307afdf52 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -92,7 +92,7 @@ mutanttongue = /obj/item/organ/internal/tongue/zombie changesource_flags = MIRROR_BADMIN | WABBAJACK | ERT_SPAWN /// The rate the zombies regenerate at - var/heal_rate = 0.5 + var/heal_rate = 0.6 /// The cooldown before the zombie can start regenerating COOLDOWN_DECLARE(regen_cooldown) @@ -112,6 +112,7 @@ TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, TRAIT_TOXIMMUNE, + TRAIT_NO_PAIN_EFFECTS, // INFECTIOUS UNIQUE TRAIT_STABLEHEART, // Replacement for noblood. Infectious zombies can bleed but don't need their heart. TRAIT_STABLELIVER, // Not necessary but for consistency with above diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm index fe8b58c603a6..37360e77d7a4 100644 --- a/code/modules/mob/transform_procs.dm +++ b/code/modules/mob/transform_procs.dm @@ -32,6 +32,8 @@ icon = initial(icon) invisibility = 0 set_species(/datum/species/monkey) + name = "monkey" + set_name() SEND_SIGNAL(src, COMSIG_HUMAN_MONKEYIZE) uncuff() regenerate_icons() diff --git a/code/modules/religion/sparring/sparring_datum.dm b/code/modules/religion/sparring/sparring_datum.dm index 037b35c26f2f..91c8415c7e5b 100644 --- a/code/modules/religion/sparring/sparring_datum.dm +++ b/code/modules/religion/sparring/sparring_datum.dm @@ -208,7 +208,7 @@ switch(pick(possible_punishments)) if(PUNISHMENT_OMEN) to_chat(interfering, span_warning("You get a bad feeling... for interfering with [chaplain]'s sparring match...")) - interfering.AddComponent(/datum/component/omen) + interfering.AddComponent(/datum/component/omen, incidents_left = 10) if(PUNISHMENT_LIGHTNING) to_chat(interfering, span_warning("[GLOB.deity] has punished you for interfering with [chaplain]'s sparring match!")) lightningbolt(interfering) diff --git a/code/modules/unit_tests/lesserform.dm b/code/modules/unit_tests/lesserform.dm index a719b11dc523..1c7e2bfdcc23 100644 --- a/code/modules/unit_tests/lesserform.dm +++ b/code/modules/unit_tests/lesserform.dm @@ -3,6 +3,7 @@ /datum/unit_test/lesserform/Run() var/mob/living/carbon/human/changeling = allocate(/mob/living/carbon/human/consistent) + var/name = changeling.name changeling.mind_initialize() var/datum/mind/mind = changeling.mind var/datum/antagonist/changeling/changeling_datum = mind.add_antag_datum(/datum/antagonist/changeling) @@ -13,11 +14,14 @@ transform_ability.Trigger() TEST_ASSERT(ismonkey(changeling), "Changeling failed to turn into a monkey after voluntarily transforming using lesser form.") + TEST_ASSERT_NOTEQUAL(name, changeling.name, "Monkeyisation failed to anonymise changeling's name.") changeling.humanize(instant = TRUE) transform_ability.Trigger() + changeling_datum.adjust_chemicals(INFINITY) TEST_ASSERT(ismonkey(changeling), "Changeling failed to turn into a monkey after involuntarily being made into a human.") transform_ability.Trigger() TEST_ASSERT(!ismonkey(changeling), "Changeling failed to stop being a monkey after voluntarily transforming using lesser form.") + TEST_ASSERT_EQUAL(name, changeling.name, "Returning from monkey form failed to restore original name.") changeling.monkeyize(instant = TRUE) transform_ability.Trigger() TEST_ASSERT(!ismonkey(changeling), "Changeling failed to stop being a monkey after being involuntarily turned into one.") diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/teratoma.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/teratoma.dm index a34c3c15b1cd..9b9f73d96eed 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/teratoma.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/teratoma.dm @@ -112,7 +112,7 @@ ) /datum/component/omen/teratoma - permanent = TRUE + incidents_left = INFINITY luck_mod = 0.75 damage_mod = 0.2 diff --git a/monkestation/code/modules/spells/spell_types/pointed/smite.dm b/monkestation/code/modules/spells/spell_types/pointed/smite.dm index bf4bbc9be600..6ff0c3688d02 100644 --- a/monkestation/code/modules/spells/spell_types/pointed/smite.dm +++ b/monkestation/code/modules/spells/spell_types/pointed/smite.dm @@ -55,7 +55,7 @@ switch(picked_smite) //subtype vars moment, I really want a better way to do this if(/datum/smite/bad_luck) var/datum/smite/bad_luck/luck_smite = new picked_smite - luck_smite.permanent = TRUE + luck_smite.incidents = 0 do_smite(luck_smite, cast_on) if(/datum/smite/berforate) var/datum/smite/berforate/shoot_smite = new picked_smite