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 712ea11a3b..c93865ca77 100644
Binary files a/icons/obj/hydroponics/growing.dmi and b/icons/obj/hydroponics/growing.dmi differ
diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi
index e746d8f43d..c7c31581f3 100644
Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ
diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi
index 43e231cbab..62843e3f54 100644
Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ
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"