From 74d6473c3be5ee1f9f3153a4d246145afb18c112 Mon Sep 17 00:00:00 2001 From: Artur Date: Tue, 25 Feb 2020 17:07:40 +0200 Subject: [PATCH 01/23] Initial Commit Changes isvamp() to isbloodsucker(), adds a isvampire() check for the race itself, reworks regen cores codewise, adds a defib check for bloodsuckers --- code/__DEFINES/is_helpers.dm | 3 +- .../game/gamemodes/bloodsucker/bloodsucker.dm | 99 +++++-------------- code/game/machinery/cloning.dm | 2 +- .../bloodsucker/objects/bloodsucker_crypt.dm | 14 +-- .../mining/equipment/regenerative_core.dm | 27 +++-- .../living/carbon/alien/special/facehugger.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- 7 files changed, 48 insertions(+), 101 deletions(-) diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 55bfcaff79..e69f5df05e 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -67,6 +67,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid) ) #define isdwarf(A) (is_species(A, /datum/species/dwarf)) #define isdullahan(A) (is_species(A, /datum/species/dullahan)) +#define isbloodsuckerire(A) (is_species(A,/datum/species/vampire)) // Citadel specific species #define isipcperson(A) (is_species(A, /datum/species/ipc)) @@ -263,4 +264,4 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define isblobmonster(O) (istype(O, /mob/living/simple_animal/hostile/blob)) -#define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs)) \ No newline at end of file +#define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs)) diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index a45e989318..3737d0a5b1 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -9,7 +9,7 @@ var/list/vassal_allowed_antags = list(/datum/antagonist/brother, /datum/antagonist/traitor, /datum/antagonist/traitor/internal_affairs, /datum/antagonist/survivalist, \ /datum/antagonist/rev, /datum/antagonist/nukeop, /datum/antagonist/pirate, /datum/antagonist/cult, /datum/antagonist/abductee, /datum/antagonist/valentine, /datum/antagonist/heartbreaker,) // The antags you're allowed to be if turning Vassal. -/proc/isvamp(mob/living/M) +/proc/isbloodsucker(mob/living/M) return istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/bloodsucker) /datum/game_mode/bloodsucker @@ -70,49 +70,28 @@ // Gamemode is all done being set up. We have all our Vamps. We now pick objectives and let them know what's happening. /datum/game_mode/bloodsucker/post_setup() - // Sunlight (Creating Bloodsuckers manually will check to create this, too) check_start_sunlight() - // Vamps for(var/datum/mind/bloodsucker in bloodsuckers) - // spawn() --> Run block of code but game continues on past it. - // sleep() --> Run block of code and freeze code there (including whoever called us) until it's resolved. - - //Clean Bloodsucker Species (racist?) - //clean_invalid_species(bloodsucker) - // TO-DO !!! - - // Add Bloodsucker Antag Datum (or remove from list on Fail) - if (!make_bloodsucker(bloodsucker)) + if(!make_bloodsucker(bloodsucker)) bloodsuckers -= bloodsucker - - // NOTE: Hunters are done in ..() parent proc - return ..() -// Checking for ACTUALLY Dead Vamps -/datum/game_mode/bloodsucker/are_special_antags_dead() - // Bloodsucker not Final Dead - for(var/datum/mind/bloodsucker in bloodsuckers) - if(!bloodsucker.AmFinalDeath()) - return FALSE - return TRUE - // Init Sunlight (called from datum_bloodsucker.on_gain(), in case game mode isn't even Bloodsucker /datum/game_mode/proc/check_start_sunlight() // Already Sunlight (and not about to cancel) - if (istype(bloodsucker_sunlight) && !bloodsucker_sunlight.cancel_me) + if(istype(bloodsucker_sunlight) && !bloodsucker_sunlight.cancel_me) return bloodsucker_sunlight = new () // End Sun (last bloodsucker removed) /datum/game_mode/proc/check_cancel_sunlight() // No Sunlight - if (!istype(bloodsucker_sunlight)) + if(!istype(bloodsucker_sunlight)) return - if (bloodsuckers.len <= 0) + if(bloodsuckers.len <= 0) bloodsucker_sunlight.cancel_me = TRUE qdel(bloodsucker_sunlight) bloodsucker_sunlight = null @@ -158,64 +137,36 @@ /datum/game_mode/proc/make_bloodsucker(datum/mind/bloodsucker, datum/mind/creator = null) // NOTE: This is a game_mode/proc, NOT a game_mode/bloodsucker/proc! We need to access this function despite the game mode. - if (!can_make_bloodsucker(bloodsucker)) + if(!can_make_bloodsucker(bloodsucker)) return FALSE - // Create Datum: Fledgling var/datum/antagonist/bloodsucker/A - - // [FLEDGLING] - if (creator) + // [FLEDGLING] AKA a young vampire. + if(creator) A = new (bloodsucker) A.creator = creator bloodsucker.add_antag_datum(A) // Log message_admins("[bloodsucker] has become a Bloodsucker, and was created by [creator].") log_admin("[bloodsucker] has become a Bloodsucker, and was created by [creator].") - // [MASTER] else A = bloodsucker.add_antag_datum(ANTAG_DATUM_BLOODSUCKER) - - return TRUE - /datum/game_mode/proc/remove_bloodsucker(datum/mind/bloodsucker) bloodsucker.remove_antag_datum(ANTAG_DATUM_BLOODSUCKER) - /datum/game_mode/proc/clean_invalid_species(datum/mind/bloodsucker) // Only checking for Humans here - if (!ishuman(bloodsucker.current) || !bloodsucker.current.client) - return - var/am_valid = TRUE - var/mob/living/carbon/human/H = bloodsucker.current - - // Check if PLASMAMAN? - if(NOBLOOD in H.dna.species.species_traits) - am_valid = FALSE - - // PROBLEM: - // - // Setting species leaves clothes on. If you were a plasmaman, we need to reassign your entire outfit. Otherwise - // everyone will wonder why you're a human with Plasma clothes (jk they'll know you're antag) - - // Convert to HUMAN (along with ID and PDA) - if (!am_valid) - H.set_species(/datum/species/human) - H.real_name = H.client.prefs.custom_names["human"] - var/obj/item/card/id/ID = H.wear_id?.GetID() - if(ID) - ID.registered_name = H.real_name - ID.update_label() - + if(ishuman(bloodsucker.current) || bloodsucker.current.client && NOBLOOD in H.dna.species.species_traits) + var/mob/living/carbon/human/H = bloodsucker.current + //Give them blood if they dont have any. + H.dna.species.species_traits =- NOBLOOD /datum/game_mode/proc/can_make_vassal(mob/living/target, datum/mind/creator, display_warning=TRUE)//, check_antag_or_loyal=FALSE) // Not Correct Type: Abort - if (!iscarbon(target) || !creator) - return FALSE - if (target.stat > UNCONSCIOUS) + if(!iscarbon(target) || !creator || target.stat > UNCONSCIOUS) return FALSE // Check Overdose: Am I even addicted to blood? Do I even have any in me? //if (!target.reagents.addiction_list || !target.reagents.reagent_list) @@ -233,23 +184,23 @@ //message_admins("DEBUG4: can_make_vassal() Abort: No Blood") // return 0 // No Mind! - if (!target.mind || !target.mind.key) - if (display_warning) + if(!target.mind || !target.mind.key) + if(display_warning) to_chat(creator, "[target] isn't self-aware enough to be made into a Vassal.") return FALSE // Already MY Vassal var/datum/antagonist/vassal/V = target.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if (istype(V) && V.master) - if (V.master.owner == creator) - if (display_warning) + if(istype(V) && V.master) + if(V.master.owner == creator) + if(display_warning) to_chat(creator, "[target] is already your loyal Vassal!") else - if (display_warning) + if(display_warning) to_chat(creator, "[target] is the loyal Vassal of another Bloodsucker!") return FALSE // Already Antag or Loyal (Vamp Hunters count as antags) - if (target.mind.enslaved_to || AmInvalidAntag(target.mind)) //!VassalCheckAntagValid(target.mind, check_antag_or_loyal)) // HAS_TRAIT(target, TRAIT_MINDSHIELD, "implant") || - if (display_warning) + if(target.mind.enslaved_to || AmInvalidAntag(target.mind)) //!VassalCheckAntagValid(target.mind, check_antag_or_loyal)) // HAS_TRAIT(target, TRAIT_MINDSHIELD, "implant") || + if(display_warning) to_chat(creator, "[target] resists the power of your blood to dominate their mind!") return FALSE return TRUE @@ -268,15 +219,15 @@ return FALSE // Does even ONE antag appear in this mind that isn't in the list? Then FAIL! for(var/datum/antagonist/antag_datum in M.antag_datums) - if (!(antag_datum.type in vassal_allowed_antags)) // vassal_allowed_antags is a list stored in the game mode, above. - //message_admins("DEBUG VASSAL: Found Invalid: [antag_datum] // [antag_datum.type]") + // vassal_allowed_antags is a list stored in the game mode, above. + if(!(antag_datum.type in vassal_allowed_antags)) return TRUE //message_admins("DEBUG VASSAL: Valid Antags! (total of [M.antag_datums.len])") // WHEN YOU DELETE THE ABOVE: Remove the 3 second timer on converting the vassal too. return FALSE /datum/game_mode/proc/make_vassal(mob/living/target, datum/mind/creator) - if (!can_make_vassal(target,creator)) + if(!can_make_vassal(target,creator)) return FALSE // Make Vassal var/datum/antagonist/vassal/V = new (target.mind) @@ -285,7 +236,7 @@ target.mind.add_antag_datum(V, V.master.get_team()) // Update Bloodsucker Title (we're a daddy now) B.SelectTitle(am_fledgling = FALSE) // Only works if you have no title yet. - // Log + // lOg it message_admins("[target] has become a Vassal, and is enslaved to [creator].") log_admin("[target] has become a Vassal, and is enslaved to [creator].") return TRUE diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 62304112b2..266fcd0e40 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -157,7 +157,7 @@ mess = TRUE update_icon() return FALSE - if(isvamp(clonemind)) //If the mind is a bloodsucker + if(isbloodsucker(clonemind)) //If the mind is a bloodsucker return FALSE attempting = TRUE //One at a time!! diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm index 9e46203483..2eace3a94d 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm @@ -116,7 +116,7 @@ /obj/structure/bloodsucker/vassalrack/examine(mob/user) . = ..() - if(isvamp(user) || isobserver(user)) + if(isbloodsucker(user) || isobserver(user)) . += {"This is the vassal rack, which allows you to thrall crewmembers into loyal minions in your service."} . += {"You need to first secure the vassal rack by clicking on it while it is in your lair."} . += {"Simply click and hold on a victim, and then drag their sprite on the vassal rack. Alt click on the vassal rack to unbuckle them."} @@ -130,7 +130,7 @@ /obj/structure/bloodsucker/vassalrack/MouseDrop_T(atom/movable/O, mob/user) if(!O.Adjacent(src) || O == user || !isliving(O) || !isliving(user) || useLock || has_buckled_mobs() || user.incapacitated()) return - if(!anchored && isvamp(user)) + if(!anchored && isbloodsucker(user)) to_chat(user, "Until this rack is secured in place, it cannot serve its purpose.") return // PULL TARGET: Remember if I was pullin this guy, so we can restore this @@ -183,7 +183,7 @@ /obj/structure/bloodsucker/vassalrack/user_unbuckle_mob(mob/living/M, mob/user) // Attempt Unbuckle - if(!isvamp(user)) + if(!isbloodsucker(user)) if(M == user) M.visible_message("[user] tries to release themself from the rack!",\ "You attempt to release yourself from the rack!") // For sound if not seen --> "You hear a squishy wet noise.") @@ -454,7 +454,7 @@ /obj/structure/bloodsucker/candelabrum/examine(mob/user) . = ..() - if((isvamp()) || isobserver(user)) + if((isbloodsucker()) || isobserver(user)) . += {"This is a magical candle which drains at the sanity of mortals who are not under your command while it is active."} . += {"You can alt click on it from any range to turn it on remotely, or simply be next to it and click on it to turn it on and off normally."} /* if(user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) @@ -463,12 +463,12 @@ /obj/structure/bloodsucker/candelabrum/attack_hand(mob/user) var/datum/antagonist/vassal/T = user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if(isvamp(user) || istype(T)) + if(isbloodsucker(user) || istype(T)) toggle() /obj/structure/bloodsucker/candelabrum/AltClick(mob/user) // Bloodsuckers can turn their candles on from a distance. SPOOOOKY. - if(isvamp(user)) + if(isbloodsucker(user)) toggle() /obj/structure/bloodsucker/candelabrum/proc/toggle(mob/user) @@ -485,7 +485,7 @@ if(lit) for(var/mob/living/carbon/human/H in viewers(7, src)) var/datum/antagonist/vassal/T = H.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if(isvamp(H) || T) //We dont want vassals or vampires affected by this + if(isbloodsucker(H) || T) //We dont want vassals or vampires affected by this return H.hallucination = 20 SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "vampcandle", /datum/mood_event/vampcandle) diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index e8ba72e62f..65304c5460 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -69,14 +69,15 @@ /obj/item/organ/regenerative_core/afterattack(atom/target, mob/user, proximity_flag) . = ..() - if(proximity_flag && ishuman(target)) + if(proximity_flag) + apply_healing_core(target, user) + +/obj/item/organ/regenerative_core/apply_healing_core(atom/target, mob/user) + if(ishuman(target)) var/mob/living/carbon/human/H = target if(inert) to_chat(user, "[src] has decayed and can no longer be used to heal.") return - if(isvamp(user)) - to_chat(user, "[src] breaks down as it fails to heal your unholy self") - return else if(H.stat == DEAD) to_chat(user, "[src] are useless on the dead.") @@ -87,22 +88,16 @@ else to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.") SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) - H.revive(full_heal = 1) + if(!isbloodsucker(H)) + H.revive(full_heal = TRUE) + else + H.revive(full_heal = FALSE) qdel(src) user.log_message("[user] used [src] to heal [H]! Wake the fuck up, Samurai!", LOG_ATTACK, color="green") //Logging for 'old' style legion core use, when clicking on a sprite of yourself or another. /obj/item/organ/regenerative_core/attack_self(mob/user) //Knouli's first hack! Allows for the use of the core in hand rather than needing to click on the target, yourself, to selfheal. Its a rip of the proc just above - but skips on distance check and only uses 'user' rather than 'target' - if(ishuman(user)) //Check if user is human, no need for distance check as it's self heal - var/mob/living/carbon/human/H = user //Set H to user rather than target - if(inert) //Inert cores are useless - to_chat(user, "[src] has decayed and can no longer be used to heal.") - return - else //Skip on check if the target to be healed is dead as, if you are dead, you're not going to be able to use it on yourself! - to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.") - SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) - H.revive(full_heal = 1) - qdel(src) - H.log_message("[H] used [src] to heal themselves! Making use of Knouli's sexy and intelligent use-in-hand proc!", LOG_ATTACK, color="green") //Logging for 'new' style legion core use, when using the core in-hand. + . = ..() + apply_healing_core(user) /obj/item/organ/regenerative_core/Insert(mob/living/carbon/M, special = 0, drop_if_replaced = TRUE) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 6947ab28f8..de65b775b4 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -252,7 +252,7 @@ return 0 if(M.getorgan(/obj/item/organ/alien/hivenode)) return 0 - if(isvamp(M)) + if(isbloodsucker(M)) return 0 if(ismonkey(M)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 574a5aedd2..d07785873a 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -837,7 +837,7 @@ /mob/living/carbon/proc/can_defib() var/tlimit = DEFIB_TIME_LIMIT * 10 var/obj/item/organ/heart = getorgan(/obj/item/organ/heart) - if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK)) + if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK) || isbloodsucker()) return if((world.time - timeofdeath) > tlimit) return From 5d3f3fc06aca9da08a723127a2736e72ad18db59 Mon Sep 17 00:00:00 2001 From: Artur Date: Fri, 28 Feb 2020 14:11:38 +0200 Subject: [PATCH 02/23] WIP --- code/__DEFINES/is_helpers.dm | 1 + code/__HELPERS/unsorted.dm | 18 +++++- .../game/gamemodes/bloodsucker/bloodsucker.dm | 61 +++++++++--------- .../bloodsucker/bloodsucker_life.dm | 16 ++--- .../bloodsucker/datum_bloodsucker.dm | 24 +++---- .../bloodsucker/objects/bloodsucker_crypt.dm | 10 +-- .../antagonists/bloodsucker/powers/feed.dm | 12 +++- .../food_and_drinks/food/snacks_bread.dm | 12 ++++ .../food_and_drinks/food/snacks_meat.dm | 4 +- .../recipes/tablecraft/recipes_bread.dm | 10 +++ .../recipes/tablecraft/recipes_misc.dm | 3 +- code/modules/hydroponics/grown/garlic.dm | 28 ++++++++ .../carbon/human/species_types/vampire.dm | 6 ++ .../mob/living/simple_animal/hostile/mimic.dm | 1 + code/modules/projectiles/projectile/magic.dm | 2 +- .../chemistry/reagents/food_reagents.dm | 52 +++++++++++++++ icons/obj/hydroponics/growing.dmi | Bin 74172 -> 75144 bytes icons/obj/hydroponics/harvest.dmi | Bin 87028 -> 87285 bytes icons/obj/hydroponics/seeds.dmi | Bin 25641 -> 25871 bytes .../code/modules/reagents/objects/clothes.dm | 4 +- tgstation.dme | 1 + 21 files changed, 200 insertions(+), 65 deletions(-) create mode 100644 code/modules/hydroponics/grown/garlic.dm diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 55bfcaff79..22abe1e4c8 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -67,6 +67,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list( #define iscatperson(A) (ishumanbasic(A) && istype(A.dna.species, /datum/species/human/felinid) ) #define isdwarf(A) (is_species(A, /datum/species/dwarf)) #define isdullahan(A) (is_species(A, /datum/species/dullahan)) +#define isvampire(A) (is_species(A,/datum/species/vampire)) // Citadel specific species #define isipcperson(A) (is_species(A, /datum/species/ipc)) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index af2fb281e6..4193e813fa 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1562,4 +1562,20 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) channels_to_use += channel if(channels_to_use.len) - world.TgsChatBroadcast() \ No newline at end of file + world.TgsChatBroadcast() + +//Checks to see if either the victim has a garlic necklace or garlic in their blood +/proc/sucking_checks(var/mob/living/carbon/target, check_neck, check_blood) + //Byppass this if the target isnt carbon. + if(!iscarbon) + return TRUE + if(check_neck) + if(istype(target.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + to_chat(owner, "[victim] is wearing a garlic clove around their neck! You cant drink from them while it is on them!") + return FALSE + if(check_blood) + if(target.reagents.has_reagent(/datum/reagent/consumable/garlic)) + to_chat(target, "[H] tries to bite you, but recoils in disgust!") + to_chat(owner, "[victim] reeks of garlic! you can't bring yourself to drain such tainted blood.") + return FALSE + return TRUE diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index a45e989318..3cd68e3758 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -91,28 +91,19 @@ return ..() -// Checking for ACTUALLY Dead Vamps -/datum/game_mode/bloodsucker/are_special_antags_dead() - // Bloodsucker not Final Dead - for(var/datum/mind/bloodsucker in bloodsuckers) - if(!bloodsucker.AmFinalDeath()) - return FALSE - return TRUE - - // Init Sunlight (called from datum_bloodsucker.on_gain(), in case game mode isn't even Bloodsucker /datum/game_mode/proc/check_start_sunlight() // Already Sunlight (and not about to cancel) - if (istype(bloodsucker_sunlight) && !bloodsucker_sunlight.cancel_me) + if(istype(bloodsucker_sunlight) && !bloodsucker_sunlight.cancel_me) return bloodsucker_sunlight = new () // End Sun (last bloodsucker removed) /datum/game_mode/proc/check_cancel_sunlight() // No Sunlight - if (!istype(bloodsucker_sunlight)) + if(!istype(bloodsucker_sunlight)) return - if (bloodsuckers.len <= 0) + if(bloodsuckers.len <= 0) bloodsucker_sunlight.cancel_me = TRUE qdel(bloodsucker_sunlight) bloodsucker_sunlight = null @@ -158,14 +149,14 @@ /datum/game_mode/proc/make_bloodsucker(datum/mind/bloodsucker, datum/mind/creator = null) // NOTE: This is a game_mode/proc, NOT a game_mode/bloodsucker/proc! We need to access this function despite the game mode. - if (!can_make_bloodsucker(bloodsucker)) + if(!can_make_bloodsucker(bloodsucker)) return FALSE // Create Datum: Fledgling var/datum/antagonist/bloodsucker/A // [FLEDGLING] - if (creator) + if(creator) A = new (bloodsucker) A.creator = creator bloodsucker.add_antag_datum(A) @@ -187,7 +178,7 @@ /datum/game_mode/proc/clean_invalid_species(datum/mind/bloodsucker) // Only checking for Humans here - if (!ishuman(bloodsucker.current) || !bloodsucker.current.client) + if(!ishuman(bloodsucker.current) || !bloodsucker.current.client) return var/am_valid = TRUE var/mob/living/carbon/human/H = bloodsucker.current @@ -202,7 +193,7 @@ // everyone will wonder why you're a human with Plasma clothes (jk they'll know you're antag) // Convert to HUMAN (along with ID and PDA) - if (!am_valid) + if(!am_valid) H.set_species(/datum/species/human) H.real_name = H.client.prefs.custom_names["human"] var/obj/item/card/id/ID = H.wear_id?.GetID() @@ -211,12 +202,13 @@ ID.update_label() -/datum/game_mode/proc/can_make_vassal(mob/living/target, datum/mind/creator, display_warning=TRUE)//, check_antag_or_loyal=FALSE) +/datum/game_mode/proc/can_make_vassal(mob/living/target, datum/mind/creator, display_warning = TRUE)//, check_antag_or_loyal=FALSE) // Not Correct Type: Abort - if (!iscarbon(target) || !creator) + if(!iscarbon(target) || !creator) return FALSE - if (target.stat > UNCONSCIOUS) + if(target.stat > UNCONSCIOUS) return FALSE + // Check Overdose: Am I even addicted to blood? Do I even have any in me? //if (!target.reagents.addiction_list || !target.reagents.reagent_list) //message_admins("DEBUG2: can_make_vassal() Abort: No reagents") @@ -233,23 +225,23 @@ //message_admins("DEBUG4: can_make_vassal() Abort: No Blood") // return 0 // No Mind! - if (!target.mind || !target.mind.key) - if (display_warning) + if(!target.mind || !target.mind.key) + if(display_warning) to_chat(creator, "[target] isn't self-aware enough to be made into a Vassal.") return FALSE // Already MY Vassal var/datum/antagonist/vassal/V = target.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if (istype(V) && V.master) - if (V.master.owner == creator) - if (display_warning) + if(istype(V) && V.master) + if(V.master.owner == creator) + if(display_warning) to_chat(creator, "[target] is already your loyal Vassal!") else - if (display_warning) + if(display_warning) to_chat(creator, "[target] is the loyal Vassal of another Bloodsucker!") return FALSE // Already Antag or Loyal (Vamp Hunters count as antags) - if (target.mind.enslaved_to || AmInvalidAntag(target.mind)) //!VassalCheckAntagValid(target.mind, check_antag_or_loyal)) // HAS_TRAIT(target, TRAIT_MINDSHIELD, "implant") || - if (display_warning) + if(target.mind.enslaved_to || AmInvalidAntag(target.mind)) //!VassalCheckAntagValid(target.mind, check_antag_or_loyal)) // HAS_TRAIT(target, TRAIT_MINDSHIELD, "implant") || + if(display_warning) to_chat(creator, "[target] resists the power of your blood to dominate their mind!") return FALSE return TRUE @@ -268,15 +260,15 @@ return FALSE // Does even ONE antag appear in this mind that isn't in the list? Then FAIL! for(var/datum/antagonist/antag_datum in M.antag_datums) - if (!(antag_datum.type in vassal_allowed_antags)) // vassal_allowed_antags is a list stored in the game mode, above. + if(!(antag_datum.type in vassal_allowed_antags)) // vassal_allowed_antags is a list stored in the game mode, above. //message_admins("DEBUG VASSAL: Found Invalid: [antag_datum] // [antag_datum.type]") return TRUE //message_admins("DEBUG VASSAL: Valid Antags! (total of [M.antag_datums.len])") // WHEN YOU DELETE THE ABOVE: Remove the 3 second timer on converting the vassal too. return FALSE -/datum/game_mode/proc/make_vassal(mob/living/target, datum/mind/creator) - if (!can_make_vassal(target,creator)) +/datum/game_mode/proc/make_vassal(/mob/living/target, /datum/mind/creator) + if(!can_make_vassal(target, creator)) return FALSE // Make Vassal var/datum/antagonist/vassal/V = new (target.mind) @@ -292,3 +284,12 @@ /datum/game_mode/proc/remove_vassal(datum/mind/vassal) vassal.remove_antag_datum(ANTAG_DATUM_VASSAL) + +/datum/game_mode/proc/count_vassals(datum/mind/master) + var/datum/antagonist/bloodsucker/B = master.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/vassal_amount + len(B.vassals) + return vassal_amount + + + \ No newline at end of file diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 0179c60ef1..4101d55df1 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -25,7 +25,7 @@ HandleStarving() // Death HandleDeath() // Standard Update update_hud()// Daytime Sleep in Coffin - if (SSticker.mode.is_daylight() && !HAS_TRAIT_FROM(owner.current, TRAIT_DEATHCOMA, "bloodsucker")) + if(SSticker.mode.is_daylight() && !HAS_TRAIT_FROM(owner.current, TRAIT_DEATHCOMA, "bloodsucker")) if(istype(owner.current.loc, /obj/structure/closet/crate/coffin)) Torpor_Begin() // Wait before next pass @@ -82,15 +82,15 @@ /datum/antagonist/bloodsucker/proc/HandleHealing(mult = 1) // NOTE: Mult of 0 is just a TEST to see if we are injured and need to go into Torpor! //It is called from your coffin on close (by you only) - if(poweron_masquerade == TRUE || owner.current.AmStaked()) + if(poweron_masquerade == TRUE || owner.current.AmStaked() || owner?.reagents?.has_reagent(/datum/reagent/consumable/garlic) return FALSE owner.current.adjustStaminaLoss(-1.5 + (regenRate * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. owner.current.adjustCloneLoss(-0.1 * (regenRate * 2) * mult, 0) owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (regenRate * 4) * mult) //adjustBrainLoss(-1 * (regenRate * 4) * mult, 0) // No Bleeding - if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. + if(ishuman(owner.current) && bleed_rate => 0) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. var/mob/living/carbon/human/H = owner.current - H.bleed_rate = 0 + H.bleed_rate =- 1 if(iscarbon(owner.current)) // Damage Heal: Do I have damage to ANY bodypart? var/mob/living/carbon/C = owner.current var/costMult = 1 // Coffin makes it cheaper @@ -305,17 +305,17 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /mob/proc/CheckBloodsuckerEatFood(var/food_nutrition) - if (!isliving(src)) + if(!isliving(src)) return var/mob/living/L = src if(!L.AmBloodsucker()) return - // We're a vamp? Try to eat food... + // We're a bloodsucker? Try to eat food... var/datum/antagonist/bloodsucker/bloodsuckerdatum = mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) - bloodsuckerdatum.handle_eat_human_food(food_nutrition) + bloodsuckerdatum.bloodsucker_disgust(food_nutrition) -/datum/antagonist/bloodsucker/proc/handle_eat_human_food(var/food_nutrition) // Called from snacks.dm and drinks.dm +/datum/antagonist/bloodsucker/proc/bloodsucker_disgust(var/food_nutrition) // Called from snacks.dm and drinks.dm set waitfor = FALSE if(!owner.current || !iscarbon(owner.current)) return diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 5207f7a66d..19a7a2889e 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -655,13 +655,13 @@ var/datum/antagonist/vassal/mob_V = M.mind.has_antag_datum(ANTAG_DATUM_VASSAL) // Check 2) If they are a BLOODSUCKER, then are they my Master? if (mob_V && atom_B == mob_V.master) - return TRUE // SUCCESS! + return TRUE // Check 3) If I am a BLOODSUCKER, then are they my Vassal? if (mob_B && atom_V && (atom_V in mob_B.vassals)) - return TRUE // SUCCESS! + return TRUE // Check 4) If we are both VASSAL, then do we have the same master? if (atom_V && mob_V && atom_V.master == mob_V.master) - return TRUE // SUCCESS! + return TRUE return FALSE @@ -719,12 +719,12 @@ invisibility = INVISIBILITY_ABSTRACT /obj/screen/bloodsucker/proc/update_counter(value, valuecolor) - invisibility = 0 // Make Visible + invisibility = 0 -/obj/screen/bloodsucker/blood_counter // NOTE: Look up /obj/screen/devil/soul_counter in _onclick / hud / human.dm - icon = 'icons/mob/actions/bloodsucker.dmi'//'icons/mob/screen_gen.dmi' +/obj/screen/bloodsucker/blood_counter + icon = 'icons/mob/actions/bloodsucker.dmi' name = "Blood Consumed" - icon_state = "blood_display"//"power_display" + icon_state = "blood_display" screen_loc = ui_blood_display /obj/screen/bloodsucker/blood_counter/update_counter(value, valuecolor) @@ -749,22 +749,22 @@ /datum/antagonist/bloodsucker/proc/update_sunlight(value, amDay = FALSE) // No Hud? Get out. - if (!owner.current.hud_used) + if(!owner.current.hud_used) return // Update Sun Time - if (owner.current.hud_used.sunlight_display) + if(owner.current.hud_used.sunlight_display) var/valuecolor = "#BBBBFF" - if (amDay) + if(amDay) valuecolor = "#FF5555" else if(value <= 25) valuecolor = "#FFCCCC" else if(value < 10) valuecolor = "#FF5555" - var/value_string = (value >= 60) ? "[round(value / 60, 1)] m" : "[round(value,1)] s" + var/value_string = (value >= 60) ? "[round(value / 60, 1)] m" : "[round(value, 1)] s" owner.current.hud_used.sunlight_display.update_counter( value_string, valuecolor ) owner.current.hud_used.sunlight_display.icon_state = "sunlight_" + (amDay ? "day":"night") /obj/screen/bloodsucker/sunlight_counter/update_counter(value, valuecolor) ..() - maptext = "
[value]
" + maptext = "
[value]
" diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm index 9e46203483..f9ba36e2c2 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm @@ -258,7 +258,7 @@ /obj/structure/bloodsucker/vassalrack/proc/torture_victim(mob/living/user, mob/living/target) var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) // Check Bloodmob/living/M, force = FALSE, check_loc = TRUE - var/convert_cost = 200 + 200 * bloodsuckerdatum.vassals + var/convert_cost = 200 if(user.blood_volume < convert_cost + 5) to_chat(user, "You don't have enough blood to initiate the Dark Communion with [target].") return @@ -321,15 +321,15 @@ // to_chat(user, "The ritual has been interrupted!") // useLock = FALSE // return - user.playsound_local(null, 'sound/effects/explosion_distant.ogg', 40, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head. - target.playsound_local(null, 'sound/effects/explosion_distant.ogg', 40, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head. - target.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head. + user.playsound_local(null, 'sound/effects/explosion_distant.ogg', 40, TRUE) + target.playsound_local(null, 'sound/effects/explosion_distant.ogg', 40, TRUE) + target.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, TRUE) target.Jitter(25) target.emote("laugh") //remove_victim(target) // Remove on CLICK ONLY! useLock = FALSE -/obj/structure/bloodsucker/vassalrack/proc/do_torture(mob/living/user, mob/living/target, mult=1) +/obj/structure/bloodsucker/vassalrack/proc/do_torture(mob/living/user, mob/living/target, mult = 1) var/torture_time = 15 // Fifteen seconds if you aren't using anything. Shorter with weapons and such. var/torture_dmg_brute = 2 var/torture_dmg_burn = 0 diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index f9ff31d94a..2ae41e7c02 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -67,6 +67,12 @@ if(display_error) to_chat(owner, "Your victim's blood is not suitable for you to take.") return FALSE + if(iscarbon(owner)) + //We want to check if the target is wearing a garlic necklance. + if(istype(owner.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + if(display_error) + to_chat(owner, "Your victim is wearing a garlic clove on their neck! Disgusting!") + return FALSE return TRUE // If I'm not grabbing someone, find me someone nearby. @@ -140,7 +146,7 @@ to_chat(user, "You lean quietly toward [target] and secretly draw out your fangs...") else to_chat(user, "You pull [target] close to you and draw out your fangs...") - if(!do_mob(user, target, feed_time,0,1,extra_checks=CALLBACK(src, .proc/ContinueActive, user, target)))//sleep(10) + if(!do_mob(user, target, feed_time, 0, 1, extra_checks = CALLBACK(src, .proc/ContinueActive, user, target)))//sleep(10) to_chat(user, "Your feeding was interrupted.") //DeactivatePower(user,target) return @@ -166,7 +172,7 @@ var/deadmessage = target.stat == DEAD ? "" : " [target.p_they(TRUE)] looks dazed, and will not remember this." user.visible_message("[user] puts [target]'s wrist up to [user.p_their()] mouth.", \ "You secretly slip your fangs into [target]'s wrist.[deadmessage]", \ - vision_distance = notice_range, ignored_mobs=target) // Only people who AREN'T the target will notice this action. + vision_distance = notice_range, ignored_mobs = target) // Only people who AREN'T the target will notice this action. // Warn Feeder about Witnesses... var/was_unnoticed = TRUE for(var/mob/living/M in viewers(notice_range, owner)) @@ -299,7 +305,7 @@ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "drankkilled", /datum/mood_event/drankkilled) // BAD // in bloodsucker_life.dm /datum/action/bloodsucker/feed/ContinueActive(mob/living/user, mob/living/target) - return ..() && target && (!target_grappled || user.pulling == target)// Active, and still Antag, + return ..() && target && (!target_grappled || user.pulling == target) && sucking_checks(target, TRUE, TRUE) // Active, and still Antag, // NOTE: We only care about pulling if target started off that way. Mostly only important for Aggressive feed. /datum/action/bloodsucker/feed/proc/ApplyVictimEffects(mob/living/target) diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm index b18dfc7968..9866e306c6 100644 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ b/code/modules/food_and_drinks/food/snacks_bread.dm @@ -179,6 +179,18 @@ tastes = list("bread" = 1) foodtype = GRAIN +/obj/item/reagent_containers/food/snacks/garlicbread + name = "garlic bread" + desc = "Alas, it is limited." + icon = 'icons/obj/food/burgerbread.dmi' + icon_state = "garlicbread" + item_state = "garlicbread" + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/vitamin = 4, /datum/reagent/consumable/garlic = 2) + bitesize = 3 + tastes = list("bread" = 1, "garlic" = 1, "butter" = 1) + foodtype = GRAIN + /obj/item/reagent_containers/food/snacks/deepfryholder name = "Deep Fried Foods Holder Obj" desc = "If you can see this description the code for the deep fryer fucked up." diff --git a/code/modules/food_and_drinks/food/snacks_meat.dm b/code/modules/food_and_drinks/food/snacks_meat.dm index 9bf95f65db..53299b9c5b 100644 --- a/code/modules/food_and_drinks/food/snacks_meat.dm +++ b/code/modules/food_and_drinks/food/snacks_meat.dm @@ -196,7 +196,7 @@ name = "raw khinkali" desc = "One hundred khinkalis? Do I look like a pig?" icon_state = "khinkali" - list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/consumable/garlic = 1) cooked_type = /obj/item/reagent_containers/food/snacks/khinkali tastes = list("meat" = 1, "onions" = 1, "garlic" = 1) foodtype = MEAT @@ -205,7 +205,7 @@ name = "khinkali" desc = "One hundred khinkalis? Do I look like a pig?" icon_state = "khinkali" - list_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 2, /datum/reagent/consumable/garlic = 1) bitesize = 3 filling_color = "#F0F0F0" tastes = list("meat" = 1, "onions" = 1, "garlic" = 1) diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm index c3890b28eb..335078eb4c 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm @@ -125,6 +125,16 @@ result = /obj/item/reagent_containers/food/snacks/baguette subcategory = CAT_BREAD +/datum/crafting_recipe/food/garlicbread + name = "Garlic Bread" + time = 40 + reqs = list(/obj/item/reagent_containers/food/snacks/grown/garlic = 1, + /obj/item/reagent_containers/food/snacks/breadslice/plain = 1, + /obj/item/reagent_containers/food/snacks/butter = 1 + ) + result = /obj/item/reagent_containers/food/snacks/garlicbread + subcategory = CAT_BREAD + /datum/crafting_recipe/food/butterbiscuit name = "Butter Biscuit" reqs = list( diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm index 6a622d6719..8f9e7ff0b7 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm @@ -28,7 +28,8 @@ name = "Raw Khinkali" reqs = list( /obj/item/reagent_containers/food/snacks/doughslice = 1, - /obj/item/reagent_containers/food/snacks/faggot = 1 + /obj/item/reagent_containers/food/snacks/faggot = 1, + /obj/item/reagent_containers/food/snacks/grown/garlic = 1 ) result = /obj/item/reagent_containers/food/snacks/rawkhinkali subcategory = CAT_MISCFOOD diff --git a/code/modules/hydroponics/grown/garlic.dm b/code/modules/hydroponics/grown/garlic.dm new file mode 100644 index 0000000000..7ee8aab9a8 --- /dev/null +++ b/code/modules/hydroponics/grown/garlic.dm @@ -0,0 +1,28 @@ +/obj/item/seeds/garlic + name = "pack of garlic seeds" + desc = "A packet of extremely pungent seeds." + icon_state = "seed-garlic" + species = "garlic" + plantname = "Garlic Sprouts" + product = /obj/item/reagent_containers/food/snacks/grown/garlic + yield = 6 + potency = 25 + growthstages = 3 + growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' + reagents_add = list(/datum/reagent/consumable/garlic = 0.15, /datum/reagent/consumable/nutriment = 0.1) + +/obj/item/reagent_containers/food/snacks/grown/garlic + seed = /obj/item/seeds/garlic + name = "garlic" + desc = "Delicious, but with a potentially overwhelming odor." + icon_state = "garlic" + filling_color = "#C0C9A0" + bitesize_mod = 2 + tastes = list("garlic" = 1) + wine_power = 10 + +/obj/item/clothing/neck/garlic_necklace + name = "garlic necklace" + desc = "A clove of garlic on a string, tied to itself in a circle, just might fit around your neck. For paranoid people who fear getting their blood sucked." + icon_state = "garlic_necklace" + \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index 8bbd870149..b62b8304da 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -81,6 +81,9 @@ if(H.blood_volume >= BLOOD_VOLUME_MAXIMUM) to_chat(H, "You're already full!") return + //This checks whether or not they are wearing a garlic clove on their neck + if(sucking_checks(victim, TRUE, FALSE)) + return if(victim.stat == DEAD) to_chat(H, "You need a living victim!") return @@ -92,6 +95,9 @@ to_chat(victim, "[H] tries to bite you, but stops before touching you!") to_chat(H, "[victim] is blessed! You stop just in time to avoid catching fire.") return + //Here we check now for both the garlic cloves on the neck and for blood in the victims bloodstream. + if(sucking_checks(victim, TRUE, TRUE)) + return if(!do_after(H, 30, target = victim)) return var/blood_volume_difference = BLOOD_VOLUME_MAXIMUM - H.blood_volume //How much capacity we have left to absorb blood diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 16a55421b8..83af522962 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -11,6 +11,7 @@ speed = 0 maxHealth = 250 health = 250 + blood_volume = 0 gender = NEUTER mob_biotypes = NONE diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 7608e5f4a8..11523d3afa 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -284,7 +284,7 @@ if(L.mind) L.mind.transfer_to(S) if(owner) - to_chat(S, "You are an animate statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [owner], your creator.") + to_chat(S, "You are an animated statue. You cannot move when monitored, but are nearly invincible and deadly when unobserved! Do not harm [owner], your creator.") P.forceMove(S) return else diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 52eee9f8ea..9218df1ad1 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -423,6 +423,58 @@ M.emote(pick("twitch","giggle")) ..() +/datum/reagent/consumable/garlic //NOTE: having garlic in your blood stops vampires from biting you. + name = "Garlic Juice" + id = "garlic" + description = "Crushed garlic. Chefs love it, but it can make you smell bad." + color = "#FEFEFE" + taste_description = "garlic" + metabolization_rate = 0.15 * REAGENTS_METABOLISM + +/datum/reagent/consumable/garlic/on_mob_life(mob/living/carbon/M) + if(isvampire(M)) //incapacitating but not lethal. Unfortunately, vampires cannot vomit. + if(prob(min(25, current_cycle))) + to_chat(M, "You can't get the scent of garlic out of your nose! You can barely think...") + M.Paralyze(10) + M.Jitter(10) + return + else if(isbloodsucker(M)) + var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + switch(method) + if(INGEST) + if(prob(min(30, current_cycle))) + to_chat(M, "You cant get the smell of garlic out of your nose! You cant think straight because of it!") + M.Jitter(15) + return + if(prob(min(15, current_cycle))) + M.visible_message("Something you ate is burning your stomach!", / + "[M] clutches their stomach and falls to the ground!" + ) + M.Knockdown(20) + M.emote("scream") + return + if(prob(min(5, current_cycle))) + M.vomit() + return + if(INJECT) + if(prob(min(20, current_cycle))) + to_chat(M, "You feel like your veins are boiling!") + M.emote("scream") + M.adjustFireLoss(5) + return + if(prob(min(5, current_cycle))) + to_chat(M, "You are trying to purge the contaminants from your blood!") + M.vomit() + return + + else if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(H.job == "Cook") + if(prob(20)) //stays in the system much longer than sprinkles/banana juice, so heals slower to partially compensate + H.heal_bodypart_damage(1, 1, 0) + . = 1 + ..() + /datum/reagent/consumable/sprinkles name = "Sprinkles" value = 3 diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/hydroponics/growing.dmi index 712ea11a3b7a0e1a6c1f595882d26ca9f4136fe2..c93865ca77bae041846d0069c1ae0c5dece1e9a1 100644 GIT binary patch delta 19548 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

