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 de59a136d9..d899950b79 100644 Binary files a/icons/mob/neck.dmi and b/icons/mob/neck.dmi differ diff --git a/icons/obj/clothing/neck.dmi b/icons/obj/clothing/neck.dmi index 0bdaa36e62..ea44ae0a7c 100644 Binary files a/icons/obj/clothing/neck.dmi and b/icons/obj/clothing/neck.dmi differ