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