8&ogCVpgZVyQwxxvgAJjpH0A);f0~9xx>R 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 WEBG994ch|%G~7>mJJ%j3(*6O8_^8tW diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index e746d8f43d7b16c2207e5f00623f75c7e9c80688..c7c31581f3eb486c34e22574f4a3cedcd88ff062 100644 GIT binary patch delta 20535 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 diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi index 43e231cbab93cca9acc55113aa042b547f75eb07..62843e3f54f903007e1dd9bfd61e3e883ddbf5a6 100644 GIT binary patch delta 6140 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 PB7b_?##-f?juHO@f?zAP delta 5908 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 diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm index 4707d5b460..457f1dfb39 100644 --- a/modular_citadel/code/modules/reagents/objects/clothes.dm +++ b/modular_citadel/code/modules/reagents/objects/clothes.dm @@ -5,7 +5,7 @@ name = "Synthetic hat" icon = 'icons/obj/clothing/hats.dmi' icon_state = "cowboy" - desc = "A sythesized hat, you can't seem to take it off. And tips their hat." + desc = "A synthesized hat, you can't seem to take it off. And tips their hat." armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) //item_flags = NODROP //Tips their hat! @@ -25,7 +25,7 @@ /obj/item/clothing/head/hattip/MouseDrop(atom/over_object) //You sure do love tipping your hat. - if(usr) + if(user) var/mob/living/carbon/C = usr if(is_ninja(C)) to_chat(C, "Using your superior ninja reflexes, you take the hat off before tipping.") diff --git a/tgstation.dme b/tgstation.dme index ee098a0ec7..f9a4b3fe7b 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1902,6 +1902,7 @@ #include "code\modules\hydroponics\grown\cotton.dm" #include "code\modules\hydroponics\grown\eggplant.dm" #include "code\modules\hydroponics\grown\flowers.dm" +#include "code\modules\hydroponics\grown\garlic.dm" #include "code\modules\hydroponics\grown\grass_carpet.dm" #include "code\modules\hydroponics\grown\kudzu.dm" #include "code\modules\hydroponics\grown\melon.dm" From ba972cf0eb5c1eaa20feff7dc729359a8d57ec56 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 18 Mar 2020 22:41:21 +0200 Subject: [PATCH 03/23] Argh --- code/__HELPERS/unsorted.dm | 10 ++-- .../game/gamemodes/bloodsucker/bloodsucker.dm | 10 +--- .../bloodsucker/bloodsucker_life.dm | 7 +-- .../bloodsucker/datum_bloodsucker.dm | 9 +++- .../bloodsucker/objects/bloodsucker_crypt.dm | 44 +++++++++------- .../food_and_drinks/food/snacks_bread.dm | 4 +- .../mining/equipment/regenerative_core.dm | 2 +- .../chemistry/reagents/food_reagents.dm | 52 ++++++++----------- .../code/modules/reagents/objects/clothes.dm | 2 +- 9 files changed, 70 insertions(+), 70 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 4193e813fa..50966b797c 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1566,16 +1566,16 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) //Checks to see if either the victim has a garlic necklace or garlic in their blood /proc/sucking_checks(var/mob/living/carbon/target, check_neck, check_blood) - //Byppass this if the target isnt carbon. - if(!iscarbon) + //Bypass this if the target isnt carbon. + if(!iscarbon(target)) return TRUE if(check_neck) if(istype(target.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) - to_chat(owner, "[victim] is wearing a garlic clove around their neck! You cant drink from them while it is on them!") + to_chat(src, "[target] is wearing a garlic clove around their neck! You cant drink from them while it is on them!") return FALSE if(check_blood) if(target.reagents.has_reagent(/datum/reagent/consumable/garlic)) - to_chat(target, "[H] tries to bite you, but recoils in disgust!") - to_chat(owner, "[victim] reeks of garlic! you can't bring yourself to drain such tainted blood.") + to_chat(target, "[src] tries to bite you, but recoils in disgust!") + to_chat(src, "[target] reeks of garlic! you can't bring yourself to drain such tainted blood.") return FALSE return TRUE diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index 0796fc3c4c..6315ea525b 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -248,11 +248,11 @@ // WHEN YOU DELETE THE ABOVE: Remove the 3 second timer on converting the vassal too. return FALSE -/datum/game_mode/proc/make_vassal(/mob/living/target, /datum/mind/creator) +/datum/game_mode/proc/make_vassal(var/mob/living/target, var/datum/mind/creator) if(!can_make_vassal(target, creator)) return FALSE // Make Vassal - var/datum/antagonist/vassal/V = new (target.mind) + var/datum/antagonist/vassal/V = new(target.mind) var/datum/antagonist/bloodsucker/B = creator.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) V.master = B target.mind.add_antag_datum(V, V.master.get_team()) @@ -265,12 +265,6 @@ /datum/game_mode/proc/remove_vassal(datum/mind/vassal) vassal.remove_antag_datum(ANTAG_DATUM_VASSAL) - -/datum/game_mode/proc/count_vassals(datum/mind/master) - var/datum/antagonist/bloodsucker/B = master.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) - var/vassal_amount - len(B.vassals) - return vassal_amount \ No newline at end of file diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 4101d55df1..11d94975b3 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -82,15 +82,16 @@ /datum/antagonist/bloodsucker/proc/HandleHealing(mult = 1) // NOTE: Mult of 0 is just a TEST to see if we are injured and need to go into Torpor! //It is called from your coffin on close (by you only) - if(poweron_masquerade == TRUE || owner.current.AmStaked() || owner?.reagents?.has_reagent(/datum/reagent/consumable/garlic) + if(poweron_masquerade == TRUE || owner.current.AmStaked() || owner.current.reagents?.has_reagent(/datum/reagent/consumable/garlic)) return FALSE owner.current.adjustStaminaLoss(-1.5 + (regenRate * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. owner.current.adjustCloneLoss(-0.1 * (regenRate * 2) * mult, 0) owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (regenRate * 4) * mult) //adjustBrainLoss(-1 * (regenRate * 4) * mult, 0) // No Bleeding - if(ishuman(owner.current) && bleed_rate => 0) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. + if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. var/mob/living/carbon/human/H = owner.current - H.bleed_rate =- 1 + if(H.bleed_rate > 0) //Only heal bleeding if we are actually bleeding + H.bleed_rate =- 0.5 + regenRate * mult if(iscarbon(owner.current)) // Damage Heal: Do I have damage to ANY bodypart? var/mob/living/carbon/C = owner.current var/costMult = 1 // Coffin makes it cheaper diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 19a7a2889e..28aef3b6d4 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -341,10 +341,10 @@ // Assign True Reputation if(vamplevel == 4) SelectReputation(am_fledgling = FALSE, forced = TRUE) - to_chat(owner.current, "You are now a rank [vamplevel] Bloodsucker. Your strength, health, feed rate, regen rate, and maximum blood have all increased!") + to_chat(owner.current, "You are now a rank [vamplevel] Bloodsucker. Your strength, health, feed rate, regen rate, can have up to [vamplevel - count_vassals()] vassals, and maximum blood have all increased!") to_chat(owner.current, "Your existing powers have all ranked up as well!") update_hud(TRUE) - owner.current.playsound_local(null, 'sound/effects/pope_entry.ogg', 25, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head. + owner.current.playsound_local(null, 'sound/effects/pope_entry.ogg', 25, TRUE, pressure_affected = FALSE) //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// @@ -768,3 +768,8 @@ /obj/screen/bloodsucker/sunlight_counter/update_counter(value, valuecolor) ..() maptext = "

" + +/datum/antagonist/bloodsucker/proc/count_vassals(datum/mind/master) + var/datum/antagonist/bloodsucker/B = master.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/vassal_amount = B.vassals.len + return vassal_amount diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm index ec7c7e9ba8..3b1698c287 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm @@ -115,13 +115,15 @@ qdel(src) /obj/structure/bloodsucker/vassalrack/examine(mob/user) + var/datum/antagonist/bloodsucker/B = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) . = ..() - if(isbloodsucker(user) || isobserver(user)) + if(B || isobserver(user)) . += {"This is the vassal rack, which allows you to thrall crewmembers into loyal minions in your service."} . += {"You need to first secure the vassal rack by clicking on it while it is in your lair."} . += {"Simply click and hold on a victim, and then drag their sprite on the vassal rack. Alt click on the vassal rack to unbuckle them."} . += {"Make sure that the victim is handcuffed, or else they can simply run away or resist, as the process is not instant."} . += {"To convert the victim, simply click on the vassal rack itself. Sharp weapons work faster than other tools."} + . += {" You have only the power for [B.vamplevel - B.count_vassals(user.mind)] vassals"} /* if(user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) . += {"This is the vassal rack, which allows your master to thrall crewmembers into his minions.\n Aid your master in bringing their victims here and keeping them secure.\n @@ -222,15 +224,15 @@ // Go away. Torturing. if(useLock) return - var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/datum/antagonist/bloodsucker/B = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) // CHECK ONE: Am I claiming this? Is it in the right place? - if(istype(bloodsuckerdatum) && !owner) - if(!bloodsuckerdatum.lair) + if(istype(B) && !owner) + if(!B.lair) to_chat(user, "You don't have a lair. Claim a coffin to make that location your lair.") - if(bloodsuckerdatum.lair != get_area(src)) - to_chat(user, "You may only activate this structure in your lair: [bloodsuckerdatum.lair].") + if(B.lair != get_area(src)) + to_chat(user, "You may only activate this structure in your lair: [B.lair].") return - switch(alert(user,"Do you wish to afix this structure here? Be aware you wont be able to unsecure it anymore","Secure [src]","Yes", "No")) + switch(alert(user,"Do you wish to afix this structure here? Be aware you wont be able to unsecure it anymore", "Secure [src]", "Yes", "No")) if("Yes") owner = user density = FALSE @@ -241,27 +243,31 @@ return // CHECK TWO: Am I a non-bloodsucker? var/mob/living/carbon/C = pick(buckled_mobs) - if(!istype(bloodsuckerdatum)) + if(!istype(B)) // Try to release this guy user_unbuckle_mob(C, user) return // Bloodsucker Owner! Let the boy go. if(C.mind) - var/datum/antagonist/vassal/vassaldatum = C.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if(istype(vassaldatum) && vassaldatum.master == bloodsuckerdatum || C.stat >= DEAD) + var/datum/antagonist/vassal/V = C.mind.has_antag_datum(ANTAG_DATUM_VASSAL) + if(istype(V) && V.master == B || C.stat >= DEAD) unbuckle_mob(C) useLock = FALSE // Failsafe return // Just torture the boy torture_victim(user, C) +#define CONVERT_COST 150 + /obj/structure/bloodsucker/vassalrack/proc/torture_victim(mob/living/user, mob/living/target) - var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/datum/antagonist/bloodsucker/B = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) // Check Bloodmob/living/M, force = FALSE, check_loc = TRUE - var/convert_cost = 200 - if(user.blood_volume < convert_cost + 5) + if(user.blood_volume < CONVERT_COST + 5) to_chat(user, "You don't have enough blood to initiate the Dark Communion with [target].") return + if(B.count_vassals(user.mind) > B.vamplevel) + to_chat(user, "Your power is yet too weak to bring more vassals under your control....") + return // Prep... useLock = TRUE // Step One: Tick Down Conversion from 3 to 0 @@ -302,12 +308,13 @@ useLock = FALSE return // Check: Blood - if(user.blood_volume < convert_cost) - to_chat(user, "You don't have enough blood to initiate the Dark Communion with [target], you need [convert_cost - user.blood_volume] units more!") + if(user.blood_volume < CONVERT_COST) + to_chat(user, "You don't have enough blood to initiate the Dark Communion with [target], you need [CONVERT_COST - user.blood_volume] units more!") useLock = FALSE return - bloodsuckerdatum.AddBloodVolume(-convert_cost) - target.add_mob_blood(user) + B.AddBloodVolume(-CONVERT_COST) + target.add_mob_blood(user, "Youve used [CONVERT_COST] amount of blood to gain a new vassal!") + to_chat(user, ) user.visible_message("[user] marks a bloody smear on [target]'s forehead and puts a wrist up to [target.p_their()] mouth!", \ "You paint a bloody marking across [target]'s forehead, place your wrist to [target.p_their()] mouth, and subject [target.p_them()] to the Dark Communion.") if(!do_mob(user, src, 50)) @@ -315,7 +322,7 @@ useLock = FALSE return // Convert to Vassal! - if(bloodsuckerdatum && bloodsuckerdatum.attempt_turn_vassal(target)) + if(B && B.attempt_turn_vassal(target)) //remove_loyalties(target) // In case of Mindshield, or appropriate Antag (Traitor, Internal, etc) //if (!target.buckled) // to_chat(user, "The ritual has been interrupted!") @@ -329,6 +336,7 @@ //remove_victim(target) // Remove on CLICK ONLY! useLock = FALSE +#undef CONVERT_COST /obj/structure/bloodsucker/vassalrack/proc/do_torture(mob/living/user, mob/living/target, mult = 1) var/torture_time = 15 // Fifteen seconds if you aren't using anything. Shorter with weapons and such. var/torture_dmg_brute = 2 diff --git a/code/modules/food_and_drinks/food/snacks_bread.dm b/code/modules/food_and_drinks/food/snacks_bread.dm index 9866e306c6..bab49e9f83 100644 --- a/code/modules/food_and_drinks/food/snacks_bread.dm +++ b/code/modules/food_and_drinks/food/snacks_bread.dm @@ -185,8 +185,8 @@ icon = 'icons/obj/food/burgerbread.dmi' icon_state = "garlicbread" item_state = "garlicbread" - bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/vitamin = 2) - list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/vitamin = 4, /datum/reagent/consumable/garlic = 2) + bonus_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 2) + list_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin= 4, /datum/reagent/consumable/garlic = 2) bitesize = 3 tastes = list("bread" = 1, "garlic" = 1, "butter" = 1) foodtype = GRAIN diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index 65304c5460..c0bc3232b7 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -72,7 +72,7 @@ if(proximity_flag) apply_healing_core(target, user) -/obj/item/organ/regenerative_core/apply_healing_core(atom/target, mob/user) +/obj/item/organ/regenerative_core/proc/apply_healing_core(atom/target, mob/user) if(ishuman(target)) var/mob/living/carbon/human/H = target if(inert) diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 9218df1ad1..1c4810dd34 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -425,7 +425,7 @@ /datum/reagent/consumable/garlic //NOTE: having garlic in your blood stops vampires from biting you. name = "Garlic Juice" - id = "garlic" + //id = "garlic" description = "Crushed garlic. Chefs love it, but it can make you smell bad." color = "#FEFEFE" taste_description = "garlic" @@ -435,37 +435,9 @@ if(isvampire(M)) //incapacitating but not lethal. Unfortunately, vampires cannot vomit. if(prob(min(25, current_cycle))) to_chat(M, "You can't get the scent of garlic out of your nose! You can barely think...") - M.Paralyze(10) + M.Stun(10) M.Jitter(10) return - else if(isbloodsucker(M)) - var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) - switch(method) - if(INGEST) - if(prob(min(30, current_cycle))) - to_chat(M, "You cant get the smell of garlic out of your nose! You cant think straight because of it!") - M.Jitter(15) - return - if(prob(min(15, current_cycle))) - M.visible_message("Something you ate is burning your stomach!", / - "[M] clutches their stomach and falls to the ground!" - ) - M.Knockdown(20) - M.emote("scream") - return - if(prob(min(5, current_cycle))) - M.vomit() - return - if(INJECT) - if(prob(min(20, current_cycle))) - to_chat(M, "You feel like your veins are boiling!") - M.emote("scream") - M.adjustFireLoss(5) - return - if(prob(min(5, current_cycle))) - to_chat(M, "You are trying to purge the contaminants from your blood!") - M.vomit() - return else if(ishuman(M)) var/mob/living/carbon/human/H = M @@ -475,6 +447,26 @@ . = 1 ..() +/datum/reagent/consumable/condensedcapsaicin/reaction_mob(mob/living/M, method, reac_volume) + if(isbloodsucker(M)) + switch(method) + if(INGEST) + if(prob(min(30, current_cycle))) + to_chat(M, "You cant get the smell of garlic out of your nose! You cant think straight because of it!") + M.Jitter(15) + if(prob(min(15, current_cycle))) + M.visible_message("Something you ate is burning your stomach!", "[M] clutches their stomach and falls to the ground!") + M.Knockdown(20) + M.emote("scream") + if(prob(min(5, current_cycle)) && iscarbon(M)) + var/mob/living/carbon/C + C.vomit() + if(INJECT) + if(prob(min(20, current_cycle))) + to_chat(M, "You feel like your veins are boiling!") + M.emote("scream") + M.adjustFireLoss(5) + /datum/reagent/consumable/sprinkles name = "Sprinkles" value = 3 diff --git a/modular_citadel/code/modules/reagents/objects/clothes.dm b/modular_citadel/code/modules/reagents/objects/clothes.dm index 457f1dfb39..34af39bbe0 100644 --- a/modular_citadel/code/modules/reagents/objects/clothes.dm +++ b/modular_citadel/code/modules/reagents/objects/clothes.dm @@ -25,7 +25,7 @@ /obj/item/clothing/head/hattip/MouseDrop(atom/over_object) //You sure do love tipping your hat. - if(user) + if(usr) var/mob/living/carbon/C = usr if(is_ninja(C)) to_chat(C, "Using your superior ninja reflexes, you take the hat off before tipping.") From e439c2231d9afc63386dae21796dc9f081cff153 Mon Sep 17 00:00:00 2001 From: Artur Date: Thu, 19 Mar 2020 17:47:21 +0200 Subject: [PATCH 04/23] fIXE --- code/modules/antagonists/bloodsucker/datum_bloodsucker.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 28aef3b6d4..fa3666e0e7 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -341,7 +341,7 @@ // Assign True Reputation if(vamplevel == 4) SelectReputation(am_fledgling = FALSE, forced = TRUE) - to_chat(owner.current, "You are now a rank [vamplevel] Bloodsucker. Your strength, health, feed rate, regen rate, can have up to [vamplevel - count_vassals()] vassals, and maximum blood have all increased!") + to_chat(owner.current, "You are now a rank [vamplevel] Bloodsucker. Your strength, health, feed rate, regen rate, can have up to [vamplevel - count_vassals(owner.current.mind)] vassals, and maximum blood have all increased!") to_chat(owner.current, "Your existing powers have all ranked up as well!") update_hud(TRUE) owner.current.playsound_local(null, 'sound/effects/pope_entry.ogg', 25, TRUE, pressure_affected = FALSE) From 9bb7529a4988bef58f713a6498052ea0d3ed80de Mon Sep 17 00:00:00 2001 From: Artur Date: Tue, 24 Mar 2020 16:55:46 +0200 Subject: [PATCH 05/23] Progress --- .../game/gamemodes/bloodsucker/bloodsucker.dm | 8 ++- code/game/machinery/cloning.dm | 2 +- .../bloodsucker/bloodsucker_integration.dm | 35 +----------- .../bloodsucker/bloodsucker_life.dm | 57 +++++++++---------- .../bloodsucker/objects/bloodsucker_crypt.dm | 12 ++-- .../antagonists/bloodsucker/powers/feed.dm | 2 +- .../bloodsucker/powers/fortitude.dm | 9 +++ code/modules/hydroponics/grown/replicapod.dm | 2 +- .../mining/equipment/regenerative_core.dm | 2 +- .../living/carbon/alien/special/facehugger.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- code/modules/mob/mob_movement.dm | 2 +- code/modules/reagents/chemistry/reagents.dm | 2 +- .../chemistry/reagents/alcohol_reagents.dm | 2 +- .../chemistry/reagents/food_reagents.dm | 2 +- 15 files changed, 60 insertions(+), 81 deletions(-) diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index 6315ea525b..58559b721f 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -9,8 +9,12 @@ var/list/vassal_allowed_antags = list(/datum/antagonist/brother, /datum/antagonist/traitor, /datum/antagonist/traitor/internal_affairs, /datum/antagonist/survivalist, \ /datum/antagonist/rev, /datum/antagonist/nukeop, /datum/antagonist/pirate, /datum/antagonist/cult, /datum/antagonist/abductee, /datum/antagonist/valentine, /datum/antagonist/heartbreaker,) // The antags you're allowed to be if turning Vassal. -/proc/isbloodsucker(mob/living/M) - return istype(M) && M.mind && M.mind.has_antag_datum(/datum/antagonist/bloodsucker) + +/proc/AmBloodsucker(mob/living/M, falseIfInDisguise = FALSE) + // No Datum + if(!M.mind || !M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + return FALSE + return TRUE /datum/game_mode/bloodsucker name = "bloodsucker" diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 323d82e0bc..02016ab0bb 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -159,7 +159,7 @@ mess = TRUE update_icon() return FALSE - if(isbloodsucker(clonemind)) //If the mind is a bloodsucker + if(AmBloodsucker(clonemind)) //If the mind is a bloodsucker return FALSE attempting = TRUE //One at a time!! diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_integration.dm b/code/modules/antagonists/bloodsucker/bloodsucker_integration.dm index 3a6b4efedb..98fb69e52c 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_integration.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_integration.dm @@ -1,12 +1,6 @@ // INTEGRATION: Adding Procs and Datums to existing "classes" -/mob/living/proc/AmBloodsucker(falseIfInDisguise=FALSE) - // No Datum - if(!mind || !mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) - return FALSE - return TRUE - -/mob/living/proc/HaveBloodsuckerBodyparts(var/displaymessage="") // displaymessage can be something such as "rising from death" for Torpid Sleep. givewarningto is the person receiving messages. +/mob/living/proc/HaveBloodsuckerBodyparts(displaymessage = "") // displaymessage can be something such as "rising from death" for Torpid Sleep. givewarningto is the person receiving messages. if(!getorganslot(ORGAN_SLOT_HEART)) if(displaymessage != "") to_chat(src, "Without a heart, you are incapable of [displaymessage].") @@ -21,33 +15,6 @@ return FALSE return TRUE - - -// GET DAMAGE - - -// Do NOT count the damage on prosthetics for this. -/mob/living/proc/getBruteLoss_nonProsthetic() - return getBruteLoss() - -/mob/living/proc/getFireLoss_nonProsthetic() - return getFireLoss() - -/mob/living/carbon/getBruteLoss_nonProsthetic() - var/amount = 0 - for(var/obj/item/bodypart/BP in bodyparts) - if(BP.status < 2) - amount += BP.brute_dam - return amount - -/mob/living/carbon/getFireLoss_nonProsthetic() - var/amount = 0 - for(var/obj/item/bodypart/BP in bodyparts) - if(BP.status < 2) - amount += BP.burn_dam - return amount - -/mob/living/carbon // EXAMINING /mob/living/carbon/human/proc/ReturnVampExamine(var/mob/viewer) if(!mind || !viewer.mind) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index b4fe2c012e..af2fd1b374 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -99,7 +99,7 @@ var/amInCoffinWhileTorpor = istype(C.loc, /obj/structure/closet/crate/coffin) && (mult == 0 || HAS_TRAIT(C, TRAIT_DEATHCOMA)) // Check for mult 0 OR death coma. (mult 0 means we're testing from coffin) if(amInCoffinWhileTorpor) mult *= 4 // Increase multiplier if we're sleeping in a coffin. - fireheal = min(C.getFireLoss_nonProsthetic(), regenRate) // NOTE: Burn damage ONLY heals in torpor. + fireheal = min(C.getFireLoss(), regenRate) // NOTE: Burn damage ONLY heals in torpor. costMult = 0.25 C.ExtinguishMob() CureDisabilities() // Extinguish Fire @@ -113,7 +113,7 @@ //if (C.getFireLoss() > owner.current.getMaxHealth()) // fireheal = regenRate / 2 // BRUTE: Always Heal - var/bruteheal = min(C.getBruteLoss_nonProsthetic(), regenRate) + var/bruteheal = min(C.getBruteLoss(), regenRate) var/toxinheal = min(C.getToxLoss(), regenRate) // Heal if Damaged if(bruteheal + fireheal + toxinheal > 0) // Just a check? Don't heal/spend, and return. @@ -130,24 +130,23 @@ return TRUE // Healed! Done for this tick. if(amInCoffinWhileTorpor) // Limbs? (And I have no other healing) var/list/missing = owner.current.get_missing_limbs() // Heal Missing - if (missing.len) // Cycle through ALL limbs and regen them! + if(missing.len) // Cycle through ALL limbs and regen them! for (var/targetLimbZone in missing) // 1) Find ONE Limb and regenerate it. owner.current.regenerate_limb(targetLimbZone, 0) // regenerate_limbs() <--- If you want to EXCLUDE certain parts, do it like this ----> regenerate_limbs(0, list("head")) - var/obj/item/bodypart/L = owner.current.get_bodypart( targetLimbZone ) // 2) Limb returns Damaged + var/obj/item/bodypart/L = owner.current.get_bodypart(targetLimbZone) // 2) Limb returns Damaged AddBloodVolume(50 * costMult) // Costs blood to heal L.brute_dam = 60 to_chat(owner.current, "Your flesh knits as it regrows [L]!") playsound(owner.current, 'sound/magic/demon_consume.ogg', 50, 1) // DONE! After regenerating ANY number of limbs, we stop here. return TRUE - /*else // REMOVED: For now, let's just leave prosthetics on. Maybe you WANT to be a robovamp. + else // REMOVED: For now, let's just leave prosthetics on. Maybe you WANT to be a robovamp. In actuality, robovamps are very bad. // Remove Prosthetic/False Limb for(var/obj/item/bodypart/BP in C.bodyparts) - message_admins("T1: [BP] ") - if (istype(BP) && BP.status == 2) - message_admins("T2: [BP] ") + if(istype(BP) && BP.status == 2) + to_chat(owner.current, "Your body expels the [BP]!") BP.drop_limb() - return TRUE */ + return TRUE // NOTE: Limbs have a "status", like their hosts "stat". 2 is dead (aka Prosthetic). 1 seems to be idle/alive.*/ return FALSE @@ -180,7 +179,10 @@ if(owner.current.blood_volume < BLOOD_VOLUME_BAD / 2) owner.current.blur_eyes(8 - 8 * (owner.current.blood_volume / BLOOD_VOLUME_BAD)) // Nutrition - owner.current.nutrition = min(owner.current.blood_volume, NUTRITION_LEVEL_FED) // <-- 350 //NUTRITION_LEVEL_FULL + if(owner.current.blood_volume < BLOOD_VOLUME_NORMAL) + owner.current.nutrition = min(owner.current.blood_volume, NUTRITION_LEVEL_WELL_FED) + else if(owner.current.blood_volume < BLOOD_VOLUME_SAFE) + owner.current.nutrition = min(owner.current.blood_volume, NUTRITION_LEVEL_FED) // <-- 350 //NUTRITION_LEVEL_FULL ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // DEATH @@ -190,7 +192,7 @@ /datum/antagonist/bloodsucker/proc/HandleDeath() // FINAL DEATH // Fire Damage? (above double health) - if(owner.current.getFireLoss_nonProsthetic() >= owner.current.maxHealth * 2.5) + if(owner.current.getFireLoss() >= owner.current.maxHealth * 3) FinalDeath() return // Staked while "Temp Death" or Asleep @@ -210,8 +212,8 @@ // for (var/datum/action/bloodsucker/masquerade/P in powers) // P.Deactivate() // TEMP DEATH - var/total_brute = owner.current.getBruteLoss_nonProsthetic() - var/total_burn = owner.current.getFireLoss_nonProsthetic() + var/total_brute = owner.current.getBruteLoss() + var/total_burn = owner.current.getFireLoss() var/total_toxloss = owner.current.getToxLoss() //This is neater than just putting it in total_damage var/total_damage = total_brute + total_burn + total_toxloss // Died? Convert to Torpor (fake death) @@ -219,7 +221,7 @@ Torpor_Begin() to_chat(owner, "Your immortal body will not yet relinquish your soul to the abyss. You enter Torpor.") sleep(30) //To avoid spam - if (poweron_masquerade == TRUE) + if(poweron_masquerade == TRUE) to_chat(owner, "Your wounds will not heal until you disable the Masquerade power.") // End Torpor: else // No damage, OR toxin healed AND brute healed and NOT in coffin (since you cannot heal burn) @@ -229,17 +231,14 @@ Torpor_End() // Fake Unconscious if(poweron_masquerade == TRUE && total_damage >= owner.current.getMaxHealth() - HEALTH_THRESHOLD_FULLCRIT) - owner.current.Unconscious(20,1) - //HEALTH_THRESHOLD_CRIT 0 - //HEALTH_THRESHOLD_FULLCRIT -30 - //HEALTH_THRESHOLD_DEAD -100 + owner.current.Unconscious(20, 1) -/datum/antagonist/bloodsucker/proc/Torpor_Begin(amInCoffin=FALSE) +/datum/antagonist/bloodsucker/proc/Torpor_Begin(amInCoffin = FALSE) owner.current.stat = UNCONSCIOUS - owner.current.fakedeath("bloodsucker") // Come after UNCONSCIOUS or else it fails + ADD_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") // Come after UNCONSCIOUS or else it fails ADD_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") // Without this, you'll just keep dying while you recover. ADD_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. - ADD_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. + ADD_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") // Visuals owner.current.update_sight() owner.current.reload_fullscreen() @@ -248,10 +247,9 @@ if(power.active && !power.can_use_in_torpor) power.DeactivatePower() - /datum/antagonist/bloodsucker/proc/Torpor_End() + REMOVE_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") owner.current.stat = SOFT_CRIT - owner.current.cure_fakedeath("bloodsucker") // Come after SOFT_CRIT or else it fails REMOVE_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") @@ -288,14 +286,15 @@ owner.current.visible_message("[owner.current]'s skin crackles and dries, their skin and bones withering to dust. A hollow cry whips from what is now a sandy pile of remains.", \ "Your soul escapes your withering body as the abyss welcomes you to your Final Death.", \ "You hear a dry, crackling sound.") + sleep(50) owner.current.dust() // Fledglings get Gibbed else owner.current.visible_message("[owner.current]'s skin bursts forth in a spray of gore and detritus. A horrible cry echoes from what is now a wet pile of decaying meat.", \ "Your soul escapes your withering body as the abyss welcomes you to your Final Death.", \ "You hear a wet, bursting sound.") - owner.current.gib(TRUE, FALSE, FALSE)//Brain cloning is wierd and allows hellbounds. Lets destroy the brain for safety. - playsound(owner.current.loc, 'sound/effects/tendril_destroyed.ogg', 40, 1) + owner.current.gib(TRUE, FALSE, FALSE) //Brain cloning is wierd and allows hellbounds. Lets destroy the brain for safety. + playsound(owner.current, 'sound/effects/tendril_destroyed.ogg', 40, TRUE) @@ -305,15 +304,15 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// -/mob/proc/CheckBloodsuckerEatFood(var/food_nutrition) +/mob/proc/CheckBloodsuckerEatFood(food_nutrition) if(!isliving(src)) return var/mob/living/L = src - if(!L.AmBloodsucker()) + if(!AmBloodsucker(L)) return // We're a bloodsucker? Try to eat food... - var/datum/antagonist/bloodsucker/bloodsuckerdatum = mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) - bloodsuckerdatum.bloodsucker_disgust(food_nutrition) + var/datum/antagonist/bloodsucker/B = L.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + B.handle_eat_human_food(food_nutrition) /datum/antagonist/bloodsucker/proc/handle_eat_human_food(food_nutrition, puke_blood = TRUE, masquerade_override) // Called from snacks.dm and drinks.dm diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm index 419093d153..c5f24ab537 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm @@ -132,7 +132,7 @@ /obj/structure/bloodsucker/vassalrack/MouseDrop_T(atom/movable/O, mob/user) if(!O.Adjacent(src) || O == user || !isliving(O) || !isliving(user) || useLock || has_buckled_mobs() || user.incapacitated()) return - if(!anchored && isbloodsucker(user)) + if(!anchored && AmBloodsucker(user)) to_chat(user, "Until this rack is secured in place, it cannot serve its purpose.") return // PULL TARGET: Remember if I was pullin this guy, so we can restore this @@ -185,7 +185,7 @@ /obj/structure/bloodsucker/vassalrack/user_unbuckle_mob(mob/living/M, mob/user) // Attempt Unbuckle - if(!isbloodsucker(user)) + if(!AmBloodsucker(user)) if(M == user) M.visible_message("[user] tries to release themself from the rack!",\ "You attempt to release yourself from the rack!") // For sound if not seen --> "You hear a squishy wet noise.") @@ -462,7 +462,7 @@ /obj/structure/bloodsucker/candelabrum/examine(mob/user) . = ..() - if((isbloodsucker()) || isobserver(user)) + if((AmBloodsucker(user)) || isobserver(user)) . += {"This is a magical candle which drains at the sanity of mortals who are not under your command while it is active."} . += {"You can alt click on it from any range to turn it on remotely, or simply be next to it and click on it to turn it on and off normally."} /* if(user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) @@ -471,12 +471,12 @@ /obj/structure/bloodsucker/candelabrum/attack_hand(mob/user) var/datum/antagonist/vassal/T = user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if(isbloodsucker(user) || istype(T)) + if(AmBloodsucker(user) || istype(T)) toggle() /obj/structure/bloodsucker/candelabrum/AltClick(mob/user) // Bloodsuckers can turn their candles on from a distance. SPOOOOKY. - if(isbloodsucker(user)) + if(AmBloodsucker(user)) toggle() /obj/structure/bloodsucker/candelabrum/proc/toggle(mob/user) @@ -493,7 +493,7 @@ if(lit) for(var/mob/living/carbon/human/H in viewers(7, src)) var/datum/antagonist/vassal/T = H.mind.has_antag_datum(ANTAG_DATUM_VASSAL) - if(isbloodsucker(H) || T) //We dont want vassals or vampires affected by this + if(AmBloodsucker(H) || T) //We dont want vassals or vampires affected by this return H.hallucination = 20 SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "vampcandle", /datum/mood_event/vampcandle) diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index 178a5afd84..b0678d5ff4 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -267,7 +267,7 @@ to_chat(user, "You are full. Further blood will be wasted.") warning_full = TRUE // Blood Remaining? (Carbons/Humans only) - if(iscarbon(target) && !target.AmBloodsucker(1)) + if(iscarbon(target) && !AmBloodsucker(target, TRUE)) if(target.blood_volume <= BLOOD_VOLUME_BAD && warning_target_bloodvol > BLOOD_VOLUME_BAD) to_chat(user, "Your victim's blood volume is fatally low!") else if(target.blood_volume <= BLOOD_VOLUME_OKAY && warning_target_bloodvol > BLOOD_VOLUME_OKAY) diff --git a/code/modules/antagonists/bloodsucker/powers/fortitude.dm b/code/modules/antagonists/bloodsucker/powers/fortitude.dm index f0724f8204..a58034df0d 100644 --- a/code/modules/antagonists/bloodsucker/powers/fortitude.dm +++ b/code/modules/antagonists/bloodsucker/powers/fortitude.dm @@ -33,6 +33,15 @@ if(was_running) user.toggle_move_intent() while(bloodsuckerdatum && ContinueActive(user) || user.m_intent == MOVE_INTENT_RUN) + if(istype(user.buckled, /obj/vehicle)) //We dont want people using fortitude being able to use vehicles + var/obj/vehicle/V = user.buckled + var/datum/component/riding/VRD = V.GetComponent(/datum/component/riding) + if(VRD) + VRD.force_dismount(user) + to_chat(user, "You trip off the [V], your muscles too heavy for it to support you.") + else + V.unbuckle_mob(user, force = TRUE) + to_chat(user, "You fall off the [V], your weight making you too heavy to be supported by it.") // Pay Blood Toll (if awake) if(user.stat == CONSCIOUS) bloodsuckerdatum.AddBloodVolume(-0.5) // Used to be 0.3 blood per 2 seconds, but we're making it more expensive to keep on. diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm index 3769f9eacc..aeddf771b8 100644 --- a/code/modules/hydroponics/grown/replicapod.dm +++ b/code/modules/hydroponics/grown/replicapod.dm @@ -78,7 +78,7 @@ make_podman = 1 break else - if(M.ckey == ckey && M.stat == DEAD && !M.suiciding) + if(M.ckey == ckey && M.stat == DEAD && !M.suiciding && AmBloodsucker(M)) make_podman = 1 if(isliving(M)) var/mob/living/L = M diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index 3b449ade7d..c89698530f 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -88,7 +88,7 @@ else to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.") SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) - if(!isbloodsucker(H)) + if(!AmBloodsucker(H)) H.revive(full_heal = TRUE) else H.revive(full_heal = FALSE) diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index de65b775b4..9640c72481 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -252,7 +252,7 @@ return 0 if(M.getorgan(/obj/item/organ/alien/hivenode)) return 0 - if(isbloodsucker(M)) + if(AmBloodsucker(M)) return 0 if(ismonkey(M)) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6e2398c487..fb06ec8186 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -853,7 +853,7 @@ /mob/living/carbon/proc/can_defib() var/tlimit = DEFIB_TIME_LIMIT * 10 var/obj/item/organ/heart = getorgan(/obj/item/organ/heart) - if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK) || isbloodsucker()) + if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK) || AmBloodsucker()) return if((world.time - timeofdeath) > tlimit) return diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index bac8053c9a..a7e739b70e 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -354,7 +354,7 @@ if(m_intent == MOVE_INTENT_RUN) m_intent = MOVE_INTENT_WALK else - if (HAS_TRAIT(src,TRAIT_NORUNNING)) // FULPSTATION 7/10/19 So you can't run during fortitude. + if (HAS_TRAIT(src,TRAIT_NORUNNING)) to_chat(src, "You find yourself unable to run.") return FALSE m_intent = MOVE_INTENT_RUN diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm index 384a113b27..5eb5b94de9 100644 --- a/code/modules/reagents/chemistry/reagents.dm +++ b/code/modules/reagents/chemistry/reagents.dm @@ -214,7 +214,7 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent()) //For easy bloodsucker disgusting and blood removal /datum/reagent/proc/disgust_bloodsucker(mob/living/carbon/C, disgust, blood_change, blood_puke = TRUE, force) - if(isvamp(C)) + if(AmBloodsucker(C)) var/datum/antagonist/bloodsucker/bloodsuckerdatum = C.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) if(disgust) bloodsuckerdatum.handle_eat_human_food(disgust, blood_puke, force) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index b7f32421aa..a7c0d55bb6 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -579,7 +579,7 @@ All effects don't start immediately, but rather get worse over time; the rate is value = 1.3 /datum/reagent/consumable/ethanol/bloody_mary/on_mob_life(mob/living/carbon/C) - if(isvamp(C)) + if(AmBloodsucker(C)) disgust_bloodsucker(FALSE, 1) //Bloodsuckers get SOME blood from it, for style reasons. if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) C.blood_volume = min((BLOOD_VOLUME_NORMAL*C.blood_ratio), C.blood_volume + 3) //Bloody Mary quickly restores blood loss. diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index d6715988be..837c3614a8 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -448,7 +448,7 @@ ..() /datum/reagent/consumable/condensedcapsaicin/reaction_mob(mob/living/M, method, reac_volume) - if(isbloodsucker(M)) + if(AmBloodsucker(M)) switch(method) if(INGEST) if(prob(min(30, current_cycle))) From fdc6a02eea369ec293e9656d50dc5ff7eb188157 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 25 Mar 2020 12:46:42 +0200 Subject: [PATCH 06/23] Hm --- code/_onclick/item_attack.dm | 2 +- .../crafting/recipes/recipes_clothing.dm | 9 ++++++ .../game/gamemodes/bloodsucker/bloodsucker.dm | 2 +- code/game/objects/items/stacks/medical.dm | 4 +++ .../bloodsucker/bloodsucker_life.dm | 26 +++++++++++++++--- .../bloodsucker/bloodsucker_powers.dm | 6 ++++ .../bloodsucker/datum_bloodsucker.dm | 6 ++-- .../antagonists/bloodsucker/powers/cloak.dm | 2 +- code/modules/hydroponics/grown/garlic.dm | 4 ++- .../living/carbon/alien/special/facehugger.dm | 14 +++++----- .../carbon/human/species_types/vampire.dm | 4 +-- .../chemistry/reagents/food_reagents.dm | 1 + icons/mob/neck.dmi | Bin 45707 -> 45980 bytes icons/obj/clothing/neck.dmi | Bin 2866 -> 2996 bytes 14 files changed, 60 insertions(+), 20 deletions(-) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index fe407509fe..baa1add7e1 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -119,7 +119,7 @@ send_item_attack_message(I, user) if(I.force) apply_damage(totitemdamage, I.damtype) //CIT CHANGE - replaces I.force with totitemdamage - if(I.damtype == BRUTE && !HAS_TRAIT(src, TRAIT_NOMARROW)) + if(I.damtype == BRUTE) if(prob(33)) I.add_mob_blood(src) var/turf/location = get_turf(src) diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm index 5636be6b2a..fb3500a037 100644 --- a/code/datums/components/crafting/recipes/recipes_clothing.dm +++ b/code/datums/components/crafting/recipes/recipes_clothing.dm @@ -287,3 +287,12 @@ /obj/item/bedsheet/cosmos = 1) time = 60 category = CAT_CLOTHING + + +/datum/crafting_recipe/wintercoat_cosmic + name = "Cosmic Winter Coat" + result = /obj/item/clothing/neck/garlic_necklace + reqs = list(/obj/item/reagent_containers/food/snacks/grown/garlic = 15, + /obj/item/stack/cable_coil = 10) + time = 100 //Takes awhile to put all the garlics on the coil and knot it. + category = CAT_CLOTHING diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index 58559b721f..7f9873cfb0 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -262,7 +262,7 @@ target.mind.add_antag_datum(V, V.master.get_team()) // Update Bloodsucker Title (we're a daddy now) B.SelectTitle(am_fledgling = FALSE) // Only works if you have no title yet. - // lOg it + // Log it message_admins("[target] has become a Vassal, and is enslaved to [creator].") log_admin("[target] has become a Vassal, and is enslaved to [creator].") return TRUE diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 205ce57251..50e9b94e97 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -72,6 +72,8 @@ to_chat(user, " [M] is at full health.") return FALSE user.visible_message("[user] applies \the [src] on [M].", "You apply \the [src] on [M].") + if(AmBloodsucker(M)) + return M.heal_bodypart_damage((heal_brute/2)) return TRUE if(iscarbon(M)) @@ -148,6 +150,8 @@ return if(iscarbon(M)) return heal_carbon(M, user, 0, heal_burn) + if(AmBloodsucker(M)) + return to_chat(user, "You can't heal [M] with the \the [src]!") /obj/item/stack/medical/ointment/suicide_act(mob/living/user) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index af2fd1b374..01e8774c27 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -12,7 +12,7 @@ /datum/antagonist/bloodsucker/proc/LifeTick()// Should probably run from life.dm, same as handle_changeling, but will be an utter pain to move set waitfor = FALSE // Don't make on_gain() wait for this function to finish. This lets this code run on the side. - var/notice_healing = FALSE + var/notice_healing while(owner && !AmFinalDeath()) // owner.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) == src if(owner.current.stat == CONSCIOUS && !poweron_feed && !HAS_TRAIT(owner.current, TRAIT_DEATHCOMA)) // Deduct Blood AddBloodVolume(-0.1) // -.15 (before tick went from 10 to 30, but we also charge more for faking life now) @@ -82,16 +82,32 @@ /datum/antagonist/bloodsucker/proc/HandleHealing(mult = 1) // NOTE: Mult of 0 is just a TEST to see if we are injured and need to go into Torpor! //It is called from your coffin on close (by you only) - if(poweron_masquerade == TRUE || owner.current.AmStaked() || owner.current.reagents?.has_reagent(/datum/reagent/consumable/garlic)) + var/notice_garlic + var/notice_necklace + if(poweron_masquerade == TRUE || owner.current.AmStaked()) + return FALSE + if(owner.current.reagents?.has_reagent(/datum/reagent/consumable/garlic)) + if(notice_garlic) + to_chat(owner.current, "Garlic in your blood is interfering with your regeneration!") + notice_garlic = TRUE + return FALSE + if(istype(owner.current.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + if(notice_necklace) + to_chat(owner.current, "The necklace on your neck is interrupting your healing!") + notice_necklace = TRUE return FALSE owner.current.adjustStaminaLoss(-1.5 + (regenRate * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. owner.current.adjustCloneLoss(-0.1 * (regenRate * 2) * mult, 0) owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (regenRate * 4) * mult) //adjustBrainLoss(-1 * (regenRate * 4) * mult, 0) + if(notice_garlic) + notice_garlic = FALSE + if(notice_necklace) + notice_necklace = FALSE // No Bleeding if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. var/mob/living/carbon/human/H = owner.current if(H.bleed_rate > 0) //Only heal bleeding if we are actually bleeding - H.bleed_rate =- 0.5 + regenRate * mult + H.bleed_rate =- 0.5 + regenRate * 0.2 * mult if(iscarbon(owner.current)) // Damage Heal: Do I have damage to ANY bodypart? var/mob/living/carbon/C = owner.current var/costMult = 1 // Coffin makes it cheaper @@ -235,6 +251,7 @@ /datum/antagonist/bloodsucker/proc/Torpor_Begin(amInCoffin = FALSE) owner.current.stat = UNCONSCIOUS + owner.current.apply_status_effect(STATUS_EFFECT_UNCONSCIOUS) ADD_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") // Come after UNCONSCIOUS or else it fails ADD_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") // Without this, you'll just keep dying while you recover. ADD_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. @@ -248,8 +265,9 @@ power.DeactivatePower() /datum/antagonist/bloodsucker/proc/Torpor_End() - REMOVE_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") owner.current.stat = SOFT_CRIT + owner.current.remove_status_effect(STATUS_EFFECT_UNCONSCIOUS) + owner.current.cure_fakedeath("bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm index 507e1f2739..abfd2d120f 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm @@ -93,6 +93,12 @@ if(display_error) to_chat(owner, "You have a stake in your chest! Your powers are useless.") return FALSE + if(istype(owner.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) + to_chat(owner, "") + return FALSE + if(owner.reagents?.has_reagent(/datum/reagent/consumable/garlic)) + to_chat(owner, "Garlic in your blood is interfering with your powers!") + return FALSE // Incap? if(must_be_capacitated) var/mob/living/L = owner diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 20ce602fce..1821ec2f3d 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -22,7 +22,7 @@ // STATS var/vamplevel = 0 var/vamplevel_unspent = 1 - var/regenRate = 0.4 // How many points of Brute do I heal per tick? + var/regenRate = 0.4 // How fast do I regenerate? var/feedAmount = 15 // Amount of blood drawn from a target per tick. var/maxBloodVolume = 600 // Maximum blood a Vamp can hold via feeding. // BLOOD_VOLUME_NORMAL 550 // BLOOD_VOLUME_SAFE 475 //BLOOD_VOLUME_OKAY 336 //BLOOD_VOLUME_BAD 224 // BLOOD_VOLUME_SURVIVE 122 // OBJECTIVES @@ -47,8 +47,8 @@ SSticker.mode.bloodsuckers |= owner // Add if not already in here (and you might be, if you were picked at round start) SSticker.mode.check_start_sunlight()// Start Sunlight? (if first Vamp) SelectFirstName()// Name & Title - SelectTitle(am_fledgling=TRUE) // If I have a creator, then set as Fledgling. - SelectReputation(am_fledgling=TRUE) + SelectTitle(am_fledgling = TRUE) // If I have a creator, then set as Fledgling. + SelectReputation(am_fledgling = TRUE) AssignStarterPowersAndStats()// Give Powers & Stats forge_bloodsucker_objectives()// Objectives & Team update_bloodsucker_icons_added(owner.current, "bloodsucker") // Add Antag HUD diff --git a/code/modules/antagonists/bloodsucker/powers/cloak.dm b/code/modules/antagonists/bloodsucker/powers/cloak.dm index 1bb7b02357..a616c39923 100644 --- a/code/modules/antagonists/bloodsucker/powers/cloak.dm +++ b/code/modules/antagonists/bloodsucker/powers/cloak.dm @@ -2,7 +2,7 @@ /datum/action/bloodsucker/cloak name = "Cloak of Darkness" - desc = "Blend into the shadows and become invisible to the untrained eye. Movement is slowed in brightly lit areas." + desc = "Blend into the shadows and become invisible to the untrained eye. Movement is slowed in brightly lit areas, and you cannot dissapear while mortals watch you." button_icon_state = "power_cloak" bloodcost = 5 cooldown = 50 diff --git a/code/modules/hydroponics/grown/garlic.dm b/code/modules/hydroponics/grown/garlic.dm index 7ee8aab9a8..fd24376282 100644 --- a/code/modules/hydroponics/grown/garlic.dm +++ b/code/modules/hydroponics/grown/garlic.dm @@ -23,6 +23,8 @@ /obj/item/clothing/neck/garlic_necklace name = "garlic necklace" - desc = "A clove of garlic on a string, tied to itself in a circle, just might fit around your neck. For paranoid people who fear getting their blood sucked." + desc = "A clove of garlic on a cable, tied to itself in a circle, just might fit around your neck. For loonies people who fear getting their blood sucked." icon_state = "garlic_necklace" + item_state = "garlic_necklace" + alternate_worn_icon = 'icons/mob/neck.dmi' \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index 9640c72481..eb1b38b9ff 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -247,13 +247,13 @@ /proc/CanHug(mob/living/M) if(!istype(M)) - return 0 + return FALSE if(M.stat == DEAD) - return 0 + return FALSE if(M.getorgan(/obj/item/organ/alien/hivenode)) - return 0 + return FALSE if(AmBloodsucker(M)) - return 0 + return FALSE if(ismonkey(M)) return 1 @@ -262,9 +262,9 @@ if(ishuman(C) && !(SLOT_WEAR_MASK in C.dna.species.no_equip)) var/mob/living/carbon/human/H = C if(H.is_mouth_covered(head_only = 1)) - return 0 - return 1 - return 0 + return FALSE + return TRUE + return FALSE #undef MIN_ACTIVE_TIME #undef MAX_ACTIVE_TIME diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index b62b8304da..6a4ef2e9d9 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -82,7 +82,7 @@ to_chat(H, "You're already full!") return //This checks whether or not they are wearing a garlic clove on their neck - if(sucking_checks(victim, TRUE, FALSE)) + if(!sucking_checks(victim, TRUE, FALSE)) return if(victim.stat == DEAD) to_chat(H, "You need a living victim!") @@ -96,7 +96,7 @@ to_chat(H, "[victim] is blessed! You stop just in time to avoid catching fire.") return //Here we check now for both the garlic cloves on the neck and for blood in the victims bloodstream. - if(sucking_checks(victim, TRUE, TRUE)) + if(!sucking_checks(victim, TRUE, TRUE)) return if(!do_after(H, 30, target = victim)) return diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 837c3614a8..ce276a0d8b 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -18,6 +18,7 @@ /datum/reagent/consumable/on_mob_life(mob/living/carbon/M) current_cycle++ M.nutrition += nutriment_factor + M.CheckBloodsuckerEatFood(nutriment_factor) holder.remove_reagent(type, metabolization_rate) /datum/reagent/consumable/reaction_mob(mob/living/M, method=TOUCH, reac_volume) diff --git a/icons/mob/neck.dmi b/icons/mob/neck.dmi index de59a136d99ca23e0b751b962395756793bcaafb..d899950b791ce189c53b278e03adf02163ad67a3 100644 GIT binary patch delta 3295 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 delta 3009 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 DO}7Xq diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index 0bdaa36e6248c6651f423569e52749145389f88c..ea44ae0a7c1ef53a3ef91b29ff6da5ca40799b05 100644 GIT binary patch delta 2685 zcmV-@3WD{r7PJ?TBmq9LB{Knk?%kvI?ak`fnDXA$^5(pGG0MpR0004WQchCV=-0C=30l(9|&F${+1%Tq+{45Glwf?8D_=qn&6aWB^8 zl9S_t;OPkzA$36K+wAE3f7!B~wSC_04@bLwIhZ%(N+sJT`*?e2x_1hH5?k_cZ@P%o zN4X?bK(K`?m(D1JE7Jwy+FmxMJ28xSiT^mppuu8cCYMx}RZwE7zD)D1OW+5UsRusI zQlID;bf}L^RYs^fyb9BVp=ZRrNbx<0MS?aF9Y3M?k`l0^)MDxydf-IONYc zOp9Alsn!4gAJ{qP-asVx+*rGrJZoN*#OFftd){;3bFVRsNS~^IVln-AJgy&4BtGu` z$)tWfHu6YI7$1GCB}|N^K8i3o{zOk0o6r-+C-sDhbSnKZgvlvAVQge#VnhQNADx^W z)c__^>1iG?lkw#npPCxi1I|oLXaQ#@C$)enzQ$SO4uH9-DGeYPI5ROb!v+NmoSmGV zWrG3*9-AIZtAdh$rFS1fFfccj%ke>pJsO#a!8GJdj6WWojKef!OiWCt(?Bbi%iBL^aD&Lb2&|b2@mqC#e@7R_)@7Jk~&or#28#uf)%5GgGAh&gK z08!+BpmGo65aP_6&*wdSxO4IOFX`V9QR+Sbg!A*B@`g%K=1}uRiWDi*f2@LOE-Yxq ziPuGStu~$h_}3K6^jo_HITqFOQn*UP~chRayb}6lkk4{VP!=PXc69z zKd!C@1xR=(HK9d#D4uYQ#NWeje4WG$7R=IriU2fCQ!!q&%BupLcj6#ot>TC z-MzhCrH2wwCYc44Nmc_?Dvh{YjItLH5-b}HMp*?|!P|59&s8_)z&<|1`?c*Yu#e9$ z_$B};D?@;gVem}=QdSgzb!amcexdLiKipm4+uLIn63Vaubhb3N`7px*(Am;|C;+m$ zWh~d6gGtCPA~*-PU=lKekPt*H6`W2ploCh?B9@Czr%|K?02}=6{l^b?cMiER;F5?7 z&X(pDAaF^}VTr!pl3k8G%K%xU=*Z8urTwE+76aW$(AnR}T z@9KAWEuoKC>=GUU*){$Lyq3{NEOr@>fc%hvui*7NK>=I=kBB_bYk2*CK~Ml!#3Ld< zuwF?Y1so#Z)@$jbfJ5X5*DDF>g%f%$Ap?PP#KAcV6fRPv|AAVzeRLEwghq&Wd~CN` zL4z<7cy_zp4kw{acz^zRauQZR!b63Wuw}PT1fXr(LBlB2YPSR+MkU06GRZ;HC}i6w zt+vFoZPg?^eRKK-eonc6D|9wG8}QS)FM;zw6sJ!08%I|9d>((8&h_>aGs~0mOczIq^0coFDF^7f^sX#}5b8 zUSA|wHX4kwH^<=po3pbwvJwhHKr@UDS!uP-&NPH@eZ%0c4;co3-vl6KMbT(ZPtX4P z>x|<=!ofSk2jABb4&FU{m|+3vY-v9H2L8JL_aPyO*lszUhFOkvCAy35`+eY&h)2$r zCS3akQCdK>Wg`q9VEg2R`V567e0##9))DNZPuezl39Mn;RUaG2t)mt~0U*%qq2My)cTX_9VPypA$BO-@PZ>5g{4v|Brw-PdxaE?L^7b#MtNRc9a zoVw?zZqOK<0Pg~iVMXi;JUqMT1_{Ec&xhyCXFB~iW|*GKuphYWT{fHW#(rP>eDRz) zA12iBAzX)lxOIte2+0uoJYVz&bRN1e4_`V1hm{|=> z;qz_!h;Fcd#{|T6eV-e!4JIt&>l+Gn!@O58sK1RgVl`# zcokB>YsFcZL%?xm|Nr`yr)&KKI@QcoR&C z_0Q*Sf-kYp^Ep?I11ho4^Enq)fUBME`CQl=^}xcwD(s{F9wDr2alf)5tuW|4);6pK rMp11;TVN9GsDnm`6e&`qPfY&+-(PbFg4`VK00000NkvXXu0mjf4fXKt delta 2554 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 Q^Z)<=07*qoM6N<$f@%1{O#lD@ From 7d22cb00d03b31b63cd79661b9dacb1063d398c1 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 25 Mar 2020 19:32:46 +0200 Subject: [PATCH 07/23] Mixes and fixes --- code/__HELPERS/unsorted.dm | 3 - code/_onclick/hud/human.dm | 2 +- .../game/gamemodes/bloodsucker/bloodsucker.dm | 2 +- .../bloodsucker/bloodsucker_life.dm | 51 +++----- .../bloodsucker/bloodsucker_powers.dm | 6 +- .../bloodsucker/bloodsucker_sunlight.dm | 10 +- .../bloodsucker/datum_bloodsucker.dm | 120 ++++++++---------- .../bloodsucker/objects/bloodsucker_crypt.dm | 4 +- .../antagonists/bloodsucker/powers/feed.dm | 4 +- code/modules/language/vampiric.dm | 2 +- .../carbon/human/species_types/jellypeople.dm | 2 +- .../chemistry/reagents/food_reagents.dm | 6 +- 12 files changed, 97 insertions(+), 115 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index e0300eca10..1240c38d93 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1573,11 +1573,8 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) return TRUE if(check_neck) if(istype(target.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) - to_chat(src, "[target] is wearing a garlic clove around their neck! You cant drink from them while it is on them!") return FALSE if(check_blood) if(target.reagents.has_reagent(/datum/reagent/consumable/garlic)) - to_chat(target, "[src] tries to bite you, but recoils in disgust!") - to_chat(src, "[target] reeks of garlic! you can't bring yourself to drain such tainted blood.") return FALSE return TRUE diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 490f0aa0f0..328e008f10 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -367,7 +367,7 @@ blood_display.hud = src infodisplay += blood_display - vamprank_display = new /obj/screen/bloodsucker/rank_counter // Vampire Rank + vamprank_display = new /obj/screen/bloodsucker/rank_counter // Bloodsucker Rank vamprank_display.hud = src infodisplay += vamprank_display diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index 7f9873cfb0..adcb80ff07 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -133,7 +133,7 @@ // Not High Enough if(creator) var/datum/antagonist/bloodsucker/creator_bloodsucker = creator.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) - if(!istype(creator_bloodsucker) || creator_bloodsucker.vamplevel < BLOODSUCKER_LEVEL_TO_EMBRACE) + if(!istype(creator_bloodsucker) || creator_bloodsucker.bloodsucker_level < BLOODSUCKER_LEVEL_TO_EMBRACE) to_chat(creator, "Your blood is too thin to turn this corpse!") return FALSE return TRUE diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 01e8774c27..90919a4e80 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -15,7 +15,7 @@ var/notice_healing while(owner && !AmFinalDeath()) // owner.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) == src if(owner.current.stat == CONSCIOUS && !poweron_feed && !HAS_TRAIT(owner.current, TRAIT_DEATHCOMA)) // Deduct Blood - AddBloodVolume(-0.1) // -.15 (before tick went from 10 to 30, but we also charge more for faking life now) + AddBloodVolume(passive_blood_drain) // -.1 currently if(HandleHealing(1)) // Heal if(notice_healing == FALSE && owner.current.blood_volume > 0) to_chat(owner, "The power of your blood begins knitting your wounds...") @@ -39,12 +39,12 @@ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /datum/antagonist/bloodsucker/proc/AddBloodVolume(value) - owner.current.blood_volume = CLAMP(owner.current.blood_volume + value, 0, maxBloodVolume) + owner.current.blood_volume = CLAMP(owner.current.blood_volume + value, 0, max_blood_volume) update_hud() /datum/antagonist/bloodsucker/proc/HandleFeeding(mob/living/carbon/target, mult=1) // mult: SILENT feed is 1/3 the amount - var/blood_taken = min(feedAmount, target.blood_volume) * mult // Starts at 15 (now 8 since we doubled the Feed time) + var/blood_taken = min(feed_amount, target.blood_volume) * mult // Starts at 15 (now 8 since we doubled the Feed time) target.blood_volume -= blood_taken // Simple Animals lose a LOT of blood, and take damage. This is to keep cats, cows, and so forth from giving you insane amounts of blood. if(!ishuman(target)) @@ -82,32 +82,21 @@ /datum/antagonist/bloodsucker/proc/HandleHealing(mult = 1) // NOTE: Mult of 0 is just a TEST to see if we are injured and need to go into Torpor! //It is called from your coffin on close (by you only) - var/notice_garlic - var/notice_necklace + var/actual_regen = regen_rate + additional_regen if(poweron_masquerade == TRUE || owner.current.AmStaked()) return FALSE - if(owner.current.reagents?.has_reagent(/datum/reagent/consumable/garlic)) - if(notice_garlic) - to_chat(owner.current, "Garlic in your blood is interfering with your regeneration!") - notice_garlic = TRUE + if(owner.current.reagents.has_reagent(/datum/reagent/consumable/garlic)) return FALSE if(istype(owner.current.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) - if(notice_necklace) - to_chat(owner.current, "The necklace on your neck is interrupting your healing!") - notice_necklace = TRUE return FALSE - owner.current.adjustStaminaLoss(-1.5 + (regenRate * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. - owner.current.adjustCloneLoss(-0.1 * (regenRate * 2) * mult, 0) - owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (regenRate * 4) * mult) //adjustBrainLoss(-1 * (regenRate * 4) * mult, 0) - if(notice_garlic) - notice_garlic = FALSE - if(notice_necklace) - notice_necklace = FALSE + owner.current.adjustStaminaLoss(-1.5 + (actual_regen * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. + owner.current.adjustCloneLoss(-0.1 * (actual_regen * 2) * mult, 0) + owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (actual_regen * 4) * mult) // No Bleeding if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. var/mob/living/carbon/human/H = owner.current if(H.bleed_rate > 0) //Only heal bleeding if we are actually bleeding - H.bleed_rate =- 0.5 + regenRate * 0.2 * mult + H.bleed_rate =- 0.5 + actual_regen * 0.2 * mult if(iscarbon(owner.current)) // Damage Heal: Do I have damage to ANY bodypart? var/mob/living/carbon/C = owner.current var/costMult = 1 // Coffin makes it cheaper @@ -115,7 +104,7 @@ var/amInCoffinWhileTorpor = istype(C.loc, /obj/structure/closet/crate/coffin) && (mult == 0 || HAS_TRAIT(C, TRAIT_DEATHCOMA)) // Check for mult 0 OR death coma. (mult 0 means we're testing from coffin) if(amInCoffinWhileTorpor) mult *= 4 // Increase multiplier if we're sleeping in a coffin. - fireheal = min(C.getFireLoss(), regenRate) // NOTE: Burn damage ONLY heals in torpor. + fireheal = min(C.getFireLoss(), actual_regen) // NOTE: Burn damage ONLY heals in torpor. costMult = 0.25 C.ExtinguishMob() CureDisabilities() // Extinguish Fire @@ -125,12 +114,10 @@ else if(owner.current.blood_volume <= 0) // No Blood? Lower Mult mult = 0.25 - // Crit from burn? Lower damage to maximum allowed. - //if (C.getFireLoss() > owner.current.getMaxHealth()) - // fireheal = regenRate / 2 + // BRUTE: Always Heal - var/bruteheal = min(C.getBruteLoss(), regenRate) - var/toxinheal = min(C.getToxLoss(), regenRate) + var/bruteheal = min(C.getBruteLoss(), actual_regen) + var/toxinheal = min(C.getToxLoss(), actual_regen) // Heal if Damaged if(bruteheal + fireheal + toxinheal > 0) // Just a check? Don't heal/spend, and return. if(mult == 0) @@ -195,10 +182,14 @@ if(owner.current.blood_volume < BLOOD_VOLUME_BAD / 2) owner.current.blur_eyes(8 - 8 * (owner.current.blood_volume / BLOOD_VOLUME_BAD)) // Nutrition + owner.current.nutrition = clamp(owner.current.blood_volume, 545, 0) //The amount of blood is how full we are. + //A bit higher regeneration based on blood volume if(owner.current.blood_volume < BLOOD_VOLUME_NORMAL) - owner.current.nutrition = min(owner.current.blood_volume, NUTRITION_LEVEL_WELL_FED) - else if(owner.current.blood_volume < BLOOD_VOLUME_SAFE) - owner.current.nutrition = min(owner.current.blood_volume, NUTRITION_LEVEL_FED) // <-- 350 //NUTRITION_LEVEL_FULL + additional_regen = 0.3 + else if(owner.current.blood_volume < BLOOD_VOLUME_OKAY) + additional_regen = 0.2 + else if(owner.current.blood_volume < BLOOD_VOLUME_BAD) + additional_regen = 0.1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // DEATH @@ -300,7 +291,7 @@ // Free my Vassals! FreeAllVassals() // Elders get Dusted - if(vamplevel >= 4) // (vamptitle) + if(bloodsucker_level >= 4) // (bloodsucker_title) owner.current.visible_message("[owner.current]'s skin crackles and dries, their skin and bones withering to dust. A hollow cry whips from what is now a sandy pile of remains.", \ "Your soul escapes your withering body as the abyss welcomes you to your Final Death.", \ "You hear a dry, crackling sound.") diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm index abfd2d120f..5c4b1f2b9f 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm @@ -94,10 +94,12 @@ to_chat(owner, "You have a stake in your chest! Your powers are useless.") return FALSE if(istype(owner.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) - to_chat(owner, "") + if(display_error) + to_chat(owner, "") return FALSE if(owner.reagents?.has_reagent(/datum/reagent/consumable/garlic)) - to_chat(owner, "Garlic in your blood is interfering with your powers!") + if(display_error) + to_chat(owner, "Garlic in your blood is interfering with your powers!") return FALSE // Incap? if(must_be_capacitated) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm index 263f91a9a6..b7d98c6783 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm @@ -141,23 +141,23 @@ if(!bloodsuckerdatum.warn_sun_locker) to_chat(M, "Your skin sizzles. The [M.current.loc] doesn't protect well against UV bombardment.") bloodsuckerdatum.warn_sun_locker = TRUE - M.current.adjustFireLoss(0.5 + bloodsuckerdatum.vamplevel / 2) // M.current.fireloss += 0.5 + bloodsuckerdatum.vamplevel / 2 // Do DIRECT damage. Being spaced was causing this to not occur. setFireLoss(bloodsuckerdatum.vamplevel) + M.current.adjustFireLoss(0.5 + bloodsuckerdatum.bloodsucker_level / 2) // M.current.fireloss += 0.5 + bloodsuckerdatum.bloodsucker_level / 2 // Do DIRECT damage. Being spaced was causing this to not occur. setFireLoss(bloodsuckerdatum.bloodsucker_level) M.current.updatehealth() SEND_SIGNAL(M.current, COMSIG_ADD_MOOD_EVENT, "vampsleep", /datum/mood_event/daylight_1) // Out in the Open? Buh Bye else if(!bloodsuckerdatum.warn_sun_burn) - if(bloodsuckerdatum.vamplevel > 0) + if(bloodsuckerdatum.bloodsucker_level > 0) to_chat(M, "The solar flare sets your skin ablaze!") else to_chat(M, "The solar flare scalds your neophyte skin!") bloodsuckerdatum.warn_sun_burn = TRUE if(M.current.fire_stacks <= 0) M.current.fire_stacks = 0 - if(bloodsuckerdatum.vamplevel > 0) - M.current.adjust_fire_stacks(0.2 + bloodsuckerdatum.vamplevel / 10) + if(bloodsuckerdatum.bloodsucker_level > 0) + M.current.adjust_fire_stacks(0.2 + bloodsuckerdatum.bloodsucker_level / 10) M.current.IgniteMob() - M.current.adjustFireLoss(2 + bloodsuckerdatum.vamplevel) // M.current.fireloss += 2 + bloodsuckerdatum.vamplevel // Do DIRECT damage. Being spaced was causing this to not occur. //setFireLoss(2 + bloodsuckerdatum.vamplevel) + M.current.adjustFireLoss(2 + bloodsuckerdatum.bloodsucker_level) // M.current.fireloss += 2 + bloodsuckerdatum.bloodsucker_level // Do DIRECT damage. Being spaced was causing this to not occur. //setFireLoss(2 + bloodsuckerdatum.bloodsucker_level) M.current.updatehealth() SEND_SIGNAL(M.current, COMSIG_ADD_MOOD_EVENT, "vampsleep", /datum/mood_event/daylight_2) diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 1821ec2f3d..f8c35f7938 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -8,9 +8,9 @@ job_rank = ROLE_BLOODSUCKER // NAME - var/vampname // My Dracula name - var/vamptitle // My Dracula title - var/vampreputation // My "Surname" or description of my deeds + var/bloodsucker_name // My Dracula style name + var/bloodsucker_title // My Dracula style title + var/bloodsucker_reputation // My "Surname" or description of my deeds // CLAN var/datum/team/vampireclan/clan var/list/datum/antagonist/vassal/vassals = list()// Vassals under my control. Periodically remove the dead ones. @@ -20,28 +20,26 @@ var/poweron_feed = FALSE // Am I feeding? var/poweron_masquerade = FALSE // STATS - var/vamplevel = 0 - var/vamplevel_unspent = 1 - var/regenRate = 0.4 // How fast do I regenerate? - var/feedAmount = 15 // Amount of blood drawn from a target per tick. - var/maxBloodVolume = 600 // Maximum blood a Vamp can hold via feeding. // BLOOD_VOLUME_NORMAL 550 // BLOOD_VOLUME_SAFE 475 //BLOOD_VOLUME_OKAY 336 //BLOOD_VOLUME_BAD 224 // BLOOD_VOLUME_SURVIVE 122 + var/bloodsucker_level + var/bloodsucker_level_unspent = 1 + var/regen_rate = 0.4 // How fast do I regenerate? + var/additional_regen // How much additional blood regen we gain from bonuses such as high blood. + var/feed_amount = 15 // Amount of blood drawn from a target per tick. + var/max_blood_volume = 600 // Maximum blood a Vamp can hold via feeding. // OBJECTIVES var/list/datum/objective/objectives_given = list() // For removal if needed. var/area/lair var/obj/structure/closet/crate/coffin // TRACKING - var/foodInGut = 0 // How much food to throw up later. You shouldn't have eaten that. - var/warn_sun_locker = FALSE // So we only get the locker burn message once per day. - var/warn_sun_burn = FALSE // So we only get the sun burn message once per day. - var/had_toxlover = FALSE + var/foodInGut // How much food to throw up later. You shouldn't have eaten that. + var/warn_sun_locker // So we only get the locker burn message once per day. + var/warn_sun_burn // So we only get the sun burn message once per day. + var/had_toxlover var/level_bloodcost + var/passive_blood_drain = -0.1 //The amount of blood we loose each bloodsucker life() tick // LISTS var/static/list/defaultTraits = list (TRAIT_STABLEHEART, TRAIT_NOBREATH, TRAIT_SLEEPIMMUNE, TRAIT_NOCRITDAMAGE, TRAIT_RESISTCOLD, TRAIT_RADIMMUNE, TRAIT_NIGHT_VISION, \ TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_AGEUSIA, TRAIT_COLDBLOODED, TRAIT_NONATURALHEAL, TRAIT_NOMARROW, TRAIT_NOPULSE, TRAIT_VIRUSIMMUNE) - // NOTES: TRAIT_AGEUSIA <-- Doesn't like flavors. - // REMOVED: TRAIT_NODEATH - // TO ADD: - //var/static/list/defaultOrgans = list (/obj/item/organ/heart/vampheart,/obj/item/organ/heart/vampeyes) /datum/antagonist/bloodsucker/on_gain() SSticker.mode.bloodsuckers |= owner // Add if not already in here (and you might be, if you were picked at round start) @@ -68,18 +66,18 @@ /datum/antagonist/bloodsucker/greet() var/fullname = ReturnFullName(TRUE) - to_chat(owner, "You are [fullname], a bloodsucking vampire!
") + to_chat(owner, "You are [fullname], a strain of vampire dubbed bloodsucker!
") owner.announce_objectives() to_chat(owner, "* You regenerate your health slowly, you're weak to fire, and you depend on blood to survive. Allow your stolen blood to run too low, and you will find yourself at \ risk of being discovered!
") //to_chat(owner, "As an immortal, your power is linked to your age. The older you grow, the more abilities you will have access to.") - var/vamp_greet - vamp_greet += "* Other Bloodsuckers are not necessarily your friends, but your survival may depend on cooperation. Betray them at your own discretion and peril.
" - vamp_greet += "* Use \",b\" to speak your ancient Bloodsucker language.
" - vamp_greet += "Bloodsucker Tip: Rest in a Coffin to claim it, and that area, as your lair.
" - vamp_greet += "Bloodsucker Tip: Fear the daylight! Solar flares will bombard the station periodically, and only your coffin can guarantee your safety.
" - vamp_greet += "Bloodsucker Tip: You wont loose blood if you are unconcious or sleeping. Use this to your advantage to conserve blood.
" - to_chat(owner, vamp_greet) + var/bloodsucker_greet + bloodsucker_greet += "* Other Bloodsuckers are not necessarily your friends, but your survival may depend on cooperation. Betray them at your own discretion and peril.
" + bloodsucker_greet += "* Use \",b\" to speak your ancient Bloodsucker language.
" + bloodsucker_greet += "Bloodsucker Tip: Rest in a Coffin to claim it, and that area, as your lair.
" + bloodsucker_greet += "Bloodsucker Tip: Fear the daylight! Solar flares will bombard the station periodically, and only your coffin can guarantee your safety.
" + bloodsucker_greet += "Bloodsucker Tip: You wont loose blood if you are unconcious or sleeping. Use this to your advantage to conserve blood.
" + to_chat(owner, bloodsucker_greet) owner.current.playsound_local(null, 'sound/bloodsucker/BloodsuckerAlert.ogg', 100, FALSE, pressure_affected = FALSE) antag_memory += "Although you were born a mortal, in un-death you earned the name [fullname].
" @@ -100,7 +98,7 @@ /datum/antagonist/bloodsucker/proc/SelectFirstName() // Names (EVERYONE gets one)) if(owner.current.gender == MALE) - vampname = pick("Desmond","Rudolph","Dracul","Vlad","Pyotr","Gregor","Cristian","Christoff","Marcu","Andrei","Constantin","Gheorghe","Grigore","Ilie","Iacob","Luca","Mihail","Pavel","Vasile","Octavian","Sorin", \ + bloodsucker_name = pick("Desmond","Rudolph","Dracul","Vlad","Pyotr","Gregor","Cristian","Christoff","Marcu","Andrei","Constantin","Gheorghe","Grigore","Ilie","Iacob","Luca","Mihail","Pavel","Vasile","Octavian","Sorin", \ "Sveyn","Aurel","Alexe","Iustin","Theodor","Dimitrie","Octav","Damien","Magnus","Caine","Abel", // Romanian/Ancient "Lucius","Gaius","Otho","Balbinus","Arcadius","Romanos","Alexios","Vitellius", // Latin "Melanthus","Teuthras","Orchamus","Amyntor","Axion", // Greek @@ -108,7 +106,7 @@ "Dio") else - vampname = pick("Islana","Tyrra","Greganna","Pytra","Hilda","Andra","Crina","Viorela","Viorica","Anemona","Camelia","Narcisa","Sorina","Alessia","Sophia","Gladda","Arcana","Morgan","Lasarra","Ioana","Elena", \ + bloodsucker_name = pick("Islana","Tyrra","Greganna","Pytra","Hilda","Andra","Crina","Viorela","Viorica","Anemona","Camelia","Narcisa","Sorina","Alessia","Sophia","Gladda","Arcana","Morgan","Lasarra","Ioana","Elena", \ "Alina","Rodica","Teodora","Denisa","Mihaela","Svetla","Stefania","Diyana","Kelssa","Lilith", // Romanian/Ancient "Alexia","Athanasia","Callista","Karena","Nephele","Scylla","Ursa", // Latin "Alcestis","Damaris","Elisavet","Khthonia","Teodora", // Greek @@ -116,57 +114,57 @@ /datum/antagonist/bloodsucker/proc/SelectTitle(am_fledgling = 0, forced = FALSE) // Already have Title - if (!forced && vamptitle != null) + if(!forced && bloodsucker_title != null) return // Titles [Master] - if (!am_fledgling) + if(!am_fledgling) if(owner.current.gender == MALE) - vamptitle = pick ("Count","Baron","Viscount","Prince","Duke","Tzar","Dreadlord","Lord","Master") + bloodsucker_title = pick ("Count","Baron","Viscount","Prince","Duke","Tzar","Dreadlord","Lord","Master") else - vamptitle = pick ("Countess","Baroness","Viscountess","Princess","Duchess","Tzarina","Dreadlady","Lady","Mistress") + bloodsucker_title = pick ("Countess","Baroness","Viscountess","Princess","Duchess","Tzarina","Dreadlady","Lady","Mistress") to_chat(owner, "You have earned a title! You are now known as [ReturnFullName(TRUE)]!") // Titles [Fledgling] else - vamptitle = null + bloodsucker_title = null /datum/antagonist/bloodsucker/proc/SelectReputation(am_fledgling = 0, forced=FALSE) // Already have Reputation - if(!forced && vampreputation != null) + if(!forced && bloodsucker_reputation != null) return // Reputations [Master] if(!am_fledgling) - vampreputation = pick("Butcher","Blood Fiend","Crimson","Red","Black","Terror","Nightman","Feared","Ravenous","Fiend","Malevolent","Wicked","Ancient","Plaguebringer","Sinister","Forgotten","Wretched","Baleful", \ + bloodsucker_reputation = pick("Butcher","Blood Fiend","Crimson","Red","Black","Terror","Nightman","Feared","Ravenous","Fiend","Malevolent","Wicked","Ancient","Plaguebringer","Sinister","Forgotten","Wretched","Baleful", \ "Inqisitor","Harvester","Reviled","Robust","Betrayer","Destructor","Damned","Accursed","Terrible","Vicious","Profane","Vile","Depraved","Foul","Slayer","Manslayer","Sovereign","Slaughterer", \ "Forsaken","Mad","Dragon","Savage","Villainous","Nefarious","Inquisitor","Marauder","Horrible","Immortal","Undying","Overlord","Corrupt","Hellspawn","Tyrant","Sanguineous") if(owner.current.gender == MALE) if(prob(10)) // Gender override - vampreputation = pick("King of the Damned", "Blood King", "Emperor of Blades", "Sinlord", "God-King") + bloodsucker_reputation = pick("King of the Damned", "Blood King", "Emperor of Blades", "Sinlord", "God-King") else if(prob(10)) // Gender override - vampreputation = pick("Queen of the Damned", "Blood Queen", "Empress of Blades", "Sinlady", "God-Queen") + bloodsucker_reputation = pick("Queen of the Damned", "Blood Queen", "Empress of Blades", "Sinlady", "God-Queen") to_chat(owner, "You have earned a reputation! You are now known as [ReturnFullName(TRUE)]!") // Reputations [Fledgling] else - vampreputation = pick ("Crude","Callow","Unlearned","Neophyte","Novice","Unseasoned","Fledgling","Young","Neonate","Scrapling","Untested","Unproven","Unknown","Newly Risen","Born","Scavenger","Unknowing",\ + bloodsucker_reputation = pick ("Crude","Callow","Unlearned","Neophyte","Novice","Unseasoned","Fledgling","Young","Neonate","Scrapling","Untested","Unproven","Unknown","Newly Risen","Born","Scavenger","Unknowing",\ "Unspoiled","Disgraced","Defrocked","Shamed","Meek","Timid","Broken")//,"Fresh") /datum/antagonist/bloodsucker/proc/AmFledgling() - return !vamptitle + return !bloodsucker_title /datum/antagonist/bloodsucker/proc/ReturnFullName(var/include_rep=0) var/fullname // Name First - fullname = (vampname ? vampname : owner.current.name) + fullname = (bloodsucker_name ? bloodsucker_name : owner.current.name) // Title - if(vamptitle) - fullname = vamptitle + " " + fullname + if(bloodsucker_title) + fullname = bloodsucker_title + " " + fullname // Rep - if(include_rep && vampreputation) - fullname = fullname + " the " + vampreputation + if(include_rep && bloodsucker_reputation) + fullname = fullname + " the " + bloodsucker_reputation return fullname @@ -201,15 +199,12 @@ var/mob/living/carbon/human/H = owner.current var/datum/species/S = H.dna.species // Make Changes - H.physiology.brute_mod *= 0.8 // <-------------------- Start small, but burn mod increases based on rank! + H.physiology.brute_mod *= 0.8 H.physiology.cold_mod = 0 H.physiology.stun_mod *= 0.5 H.physiology.siemens_coeff *= 0.75 //base electrocution coefficient 1 - //S.heatmod += 0.5 // Heat shouldn't affect. Only Fire. - //S.punchstunthreshold = 8 //damage at which punches from this race will stun 9 S.punchdamagelow += 1 //lowest possible punch damage 0 S.punchdamagehigh += 1 //highest possible punch damage 9 - // Clown if(istype(H) && owner.assigned_role == "Clown") H.dna.remove_mutation(CLOWNMUT) to_chat(H, "As a vampiric clown, you are no longer a danger to yourself. Your nature is subdued.") @@ -217,8 +212,6 @@ CheckVampOrgans() // Heart, Eyes // Language owner.current.grant_language(/datum/language/vampiric) - // Soul - //owner.current.hellbound = TRUE Causes wierd stuff owner.hasSoul = FALSE // If false, renders the character unable to sell their soul. owner.isholy = FALSE // is this person a chaplain or admin role allowed to use bibles // Disabilities @@ -250,7 +243,6 @@ // Clown if(istype(H) && owner.assigned_role == "Clown") H.dna.add_mutation(CLOWNMUT) - // NOTE: Use initial() to return things to default! // Physiology owner.current.regenerate_organs() // Update Health @@ -266,13 +258,13 @@ set waitfor = FALSE if(!owner || !owner.current) return - vamplevel_unspent ++ + bloodsucker_level_unspent ++ // Spend Rank Immediately? if(istype(owner.current.loc, /obj/structure/closet/crate/coffin)) SpendRank() else to_chat(owner, "You have grown more ancient! Sleep in a coffin that you have claimed to thicken your blood and become more powerful.") - if(vamplevel_unspent >= 2) + if(bloodsucker_level_unspent >= 2) to_chat(owner, "Bloodsucker Tip: If you cannot find or steal a coffin to use, you can build one from wooden planks.
") /datum/antagonist/bloodsucker/proc/LevelUpPowers() @@ -281,10 +273,10 @@ /datum/antagonist/bloodsucker/proc/SpendRank() set waitfor = FALSE - if(vamplevel_unspent <= 0 || !owner || !owner.current || !owner.current.client || !isliving(owner.current)) + if(bloodsucker_level_unspent <= 0 || !owner || !owner.current || !owner.current.client || !isliving(owner.current)) return var/mob/living/L = owner.current - level_bloodcost = maxBloodVolume * 0.2 + level_bloodcost = max_blood_volume * 0.2 //If the blood volume of the bloodsucker is lower than the cost to level up, return and inform the bloodsucker //TODO: Make this into a radial, or perhaps a tgui next UI @@ -300,7 +292,7 @@ if(options.len > 1) var/choice = input(owner.current, "You have the opportunity to grow more ancient at the cost of [level_bloodcost] units of blood. Select a power to advance your Rank.", "Your Blood Thickens...") in options // Cheat-Safety: Can't keep opening/closing coffin to spam levels - if(vamplevel_unspent <= 0) // Already spent all your points, and tried opening/closing your coffin, pal. + if(bloodsucker_level_unspent <= 0) // Already spent all your points, and tried opening/closing your coffin, pal. return if(!istype(owner.current.loc, /obj/structure/closet/crate/coffin)) to_chat(owner.current, "Return to your coffin to advance your Rank.") @@ -331,17 +323,17 @@ // More Health owner.current.setMaxHealth(owner.current.maxHealth + 10) // Vamp Stats - regenRate += 0.05 // Points of brute healed (starts at 0.3) - feedAmount += 2 // Increase how quickly I munch down vics (15) - maxBloodVolume += 100 // Increase my max blood (600) + regen_rate += 0.05 // Points of brute healed (starts at 0.3) + feed_amount += 2 // Increase how quickly I munch down vics (15) + max_blood_volume += 100 // Increase my max blood (600) ///////// - vamplevel ++ - vamplevel_unspent -- + bloodsucker_level ++ + bloodsucker_level_unspent -- // Assign True Reputation - if(vamplevel == 4) + if(bloodsucker_level == 4) SelectReputation(am_fledgling = FALSE, forced = TRUE) - to_chat(owner.current, "You are now a rank [vamplevel] Bloodsucker. Your strength, health, feed rate, regen rate, can have up to [vamplevel - count_vassals(owner.current.mind)] vassals, and maximum blood have all increased!") + to_chat(owner.current, "You are now a rank [bloodsucker_level] Bloodsucker. Your strength, health, feed rate, regen rate, can have up to [bloodsucker_level - count_vassals(owner.current.mind)] vassals, and maximum blood have all increased!") to_chat(owner.current, "Your existing powers have all ranked up as well!") update_hud(TRUE) owner.current.playsound_local(null, 'sound/effects/pope_entry.ogg', 25, TRUE, pressure_affected = FALSE) @@ -707,10 +699,10 @@ // Update Rank Counter if(owner.current.hud_used.vamprank_display) - var/valuecolor = vamplevel_unspent ? "#FFFF00" : "#FF0000" - owner.current.hud_used.vamprank_display.update_counter(vamplevel, valuecolor) + var/valuecolor = bloodsucker_level_unspent ? "#FFFF00" : "#FF0000" + owner.current.hud_used.vamprank_display.update_counter(bloodsucker_level, valuecolor) if(updateRank) // Only change icon on special request. - owner.current.hud_used.vamprank_display.icon_state = (vamplevel_unspent > 0) ? "rank_up" : "rank" + owner.current.hud_used.vamprank_display.icon_state = (bloodsucker_level_unspent > 0) ? "rank_up" : "rank" /obj/screen/bloodsucker diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm index c5f24ab537..7998a33c7b 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm @@ -123,7 +123,7 @@ . += {"Simply click and hold on a victim, and then drag their sprite on the vassal rack. Alt click on the vassal rack to unbuckle them."} . += {"Make sure that the victim is handcuffed, or else they can simply run away or resist, as the process is not instant."} . += {"To convert the victim, simply click on the vassal rack itself. Sharp weapons work faster than other tools."} - . += {" You have only the power for [B.vamplevel - B.count_vassals(user.mind)] vassals"} + . += {" You have only the power for [B.bloodsucker_level - B.count_vassals(user.mind)] vassals"} /* if(user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) . += {"This is the vassal rack, which allows your master to thrall crewmembers into his minions.\n Aid your master in bringing their victims here and keeping them secure.\n @@ -265,7 +265,7 @@ if(user.blood_volume < CONVERT_COST + 5) to_chat(user, "You don't have enough blood to initiate the Dark Communion with [target].") return - if(B.count_vassals(user.mind) > B.vamplevel) + if(B.count_vassals(user.mind) > B.bloodsucker_level) to_chat(user, "Your power is yet too weak to bring more vassals under your control....") return // Prep... diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index b0678d5ff4..5e82a282b2 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -263,7 +263,7 @@ to_chat(user, "Your victim is dead. [target.p_their(TRUE)] blood barely nourishes you.") warning_target_dead = TRUE // Full? - if(!warning_full && user.blood_volume >= bloodsuckerdatum.maxBloodVolume) + if(!warning_full && user.blood_volume >= bloodsuckerdatum.max_blood_volume) to_chat(user, "You are full. Further blood will be wasted.") warning_full = TRUE // Blood Remaining? (Carbons/Humans only) @@ -300,7 +300,7 @@ /datum/action/bloodsucker/feed/proc/CheckKilledTarget(mob/living/user, mob/living/target) - // Bad Vampire. You shouldn't do that. + // Bad Bloodsucker. You shouldn't do that. if(target && target.stat >= DEAD && ishuman(target)) SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "drankkilled", /datum/mood_event/drankkilled) // BAD // in bloodsucker_life.dm diff --git a/code/modules/language/vampiric.dm b/code/modules/language/vampiric.dm index 6da54ce844..ab48a17d2f 100644 --- a/code/modules/language/vampiric.dm +++ b/code/modules/language/vampiric.dm @@ -1,4 +1,4 @@ -// VAMPIRE LANGUAGE // +// BLOODSUCKER LANGUAGE // /datum/language/vampiric name = "Blah-Sucker" diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 147cb30772..d81251eca9 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -44,7 +44,7 @@ C.faction |= "slime" /datum/species/jelly/spec_life(mob/living/carbon/human/H) - if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for vampires + if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for blooduskers return if(!H.blood_volume) H.blood_volume += 5 diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index ce276a0d8b..c003fc7111 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -448,8 +448,8 @@ . = 1 ..() -/datum/reagent/consumable/condensedcapsaicin/reaction_mob(mob/living/M, method, reac_volume) - if(AmBloodsucker(M)) +/datum/reagent/consumable/garlic/reaction_mob(mob/living/M, method, reac_volume) + if(AmBloodsucker(M, TRUE)) //Theyll be immune to garlic as long as they masquarade, but they cant do it if they already have it. switch(method) if(INGEST) if(prob(min(30, current_cycle))) @@ -467,7 +467,7 @@ to_chat(M, "You feel like your veins are boiling!") M.emote("scream") M.adjustFireLoss(5) - + ..() /datum/reagent/consumable/sprinkles name = "Sprinkles" value = 3 From 6e22438fb56f4856ac609962266a96deef1b97e1 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 25 Mar 2020 19:39:19 +0200 Subject: [PATCH 08/23] Whoopsie~ Forgot to rename the recipy --- code/datums/components/crafting/recipes/recipes_clothing.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm index fb3500a037..444eaeafaf 100644 --- a/code/datums/components/crafting/recipes/recipes_clothing.dm +++ b/code/datums/components/crafting/recipes/recipes_clothing.dm @@ -290,7 +290,7 @@ /datum/crafting_recipe/wintercoat_cosmic - name = "Cosmic Winter Coat" + name = "Garlic Necklace" result = /obj/item/clothing/neck/garlic_necklace reqs = list(/obj/item/reagent_containers/food/snacks/grown/garlic = 15, /obj/item/stack/cable_coil = 10) From 8d629221fd1ce03e1f8684003e758ad7cee66eb4 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 25 Mar 2020 19:42:52 +0200 Subject: [PATCH 09/23] Make it look nicer --- code/game/gamemodes/bloodsucker/bloodsucker.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index adcb80ff07..3fe67fd431 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -269,6 +269,3 @@ /datum/game_mode/proc/remove_vassal(datum/mind/vassal) vassal.remove_antag_datum(ANTAG_DATUM_VASSAL) - - - \ No newline at end of file From 2546de3ee26c91deb336ee2feee424d0851c940e Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 25 Mar 2020 19:45:40 +0200 Subject: [PATCH 10/23] This is not neccesary --- code/modules/antagonists/bloodsucker/powers/feed.dm | 6 ------ 1 file changed, 6 deletions(-) diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index 5e82a282b2..71b866b2f4 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -67,12 +67,6 @@ if(display_error) to_chat(owner, "Your victim's blood is not suitable for you to take.") return FALSE - if(iscarbon(owner)) - //We want to check if the target is wearing a garlic necklance. - if(istype(owner.get_item_by_slot(SLOT_NECK), /obj/item/clothing/neck/garlic_necklace)) - if(display_error) - to_chat(owner, "Your victim is wearing a garlic clove on their neck! Disgusting!") - return FALSE return TRUE // If I'm not grabbing someone, find me someone nearby. From 4c4b1b340b844432c49eba3d05dcad43890c4e3c Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 25 Mar 2020 20:24:54 +0200 Subject: [PATCH 11/23] might as well fix the regen core name and a few tweaks. --- .../antagonists/bloodsucker/bloodsucker_life.dm | 15 +++++++++------ .../antagonists/bloodsucker/datum_bloodsucker.dm | 2 +- .../modules/mining/equipment/regenerative_core.dm | 14 ++++++++------ 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 90919a4e80..06eb271dd6 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -184,12 +184,15 @@ // Nutrition owner.current.nutrition = clamp(owner.current.blood_volume, 545, 0) //The amount of blood is how full we are. //A bit higher regeneration based on blood volume - if(owner.current.blood_volume < BLOOD_VOLUME_NORMAL) - additional_regen = 0.3 - else if(owner.current.blood_volume < BLOOD_VOLUME_OKAY) - additional_regen = 0.2 - else if(owner.current.blood_volume < BLOOD_VOLUME_BAD) - additional_regen = 0.1 + switch(owner.current.blood_volume) + if(owner.current.blood_volume < 700) + additional_regen = 0.4 + if(owner.current.blood_volume < BLOOD_VOLUME_NORMAL) + additional_regen = 0.3 + if(owner.current.blood_volume < BLOOD_VOLUME_OKAY) + additional_regen = 0.2 + if(owner.current.blood_volume < BLOOD_VOLUME_BAD) + additional_regen = 0.1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // DEATH diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index f8c35f7938..f95883e7c8 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -22,7 +22,7 @@ // STATS var/bloodsucker_level var/bloodsucker_level_unspent = 1 - var/regen_rate = 0.4 // How fast do I regenerate? + var/regen_rate = 0.3 // How fast do I regenerate? var/additional_regen // How much additional blood regen we gain from bonuses such as high blood. var/feed_amount = 15 // Amount of blood drawn from a target per tick. var/max_blood_volume = 600 // Maximum blood a Vamp can hold via feeding. diff --git a/code/modules/mining/equipment/regenerative_core.dm b/code/modules/mining/equipment/regenerative_core.dm index c89698530f..c14aa097bb 100644 --- a/code/modules/mining/equipment/regenerative_core.dm +++ b/code/modules/mining/equipment/regenerative_core.dm @@ -26,8 +26,8 @@ slot = "hivecore" force = 0 actions_types = list(/datum/action/item_action/organ_action/use) - var/inert = 0 - var/preserved = 0 + var/inert + var/preserved /obj/item/organ/regenerative_core/Initialize() . = ..() @@ -38,7 +38,9 @@ go_inert() /obj/item/organ/regenerative_core/proc/preserved(implanted = 0) - inert = FALSE + if(inert) + name = initial(name) + inert = FALSE preserved = TRUE update_icon() desc = "All that remains of a hivelord. It is preserved, allowing you to use it to heal completely without danger of decay." @@ -88,10 +90,10 @@ else to_chat(user, "You start to smear [src] on yourself. It feels and smells disgusting, but you feel amazingly refreshed in mere moments.") SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self")) - if(!AmBloodsucker(H)) - H.revive(full_heal = TRUE) - else + if(AmBloodsucker(H)) H.revive(full_heal = FALSE) + else + H.revive(full_heal = TRUE) qdel(src) user.log_message("[user] used [src] to heal [H]! Wake the fuck up, Samurai!", LOG_ATTACK, color="green") //Logging for 'old' style legion core use, when clicking on a sprite of yourself or another. From e8f3e0a3a1a5be681dee89385d07983310b53465 Mon Sep 17 00:00:00 2001 From: Artur Date: Thu, 26 Mar 2020 09:49:20 +0200 Subject: [PATCH 12/23] Forgot to add the mutation, what a dummy i am --- code/modules/hydroponics/grown/onion.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown/onion.dm b/code/modules/hydroponics/grown/onion.dm index 2ebaa6d5e2..a75b9caf5f 100644 --- a/code/modules/hydroponics/grown/onion.dm +++ b/code/modules/hydroponics/grown/onion.dm @@ -14,7 +14,7 @@ weed_chance = 3 growing_icon = 'icons/obj/hydroponics/growing_vegetables.dmi' reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1) - mutatelist = list(/obj/item/seeds/onion/red) + mutatelist = list(/obj/item/seeds/onion/red, /obj/item/seeds/garlic) /obj/item/reagent_containers/food/snacks/grown/onion seed = /obj/item/seeds/onion From 9db779ddc643ae2f15a8f16a6c335144942b9a23 Mon Sep 17 00:00:00 2001 From: Artur Date: Thu, 26 Mar 2020 23:38:25 +0200 Subject: [PATCH 13/23] Else if chain ahoy --- .../antagonists/bloodsucker/bloodsucker_life.dm | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 06eb271dd6..178d069f52 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -184,15 +184,14 @@ // Nutrition owner.current.nutrition = clamp(owner.current.blood_volume, 545, 0) //The amount of blood is how full we are. //A bit higher regeneration based on blood volume - switch(owner.current.blood_volume) - if(owner.current.blood_volume < 700) - additional_regen = 0.4 - if(owner.current.blood_volume < BLOOD_VOLUME_NORMAL) - additional_regen = 0.3 - if(owner.current.blood_volume < BLOOD_VOLUME_OKAY) - additional_regen = 0.2 - if(owner.current.blood_volume < BLOOD_VOLUME_BAD) - additional_regen = 0.1 + if(owner.current.blood_volume < 700) + additional_regen = 0.4 + else if(owner.current.blood_volume < BLOOD_VOLUME_NORMAL) + additional_regen = 0.3 + else if(owner.current.blood_volume < BLOOD_VOLUME_OKAY) + additional_regen = 0.2 + else if(owner.current.blood_volume < BLOOD_VOLUME_BAD) + additional_regen = 0.1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // DEATH From 75c4e8b19ab478d8679b67f22dcbd28b3dbd88a5 Mon Sep 17 00:00:00 2001 From: Artur Date: Fri, 27 Mar 2020 10:17:42 +0200 Subject: [PATCH 14/23] What the fuck travis --- code/modules/antagonists/bloodsucker/datum_bloodsucker.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index f95883e7c8..137739ec1d 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -22,9 +22,9 @@ // STATS var/bloodsucker_level var/bloodsucker_level_unspent = 1 - var/regen_rate = 0.3 // How fast do I regenerate? + var/regen_rate = 0.3 // How fast do I regenerate? var/additional_regen // How much additional blood regen we gain from bonuses such as high blood. - var/feed_amount = 15 // Amount of blood drawn from a target per tick. + var/feed_amount = 15 // Amount of blood drawn from a target per tick. var/max_blood_volume = 600 // Maximum blood a Vamp can hold via feeding. // OBJECTIVES var/list/datum/objective/objectives_given = list() // For removal if needed. From 694abd072458356da51baefc9681725bf8902b49 Mon Sep 17 00:00:00 2001 From: Artur Date: Tue, 31 Mar 2020 19:44:01 +0300 Subject: [PATCH 15/23] Fixes compile. I blame putnam. --- code/modules/antagonists/bloodsucker/datum_bloodsucker.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index edac8763c8..e70160484e 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -90,7 +90,7 @@ owner.current.blood_volume = max(owner.current.blood_volume,BLOOD_VOLUME_SAFE) /datum/antagonist/bloodsucker/threat() - return ..()+3*vamplevel + return ..()+3*bloodsucker_level /datum/antagonist/bloodsucker/proc/SelectFirstName() From 7a5bb4804d59ec0cb910fac1ee25c00e7649d16b Mon Sep 17 00:00:00 2001 From: Artur Date: Tue, 31 Mar 2020 19:46:54 +0300 Subject: [PATCH 16/23] Nice spacing --- code/modules/antagonists/bloodsucker/datum_bloodsucker.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index e70160484e..946be31ed6 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -90,7 +90,7 @@ owner.current.blood_volume = max(owner.current.blood_volume,BLOOD_VOLUME_SAFE) /datum/antagonist/bloodsucker/threat() - return ..()+3*bloodsucker_level + return ..() + 3 * bloodsucker_level /datum/antagonist/bloodsucker/proc/SelectFirstName() From 6e62ea5cb1dd6634e466ca8d5af8f7eb32964a78 Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 1 Apr 2020 09:15:31 +0300 Subject: [PATCH 17/23] Quickfix for baaad problem --- code/modules/antagonists/bloodsucker/bloodsucker_life.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 178d069f52..fe43310875 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -236,7 +236,7 @@ else // No damage, OR toxin healed AND brute healed and NOT in coffin (since you cannot heal burn) if(total_damage <= 0 || total_toxloss <= 0 && total_brute <= 0 && !istype(owner.current.loc, /obj/structure/closet/crate/coffin)) // Not Daytime, Not in Torpor - if(!SSticker.mode.is_daylight() && HAS_TRAIT_FROM(owner.current, TRAIT_DEATHCOMA, "bloodsucker")) + if(!SSticker.mode.is_daylight() && HAS_TRAIT_FROM(owner.current, TRAIT_FAKEDEATH, "bloodsucker")) Torpor_End() // Fake Unconscious if(poweron_masquerade == TRUE && total_damage >= owner.current.getMaxHealth() - HEALTH_THRESHOLD_FULLCRIT) @@ -261,6 +261,7 @@ owner.current.stat = SOFT_CRIT owner.current.remove_status_effect(STATUS_EFFECT_UNCONSCIOUS) owner.current.cure_fakedeath("bloodsucker") + REMOVE_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") From ca1f3d9a1e10e10cba8cc5a9d5b6477f7e0db7cd Mon Sep 17 00:00:00 2001 From: Artur Date: Wed, 1 Apr 2020 11:45:11 +0300 Subject: [PATCH 18/23] Added succ sound for the victim --- code/modules/antagonists/bloodsucker/powers/feed.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index 71b866b2f4..40e0dbd25a 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -275,8 +275,9 @@ break // Blood Gulp Sound - owner.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, 1) // Play THIS sound for user only. The "null" is where turf would go if a location was needed. Null puts it right in their head. - + owner.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, TRUE) + if(!amSilent) + target.playsound_local(null, 'sound/effects/singlebeat.ogg', 40, TRUE) // DONE! //DeactivatePower(user,target) if(amSilent) @@ -299,7 +300,7 @@ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "drankkilled", /datum/mood_event/drankkilled) // BAD // in bloodsucker_life.dm /datum/action/bloodsucker/feed/ContinueActive(mob/living/user, mob/living/target) - return ..() && target && (!target_grappled || user.pulling == target) && sucking_checks(target, TRUE, TRUE) // Active, and still Antag, + return ..() && target && (!target_grappled || user.pulling == target) && sucking_checks(target, TRUE, TRUE) // Active, and still antag, // NOTE: We only care about pulling if target started off that way. Mostly only important for Aggressive feed. /datum/action/bloodsucker/feed/proc/ApplyVictimEffects(mob/living/target) From 67f43191771538edf5992cb797f3791b4f699a34 Mon Sep 17 00:00:00 2001 From: Artur Date: Fri, 3 Apr 2020 01:52:08 +0300 Subject: [PATCH 19/23] fixes burn regen and some tweaks --- .../game/gamemodes/bloodsucker/bloodsucker.dm | 4 +- .../bloodsucker/bloodsucker_life.dm | 58 +++++++++---------- .../bloodsucker/items/bloodsucker_organs.dm | 3 +- 3 files changed, 34 insertions(+), 31 deletions(-) diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm index 01b6035034..bb776d7bc0 100644 --- a/code/game/gamemodes/bloodsucker/bloodsucker.dm +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -11,8 +11,10 @@ // The antags you're allowed to be if turning Vassal. /proc/AmBloodsucker(mob/living/M, falseIfInDisguise = FALSE) + if(!M.mind) + return FALSE // No Datum - if(!M.mind || !M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + if(!M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) return FALSE return TRUE diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index fe43310875..0814fd217d 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -93,27 +93,25 @@ owner.current.adjustCloneLoss(-0.1 * (actual_regen * 2) * mult, 0) owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (actual_regen * 4) * mult) // No Bleeding - if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. + /*if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. var/mob/living/carbon/human/H = owner.current if(H.bleed_rate > 0) //Only heal bleeding if we are actually bleeding - H.bleed_rate =- 0.5 + actual_regen * 0.2 * mult + H.bleed_rate =- 0.5 + actual_regen * 0.2 */ if(iscarbon(owner.current)) // Damage Heal: Do I have damage to ANY bodypart? var/mob/living/carbon/C = owner.current var/costMult = 1 // Coffin makes it cheaper var/fireheal = 0 // BURN: Heal in Coffin while Fakedeath, or when damage above maxhealth (you can never fully heal fire) - var/amInCoffinWhileTorpor = istype(C.loc, /obj/structure/closet/crate/coffin) && (mult == 0 || HAS_TRAIT(C, TRAIT_DEATHCOMA)) // Check for mult 0 OR death coma. (mult 0 means we're testing from coffin) + var/amInCoffinWhileTorpor = istype(C.loc, /obj/structure/closet/crate/coffin) && (mult == 0 || HAS_TRAIT(C, TRAIT_FAKEDEATH)) // Check for mult 0 OR death coma. (mult 0 means we're testing from coffin) if(amInCoffinWhileTorpor) mult *= 4 // Increase multiplier if we're sleeping in a coffin. - fireheal = min(C.getFireLoss(), actual_regen) // NOTE: Burn damage ONLY heals in torpor. - costMult = 0.25 + fireheal = min(C.getFireLoss(), regen_rate) // NOTE: Burn damage ONLY heals in torpor. C.ExtinguishMob() CureDisabilities() // Extinguish Fire C.remove_all_embedded_objects() // Remove Embedded! owner.current.regenerate_organs() // Heal Organs (will respawn original eyes etc. but we replace right away, next) CheckVampOrgans() // Heart, Eyes - else - if(owner.current.blood_volume <= 0) // No Blood? Lower Mult - mult = 0.25 + if(check_limbs(costMult)) + return TRUE // BRUTE: Always Heal var/bruteheal = min(C.getBruteLoss(), actual_regen) @@ -131,27 +129,29 @@ //C.heal_overall_damage(bruteheal * mult, fireheal * mult) // REMOVED: We need to FORCE this, because otherwise, vamps won't heal EVER. Swapped to above. AddBloodVolume((bruteheal * -0.5 + fireheal * -1 + toxinheal * -0.2) / mult * costMult) // Costs blood to heal return TRUE // Healed! Done for this tick. - if(amInCoffinWhileTorpor) // Limbs? (And I have no other healing) - var/list/missing = owner.current.get_missing_limbs() // Heal Missing - if(missing.len) // Cycle through ALL limbs and regen them! - for (var/targetLimbZone in missing) // 1) Find ONE Limb and regenerate it. - owner.current.regenerate_limb(targetLimbZone, 0) // regenerate_limbs() <--- If you want to EXCLUDE certain parts, do it like this ----> regenerate_limbs(0, list("head")) - var/obj/item/bodypart/L = owner.current.get_bodypart(targetLimbZone) // 2) Limb returns Damaged - AddBloodVolume(50 * costMult) // Costs blood to heal - L.brute_dam = 60 - to_chat(owner.current, "Your flesh knits as it regrows [L]!") - playsound(owner.current, 'sound/magic/demon_consume.ogg', 50, 1) - // DONE! After regenerating ANY number of limbs, we stop here. - return TRUE - else // REMOVED: For now, let's just leave prosthetics on. Maybe you WANT to be a robovamp. In actuality, robovamps are very bad. - // Remove Prosthetic/False Limb - for(var/obj/item/bodypart/BP in C.bodyparts) - if(istype(BP) && BP.status == 2) - to_chat(owner.current, "Your body expels the [BP]!") - BP.drop_limb() - return TRUE - // NOTE: Limbs have a "status", like their hosts "stat". 2 is dead (aka Prosthetic). 1 seems to be idle/alive.*/ - return FALSE + + + +/datum/antagonist/bloodsucker/proc/check_limbs(costMult) + var/limb_regen_cost = 50 * costMult + var/mob/living/carbon/C = owner.current + var/list/missing = C.get_missing_limbs() + if(missing.len && C.blood_volume < limb_regen_cost + 5) + return FALSE + for(var/targetLimbZone in missing) // 1) Find ONE Limb and regenerate it. + C.regenerate_limb(targetLimbZone, FALSE) // regenerate_limbs() <--- If you want to EXCLUDE certain parts, do it like this ----> regenerate_limbs(0, list("head")) + C.AddBloodVolume(50) + var/obj/item/bodypart/L = C.get_bodypart(targetLimbZone) // 2) Limb returns Damaged + L.brute_dam = 60 + to_chat(C, "Your flesh knits as it regrows your [L]!") + playsound(C, 'sound/magic/demon_consume.ogg', 50, TRUE) + return TRUE + /*for(var/obj/item/bodypart/BP in C.bodyparts) + if(!istype(BP) && !BP.status == 2) + return FALSE + to_chat(C, "Your body expels the [BP]!") + BP.drop_limb() + return TRUE */ /datum/antagonist/bloodsucker/proc/CureDisabilities() var/mob/living/carbon/C = owner.current diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm index e4e26fe034..640c53946f 100644 --- a/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm +++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm @@ -5,7 +5,8 @@ var/obj/item/organ/O // Heart O = owner.current.getorganslot(ORGAN_SLOT_HEART) - if(!istype(O, /obj/item/organ/heart/vampheart)) + + if(!istype(O, /obj/item/organ/heart/vampheart) && !istype(O, /obj/item/organ/heart/demon)) qdel(O) var/obj/item/organ/heart/vampheart/H = new H.Insert(owner.current) From 991f73893ffa020a21f5fe2a2fa4450323e724f0 Mon Sep 17 00:00:00 2001 From: Artur Date: Fri, 3 Apr 2020 02:00:41 +0300 Subject: [PATCH 20/23] Fuck me im tired --- code/modules/antagonists/bloodsucker/bloodsucker_life.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 0814fd217d..ae685c5603 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -140,7 +140,7 @@ return FALSE for(var/targetLimbZone in missing) // 1) Find ONE Limb and regenerate it. C.regenerate_limb(targetLimbZone, FALSE) // regenerate_limbs() <--- If you want to EXCLUDE certain parts, do it like this ----> regenerate_limbs(0, list("head")) - C.AddBloodVolume(50) + AddBloodVolume(50) var/obj/item/bodypart/L = C.get_bodypart(targetLimbZone) // 2) Limb returns Damaged L.brute_dam = 60 to_chat(C, "Your flesh knits as it regrows your [L]!") From 2e2fc456326189c5e2d149477c29498069b5a242 Mon Sep 17 00:00:00 2001 From: Artur Date: Tue, 14 Apr 2020 09:28:43 +0300 Subject: [PATCH 21/23] Conflicting icon fix --- icons/mob/clothing/neck.dmi | Bin 47399 -> 47688 bytes icons/obj/clothing/neck.dmi | Bin 2759 -> 2897 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/clothing/neck.dmi b/icons/mob/clothing/neck.dmi index 68fde7bff95931d53484b9bcb01221142988828d..78073222cae4bfbe0b96d993cc5c5ee851bfe40d 100644 GIT binary patch delta 5070 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 U9yV##JP`FW);EQsb)BF54=E%Ypa1{> delta 4779 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 SzUXHNIPTst)vM8Uj`}}tIi!{V diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index 622f43ea56843baa5589405fdbe42e415e88a8b2..c4c9c94f48485b44001aaacbf20e7d46b50874ab 100644 GIT binary patch delta 2586 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 Date: Tue, 14 Apr 2020 09:30:14 +0300 Subject: [PATCH 22/23] Ghommies suggestions and renames a proc --- code/__HELPERS/unsorted.dm | 2 +- code/datums/components/crafting/recipes/recipes_clothing.dm | 2 +- code/game/machinery/cloning.dm | 4 ++-- code/modules/antagonists/bloodsucker/bloodsucker_life.dm | 3 +-- code/modules/antagonists/bloodsucker/powers/feed.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 2 +- code/modules/mob/living/carbon/human/species_types/vampire.dm | 4 ++-- 7 files changed, 9 insertions(+), 10 deletions(-) diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 2cc8c48dd5..afa858afb7 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -1565,7 +1565,7 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new) world.TgsChatBroadcast() //Checks to see if either the victim has a garlic necklace or garlic in their blood -/proc/sucking_checks(var/mob/living/carbon/target, check_neck, check_blood) +/proc/blood_sucking_checks(var/mob/living/carbon/target, check_neck, check_blood) //Bypass this if the target isnt carbon. if(!iscarbon(target)) return TRUE diff --git a/code/datums/components/crafting/recipes/recipes_clothing.dm b/code/datums/components/crafting/recipes/recipes_clothing.dm index fc1f4e25e5..b9e3c379b4 100644 --- a/code/datums/components/crafting/recipes/recipes_clothing.dm +++ b/code/datums/components/crafting/recipes/recipes_clothing.dm @@ -296,7 +296,7 @@ category = CAT_CLOTHING -/datum/crafting_recipe/wintercoat_cosmic +/datum/crafting_recipe/garlic_necklace name = "Garlic Necklace" result = /obj/item/clothing/neck/garlic_necklace reqs = list(/obj/item/reagent_containers/food/snacks/grown/garlic = 15, diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index b0132884ea..b4744ec254 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -142,6 +142,8 @@ if(!QDELETED(clonemind.current)) if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body return FALSE + if(AmBloodsucker(clonemind.current)) //If the mind is a bloodsucker + return FALSE if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding. return FALSE if(clonemind.active) //somebody is using that mind @@ -159,8 +161,6 @@ mess = TRUE update_icon() return FALSE - if(AmBloodsucker(clonemind)) //If the mind is a bloodsucker - return FALSE attempting = TRUE //One at a time!! countdown.start() diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index ae685c5603..efccb5591e 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -247,7 +247,7 @@ owner.current.apply_status_effect(STATUS_EFFECT_UNCONSCIOUS) ADD_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") // Come after UNCONSCIOUS or else it fails ADD_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") // Without this, you'll just keep dying while you recover. - ADD_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") // So you can heal in 0 G. otherwise you just...heal forever. + ADD_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") // So you can heal in space. Otherwise you just...heal forever. ADD_TRAIT(owner.current, TRAIT_RESISTLOWPRESSURE, "bloodsucker") // Visuals owner.current.update_sight() @@ -260,7 +260,6 @@ /datum/antagonist/bloodsucker/proc/Torpor_End() owner.current.stat = SOFT_CRIT owner.current.remove_status_effect(STATUS_EFFECT_UNCONSCIOUS) - owner.current.cure_fakedeath("bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_FAKEDEATH, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_NODEATH, "bloodsucker") REMOVE_TRAIT(owner.current, TRAIT_RESISTHIGHPRESSURE, "bloodsucker") diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index 40e0dbd25a..8ac4fcebc1 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -300,7 +300,7 @@ SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "drankkilled", /datum/mood_event/drankkilled) // BAD // in bloodsucker_life.dm /datum/action/bloodsucker/feed/ContinueActive(mob/living/user, mob/living/target) - return ..() && target && (!target_grappled || user.pulling == target) && sucking_checks(target, TRUE, TRUE) // Active, and still antag, + return ..() && target && (!target_grappled || user.pulling == target) && blood_sucking_checks(target, TRUE, TRUE) // Active, and still antag, // NOTE: We only care about pulling if target started off that way. Mostly only important for Aggressive feed. /datum/action/bloodsucker/feed/proc/ApplyVictimEffects(mob/living/target) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index f0e94e4845..40b8de36c5 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -854,7 +854,7 @@ /mob/living/carbon/proc/can_defib() var/tlimit = DEFIB_TIME_LIMIT * 10 var/obj/item/organ/heart = getorgan(/obj/item/organ/heart) - if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK) || AmBloodsucker()) + if(suiciding || hellbound || HAS_TRAIT(src, TRAIT_HUSK) || AmBloodsucker(src)) return if((world.time - timeofdeath) > tlimit) return diff --git a/code/modules/mob/living/carbon/human/species_types/vampire.dm b/code/modules/mob/living/carbon/human/species_types/vampire.dm index c4a9fdb086..415cd9889c 100644 --- a/code/modules/mob/living/carbon/human/species_types/vampire.dm +++ b/code/modules/mob/living/carbon/human/species_types/vampire.dm @@ -82,7 +82,7 @@ to_chat(H, "You're already full!") return //This checks whether or not they are wearing a garlic clove on their neck - if(!sucking_checks(victim, TRUE, FALSE)) + if(!blood_sucking_checks(victim, TRUE, FALSE)) return if(victim.stat == DEAD) to_chat(H, "You need a living victim!") @@ -96,7 +96,7 @@ to_chat(H, "[victim] is blessed! You stop just in time to avoid catching fire.") return //Here we check now for both the garlic cloves on the neck and for blood in the victims bloodstream. - if(!sucking_checks(victim, TRUE, TRUE)) + if(!blood_sucking_checks(victim, TRUE, TRUE)) return if(!do_after(H, 30, target = victim)) return From fb7dc7a54cf2660d745515772eefe6f05cdfbc70 Mon Sep 17 00:00:00 2001 From: Artur Date: Tue, 14 Apr 2020 09:42:11 +0300 Subject: [PATCH 23/23] Fucking icons --- code/game/machinery/cloning.dm | 4 ++-- code/modules/hydroponics/grown/garlic.dm | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index b4744ec254..bc0fec68ba 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -142,10 +142,10 @@ if(!QDELETED(clonemind.current)) if(clonemind.current.stat != DEAD) //mind is associated with a non-dead body return FALSE - if(AmBloodsucker(clonemind.current)) //If the mind is a bloodsucker - return FALSE if(clonemind.current.suiciding) // Mind is associated with a body that is suiciding. return FALSE + if(AmBloodsucker(clonemind.current)) //If the mind is a bloodsucker + return FALSE if(clonemind.active) //somebody is using that mind if( ckey(clonemind.key)!=ckey ) return FALSE diff --git a/code/modules/hydroponics/grown/garlic.dm b/code/modules/hydroponics/grown/garlic.dm index fd24376282..4184b85008 100644 --- a/code/modules/hydroponics/grown/garlic.dm +++ b/code/modules/hydroponics/grown/garlic.dm @@ -26,5 +26,4 @@ desc = "A clove of garlic on a cable, tied to itself in a circle, just might fit around your neck. For loonies people who fear getting their blood sucked." icon_state = "garlic_necklace" item_state = "garlic_necklace" - alternate_worn_icon = 'icons/mob/neck.dmi' \ No newline at end of file