diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm
index 08f9a628b6..db92248347 100644
--- a/code/game/gamemodes/bloodsucker/bloodsucker.dm
+++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm
@@ -17,7 +17,7 @@
antag_flag = ROLE_BLOODSUCKER
false_report_weight = 1
restricted_jobs = list("AI","Cyborg")
- protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "Chaplain")
+ protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster")
required_players = 0
required_enemies = 1
recommended_enemies = 4
diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
index 56b02a1364..c1842b2530 100644
--- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
+++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm
@@ -778,3 +778,44 @@
var/ramp_up_final = CLAMP(round(meteorminutes/rampupdelta), 1, 10)
spawn_meteors(ramp_up_final, wavetype)
+
+//////////////////////////////////////////////
+// //
+// BLOODSUCKERS //
+// //
+//////////////////////////////////////////////
+/* Doesnt work just yet
+/datum/dynamic_ruleset/roundstart/bloodsucker
+ name = "bloodsucker"
+ config_tag = "bloodsucker"
+ antag_flag = ROLE_BLOODSUCKER
+ antag_datum = /datum/antagonist/bloodsucker/
+ protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster", "Chaplain")
+ restricted_roles = list("AI", "Cyborg")
+ required_candidates = 1
+ weight = 3
+ cost = 15
+ scaling_cost = 10
+ requirements = list(80,70,60,50,50,50,50,50,50,50)
+ //antag_cap = list(1,1,1,1,1,2,2,2,2,2) There will be just as many vamp hunters as vampires, right?
+ high_population_requirement = 50
+ var/datum/antagonist/bloodsucker/V
+
+/datum/dynamic_ruleset/roundstart/bloodsucker/pre_execute()
+ var/num_bloodsuckers = antag_cap[indice_pop] * (scaled_times + 1)
+ for (var/i = 1 to num_bloodsuckers)
+ var/mob/M = pick_n_take(candidates)
+ assigned += M.mind
+ V += M.mind
+ M.mind.special_role = ROLE_TRAITOR
+ M.mind.restricted_roles = restricted_roles
+ mode.assign_monster_hunters(num_bloodsuckers,TRUE, assigned)
+ return TRUE
+
+/datum/dynamic_ruleset/roundstart/bloodsucker/execute()
+ //check_start_sunlight() The procs that make a vampire SHOULD enable sunlight by itself
+ for(var/datum/mind/M in assigned)
+ if(!mode.make_bloodsucker(M))
+ V -= M.mind
+ return TRUE
+*/
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 4d7b346241..b75b2184cd 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -81,6 +81,7 @@
///Everyone should now be on the station and have their normal gear. This is the place to give the special roles extra things
/datum/game_mode/proc/post_setup(report) //Gamemodes can override the intercept report. Passing TRUE as the argument will force a report.
+ finalize_monster_hunters()
if(!report)
report = !CONFIG_GET(flag/no_intercept_report)
addtimer(CALLBACK(GLOBAL_PROC, .proc/display_roundstart_logout_report), ROUNDSTART_LOGOUT_REPORT_TIME)
diff --git a/code/modules/antagonists/bloodsucker/powers/bs_brawn.dm b/code/modules/antagonists/bloodsucker/powers/bs_brawn.dm
index b5c5c2f265..7754e27a76 100644
--- a/code/modules/antagonists/bloodsucker/powers/bs_brawn.dm
+++ b/code/modules/antagonists/bloodsucker/powers/bs_brawn.dm
@@ -5,7 +5,7 @@
desc = "Snap restraints with ease, or deal terrible damage with your bare hands."
button_icon_state = "power_strength"
bloodcost = 10
- cooldown = 600
+ cooldown = 130
target_range = 1
power_activates_immediately = TRUE
message_Trigger = ""//"Whom will you subvert to your will?"
@@ -41,22 +41,22 @@
/datum/action/bloodsucker/targeted/brawn/CheckCanTarget(atom/A, display_error)
// DEFAULT CHECKS (Distance)
- if (!..()) // Disable range notice for Brawn.
+ if(!..()) // Disable range notice for Brawn.
return FALSE
// Must outside Closet to target anyone!
- if (!isturf(owner.loc))
+ if(!isturf(owner.loc))
return FALSE
// Check: Self
- if (A == owner)
+ if(A == owner)
return FALSE
// Target Type: Living
- if (isliving(A))
+ if(isliving(A))
return TRUE
// Target Type: Door
- else if (upgrade_canDoor && istype(A, /obj/machinery/door))
+ else if(upgrade_canDoor && istype(A, /obj/machinery/door))
return TRUE
// Target Type: Closet
- else if (upgrade_canLocker && istype(A, /obj/structure/closet))
+ else if(upgrade_canLocker && istype(A, /obj/structure/closet))
return TRUE
return ..() // yes, FALSE! You failed if you got here! BAD TARGET
@@ -65,17 +65,17 @@
var/mob/living/carbon/target = A
var/mob/living/user = owner
// Target Type: Mob
- if (isliving(target))
+ if(isliving(target))
var/mob/living/carbon/user_C = user
- var/hitStrength = user_C.dna.species.punchdamagehigh * 1.25 + 2
+ var/hitStrength = user_C.dna.species.punchdamagehigh * 1.3 + 5
// Knockdown!
- var/powerlevel = min(7, 1 + level_current)
- if (rand(10 + powerlevel) >= 5)
- target.visible_message("[user] has knocked [target] down!", \
- "[user] has knocked you down!", null, COMBAT_MESSAGE_RANGE)
- target.Knockdown( min(5, rand(10, 10 * powerlevel)) )
+ var/powerlevel = min(5, 1 + level_current)
+ if(rand(5 + powerlevel) >= 5)
+ target.visible_message("[user] lands a vicious punch, sending [target] away!", \
+ "[user] has landed a horrifying punch on you, sending you flying!!", null, COMBAT_MESSAGE_RANGE)
+ target.Knockdown(min(5, rand(10, 10 * powerlevel)) )
// Chance of KO
- if (rand(3 + powerlevel) >= 5 && target.stat <= UNCONSCIOUS)
+ if(rand(6 + powerlevel) >= 6 && target.stat <= UNCONSCIOUS)
target.Unconscious(40)
// Attack!
playsound(get_turf(target), 'sound/weapons/punch4.ogg', 60, 1, -1)
diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm
index a0bf818f46..8195b3d84b 100644
--- a/code/modules/mob/living/blood.dm
+++ b/code/modules/mob/living/blood.dm
@@ -36,7 +36,7 @@
if(bleed_rate <= 0)
bleed_rate = 0
- if (HAS_TRAIT(src, TRAIT_NOPULSE)) //Bloodsuckers don't need to be here.
+ if(HAS_TRAIT(src, TRAIT_NOMARROW)) //Bloodsuckers don't need to be here.
return
if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
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 ff182b19ea..069190d9e0 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(src, 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 vampires
return
if(!H.blood_volume)
H.blood_volume += 5
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index bd60880324..dfda74b22b 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -610,6 +610,8 @@ 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((HAS_TRAIT(C, TRAIT_NOMARROW)))
+ return
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/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index e3962e89c2..3180fb99f6 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -355,6 +355,8 @@ datum/reagent/medicine/styptic_powder/overdose_start(mob/living/M)
value = 1
/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M)
+ if((HAS_TRAIT(M, TRAIT_NOMARROW)))
+ return
if(last_added)
M.blood_volume -= last_added
last_added = 0
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index e91719504e..00ff3885ea 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -38,6 +38,8 @@
L.add_blood_DNA(list(data["blood_DNA"] = data["blood_type"]))
/datum/reagent/blood/on_mob_life(mob/living/carbon/C) //Because lethals are preferred over stamina. damnifino.
+ if((HAS_TRAIT(C, TRAIT_NOMARROW)))
+ return //We dont want vampires getting toxed from blood
var/blood_id = C.get_blood_id()
if((blood_id == "blood" || blood_id == "jellyblood"))
if(!data || !(data["blood_type"] in get_safe_blood(C.dna.blood_type))) //we only care about bloodtype here because this is where the poisoning should be
@@ -1116,6 +1118,8 @@
color = "#c2391d"
/datum/reagent/iron/on_mob_life(mob/living/carbon/C)
+ if((HAS_TRAIT(C, TRAIT_NOMARROW)))
+ return
if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio))
C.blood_volume += 0.01 //we'll have synthetics from medbay.
..()
diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm
index 50fb5efcb0..e2e1661ab7 100644
--- a/code/modules/research/nanites/nanite_programs/healing.dm
+++ b/code/modules/research/nanites/nanite_programs/healing.dm
@@ -98,7 +98,7 @@
/datum/nanite_program/blood_restoring/check_conditions()
if(iscarbon(host_mob))
var/mob/living/carbon/C = host_mob
- if(C.blood_volume >= (BLOOD_VOLUME_SAFE*C.blood_ratio))
+ if(C.blood_volume >= (BLOOD_VOLUME_SAFE*C.blood_ratio) || (HAS_TRAIT(C, TRAIT_NOMARROW)))
return FALSE
else
return FALSE