diff --git a/code/__HELPERS/mob_helpers.dm b/code/__HELPERS/mob_helpers.dm index 3aa5f438782..86d883626db 100644 --- a/code/__HELPERS/mob_helpers.dm +++ b/code/__HELPERS/mob_helpers.dm @@ -388,7 +388,7 @@ * This will create progress bar that lasts for 5 seconds. If the user doesn't move or otherwise do something that would cause the checks to fail in those 5 seconds, do_stuff() would execute. * The Proc returns TRUE upon success (the progress bar reached the end), or FALSE upon failure (the user moved or some other check failed) */ -/proc/do_after(mob/user, delay, needhand = 1, atom/target = null, progress = 1, allow_moving = 0, must_be_held = 0, list/extra_checks = list(), use_default_checks = TRUE) +/proc/do_after(mob/user, delay, needhand = 1, atom/target = null, progress = 1, allow_moving = 0, must_be_held = 0, list/extra_checks = list(), use_default_checks = TRUE, allow_moving_target = FALSE) if(!user) return FALSE var/atom/Tloc = null @@ -437,7 +437,7 @@ . = FALSE break - if(Tloc && (!target || Tloc != target.loc)) + if(!allow_moving_target && Tloc && (!target || Tloc != target.loc)) . = FALSE break diff --git a/code/__HELPERS/trait_helpers.dm b/code/__HELPERS/trait_helpers.dm index 21d632a2e45..cb1146caf35 100644 --- a/code/__HELPERS/trait_helpers.dm +++ b/code/__HELPERS/trait_helpers.dm @@ -232,7 +232,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_CLING_BURSTING "cling_bursting" // This changeling is about to burst into a headslug, block cremation / gibber to prevent nullspace issues #define TRAIT_I_WANT_BRAINS "mob_zombie" // A general trait for tracking if the mob is a zombie. #define TRAIT_ABSTRACT_HANDS "abstract_hands" // Mobs with this trait can only pick up abstract items. -#define TRAIT_SLOW_GRABBER "slow_grabber" // Adds a 1.5 * CLICK_CD_MELEE delay to upgrading into a aggressive grab. #define TRAIT_LANGUAGE_LOCKED "language_locked" // cant add/remove languages until removed (excludes babel because fuck everything i guess) #define TRAIT_HAS_IV_BAG "iv_bag" // Used to check if there is an active IV bag. Currently blocks another IV bags from being inserted. diff --git a/code/_globalvars/traits.dm b/code/_globalvars/traits.dm index 48c993c8bf2..03b2aa2b9b1 100644 --- a/code/_globalvars/traits.dm +++ b/code/_globalvars/traits.dm @@ -95,7 +95,6 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CLING_BURSTING" = TRAIT_CLING_BURSTING, "TRAIT_I_WANT_BRAINS" = TRAIT_I_WANT_BRAINS, "TRAIT_ABSTRACT_HANDS" = TRAIT_ABSTRACT_HANDS, - "TRAIT_SLOW_GRABBER" = TRAIT_SLOW_GRABBER, "TRAIT_LANGUAGE_LOCKED" = TRAIT_LANGUAGE_LOCKED, "TRAIT_HAS_IV_BAG" = TRAIT_HAS_IV_BAG ), diff --git a/code/datums/components/zombie_regen.dm b/code/datums/components/zombie_regen.dm index 416f3deffa7..a23f2e81037 100644 --- a/code/datums/components/zombie_regen.dm +++ b/code/datums/components/zombie_regen.dm @@ -29,6 +29,7 @@ return zombie_rejuv() to_chat(zomboid, "We... Awaken...") + zomboid.notify_ghost_cloning("Your zombie body has risen again, re-enter your corpse to continue the feast!", source = zomboid) // If no client, but they were a player thats not SSD (debrained, revived but hasn't returned to body, etc) if(zomboid.stat != CONSCIOUS || HAS_TRAIT(zomboid, TRAIT_HANDS_BLOCKED)) @@ -128,6 +129,8 @@ target = pick(targets) if(zomboid.Adjacent(target) && safe_active_hand(zomboid)) + if(!zomboid.get_active_hand()) + zomboid.put_in_hands(new /obj/item/zombie_claw()) zomboid.a_intent = INTENT_HARM zomboid.ClickOn(target) return diff --git a/code/datums/diseases/_disease.dm b/code/datums/diseases/_disease.dm index 00e4479e899..e634ddfed1d 100644 --- a/code/datums/diseases/_disease.dm +++ b/code/datums/diseases/_disease.dm @@ -89,14 +89,17 @@ GLOBAL_LIST_INIT(diseases, subtypesof(/datum/disease)) stage = min(stage, max_stages) - if(!cure && prob(stage_prob)) + handle_stage_advance(cure) + + return handle_cure_testing(cure) + +/datum/disease/proc/handle_stage_advance(has_cure = FALSE) + if(!has_cure && prob(stage_prob)) stage = min(stage + 1, max_stages) if(!discovered && stage >= CEILING(max_stages * discovery_threshold, 1)) // Once we reach a late enough stage, medical HUDs can pick us up even if we regress discovered = TRUE affected_mob.med_hud_set_status() - return handle_cure_testing(cure) - /datum/disease/proc/handle_cure_testing(has_cure = FALSE) if(has_cure && prob(cure_chance)) stage = max(stage - 1, 1) diff --git a/code/datums/diseases/zombie_virus.dm b/code/datums/diseases/zombie_virus.dm index 418cc539c47..1bd7beb6681 100644 --- a/code/datums/diseases/zombie_virus.dm +++ b/code/datums/diseases/zombie_virus.dm @@ -13,10 +13,12 @@ allow_dead = TRUE disease_flags = CAN_CARRY virus_heal_resistant = TRUE - stage_prob = 1 + stage_prob = 100 // It isn't actually 100%, but is instead based on a timer cure_chance = 80 /// How far this particular virus is in being cured (0-4) var/cure_stage = 0 + /// Cooldown until the virus can advance to the next stage + COOLDOWN_DECLARE(stage_timer) /datum/disease/zombie/stage_act() if(stage == 8) @@ -34,7 +36,7 @@ SSticker.mode.zombie_infected -= affected_mob if(affected_mob.reagents.has_reagent("zombiecure4")) return - handle_rot(TRUE) + handle_rot() stage = 7 return FALSE SSticker.mode.zombie_infected |= affected_mob @@ -79,17 +81,24 @@ if(stage == 6 && !affected_mob.reagents.has_reagent("zombiecure3")) // cure 3 can delay it, but not cure it if(prob(10)) to_chat(affected_mob, "You feel your flesh rotting.") - handle_rot() + if(prob(10) || affected_mob.stat != DEAD) + handle_rot() if(7) - if(!handle_rot(TRUE)) + if(!handle_rot()) stage = 6 return +/datum/disease/zombie/handle_stage_advance(has_cure = FALSE) + if(!stage_timer) + COOLDOWN_START(src, stage_timer, 1 MINUTES) // for the first infection + if(affected_mob.stat != DEAD || !prob(30)) // when the body is dead, it always has a 30% chance to advance regardless + if(!COOLDOWN_FINISHED(src, stage_timer)) + return + COOLDOWN_START(src, stage_timer, 1 MINUTES) + ..() -/datum/disease/zombie/proc/handle_rot(forced = FALSE) - if(!prob(20) && !forced && affected_mob.stat != DEAD) - return FALSE +/datum/disease/zombie/proc/handle_rot() var/mob/living/carbon/human/H = affected_mob if(!istype(H)) return FALSE diff --git a/code/modules/antagonists/zombie/datum_zombie.dm b/code/modules/antagonists/zombie/datum_zombie.dm index 0a6032bc9dd..9e7f181b4dd 100644 --- a/code/modules/antagonists/zombie/datum_zombie.dm +++ b/code/modules/antagonists/zombie/datum_zombie.dm @@ -9,7 +9,7 @@ RESTRICT_TYPE(/datum/antagonist/zombie) clown_removal_text = "You feel funnier again." wiki_page_name = "Zombie" var/list/old_languages = list() // someone make this better to prevent langs changing if species changes while zombie somehow - var/static/list/zombie_traits = list(TRAIT_LANGUAGE_LOCKED, TRAIT_GOTTAGOSLOW, TRAIT_ABSTRACT_HANDS, TRAIT_SLOW_GRABBER, TRAIT_NOBREATH) + var/static/list/zombie_traits = list(TRAIT_LANGUAGE_LOCKED, TRAIT_GOTTAGOSLOW, TRAIT_ABSTRACT_HANDS, TRAIT_NOBREATH) var/datum/unarmed_attack/claws/claw_attack // possibly upgrades for the zombies after eating brains? Better vision (/datum/action/changeling/augmented_eyesight), better weapons (armblade), better infection, more inhereint armor (physiology) diff --git a/code/modules/antagonists/zombie/zombie_spells.dm b/code/modules/antagonists/zombie/zombie_spells.dm index 19618c24c1f..b1526e8a254 100644 --- a/code/modules/antagonists/zombie/zombie_spells.dm +++ b/code/modules/antagonists/zombie/zombie_spells.dm @@ -62,18 +62,20 @@ /obj/item/zombie_claw/Initialize(mapload, new_parent_spell) . = ..() - parent_spell = new_parent_spell - RegisterSignal(parent_spell.action.owner, COMSIG_MOB_WILLINGLY_DROP, PROC_REF(dispel)) + if(new_parent_spell) + parent_spell = new_parent_spell + RegisterSignal(parent_spell.action.owner, COMSIG_MOB_WILLINGLY_DROP, PROC_REF(dispel)) /obj/item/zombie_claw/proc/dispel(mob/user) if(user && user.get_active_hand() == src) qdel(src) /obj/item/zombie_claw/Destroy() - UnregisterSignal(parent_spell.action.owner, COMSIG_MOB_WILLINGLY_DROP) if(parent_spell) - parent_spell.our_claws -= src - parent_spell = null + UnregisterSignal(parent_spell.action.owner, COMSIG_MOB_WILLINGLY_DROP) + if(parent_spell) + parent_spell.our_claws -= src + parent_spell = null return ..() /obj/item/zombie_claw/customised_abstract_text(mob/living/carbon/owner) diff --git a/code/modules/mob/living/carbon/carbon_procs.dm b/code/modules/mob/living/carbon/carbon_procs.dm index 6cbdbd9d46f..98758accbf9 100644 --- a/code/modules/mob/living/carbon/carbon_procs.dm +++ b/code/modules/mob/living/carbon/carbon_procs.dm @@ -892,16 +892,18 @@ GLOBAL_LIST_INIT(ventcrawl_machinery, list(/obj/machinery/atmospherics/unary/ven /mob/living/carbon/proc/cuff_resist(obj/item/I, breakouttime = 600, cuff_break = 0) breakouttime = I.breakouttime + if(HAS_TRAIT(src, TRAIT_I_WANT_BRAINS)) + breakouttime /= 2 - var/displaytime = breakouttime / 10 if(!cuff_break) if(has_status_effect(STATUS_EFFECT_REMOVE_CUFFS)) to_chat(src, "You are already trying to remove [I].") return apply_status_effect(STATUS_EFFECT_REMOVE_CUFFS) visible_message("[src] attempts to remove [I]!") - to_chat(src, "You attempt to remove [I]... (This will take around [displaytime] seconds and you need to stand still.)") - if(do_after(src, breakouttime, 0, target = src)) + var/is_zombie = HAS_TRAIT(src, TRAIT_I_WANT_BRAINS) + to_chat(src, "You attempt to remove [I]... (This will take around [breakouttime / 10] seconds[is_zombie ? "" : " and you need to stand still"].)") + if(do_after(src, breakouttime, 0, target = src, allow_moving = is_zombie, allow_moving_target = is_zombie)) remove_status_effect(STATUS_EFFECT_REMOVE_CUFFS) if(I.loc != src || buckled) return diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 63cd2bee190..8958daeee77 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -64,9 +64,6 @@ clean_grabbed_by(assailant, affecting) adjust_position() - if(HAS_TRAIT(assailant, TRAIT_SLOW_GRABBER)) - assailant.changeNext_move(1.5 * CLICK_CD_MELEE) - /obj/item/grab/Destroy() if(affecting) UnregisterSignal(affecting, COMSIG_MOVABLE_MOVED) diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm index be8b3a02cf2..76d273342e6 100644 --- a/code/modules/reagents/chemistry/reagents/medicine.dm +++ b/code/modules/reagents/chemistry/reagents/medicine.dm @@ -918,7 +918,7 @@ if(method == REAGENT_INGEST || (method == REAGENT_TOUCH && prob(25))) if(M.stat == DEAD) if(M.getBruteLoss() + M.getFireLoss() + M.getCloneLoss() >= 150) - if(IS_CHANGELING(M)) + if(IS_CHANGELING(M) || HAS_TRAIT(M, TRAIT_I_WANT_BRAINS)) return M.delayed_gib(TRUE) return diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index c3c91428bfe..7bb6914aa8a 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -547,10 +547,10 @@ id = "zombiecure2" result = "zombiecure2" cure_level = 2 - amt_req_cures = 2 + amt_req_cures = 3 /datum/chemical_reaction/zombie/second/get_possible_cures() - return list("vomit", "jenkem", "charcoal", "egg", "salglu_solution", "toxin", "atropine", "lye", "sacid", "facid", "sodawater", "surge", "ultralube", "happiness", "morphine") + return list("salglu_solution", "toxin", "atropine", "lye", "sodawater", "happiness", "morphine", "teporone") /datum/chemical_reaction/zombie/third name = "Anti-Plague Sequence Gamma" @@ -561,7 +561,7 @@ required_symptom = /datum/symptom/flesh_eating /datum/chemical_reaction/zombie/third/get_possible_cures() - return list("colorful_reagent", "bacchus_blessing", "pen_acid", "teporone", "glyphosate", "lazarus_reagent", "omnizine", "sarin", "mitocholide", "ants", "clf3", "sorium", "????", "aranesp") + return list("vomit", "jenkem", "charcoal", "egg", "sacid", "facid", "surge", "ultralube", "mitocholide") /datum/chemical_reaction/zombie/four name = "Anti-Plague Sequence Omega" @@ -572,7 +572,9 @@ required_symptom = /datum/symptom/heal/metabolism /datum/chemical_reaction/zombie/four/get_possible_cures() - return list("entpoly", "tinlux", "earthsblood", "bath_salts", "rezadone", "rotatium", "krokodil", "fliptonium") + return list("colorful_reagent", "bacchus_blessing", "pen_acid", "glyphosate", "lazarus_reagent", "omnizine", "sarin", "ants", "clf3", "sorium", "????", "aranesp") + // Heres some ideas for making this harder if people ever get too good at curing zombies some day + // return list("entpoly", "tinlux", "earthsblood", "bath_salts", "rezadone", "rotatium", "krokodil", "fliptonium") /datum/chemical_reaction/dupe_zomb_cure name = "Duplicate Zombie Cure"