From ad8a067015ef319ef9c91280b9c947da8ca6d5d8 Mon Sep 17 00:00:00 2001 From: CygnusB <39594514+MalricB@users.noreply.github.com> Date: Tue, 1 Dec 2020 18:09:00 -0300 Subject: [PATCH] agonyyyy --- code/__DEFINES/antagonists.dm | 17 + code/__DEFINES/atom_hud.dm | 1 + code/__DEFINES/role_preferences.dm | 5 +- code/__DEFINES/status_effects.dm | 4 + code/__DEFINES/traits.dm | 6 +- code/_onclick/hud/human.dm | 7 + code/_onclick/item_attack.dm | 3 +- code/datums/hud.dm | 1 + .../mood_events/generic_negative_events.dm | 47 +- .../mood_events/generic_positive_events.dm | 2 +- code/datums/status_effects/debuffs.dm | 38 +- .../game/gamemodes/bloodsucker/bloodsucker.dm | 292 +++++++ code/game/gamemodes/bloodsucker/hunter.dm | 42 + .../dynamic/dynamic_rulesets_midround.dm | 31 +- .../dynamic/dynamic_rulesets_roundstart.dm | 42 +- code/game/gamemodes/game_mode.dm | 3 +- code/game/objects/items/devices/scanners.dm | 12 +- .../items/implants/implant_mindshield.dm | 4 + .../items/stacks/sheets/sheet_types.dm | 32 +- .../structures/crates_lockers/crates.dm | 9 + .../bloodsucker/bloodsucker_flaws.dm | 84 ++ .../bloodsucker/bloodsucker_integration.dm | 148 ++++ .../bloodsucker/bloodsucker_life.dm | 361 ++++++++ .../bloodsucker/bloodsucker_objectives.dm | 351 ++++++++ .../bloodsucker/bloodsucker_powers.dm | 284 +++++++ .../bloodsucker/bloodsucker_sunlight.dm | 195 +++++ .../antagonists/bloodsucker/bloodsucker_ui.dm | 110 +++ .../bloodsucker/datum_bloodsucker.dm | 770 ++++++++++++++++++ .../antagonists/bloodsucker/datum_hunter.dm | 229 ++++++ .../antagonists/bloodsucker/datum_vassal.dm | 151 ++++ .../bloodsucker/items/bloodsucker_coffin.dm | 247 ++++++ .../bloodsucker/items/bloodsucker_organs.dm | 67 ++ .../bloodsucker/items/bloodsucker_stake.dm | 176 ++++ .../bloodsucker/objects/bloodsucker_coffin.dm | 242 ++++++ .../bloodsucker/objects/bloodsucker_crypt.dm | 494 +++++++++++ .../bloodsucker/objects/bloodsucker_lair.dm | 85 ++ .../bloodsucker/powers/bs_brawn.dm | 174 ++++ .../bloodsucker/powers/bs_cloak.dm | 56 ++ .../antagonists/bloodsucker/powers/bs_feed.dm | 324 ++++++++ .../bloodsucker/powers/bs_fortitude.dm | 54 ++ .../bloodsucker/powers/bs_gohome.dm | 115 +++ .../bloodsucker/powers/bs_haste.dm | 86 ++ .../bloodsucker/powers/bs_lunge.dm | 83 ++ .../bloodsucker/powers/bs_masquerade.dm | 97 +++ .../bloodsucker/powers/bs_mesmerize.dm | 114 +++ .../bloodsucker/powers/bs_trespass.dm | 124 +++ .../antagonists/bloodsucker/powers/bs_veil.dm | 163 ++++ .../bloodsucker/powers/v_recuperate.dm | 38 + code/modules/clothing/neck/_neck.dm | 5 +- code/modules/crafting/recipes/recipes_misc.dm | 38 + code/modules/language/vampiric.dm | 25 + code/modules/mob/living/blood.dm | 3 + .../modules/mob/living/carbon/damage_procs.dm | 4 + .../mob/living/carbon/human/examine.dm | 9 +- .../mob/living/carbon/human/species.dm | 2 + .../carbon/human/species_types/jellypeople.dm | 4 +- code/modules/mob/living/carbon/life.dm | 3 + code/modules/mob/living/silicon/login.dm | 3 + .../mob/living/simple_animal/astral.dm | 1 + .../mob/living/simple_animal/bot/bot.dm | 1 + .../mob/living/simple_animal/constructs.dm | 1 + .../simple_animal/friendly/cockroach.dm | 1 + .../mob/living/simple_animal/friendly/crab.dm | 1 + .../living/simple_animal/friendly/mouse.dm | 1 + .../living/simple_animal/guardian/guardian.dm | 1 + .../living/simple_animal/hostile/faithless.dm | 3 +- .../living/simple_animal/hostile/hivebot.dm | 1 + .../hostile/megafauna/hierophant.dm | 1 + .../hostile/mining_mobs/curse_blob.dm | 1 + .../simple_animal/hostile/retaliate/bat.dm | 1 + .../simple_animal/hostile/retaliate/ghost.dm | 1 + .../living/simple_animal/hostile/skeleton.dm | 1 + .../living/simple_animal/hostile/statue.dm | 1 + .../living/simple_animal/hostile/stickman.dm | 1 + .../modules/mob/living/simple_animal/shade.dm | 1 + .../mob/living/simple_animal/simple_animal.dm | 3 +- .../mob/living/simple_animal/slime/slime.dm | 1 + code/modules/mob/mob_movement.dm | 3 + code/modules/projectiles/projectile.dm | 2 +- .../chemistry/reagents/alcohol_reagents.dm | 2 + .../chemistry/reagents/medicine_reagents.dm | 2 + .../chemistry/reagents/other_reagents.dm | 6 +- .../reagents/reagent_containers/blood_pack.dm | 24 +- .../nanites/nanite_programs/healing.dm | 2 +- code/modules/surgery/organs/heart.dm | 5 + code/modules/surgery/organs/tongue.dm | 1 + config/game_options.txt | 2 + icons/misc/language.dmi | Bin 4645 -> 4889 bytes icons/misc/mark_icons.dmi | Bin 0 -> 433 bytes icons/mob/actions/bloodsucker.dmi | Bin 0 -> 16840 bytes icons/mob/hud.dmi | Bin 14922 -> 16351 bytes icons/mob/inhands/weapons/melee_lefthand.dmi | Bin 2444 -> 2604 bytes icons/mob/inhands/weapons/melee_righthand.dmi | Bin 2444 -> 2581 bytes icons/obj/stake.dmi | Bin 0 -> 853 bytes icons/obj/vamp_obj.dmi | Bin 0 -> 8966 bytes sound/bloodsucker/BloodsuckerAlert.ogg | Bin 0 -> 218645 bytes sound/bloodsucker/coffin_close.ogg | Bin 0 -> 59363 bytes sound/bloodsucker/coffin_open.ogg | Bin 0 -> 71218 bytes tgstation.dme | 29 + 99 files changed, 6181 insertions(+), 36 deletions(-) create mode 100644 code/game/gamemodes/bloodsucker/bloodsucker.dm create mode 100644 code/game/gamemodes/bloodsucker/hunter.dm create mode 100644 code/modules/antagonists/bloodsucker/bloodsucker_flaws.dm create mode 100644 code/modules/antagonists/bloodsucker/bloodsucker_integration.dm create mode 100644 code/modules/antagonists/bloodsucker/bloodsucker_life.dm create mode 100644 code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm create mode 100644 code/modules/antagonists/bloodsucker/bloodsucker_powers.dm create mode 100644 code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm create mode 100644 code/modules/antagonists/bloodsucker/bloodsucker_ui.dm create mode 100644 code/modules/antagonists/bloodsucker/datum_bloodsucker.dm create mode 100644 code/modules/antagonists/bloodsucker/datum_hunter.dm create mode 100644 code/modules/antagonists/bloodsucker/datum_vassal.dm create mode 100644 code/modules/antagonists/bloodsucker/items/bloodsucker_coffin.dm create mode 100644 code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm create mode 100644 code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm create mode 100644 code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm create mode 100644 code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm create mode 100644 code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm create mode 100644 code/modules/antagonists/bloodsucker/powers/bs_brawn.dm create mode 100644 code/modules/antagonists/bloodsucker/powers/bs_cloak.dm create mode 100644 code/modules/antagonists/bloodsucker/powers/bs_feed.dm create mode 100644 code/modules/antagonists/bloodsucker/powers/bs_fortitude.dm create mode 100644 code/modules/antagonists/bloodsucker/powers/bs_gohome.dm create mode 100644 code/modules/antagonists/bloodsucker/powers/bs_haste.dm create mode 100644 code/modules/antagonists/bloodsucker/powers/bs_lunge.dm create mode 100644 code/modules/antagonists/bloodsucker/powers/bs_masquerade.dm create mode 100644 code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm create mode 100644 code/modules/antagonists/bloodsucker/powers/bs_trespass.dm create mode 100644 code/modules/antagonists/bloodsucker/powers/bs_veil.dm create mode 100644 code/modules/antagonists/bloodsucker/powers/v_recuperate.dm create mode 100644 code/modules/language/vampiric.dm create mode 100644 icons/misc/mark_icons.dmi create mode 100644 icons/mob/actions/bloodsucker.dmi create mode 100644 icons/obj/stake.dmi create mode 100644 icons/obj/vamp_obj.dmi create mode 100644 sound/bloodsucker/BloodsuckerAlert.ogg create mode 100644 sound/bloodsucker/coffin_close.ogg create mode 100644 sound/bloodsucker/coffin_open.ogg diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index e35defd4..29f37549 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -40,3 +40,20 @@ #define NOT_DOMINATING -1 #define MAX_LEADERS_GANG 3 #define INITIAL_DOM_ATTEMPTS 3 + + +//Bloodsucker defines +// Bloodsucker related antag datums +#define ANTAG_DATUM_BLOODSUCKER /datum/antagonist/bloodsucker +#define ANTAG_DATUM_VASSAL /datum/antagonist/vassal +//#define ANTAG_DATUM_HUNTER /datum/antagonist/vamphunter Disabled for now + +// BLOODSUCKER +#define BLOODSUCKER_LEVEL_TO_EMBRACE 3 +#define BLOODSUCKER_FRENZY_TIME 25 // How long the vamp stays in frenzy. +#define BLOODSUCKER_FRENZY_OUT_TIME 300 // How long the vamp goes back into frenzy. +#define BLOODSUCKER_STARVE_VOLUME 5 // Amount of blood, below which a Vamp is at risk of frenzy. + +#define CAT_STRUCTURE "Structures" + +#define MARTIALART_HUNTER "hunter-fu" diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 4fd16697..284769fe 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -57,6 +57,7 @@ #define ANTAG_HUD_SOULLESS 21 #define ANTAG_HUD_CLOCKWORK 22 #define ANTAG_HUD_BROTHER 23 +#define ANTAG_HUD_BLOODSUCKER 24 // Notification action types #define NOTIFY_JUMP "jump" diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm index 96e6e44d..937bee87 100644 --- a/code/__DEFINES/role_preferences.dm +++ b/code/__DEFINES/role_preferences.dm @@ -35,6 +35,7 @@ #define ROLE_LAVALAND "lavaland" #define ROLE_INTERNAL_AFFAIRS "internal affairs agent" #define ROLE_GANG "gangster" +#define ROLE_BLOODSUCKER "bloodsucker" //Hyper #define ROLE_LEWD_TRAITOR "lewd traitor" @@ -62,7 +63,9 @@ GLOBAL_LIST_INIT(special_roles, list( ROLE_OVERTHROW = /datum/game_mode/overthrow, ROLE_INTERNAL_AFFAIRS = /datum/game_mode/traitor/internal_affairs, ROLE_SENTIENCE, - ROLE_GANG = /datum/game_mode/gang + ROLE_GANG = /datum/game_mode/gang, + ROLE_BLOODSUCKER = /datum/game_mode/bloodsucker + //ROLE_MONSTERHUNTER Disabled for now )) //Job defines for what happens when you fail to qualify for any job during job selection diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 444c8f6c..8f3a316f 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -45,6 +45,7 @@ #define STATUS_EFFECT_SLEEPING /datum/status_effect/incapacitating/sleeping //the affected is asleep #define STATUS_EFFECT_TASED /datum/status_effect/electrode //the affected has been tased, preventing fine muscle control +#define STATUS_EFFECT_TASED /datum/status_effect/no_combat_mode/electrode/ //the affected has been tased, preventing fine muscle control #define STATUS_EFFECT_PACIFY /datum/status_effect/pacify //the affected is pacified, preventing direct hostile actions @@ -75,6 +76,9 @@ #define STATUS_EFFECT_ICHORIAL_STAIN /datum/status_effect/ichorial_stain //Prevents a servant from being revived by vitality matrices for one minute. #define STATUS_EFFECT_STASIS /datum/status_effect/incapacitating/stasis //Halts biological functions like bleeding, chemical processing, blood regeneration, walking, etc + +#define STATUS_EFFECT_NO_COMBAT_MODE /datum/status_effect/no_combat_mode //Wont allow combat mode and will disable it +#define STATUS_EFFECT_MESMERIZE /datum/status_effect/no_combat_mode/mesmerize //Just reskinned no_combat_mode ///////////// // NEUTRAL // ///////////// diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 152dc7a8..fec5cead 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -124,9 +124,13 @@ #define TRAIT_ALCOHOL_LIGHTWEIGHT "alcohol_lightweight" //Skyrat port #define TRAIT_CURSED_BLOOD "cursed_blood" //Yo dawg I heard you like bloodborne references so I put a #define TRAIT_RADRESONANCE "radioactive_resonance" //Hyperstation edit - #define TRAIT_SWIMMING "swimming" //only applied by /datum/element/swimming, for checking #define TRAIT_CAPTAIN_METABOLISM "captain-metabolism" +#define TRAIT_COLDBLOODED "coldblooded" // Your body is literal room temperature. Does not make you immune to the temp. +#define TRAIT_NONATURALHEAL "nonaturalheal" // Only Admins can heal you. NOTHING else does it unless it's given the god tag. +#define TRAIT_NORUNNING "norunning" // You walk! +#define TRAIT_NOMARROW "nomarrow" // You don't make blood, with chemicals or nanites. +#define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat. //non-mob traits #define TRAIT_PARALYSIS "paralysis" //Used for limb-based paralysis, where replacing the limb will fix it diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 52f3515d..756ad692 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -349,6 +349,13 @@ devilsouldisplay = new /obj/screen/devil/soul_counter infodisplay += devilsouldisplay + blood_display = new /obj/screen/bloodsucker/blood_counter // Blood Volume + infodisplay += blood_display + vamprank_display = new /obj/screen/bloodsucker/rank_counter // Vampire Rank + infodisplay += vamprank_display + sunlight_display = new /obj/screen/bloodsucker/sunlight_counter // Sunlight + infodisplay += sunlight_display + zone_select = new /obj/screen/zone_sel() zone_select.icon = ui_style zone_select.update_icon(mymob) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index a7ff5668..05bb1b9a 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -122,7 +122,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) + if(I.damtype == BRUTE && !HAS_TRAIT(src, TRAIT_NOMARROW)) if(prob(33)) I.add_mob_blood(src) var/turf/location = get_turf(src) @@ -175,4 +175,3 @@ /obj/item/proc/getweight() return total_mass || w_class * 1.25 - diff --git a/code/datums/hud.dm b/code/datums/hud.dm index eb3ac0b4..e2d9bc57 100644 --- a/code/datums/hud.dm +++ b/code/datums/hud.dm @@ -27,6 +27,7 @@ GLOBAL_LIST_INIT(huds, list( ANTAG_HUD_SOULLESS = new/datum/atom_hud/antag/hidden(), ANTAG_HUD_CLOCKWORK = new/datum/atom_hud/antag(), ANTAG_HUD_BROTHER = new/datum/atom_hud/antag/hidden(), + ANTAG_HUD_BLOODSUCKER = new/datum/atom_hud/antag/bloodsucker() )) /datum/atom_hud diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm index a278affa..2e783adf 100644 --- a/code/datums/mood_events/generic_negative_events.dm +++ b/code/datums/mood_events/generic_negative_events.dm @@ -175,4 +175,49 @@ mood_change = -5 /datum/mood_event/revenant_blight/add_effects() - description = "Just give up, [pick("no one will miss you", "there is nothing you can do to help", "even a clown would be more useful than you", "does it even matter in the end?")]...\n" \ No newline at end of file + description = "Just give up, [pick("no one will miss you", "there is nothing you can do to help", "even a clown would be more useful than you", "does it even matter in the end?")]...\n" + +/datum/mood_event/vampcandle + description = "Something is making your mind feel... loose...\n" + mood_change = -15 + timeout = 1 MINUTES + +/datum/mood_event/drankblood_bad + description = "I drank the blood of a lesser creature. Disgusting.\n" + mood_change = -3 + timeout = 8 MINUTES + +/datum/mood_event/drankblood_dead + description = "I drank dead blood. I am better than this.\n" + mood_change = -5 + timeout = 10 MINUTES + +/datum/mood_event/drankblood_synth + description = "I drank synthetic blood. What is wrong with me?\n" + mood_change = -7 + timeout = 15 MINUTES + +/datum/mood_event/drankkilled + description = "I drank from my victim until they died. I feel...less human.\n" + mood_change = -10 + timeout = 25 MINUTES + +/datum/mood_event/madevamp + description = "A soul has been cursed to undeath by my own hand.\n" + mood_change = -10 + timeout = 10 MINUTES + +/datum/mood_event/vampatefood + description = "Mortal nourishment no longer sustains me. I feel unwell.\n" + mood_change = -6 + timeout = 10 MINUTES + +/datum/mood_event/daylight_1 + description = "I slept poorly in a makeshift coffin during the day.\n" + mood_change = -3 + timeout = 10 MINUTES + +/datum/mood_event/daylight_2 + description = "I have been scorched by the unforgiving rays of the sun.\n" + mood_change = -6 + timeout = 15 MINUTES diff --git a/code/datums/mood_events/generic_positive_events.dm b/code/datums/mood_events/generic_positive_events.dm index 9289b3f1..85fe2810 100644 --- a/code/datums/mood_events/generic_positive_events.dm +++ b/code/datums/mood_events/generic_positive_events.dm @@ -127,7 +127,7 @@ mood_change = 2 timeout = 15 MINUTES -//Power gamer stuff below +//Bloodsucker stuff below. /datum/mood_event/drankblood description = "I have fed greedly from that which nourishes me.\n" mood_change = 10 diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 420545cc..9108e4ce 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -81,33 +81,55 @@ icon_state = "asleep" //TASER -/datum/status_effect/electrode - id = "tased" +/datum/status_effect/no_combat_mode/ + id = "no_combat_mode" blocks_combatmode = TRUE - status_type = STATUS_EFFECT_REPLACE alert_type = null + status_type = STATUS_EFFECT_REPLACE -/datum/status_effect/electrode/on_creation(mob/living/new_owner, set_duration) +/datum/status_effect/no_combat_mode/on_creation(mob/living/new_owner, set_duration) if(isnum(set_duration)) duration = set_duration . = ..() + if(iscarbon(owner)) + var/mob/living/carbon/C = owner + if(C.combatmode) + C.toggle_combat_mode(TRUE) + +/datum/status_effect/no_combat_mode/mesmerize + id = "Mesmerize" + alert_type = /obj/screen/alert/status_effect/mesmerized + +/obj/screen/alert/status_effect/mesmerized + name = "Mesmerized" + desc = "You cant tear your sight from who is in front of you...Their gaze is simply too enthralling.." + icon = 'icons/mob/actions/bloodsucker.dmi' + icon_state = "power_mez" + +/datum/status_effect/no_combat_mode/electrode + id = "tased" + +/datum/status_effect/no_combat_mode/electrode/on_creation(mob/living/new_owner, set_duration) + if(isnum(set_duration)) //TODO, figure out how to grab from subtype + duration = set_duration + . = ..() if(iscarbon(owner)) var/mob/living/carbon/C = owner if(C.combatmode) C.toggle_combat_mode(TRUE) C.add_movespeed_modifier(MOVESPEED_ID_TASED_STATUS, TRUE, override = TRUE, multiplicative_slowdown = 8) -/datum/status_effect/electrode/on_remove() +/datum/status_effect/no_combat_mode/electrode/on_remove() if(iscarbon(owner)) var/mob/living/carbon/C = owner C.remove_movespeed_modifier(MOVESPEED_ID_TASED_STATUS) . = ..() -/datum/status_effect/electrode/tick() +/datum/status_effect/no_combat_mode/electrode/tick() if(owner) owner.adjustStaminaLoss(5) //if you really want to try to stamcrit someone with a taser alone, you can, but it'll take time and good timing. -/datum/status_effect/electrode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y +/datum/status_effect/no_combat_mode/electrode/nextmove_modifier() //why is this a proc. its no big deal since this doesnt get called often at all but literally w h y return 2 //STASIS @@ -698,4 +720,4 @@ datum/status_effect/pacify /obj/screen/alert/status_effect/dna_melt name = "Genetic Breakdown" desc = "I don't feel so good. Your body can't handle the mutations! You have one minute to remove your mutations, or you will be met with a horrible fate." - icon_state = "dna_melt" \ No newline at end of file + icon_state = "dna_melt" diff --git a/code/game/gamemodes/bloodsucker/bloodsucker.dm b/code/game/gamemodes/bloodsucker/bloodsucker.dm new file mode 100644 index 00000000..e784fd83 --- /dev/null +++ b/code/game/gamemodes/bloodsucker/bloodsucker.dm @@ -0,0 +1,292 @@ + +/datum/game_mode + var/list/datum/mind/bloodsuckers = list() // List of minds belonging to this game mode. + var/list/datum/mind/vassals = list() // List of minds that have been turned into Vassals. + //var/list/datum/mind/vamphunters = list() // List of minds hunting vampires. Disabled at the moment + var/obj/effect/sunlight/bloodsucker_sunlight // Sunlight Timer. Created on first Bloodsucker assign. Destroyed on last removed Bloodsucker. + + // LISTS // + 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) + // The antags you're allowed to be if turning Vassal. + +/datum/game_mode/bloodsucker + name = "bloodsucker" + config_tag = "bloodsucker" + traitor_name = "Bloodsucker" + 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") + required_players = 20 + required_enemies = 2 + recommended_enemies = 4 + reroll_friendly = FALSE + enemy_minimum_age = 7 + round_ends_with_antag_death = FALSE + + + announce_span = "danger" + announce_text = "Filthy, bloodsucking vampires are crawling around disguised as crewmembers!\n\ + Bloodsuckers: The crew are cattle, while you are both shepherd and slaughterhouse.\n\ + Crew: Put an end to the undead infestation before the station is overcome!" + +/datum/game_mode/bloodsucker/generate_report() + return "Reports indicate that some of your crew may have toppled statues in the past week, angering the gods and becoming cursed with undeath and a desire for blood. Watch out for crewmembers that seem to shun the light or are found pale and delirious." + +// Seems to be run by game ONCE, and finds all potential players to be antag. +/datum/game_mode/bloodsucker/pre_setup() + + // Set Restricted Jobs + if(CONFIG_GET(flag/protect_roles_from_antagonist)) + restricted_jobs += protected_jobs + + if(CONFIG_GET(flag/protect_assistant_from_antagonist)) + restricted_jobs += "Assistant" + + // Set number of Vamps + recommended_enemies = CLAMP(round(num_players()/10), 1, 6); + + // Select Antags + for(var/i = 0, i < recommended_enemies, i++) + if (!antag_candidates.len) + break + var/datum/mind/bloodsucker = pick(antag_candidates) + // Can we even BE a bloodsucker? + //if (can_make_bloodsucker(bloodsucker, display_warning=FALSE)) + bloodsuckers += bloodsucker + bloodsucker.restricted_roles = restricted_jobs + log_game("[bloodsucker.key] (ckey) has been selected as a Bloodsucker.") + antag_candidates.Remove(bloodsucker) // Apparently you can also write antag_candidates -= bloodsucker + + // Assign Hunters (as many as monsters, plus one) + //assign_monster_hunters(bloodsuckers.len, TRUE, bloodsuckers) // Disabled for now + + // Do we have enough vamps to continue? + return bloodsuckers.len >= required_enemies + + +// 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)) + 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) + return + bloodsucker_sunlight = new () + +// End Sun (last bloodsucker removed) +/datum/game_mode/proc/check_cancel_sunlight() + // No Sunlight + if (!istype(bloodsucker_sunlight)) + return + if (bloodsuckers.len <= 0) + bloodsucker_sunlight.cancel_me = TRUE + qdel(bloodsucker_sunlight) + bloodsucker_sunlight = null + +/datum/game_mode/proc/is_daylight() + return istype(bloodsucker_sunlight) && bloodsucker_sunlight.amDay + +////////////////////////////////////////////////////////////////////////////// + + +/datum/game_mode/proc/can_make_bloodsucker(datum/mind/bloodsucker, datum/mind/creator, display_warning=TRUE) // Creator is just here so we can display fail messages to whoever is turning us. + // No Mind + if(!bloodsucker || !bloodsucker.key) // KEY is client login? + //if(creator) // REMOVED. You wouldn't see their name if there is no mind, so why say anything? + // to_chat(creator, "[bloodsucker] isn't self-aware enough to be raised as a Bloodsucker!") + return FALSE + // Current body is invalid + if(!ishuman(bloodsucker.current))// && !ismonkey(bloodsucker.current)) + if(display_warning && creator) + to_chat(creator, "[bloodsucker] isn't evolved enough to be raised as a Bloodsucker!") + return FALSE + // Species Must have a HEART (Sorry Plasmabois) + var/mob/living/carbon/human/H = bloodsucker.current + if(NOBLOOD in H.dna.species.species_traits) + if(display_warning && creator) + to_chat(creator, "[bloodsucker]'s DNA isn't compatible!") + return FALSE + // Already a Non-Human Antag + if(bloodsucker.has_antag_datum(/datum/antagonist/abductor) || bloodsucker.has_antag_datum(/datum/antagonist/devil) || bloodsucker.has_antag_datum(/datum/antagonist/changeling)) + return FALSE + // Already a vamp + if(bloodsucker.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + if(display_warning && creator) + to_chat(creator, "[bloodsucker] is already a Bloodsucker!") + return FALSE + // 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) + to_chat(creator, "Your blood is too thin to turn this corpse!") + return FALSE + return TRUE + + +/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)) + return FALSE + + // Create Datum: Fledgling + var/datum/antagonist/bloodsucker/A + + // [FLEDGLING] + 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() + + +/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) + 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") + // return 0 + // Check Overdose: Did my current volume go over the Overdose threshold? + //var/am_addicted = 0 + //for (var/datum/reagent/blood/vampblood/blood in target.reagents.addiction_list) // overdosed is tracked in reagent_list, not addiction_list. + //message_admins("DEBUG3: can_make_vassal() Found Blood! [blood] [blood.overdose]") + //if (blood.overdosed) + // am_addicted = 1 // Blood is present in addiction? That's all we need. + // break + + //if (!am_addicted) + //message_admins("DEBUG4: can_make_vassal() Abort: No Blood") + // return 0 + // No Mind! + 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) + to_chat(creator, "[target] is already your loyal Vassal!") + else + 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) + to_chat(creator, "[target] resists the power of your blood to dominate their mind!") + return FALSE + return TRUE + + +/datum/game_mode/proc/AmValidAntag(datum/mind/M) + // No List? + if(!islist(M.antag_datums) || M.antag_datums.len == 0) + return FALSE + // Am I NOT an invalid Antag? NOTE: We already excluded non-antags above. Don't worry about the "No List?" check in AmInvalidIntag() + return !AmInvalidAntag(M) + +/datum/game_mode/proc/AmInvalidAntag(datum/mind/M) + // No List? + if(!islist(M.antag_datums) || M.antag_datums.len == 0) + 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]") + 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)) + return FALSE + // Make Vassal + 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()) + // Update Bloodsucker Title (we're a daddy now) + B.SelectTitle(am_fledgling = FALSE) // Only works if you have no title yet. + // Log + 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 + +/datum/game_mode/proc/remove_vassal(datum/mind/vassal) + vassal.remove_antag_datum(ANTAG_DATUM_VASSAL) diff --git a/code/game/gamemodes/bloodsucker/hunter.dm b/code/game/gamemodes/bloodsucker/hunter.dm new file mode 100644 index 00000000..6784247b --- /dev/null +++ b/code/game/gamemodes/bloodsucker/hunter.dm @@ -0,0 +1,42 @@ + +/* +// Called from game mode pre_setup() +/datum/game_mode/proc/assign_monster_hunters(monster_count = 4, guaranteed_hunters = FALSE, list/datum/mind/exclude_from_hunter) + // Not all game modes GUARANTEE a hunter + if (rand(0,2) == 0) // 50% of the time, we get fewer or NO Hunters + if (!guaranteed_hunters) + return + else + monster_count /= 2 + var/list/no_hunter_jobs = list("AI","Cyborg") + // Set Restricted Jobs + if(CONFIG_GET(flag/protect_roles_from_antagonist)) + no_hunter_jobs += list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") + if(CONFIG_GET(flag/protect_assistant_from_antagonist)) + no_hunter_jobs += "Assistant" + // Find Valid Hunters + var/list/datum/mind/hunter_candidates = get_players_for_role(ROLE_MONSTERHUNTER) + // Assign Hunters (as many as vamps, plus one) + for(var/i = 1, i < monster_count, i++) // Start at 1 so we skip Hunters if there's only one sucker. + if (!hunter_candidates.len) + break + // Assign Hunter + var/datum/mind/hunter = pick(hunter_candidates) + hunter_candidates.Remove(hunter) // Remove Either Way + // Already Antag? Skip + if (islist(exclude_from_hunter) && (locate(hunter) in exclude_from_hunter)) //if (islist(hunter.antag_datums) && hunter.antag_datums.len) + i -- + continue + // NOTE: + vamphunters += hunter + hunter.restricted_roles = no_hunter_jobs + log_game("[hunter.key] (ckey) has been selected as a Hunter.") +// Called from game mode post_setup() +/datum/game_mode/proc/finalize_monster_hunters(monster_count = 4) + var/amEvil = TRUE // First hunter is always an evil boi + for(var/datum/mind/hunter in vamphunters) + var/datum/antagonist/vamphunter/A = new (hunter) + A.bad_dude = amEvil + hunter.add_antag_datum(A) + amEvil = FALSE // Every other hunter is just a boring greytider +*/ diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index fd0b256e..38dbbfd2 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -367,7 +367,7 @@ return 1 return 0 - + /datum/dynamic_ruleset/midround/autotraitor/lewd/execute() var/mob/M = pick(lewd_candidates) lewd_candidates -= M @@ -745,3 +745,32 @@ #undef ABDUCTOR_MAX_TEAMS #undef REVENANT_SPAWN_THRESHOLD + + +////////////////////////////////////////////// +// // +// BLOODSUCKERS // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/latejoin/bloodsucker + name = "Bloodsucker Infiltrator" + //config_tag = "latejoin_bloodsucker" + antag_datum = ANTAG_DATUM_BLOODSUCKER + antag_flag = ROLE_TRAITOR + restricted_roles = list("AI", "Cyborg") + protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") + required_candidates = 1 + weight = 3 + cost = 10 + requirements = list(90,80,70,60,55,50,45,40,35,30) + high_population_requirement = 30 + repeatable = TRUE + +/datum/dynamic_ruleset/latejoin/bloodsucker/execute() + var/mob/M = pick(candidates) + assigned += M.mind + M.mind.special_role = antag_flag + if(mode.make_bloodsucker(M.mind)) + mode.bloodsuckers += M + return TRUE diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index 41b239ba..afd1830f 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -103,7 +103,7 @@ return 1 return 0 - + /datum/dynamic_ruleset/roundstart/traitor/lewd/pre_execute() var/traitor_scaling_coeff = 10 - max(0,round(mode.threat_level/10)-5) // Above 50 threat level, coeff goes down by 1 for every 10 levels var/num_traitors = min(round(mode.candidates.len / traitor_scaling_coeff) + 1, candidates.len) @@ -825,4 +825,42 @@ var/ramp_up_final = CLAMP(round(meteorminutes/rampupdelta), 1, 10) - spawn_meteors(ramp_up_final, wavetype) \ No newline at end of file + spawn_meteors(ramp_up_final, wavetype) + +////////////////////////////////////////////// +// // +// BLOODSUCKERS // +// // +////////////////////////////////////////////// + +/datum/dynamic_ruleset/roundstart/bloodsucker + name = "Bloodsuckers" + persistent = TRUE + antag_flag = ROLE_BLOODSUCKER + antag_datum = ANTAG_DATUM_BLOODSUCKER + minimum_required_age = 0 + protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") + restricted_roles = list("Cyborg", "AI") + required_candidates = 1 + weight = 3 + cost = 10 + requirements = list(101,101,50,40,40,30,30,30,20,20) + high_population_requirement = 10 + chaos_min = 2.9 + chaos_max = 4.9 + +/datum/dynamic_ruleset/roundstart/bloodsucker/pre_execute() + var/num_bloodsuckers = min(round(mode.candidates.len / 10) +1, candidates.len) + for (var/i = 1 to num_bloodsuckers) + var/mob/M = pick_n_take(candidates) + assigned += M.mind + M.mind.special_role = ROLE_BLOODSUCKER + M.mind.restricted_roles = restricted_roles + return TRUE + +/datum/dynamic_ruleset/roundstart/bloodsucker/execute() + mode.check_start_sunlight() + for(var/datum/mind/M in assigned) + if(mode.make_bloodsucker(M)) + mode.bloodsuckers += M + return TRUE diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 8b7c0ed4..f12e9656 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -79,6 +79,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() Disabled for now if(!report) report = !CONFIG_GET(flag/no_intercept_report) addtimer(CALLBACK(GLOBAL_PROC, .proc/display_roundstart_logout_report), ROUNDSTART_LOGOUT_REPORT_TIME) @@ -549,4 +550,4 @@ /// Mode specific admin panel. /datum/game_mode/proc/admin_panel() - return \ No newline at end of file + return diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index a27526ba..906cf6da 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -420,7 +420,7 @@ GENE SCANNER var/mob/living/carbon/human/H = C if(H.bleed_rate) msg += "Subject is bleeding!\n" - var/blood_percent = round((C.blood_volume / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100) + var/blood_percent = round((C.scan_blood_volume() / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100) var/blood_type = C.dna.blood_type if(blood_id != ("blood" || "jellyblood"))//special blood substance var/datum/reagent/R = GLOB.chemical_reagents_list[blood_id] @@ -428,12 +428,12 @@ GENE SCANNER blood_type = R.name else blood_type = blood_id - if(C.blood_volume <= (BLOOD_VOLUME_SAFE*C.blood_ratio) && C.blood_volume > (BLOOD_VOLUME_OKAY*C.blood_ratio)) - msg += "LOW blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n" - else if(C.blood_volume <= (BLOOD_VOLUME_OKAY*C.blood_ratio)) - msg += "CRITICAL blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n" + if(C.scan_blood_volume() <= (BLOOD_VOLUME_SAFE*C.blood_ratio) && C.scan_blood_volume() > (BLOOD_VOLUME_OKAY*C.blood_ratio)) + msg += "LOW blood level [blood_percent] %, [C.scan_blood_volume()] cl, type: [blood_type]\n" + else if(C.scan_blood_volume() <= (BLOOD_VOLUME_OKAY*C.blood_ratio)) + msg += "CRITICAL blood level [blood_percent] %, [C.scan_blood_volume()] cl, type: [blood_type]\n" else - msg += "Blood level [blood_percent] %, [C.blood_volume] cl, type: [blood_type]\n" + msg += "Blood level [blood_percent] %, [C.scan_blood_volume()] cl, type: [blood_type]\n" var/cyberimp_detect for(var/obj/item/organ/cyberimp/CI in C.internal_organs) diff --git a/code/game/objects/items/implants/implant_mindshield.dm b/code/game/objects/items/implants/implant_mindshield.dm index 2a99c6e1..13bf9d6d 100644 --- a/code/game/objects/items/implants/implant_mindshield.dm +++ b/code/game/objects/items/implants/implant_mindshield.dm @@ -26,6 +26,10 @@ if(target.mind.has_antag_datum(/datum/antagonist/brainwashed)) target.mind.remove_antag_datum(/datum/antagonist/brainwashed) + if(target.mind.has_antag_datum(ANTAG_DATUM_VASSAL)) + SSticker.mode.remove_vassal(target.mind) + + if(target.mind.has_antag_datum(/datum/antagonist/rev/head) || target.mind.unconvertable || target.mind.has_antag_datum(/datum/antagonist/gang/boss)) if(!silent) target.visible_message("[target] seems to resist the implant!", "You feel something interfering with your mental conditioning, but you resist it!") diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 7c98cb6c..f475e13d 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -225,7 +225,7 @@ GLOBAL_LIST_INIT(wood_recipes, list ( \ /obj/item/stack/sheet/mineral/wood name = "wooden plank" - desc = "One can only guess that this is a bunch of wood." + desc = "One can only guess that this is a bunch of wood. You might be able to make a stake with this if you use something sharp on it" singular_name = "wood plank" icon_state = "sheet-wood" item_state = "sheet-wood" @@ -267,6 +267,34 @@ GLOBAL_LIST_INIT(bamboo_recipes, list ( \ merge_type = /obj/item/stack/sheet/mineral/bamboo grind_results = list("carbon" = 5) +/obj/item/stack/sheet/mineral/wood/attackby(obj/item/W, mob/user, params) // NOTE: sheet_types.dm is where the WOOD stack lives. Maybe move this over there. + // Taken from /obj/item/stack/rods/attackby in [rods.dm] + if(W.get_sharpness()) + user.visible_message("[user] begins whittling [src] into a pointy object.", \ + "You begin whittling [src] into a sharp point at one end.", \ + "You hear wood carving.") + // 8 Second Timer + if(!do_after(user, 80, TRUE, src)) + return + // Make Stake + var/obj/item/stake/basic/new_item = new(user.loc) + user.visible_message("[user] finishes carving a stake out of [src].", \ + "You finish carving a stake out of [src].") + // Prepare to Put in Hands (if holding wood) + var/obj/item/stack/sheet/mineral/wood/N = src + var/replace = (user.get_inactive_held_item() == N) + // Use Wood + N.use(1) + // If stack depleted, put item in that hand (if it had one) + if (!N && replace) + user.put_in_hands(new_item) + if(istype(W, merge_type)) + var/obj/item/stack/S = W + if(merge(S)) + to_chat(user, "Your [S.name] stack now contains [S.get_amount()] [S.singular_name]\s.") + else + . = ..() + /obj/item/stack/sheet/mineral/bamboo/Initialize(mapload, new_amount, merge = TRUE) recipes = GLOB.bamboo_recipes return ..() @@ -721,5 +749,3 @@ new /datum/stack_recipe("paper frame door", /obj/structure/mineral_door/paperfra merge_type = /obj/item/stack/sheet/cotton/durathread pull_effort = 70 loom_result = /obj/item/stack/sheet/durathread - - diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 36ff16d5..5b16126e 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -79,6 +79,15 @@ material_drop = /obj/item/stack/sheet/mineral/wood material_drop_amount = 5 +/obj/structure/closet/crate/coffin/examine(mob/user) + . = ..() + if(user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + . += {"This is a coffin which you can use to regenerate your burns and other wounds faster."} + . += {"You can also thicken your blood if you survive the day, and hide from the sun safely while inside."} + /* if(user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) + . += {"This is a coffin which your master can use to shield himself from the unforgiving sun.\n + You yourself are still human and dont need it. Yet."} */ + /obj/structure/closet/crate/internals desc = "An internals crate." name = "internals crate" diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_flaws.dm b/code/modules/antagonists/bloodsucker/bloodsucker_flaws.dm new file mode 100644 index 00000000..6dd94e56 --- /dev/null +++ b/code/modules/antagonists/bloodsucker/bloodsucker_flaws.dm @@ -0,0 +1,84 @@ + +// Getting Flaws: +// +// Killing crew +// +// Gaining ranks + + + +// * COMPULSION * Things you must do +// +// SELECTIVE: -Gender/BloodType/Job sustains you, but others give you less. +// + + + + +// * WEAKNESSES * Things that may harm you +// +// LIGHTS: -Bright light nullifies the Examine benefits of Masquerade. +// -Bright lights disable your healing (including in Torpor) +// +// STAKES: -Stakes kill you immediately. +// +// PAINFUL: -Your feed victims scream, despite being unconscious. +// +// FIRE: -You only need your max health (not x2) in fire damage to die. +// +// CORPSE: -Your Masquerade turns off when unconscious or crit. +// +// FERAL: - +// +// CRAVEN + + + + + + + + + + + + + + // BANES // + +// These are basically small weaknesses that affect your character in certain circumstances. +// As a rule, they should be specific as to when they happen, or have only some certain +// drawback. + +// (core ideas) +// SENSITIVE: You are slightly blinded by bright lights. +// DARKFRIEND: Your automatic healing is at a crawl when in bright light. +// TRADITIONAL: Every five minutes spent outside a coffin lowers your rate of automatic healing. +// CONSUMED: Every five minutes spent outside a coffin increases the rate at which your blood ticks down. +// GOURMAND: Animals and blood bags offer you no nourishment when feeding. +// DEATHMASK: You no longer fake having a heartbeat, and always show up as pale when examined. +// BESTIAL: When your blood is low, you will twitch involuntarily. + +// (alternate ideas) +// STERILE: There is a high chance that turning corpses to Bloodsuckers will fail, and further attempts on them by you are impossible. +// FERAL: You're a threat to Vampire-kind: New Bloodsuckers may have an Objective to destroy you. +// UNHOLY: The Chapel, the Bible, and Holy Water set you on fire. +// PARANOID: Only your own claimed coffin counts for healing and banes. + + +// ON LEVEL-UP: +// Burn Damage increases +// Regen Rate increases +// Max Punch Damage increase +// Reset Level Timer +// Select Bane + + +// How to Burn Vamps: +// C.adjustFireLoss(20) +// C.adjust_fire_stacks(6) +// C.IgniteMob() + + +/datum/antagonist/bloodsucker/proc/AssignRandomBane() + return diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_integration.dm b/code/modules/antagonists/bloodsucker/bloodsucker_integration.dm new file mode 100644 index 00000000..bf4ae4b6 --- /dev/null +++ b/code/modules/antagonists/bloodsucker/bloodsucker_integration.dm @@ -0,0 +1,148 @@ +// 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. + if(!getorganslot(ORGAN_SLOT_HEART)) + if(displaymessage != "") + to_chat(src, "Without a heart, you are incapable of [displaymessage].") + return FALSE + if(!get_bodypart(BODY_ZONE_HEAD)) + if(displaymessage != "") + to_chat(src, "Without a head, you are incapable of [displaymessage].") + return FALSE + if(!getorgan(/obj/item/organ/brain)) // NOTE: This is mostly just here so we can do one scan for all needed parts when creating a vamp. You probably won't be trying to use powers w/out a brain. + if(displaymessage != "") + to_chat(src, "Without a brain, you are incapable of [displaymessage].") + 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) + return "" + // Target must be a Vamp + var/datum/antagonist/bloodsucker/bloodsuckerdatum = mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(!bloodsuckerdatum) + return "" + // Viewer is Target's Vassal? + if(viewer.mind.has_antag_datum(ANTAG_DATUM_VASSAL) in bloodsuckerdatum.vassals) + var/returnString = "\[This is your Master!\]" + var/returnIcon = "[icon2html('icons/misc/language.dmi', world, "bloodsucker")]" + returnString += "\n" + return returnIcon + returnString + // Viewer not a Vamp AND not the target's vassal? + if(!viewer.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) && !(viewer in bloodsuckerdatum.vassals)) + return "" + // Default String + var/returnString = "\[[bloodsuckerdatum.ReturnFullName(1)]\]" + var/returnIcon = "[icon2html('icons/misc/language.dmi', world, "bloodsucker")]" + + // In Disguise (Veil)? + //if (name_override != null) + // returnString += " ([real_name] in disguise!) " + + //returnString += "\n" Don't need spacers. Using . += "" in examine.dm does this on its own. + return returnIcon + returnString + + +/mob/living/carbon/human/proc/ReturnVassalExamine(var/mob/viewer) + if(!mind || !viewer.mind) + return "" + // Am I not even a Vassal? Then I am not marked. + var/datum/antagonist/vassal/vassaldatum = mind.has_antag_datum(ANTAG_DATUM_VASSAL) + if(!vassaldatum) + return "" + // Only Vassals and Bloodsuckers can recognize marks. + if(!viewer.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) && !viewer.mind.has_antag_datum(ANTAG_DATUM_VASSAL)) + return "" + + // Default String + var/returnString = "\[" + var/returnIcon = "" + // Am I Viewer's Vassal? + if(vassaldatum.master.owner == viewer.mind) + returnString += "This [dna.species.name] bears YOUR mark!" + returnIcon = "[icon2html('icons/misc/mark_icons.dmi', world, "vassal")]" + // Am I someone ELSE'S Vassal? + else if(viewer.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + returnString += "This [dna.species.name] bears the mark of [vassaldatum.master.ReturnFullName(vassaldatum.master.owner.current,1)]" + returnIcon = "[icon2html('icons/misc/mark_icons.dmi', world, "vassal_grey")]" + // Are you serving the same master as I am? + else if(viewer.mind.has_antag_datum(ANTAG_DATUM_VASSAL) in vassaldatum.master.vassals) + returnString += "[p_they(TRUE)] bears the mark of your Master" + returnIcon = "[icon2html('icons/misc/mark_icons.dmi', world, "vassal")]" + // You serve a different Master than I do. + else + returnString += "[p_they(TRUE)] bears the mark of another Bloodsucker" + returnIcon = "[icon2html('icons/misc/mark_icons.dmi', world, "vassal_grey")]" + + returnString += "\]" // \n" Don't need spacers. Using . += "" in examine.dm does this on its own. + return returnIcon + returnString + + +// Am I "pale" when examined? Bloodsuckers can trick this. +/mob/living/carbon/proc/ShowAsPaleExamine() + + // Normal Creatures: + if(!mind || !mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + return blood_volume < (BLOOD_VOLUME_SAFE * blood_ratio) + + var/datum/antagonist/bloodsucker/bloodsuckerdatum = mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(bloodsuckerdatum.poweron_masquerade) + return FALSE + + // If a Bloodsucker is malnourished, AND if his temperature matches his surroundings (aka he hasn't fed recently and looks COLD)... + return blood_volume < (BLOOD_VOLUME_OKAY * blood_ratio) // && !(bodytemperature <= get_temperature() + 2) + +/mob/living/carbon/human/ShowAsPaleExamine() + // Check for albino, as per human/examine.dm's check. + if(skin_tone == "albino") + return TRUE + + return ..() // Return vamp check + +/mob/living/carbon/proc/scan_blood_volume() + // Vamps don't show up normally to scanners unless Masquerade power is on ----> scanner.dm + if(mind) + var/datum/antagonist/bloodsucker/bloodsuckerdatum = mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if (istype(bloodsuckerdatum) && bloodsuckerdatum.poweron_masquerade) + return BLOOD_VOLUME_NORMAL + return blood_volume + +/mob/living/proc/IsFrenzied() + return FALSE + +/mob/living/proc/StartFrenzy(inTime = 120) + set waitfor = FALSE diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm new file mode 100644 index 00000000..9174692b --- /dev/null +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -0,0 +1,361 @@ + + +// TO PLUG INTO LIFE: + +// Cancel BLOOD life +// Cancel METABOLISM life (or find a way to control what gets digested) +// Create COLDBLOODED trait (thermal homeostasis) + +// EXAMINE +// +// Show as dead when... + +/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 + 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) + 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...") + notice_healing = TRUE + else if(notice_healing == TRUE) + notice_healing = FALSE // Apply Low Blood Effects + 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(istype(owner.current.loc, /obj/structure/closet/crate/coffin)) + Torpor_Begin() + // Wait before next pass + sleep(10) + FreeAllVassals() // Free my Vassals! (if I haven't yet) + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// BLOOD + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/antagonist/bloodsucker/proc/AddBloodVolume(value) + owner.current.blood_volume = CLAMP(owner.current.blood_volume + value, 0, maxBloodVolume) + 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) + 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)) + target.blood_volume -= (blood_taken / max(target.mob_size, 0.1)) * 3.5 // max() to prevent divide-by-zero + target.apply_damage_type(blood_taken / 3.5) // Don't do too much damage, or else they die and provide no blood nourishment. + if(target.blood_volume <= 0) + target.blood_volume = 0 + target.death(0) + /////////// + // Shift Body Temp (toward Target's temp, by volume taken) + owner.current.bodytemperature = ((owner.current.blood_volume * owner.current.bodytemperature) + (blood_taken * target.bodytemperature)) / (owner.current.blood_volume + blood_taken) + // our volume * temp, + their volume * temp, / total volume + /////////// + // Reduce Value Quantity + if(target.stat == DEAD) // Penalty for Dead Blood + blood_taken /= 3 + if(!ishuman(target)) // Penalty for Non-Human Blood + blood_taken /= 2 + //if (!iscarbon(target)) // Penalty for Animals (they're junk food) + // Apply to Volume + AddBloodVolume(blood_taken) + // Reagents (NOT Blood!) + if(target.reagents && target.reagents.total_volume) + target.reagents.reaction(owner.current, INGEST, 1) // Run Reaction: what happens when what they have mixes with what I have? + target.reagents.trans_to(owner.current, 1) // Run transfer of 1 unit of reagent from them to me. + // Blood Gulp Sound + owner.current.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. + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// HEALING + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/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()) + return FALSE + owner.current.adjustStaminaLoss(-2 + (regenRate * -10) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. + owner.current.adjustCloneLoss(-1 * (regenRate * 4) * 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. + var/mob/living/carbon/human/H = owner.current + H.bleed_rate = 0 + 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) + if(amInCoffinWhileTorpor) + mult *= 5 // Increase multiplier if we're sleeping in a coffin. + fireheal = min(C.getFireLoss_nonProsthetic(), regenRate) // NOTE: Burn damage ONLY heals in torpor. + costMult = 0.25 + 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 + // 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_nonProsthetic(), regenRate) + var/toxinheal = min(C.getToxLoss(), regenRate) + // Heal if Damaged + if(bruteheal + fireheal + toxinheal > 0) // Just a check? Don't heal/spend, and return. + if(mult == 0) + return TRUE + // We have damage. Let's heal (one time) + C.adjustBruteLoss(-bruteheal * mult, forced = TRUE)// Heal BRUTE / BURN in random portions throughout the body. + C.adjustFireLoss(-fireheal * mult, forced = TRUE) + C.adjustToxLoss(-toxinheal * mult * 2, forced = TRUE) //Toxin healing because vamps arent immune + //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) / 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. + // 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] ") + 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/CureDisabilities() + var/mob/living/carbon/C = owner.current + C.cure_blind(list(EYE_DAMAGE))//() + C.cure_nearsighted(EYE_DAMAGE) + C.set_blindness(0) // Added 9/2/19 + C.set_blurriness(0) // Added 9/2/19 + C.update_tint() // Added 9/2/19 + C.update_sight() // Added 9/2/19 + for(var/O in C.internal_organs) //owner.current.adjust_eye_damage(-100) // This was removed by TG + var/obj/item/organ/organ = O + organ.setOrganDamage(0) + owner.current.cure_husk() + +// I am thirsty for blud! +/datum/antagonist/bloodsucker/proc/HandleStarving() + + // High: Faster Healing + // Med: Pale + // Low: Twitch + // V.Low: Blur Vision + // EMPTY: Frenzy! + // BLOOD_VOLUME_GOOD: [336] Pale (handled in bloodsucker_integration.dm + // BLOOD_VOLUME_BAD: [224] Jitter + if(owner.current.blood_volume < BLOOD_VOLUME_BAD && !prob(0.5)) + owner.current.Jitter(3) + // BLOOD_VOLUME_SURVIVE: [122] Blur Vision + 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 +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// DEATH + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/antagonist/bloodsucker/proc/HandleDeath() + // FINAL DEATH + // Fire Damage? (above double health) + if (owner.current.getFireLoss_nonProsthetic() >= owner.current.getMaxHealth() * 2) + FinalDeath() + return + // Staked while "Temp Death" or Asleep + if (owner.current.StakeCanKillMe() && owner.current.AmStaked()) + FinalDeath() + return + // Not "Alive"? + if (!owner.current || !isliving(owner.current) || isbrain(owner.current) || !get_turf(owner.current)) + FinalDeath() + return + // Missing Brain or Heart? + if (!owner.current.HaveBloodsuckerBodyparts()) + FinalDeath() + return + // Disable Powers: Masquerade * NOTE * This should happen as a FLAW! + //if (stat >= UNCONSCIOUS) + // 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_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) + if (owner.current.stat >= DEAD) + Torpor_Begin() + to_chat(owner, "Your immortal body will not yet relinquish your soul to the abyss. You enter Torpor.") + 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) + 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")) + 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 + +/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_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. + // Visuals + owner.current.update_sight() + owner.current.reload_fullscreen() + // Disable ALL Powers + for (var/datum/action/bloodsucker/power in powers) + if (power.active && !power.can_use_in_torpor) + power.DeactivatePower() + + +/datum/antagonist/bloodsucker/proc/Torpor_End() + 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") + to_chat(owner, "You have recovered from Torpor.") + + +/datum/antagonist/proc/AmFinalDeath() + // Standard Antags can be dead OR final death + return owner && (owner.current && owner.current.stat >= DEAD || owner.AmFinalDeath()) + +/datum/antagonist/bloodsucker/AmFinalDeath() + return owner && owner.AmFinalDeath() +/datum/antagonist/changeling/AmFinalDeath() + return owner && owner.AmFinalDeath() + +/datum/mind/proc/AmFinalDeath() + return !current || QDELETED(current) || !isliving(current) || isbrain(current) || !get_turf(current) // NOTE: "isliving()" is not the same as STAT == CONSCIOUS. This is to make sure you're not a BORG (aka silicon) + +/datum/antagonist/bloodsucker/proc/FinalDeath() + if(!iscarbon(owner.current)) //Check for non carbons. + owner.current.gib() + return + playsound(get_turf(owner.current), 'sound/effects/tendril_destroyed.ogg', 60, 1) + owner.current.drop_all_held_items() + owner.current.unequip_everything() + var/mob/living/carbon/C = owner.current + C.remove_all_embedded_objects() + // Make me UN-CLONEABLE + owner.current.hellbound = TRUE // This was done during creation, but let's do it again one more time...to make SURE this guy stays dead, but they dont stay dead because brains can be cloned! + // Free my Vassals! + FreeAllVassals() + // Elders get Dusted + if (vamplevel >= 4) // (vamptitle) + 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.") + 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) + + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// HUMAN FOOD + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/mob/proc/CheckBloodsuckerEatFood(var/food_nutrition) + if (!isliving(src)) + return + var/mob/living/L = src + if (!L.AmBloodsucker()) + return + // We're a vamp? Try to eat food... + var/datum/antagonist/bloodsucker/bloodsuckerdatum = mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + bloodsuckerdatum.handle_eat_human_food(food_nutrition) + + +/datum/antagonist/bloodsucker/proc/handle_eat_human_food(var/food_nutrition) // Called from snacks.dm and drinks.dm + set waitfor = FALSE + if (!owner.current || !iscarbon(owner.current)) + return + var/mob/living/carbon/C = owner.current + // Remove Nutrition, Give Bad Food + C.nutrition -= food_nutrition + foodInGut += food_nutrition + // Already ate some bad clams? Then we can back out, because we're already sick from it. + if (foodInGut != food_nutrition) + return + // Haven't eaten, but I'm in a Human Disguise. + else if (poweron_masquerade) + to_chat(C, "Your stomach turns, but your \"human disguise\" keeps the food down...for now.") + // Keep looping until we purge. If we have activated our Human Disguise, we ignore the food. But it'll come up eventually... + var/sickphase = 0 + while (foodInGut) + sleep(50) + C.adjust_disgust(10 * sickphase) + // Wait an interval... + sleep(50 + 50 * sickphase) // At intervals of 100, 150, and 200. (10 seconds, 15 seconds, and 20 seconds) + // Died? Cancel + if(C.stat == DEAD) + return + // Put up disguise? Then hold off the vomit. + if(poweron_masquerade) + if(sickphase > 0) + to_chat(C, "Your stomach settles temporarily. You regain your composure...for now.") + sickphase = 0 + continue + switch(sickphase) + if (1) + to_chat(C, "You feel unwell. You can taste ash on your tongue.") + C.Stun(10) + if (2) + to_chat(C, "Your stomach turns. Whatever you ate tastes of grave dirt and brimstone.") + C.Dizzy(15) + C.Stun(13) + if (3) + to_chat(C, "You purge the food of the living from your viscera! You've never felt worse.") + C.vomit(foodInGut * 4, foodInGut * 2, 0) // (var/lost_nutrition = 10, var/blood = 0, var/stun = 1, var/distance = 0, var/message = 1, var/toxic = 0) + C.blood_volume = max(0, C.blood_volume - foodInGut * 2) + C.Stun(30) + //C.Dizzy(50) + foodInGut = 0 + sickphase ++ diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm b/code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm new file mode 100644 index 00000000..949c755f --- /dev/null +++ b/code/modules/antagonists/bloodsucker/bloodsucker_objectives.dm @@ -0,0 +1,351 @@ + + +// Hide a random object somewhere on the station: +// var/turf/targetturf = get_random_station_turf() +// var/turf/targetturf = get_safe_random_station_turf() + + + + +/datum/objective/bloodsucker + martyr_compatible = TRUE + +// GENERATE! +/datum/objective/bloodsucker/proc/generate_objective() + update_explanation_text() + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// // PROCS // // + + +/datum/objective/bloodsucker/proc/return_possible_targets() + var/list/possible_targets = list() + + // Look at all crew members, and for/loop through. + for(var/datum/mind/possible_target in get_crewmember_minds()) + // Check One: Default Valid User + if(possible_target != owner && ishuman(possible_target.current) && possible_target.current.stat != DEAD)// && is_unique_objective(possible_target)) + // Check Two: Am Bloodsucker? OR in Bloodsucker list? + if (possible_target.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) || (possible_target in SSticker.mode.bloodsuckers)) + continue + else + possible_targets += possible_target + + return possible_targets + + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/objective/bloodsucker/lair + +// EXPLANATION +/datum/objective/bloodsucker/lair/update_explanation_text() + explanation_text = "Create a lair by claiming a coffin, and protect it until the end of the shift"// Make sure to keep it safe!" + +// WIN CONDITIONS? +/datum/objective/bloodsucker/lair/check_completion() + var/datum/antagonist/bloodsucker/antagdatum = owner.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if (antagdatum && antagdatum.coffin && antagdatum.lair) + return TRUE + return FALSE + + // Space_Station_13_areas.dm <--- all the areas + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Vassal becomes a Head, or part of a department +/datum/objective/bloodsucker/protege + + // LOOKUP: /datum/crewmonitor/proc/update_data(z) for .assignment to see how to get a person's PDA. + var/list/roles = list( + "Captain", + "Head of Personnel", + "Research Director", + "Chief Engineer", + "Chief Medical Officer", + "Quartermaster" + ) + var/list/departs = list( + "Research Director", + "Chief Engineer", + "Chief Medical Officer", + "Quartermaster" + ) + + + var/target_role // Equals "HEAD" when it's not a department role. + var/department_string + +// GENERATE! +/datum/objective/bloodsucker/protege/generate_objective() + target_role = rand(0,2) == 0 ? "HEAD" : pick(departs) + + // Heads? + if (target_role == "HEAD") + target_amount = rand(1, round(SSticker.mode.num_players() / 20)) + target_amount = CLAMP(target_amount,1,3) + // Department? + else + switch(target_role) + if("Research Director") + department_string = "Science" + if("Chief Engineer") + department_string = "Engineering" + if("Chief Medical Officer") + department_string = "Medical" + if("Quartermaster") + department_string = "Cargo" + target_amount = rand(round(SSticker.mode.num_players() / 20), round(SSticker.mode.num_players() / 10)) + target_amount = CLAMP(target_amount, 2, 4) + ..() + +// EXPLANATION +/datum/objective/bloodsucker/protege/update_explanation_text() + if (target_role == "HEAD") + if (target_amount == 1) + explanation_text = "Guarantee a Vassal ends up as a Department Head or in a Leadership role." + else + explanation_text = "Guarantee [target_amount] Vassals end up as different Leadership or Department Heads." + else + explanation_text = "Have [target_amount] Vassal[target_amount==1?"":"s"] in the [department_string] department." + +// WIN CONDITIONS? +/datum/objective/bloodsucker/protege/check_completion() + + var/datum/antagonist/bloodsucker/antagdatum = owner.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if (!antagdatum || antagdatum.vassals.len == 0) + return FALSE + + // Get list of all jobs that are qualified (for HEAD, this is already done) + var/list/valid_jobs + if (target_role == "HEAD") + valid_jobs = roles + else + valid_jobs = list() + var/list/alljobs = subtypesof(/datum/job) // This is just a list of TYPES, not the actual variables! + for(var/T in alljobs) + var/datum/job/J = SSjob.GetJobType(T) // + if (!istype(J)) + continue + // Found a job whose Dept Head matches either list of heads, or this job IS the head + if ((target_role in J.department_head) || target_role == J.title) + valid_jobs += J.title + + + // Check Vassals, and see if they match + var/objcount = 0 + var/list/counted_roles = list() // So you can't have more than one Captain count. + for(var/datum/antagonist/vassal/V in antagdatum.vassals) + if (!V || !V.owner) // Must exist somewhere, and as a vassal. + continue + + var/thisRole = "none" + + // Mind Assigned + if ((V.owner.assigned_role in valid_jobs) && !(V.owner.assigned_role in counted_roles)) + //to_chat(owner, "PROTEGE OBJECTIVE: (MIND ROLE)") + thisRole = V.owner.assigned_role + // Mob Assigned + else if ((V.owner.current.job in valid_jobs) && !(V.owner.current.job in counted_roles)) + //to_chat(owner, "PROTEGE OBJECTIVE: (MOB JOB)") + thisRole = V.owner.current.job + // PDA Assigned + else if (V.owner.current && ishuman(V.owner.current)) + var/mob/living/carbon/human/H = V.owner.current + var/obj/item/card/id/I = H.wear_id ? H.wear_id.GetID() : null + if (I && (I.assignment in valid_jobs) && !(I.assignment in counted_roles)) + //to_chat(owner, "PROTEGE OBJECTIVE: (GET ID)") + thisRole = I.assignment + + // NO MATCH + if (thisRole == "none") + continue + + // SUCCESS! + objcount ++ + if (target_role == "HEAD") + counted_roles += thisRole // Add to list so we don't count it again (but only if it's a Head) + + // NOTE!!!!!!!!!!! + + // Look for jobs value on mobs! This is assigned at start, but COULD be assigned from HoP? + // + // ALSO - Search through all jobs (look for prefs earlier that look for all jobs, and search through all jobs to see if their head matches the head listed, or it IS the head) + // + // ALSO - registered_account in _vending.dm for banks, and assigning new ones. + + //to_chat(antagdatum.owner, "PROTEGE OBJECTIVE: Final Count: [objcount] of [antagdatum.vassals.len] vassals") + return objcount >= target_amount + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Eat blood from a lot of people +/datum/objective/bloodsucker/gourmand + +// HOW: Track each feed (if human). Count victory. + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Convert a crewmate +/datum/objective/bloodsucker/embrace + +// HOW: Find crewmate. Check if person is a bloodsucker + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Defile a facility with blood +/datum/objective/bloodsucker/desecrate + + // Space_Station_13_areas.dm <--- all the areas + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Destroy the Solar Arrays +/datum/objective/bloodsucker/solars + +// Space_Station_13_areas.dm <--- all the areas +/datum/objective/bloodsucker/solars/update_explanation_text() + explanation_text = "Prevent all solar arrays on the station from functioning." + +/datum/objective/bloodsucker/solars/check_completion() + // Sort through all /obj/machinery/power/solar_control in the station ONLY, and check that they are functioning. + // Make sure that lastgen is 0 or connected_panels.len is 0. Doesnt matter if it's tracking. + for (var/obj/machinery/power/solar_control/SC in SSsun.solars) + // Check On Station: + var/turf/T = get_turf(SC) + if(!T || !is_station_level(T.z)) // <------ Taken from NukeOp + //message_admins("DEBUG A: [SC] not on station!") + continue // Not on station! We don't care about this. + if (SC && SC.lastgen > 0 && SC.connected_panels.len > 0 && SC.connected_tracker) + return FALSE + return TRUE + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Steal hearts. You just really wanna have some hearts. +/datum/objective/bloodsucker/heartthief + // NOTE: Look up /steal in objective.dm for inspiration. + +// GENERATE! +/datum/objective/bloodsucker/heartthief/generate_objective() + target_amount = rand(1,3) + + update_explanation_text() + //dangerrating += target_amount * 2 + +// EXPLANATION +/datum/objective/bloodsucker/heartthief/update_explanation_text() + explanation_text = "Steal and keep [target_amount] heart[target_amount == 1 ? "" : "s"]." // TO DO: Limit them to Human Only! + +// WIN CONDITIONS? +/datum/objective/bloodsucker/heartthief/check_completion() + // -Must have a body. + if (!owner.current) + return FALSE + // Taken from /steal in objective.dm + var/list/all_items = owner.current.GetAllContents() // Includes items inside other items. + var/itemcount = FALSE + for(var/obj/I in all_items) //Check for items + if(I == /obj/item/organ/heart) + itemcount ++ + if (itemcount >= target_amount) // Got the right amount? + return TRUE + + return FALSE + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/objective/bloodsucker/survive + martyr_compatible = FALSE + + +// EXPLANATION +/datum/objective/bloodsucker/survive/update_explanation_text() + explanation_text = "Survive the entire shift without succumbing to Final Death." + +// WIN CONDITIONS? +/datum/objective/bloodsucker/survive/check_completion() + // -Must have a body. + if (!owner.current || !isliving(owner.current)) + return FALSE + // Dead, without a head or heart? Cya + return owner.current.stat != DEAD// || owner.current.HaveBloodsuckerBodyparts() + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/objective/bloodsucker/vamphunter + +// GENERATE! +/datum/objective/bloodsucker/vamphunter/generate_objective() + update_explanation_text() + +// EXPLANATION +/datum/objective/bloodsucker/vamphunter/update_explanation_text() + explanation_text = "Destroy all Bloodsuckers on [station_name()]." + +// WIN CONDITIONS? +/datum/objective/bloodsucker/vamphunter/check_completion() + for (var/datum/mind/M in SSticker.mode.bloodsuckers) + if (M && M.current && M.current.stat != DEAD && get_turf(M.current)) + return FALSE + return TRUE + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/objective/bloodsucker/monsterhunter + +// GENERATE! +/datum/objective/bloodsucker/monsterhunter/generate_objective() + update_explanation_text() + +// EXPLANATION +/datum/objective/bloodsucker/monsterhunter/update_explanation_text() + explanation_text = "Destroy all monsters on [station_name()]." + +// WIN CONDITIONS? +/datum/objective/bloodsucker/monsterhunter/check_completion() + var/list/datum/mind/monsters = list() + monsters += SSticker.mode.bloodsuckers + monsters += SSticker.mode.devils + monsters += SSticker.mode.cult + monsters += SSticker.mode.wizards + monsters += SSticker.mode.apprentices + //monsters += SSticker.mode.servants_of_ratvar + //monsters += SSticker.mode.changelings disabled anyways + + for (var/datum/mind/M in monsters) + if (M && M != owner && M.current && M.current.stat != DEAD && get_turf(M.current)) + return FALSE + return TRUE + + +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/datum/objective/bloodsucker/vassal + +// GENERATE! +/datum/objective/bloodsucker/vassal/generate_objective() + update_explanation_text() + +// EXPLANATION +/datum/objective/bloodsucker/vassal/update_explanation_text() + explanation_text = "Guarantee the success of your Master's mission!" + +// WIN CONDITIONS? +/datum/objective/bloodsucker/vassal/check_completion() + var/datum/antagonist/vassal/antag_datum = owner.has_antag_datum(ANTAG_DATUM_VASSAL) + return antag_datum.master && antag_datum.master.owner && antag_datum.master.owner.current && antag_datum.master.owner.current.stat != DEAD diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm new file mode 100644 index 00000000..dffdeaf7 --- /dev/null +++ b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm @@ -0,0 +1,284 @@ +/datum/action/bloodsucker + name = "Vampiric Gift" + desc = "A vampiric gift." + button_icon = 'icons/mob/actions/bloodsucker.dmi' //This is the file for the BACKGROUND icon + background_icon_state = "vamp_power_off" //And this is the state for the background icon + var/background_icon_state_on = "vamp_power_on" // FULP: Our "ON" icon alternative. + var/background_icon_state_off = "vamp_power_off" // FULP: Our "OFF" icon alternative. + icon_icon = 'icons/mob/actions/bloodsucker.dmi' //This is the file for the ACTION icon + button_icon_state = "power_feed" //And this is the state for the action icon + buttontooltipstyle = "cult" + + // Action-Related + //var/amPassive = FALSE // REMOVED: Just made it its own kind. // Am I just "on" at all times? (aka NO ICON) + var/amTargetted = FALSE // Am I asked to choose a target when enabled? (Shows as toggled ON when armed) + var/amToggle = FALSE // Can I be actively turned on and off? + var/amSingleUse = FALSE // Am I removed after a single use? + var/active = FALSE + var/cooldown = 20 // 10 ticks, 1 second. + var/cooldownUntil = 0 // From action.dm: next_use_time = world.time + cooldown_time + // Power-Related + var/level_current = 0 // Can increase to yield new abilities. Each power goes up in strength each Rank. + //var/level_max = 1 // + var/bloodcost = 10 + var/needs_button = TRUE // Taken from Changeling - for passive abilities that dont need a button + var/bloodsucker_can_buy = FALSE // Must be a bloodsucker to use this power. + var/warn_constant_cost = FALSE // Some powers charge you for staying on. Masquerade, Cloak, Veil, etc. + var/can_use_in_torpor = FALSE // Most powers don't function if you're in torpor. + var/must_be_capacitated = FALSE // Some powers require you to be standing and ready. + var/can_be_immobilized = FALSE // Brawn can be used when incapacitated/laying if it's because you're being immobilized. NOTE: If must_be_capacitated is FALSE, this is irrelevant. + var/can_be_staked = FALSE // Only Feed can happen with a stake in you. + var/cooldown_static = FALSE // Feed, Masquerade, and One-Shot powers don't improve their cooldown. + //var/not_bloodsucker = FALSE // This goes to Vassals or Hunters, but NOT bloodsuckers. + +/datum/action/bloodsucker/New() + if (bloodcost > 0) + desc += "

COST: [bloodcost] Blood" // Modify description to add cost. + if (warn_constant_cost) + desc += "

Your over-time blood consumption increases while [name] is active." + if (amSingleUse) + desc += "

Useable once per night." + ..() + +// NOTES +// +// click.dm <--- Where we can take over mouse clicks +// spells.dm /add_ranged_ability() <--- How we take over the mouse click to use a power on a target. + +/datum/action/bloodsucker/Trigger() + // Active? DEACTIVATE AND END! + if (active && CheckCanDeactivate(TRUE)) + DeactivatePower() + return + if (!CheckCanPayCost(TRUE) || !CheckCanUse(TRUE)) + return + PayCost() + if (amToggle) + active = !active + UpdateButtonIcon() + if (!amToggle || !active) + StartCooldown() // Must come AFTER UpdateButton(), otherwise icon will revert. + ActivatePower() // NOTE: ActivatePower() freezes this power in place until it ends. + if (active) // Did we not manually disable? Handle it here. + DeactivatePower() + if (amSingleUse) + RemoveAfterUse() + +/datum/action/bloodsucker/proc/CheckCanPayCost(display_error) + if(!owner || !owner.mind) + return FALSE + // Cooldown? + if (cooldownUntil > world.time) + if (display_error) + to_chat(owner, "[src] is unavailable. Wait [(cooldownUntil - world.time) / 10] seconds.") + return FALSE + // Have enough blood? + var/mob/living/L = owner + if (L.blood_volume < bloodcost) + if (display_error) + to_chat(owner, "You need at least [bloodcost] blood to activate [name]") + return FALSE + return TRUE + +/datum/action/bloodsucker/proc/CheckCanUse(display_error) // These checks can be scanned every frame while a ranged power is on. + if(!owner || !owner.mind) + return FALSE + // Torpor? + if(!can_use_in_torpor && HAS_TRAIT(owner, TRAIT_DEATHCOMA)) + if(display_error) + to_chat(owner, "Not while you're in Torpor.") + return FALSE + // Stake? + if(!can_be_staked && owner.AmStaked()) + if(display_error) + to_chat(owner, "You have a stake in your chest! Your powers are useless.") + return FALSE + // Incap? + if(must_be_capacitated) + var/mob/living/L = owner + if (L.incapacitated(TRUE, TRUE) || L.resting && !can_be_immobilized) + if(display_error) + to_chat(owner, "Not while you're incapacitated!") + return FALSE + // Constant Cost (out of blood) + if(warn_constant_cost) + var/mob/living/L = owner + if(L.blood_volume <= 0) + if(display_error) + to_chat(owner, "You don't have the blood to upkeep [src].") + return FALSE + return TRUE + +/datum/action/bloodsucker/proc/StartCooldown() + set waitfor = FALSE + // Alpha Out + button.color = rgb(128,0,0,128) + button.alpha = 100 + // Calculate Cooldown (by power's level) + var/this_cooldown = (cooldown_static || amSingleUse) ? cooldown : max(cooldown / 2, cooldown - (cooldown / 16 * (level_current-1))) + // NOTE: With this formula, you'll hit half cooldown at level 8 for that power. + + // Wait for cooldown + cooldownUntil = world.time + this_cooldown + spawn(this_cooldown) + // Alpha In + button.color = rgb(255,255,255,255) + button.alpha = 255 + +/datum/action/bloodsucker/proc/CheckCanDeactivate(display_error) + return TRUE + +/datum/action/bloodsucker/UpdateButtonIcon(force = FALSE) + background_icon_state = active? background_icon_state_on : background_icon_state_off + ..()//UpdateButtonIcon() + + +/datum/action/bloodsucker/proc/PayCost() + // owner for actions is the mob, not mind. + var/mob/living/L = owner + L.blood_volume -= bloodcost + + +/datum/action/bloodsucker/proc/ActivatePower() + + +/datum/action/bloodsucker/proc/DeactivatePower(mob/living/user = owner, mob/living/target) + active = FALSE + UpdateButtonIcon() + StartCooldown() + +/datum/action/bloodsucker/proc/ContinueActive(mob/living/user, mob/living/target) // Used by loops to make sure this power can stay active. + return active && user && (!warn_constant_cost || user.blood_volume > 0) + +/datum/action/bloodsucker/proc/RemoveAfterUse() + // Un-Learn Me! (GO HOME + var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if (istype(bloodsuckerdatum)) + bloodsuckerdatum.powers -= src + Remove(owner) + +/datum/action/bloodsucker/proc/Upgrade() + level_current ++ + +/////////////////////////////////// PASSIVE POWERS /////////////////////////////////// + +// New Type: Passive (Always on, no button) +/datum/action/bloodsucker/passive + +/datum/action/bloodsucker/passive/New() + // REMOVED: DO NOTHBING! + ..() + // Don't Display Button! (it doesn't do anything anyhow) + button.screen_loc = DEFAULT_BLOODSPELLS + button.moved = DEFAULT_BLOODSPELLS + button.ordered = FALSE +/datum/action/bloodsucker/passive/Destroy() + if(owner) + Remove(owner) + target = null + +/////////////////////////////////// TARGETTED POWERS /////////////////////////////////// + +/datum/action/bloodsucker/targeted + // NOTE: All Targeted spells are Toggles! We just don't bother checking here. + var/target_range = 99 + var/message_Trigger = "Select a target." + var/obj/effect/proc_holder/bloodsucker/bs_proc_holder + var/power_activates_immediately = TRUE // Most powers happen the moment you click. Some, like Mesmerize, require time and shouldn't cost you if they fail. + + var/power_in_use = FALSE // Is this power LOCKED due to being used? + +/datum/action/bloodsucker/targeted/New(Target) + desc += "
\[Targeted Power\]" // Modify description to add notice that this is aimed. + ..() + // Create Proc Holder for intercepting clicks + bs_proc_holder = new () + bs_proc_holder.linked_power = src + +// Click power: Begin Aim +/datum/action/bloodsucker/targeted/Trigger() + if(active && CheckCanDeactivate(TRUE)) + DeactivateRangedAbility() + DeactivatePower() + return + if(!CheckCanPayCost(TRUE) || !CheckCanUse(TRUE)) + return + active = !active + UpdateButtonIcon() + // Create & Link Targeting Proc + var/mob/living/L = owner + if(L.ranged_ability) + L.ranged_ability.remove_ranged_ability() + bs_proc_holder.add_ranged_ability(L) + + if(message_Trigger != "") + to_chat(owner, "[message_Trigger]") + +/datum/action/bloodsucker/targeted/CheckCanUse(display_error) + . = ..() + if(!.) + return + if(!owner.client) // <--- We don't allow non client usage so that using powers like mesmerize will FAIL if you try to use them as ghost. Why? because ranged_abvility in spell.dm + return FALSE // doesn't let you remove powers if you're not there. So, let's just cancel the power entirely. + return TRUE + +/datum/action/bloodsucker/targeted/DeactivatePower(mob/living/user = owner, mob/living/target) + // Don't run ..(), we don't want to engage the cooldown until we USE this power! + active = FALSE + UpdateButtonIcon() + +/datum/action/bloodsucker/targeted/proc/DeactivateRangedAbility() + // Only Turned off when CLICK is disabled...aka, when you successfully clicked (or + bs_proc_holder.remove_ranged_ability() + +// Check if target is VALID (wall, turf, or character?) +/datum/action/bloodsucker/targeted/proc/CheckValidTarget(atom/A) + return FALSE // FALSE targets nothing. + +// Check if valid target meets conditions +/datum/action/bloodsucker/targeted/proc/CheckCanTarget(atom/A, display_error) + // Out of Range + if(!(A in view(target_range, owner))) + if(display_error && target_range > 1) // Only warn for range if it's greater than 1. Brawn doesn't need to announce itself. + to_chat(owner, "Your target is out of range.") + return FALSE + return istype(A) + +// Click Target +/datum/action/bloodsucker/targeted/proc/ClickWithPower(atom/A) + // CANCEL RANGED TARGET check + if(power_in_use || !CheckValidTarget(A)) + return FALSE + // Valid? (return true means DON'T cancel power!) + if(!CheckCanPayCost(TRUE) || !CheckCanUse(TRUE) || !CheckCanTarget(A, TRUE)) + return TRUE + // Skip this part so we can return TRUE right away. + if(power_activates_immediately) + PowerActivatedSuccessfully() // Mesmerize pays only after success. + power_in_use = TRUE // Lock us into this ability until it successfully fires off. Otherwise, we pay the blood even if we fail. + FireTargetedPower(A) // We use this instead of ActivatePower(), which has no input + power_in_use = FALSE + return TRUE + +/datum/action/bloodsucker/targeted/proc/FireTargetedPower(atom/A) + // Like ActivatePower, but specific to Targeted (and takes an atom input). We don't use ActivatePower for targeted. + +/datum/action/bloodsucker/targeted/proc/PowerActivatedSuccessfully() + // The power went off! We now pay the cost of the power. + PayCost() + DeactivateRangedAbility() + DeactivatePower() + StartCooldown() // Do AFTER UpdateIcon() inside of DeactivatePower. Otherwise icon just gets wiped. + +/datum/action/bloodsucker/targeted/ContinueActive(mob/living/user, mob/living/target) // Used by loops to make sure this power can stay active. + return ..() +// Target Proc Holder +/obj/effect/proc_holder/bloodsucker + var/datum/action/bloodsucker/targeted/linked_power + +/obj/effect/proc_holder/bloodsucker/remove_ranged_ability(msg) + ..() + linked_power.DeactivatePower() + +/obj/effect/proc_holder/bloodsucker/InterceptClickOn(mob/living/caller, params, atom/A) + return linked_power.ClickWithPower(A) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm new file mode 100644 index 00000000..77ab31c5 --- /dev/null +++ b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm @@ -0,0 +1,195 @@ +#define TIME_BLOODSUCKER_DAY_WARN 90 // 1.5 minutes +#define TIME_BLOODSUCKER_DAY_FINAL_WARN 25 // 25 sec +#define TIME_BLOODSUCKER_DAY 60 // 1.5 minutes // 10 is a second, 600 is a minute. +#define TIME_BLOODSUCKER_BURN_INTERVAL 40 // 4 sec + + +// Over Time, tick down toward a "Solar Flare" of UV buffeting the station. This period is harmful to vamps. +/obj/effect/sunlight + //var/amDay = FALSE + var/cancel_me = FALSE + var/amDay = FALSE + var/time_til_cycle = 0 + var/nightime_duration = 900 //15 minutes + +/obj/effect/sunlight/Initialize() + countdown() + hud_tick() + +/obj/effect/sunlight/proc/countdown() + set waitfor = FALSE + + while(!cancel_me) + + time_til_cycle = nightime_duration + + // Part 1: Night (all is well) + while(time_til_cycle > TIME_BLOODSUCKER_DAY_WARN) + sleep(10) + if(cancel_me) + return + //sleep(TIME_BLOODSUCKER_NIGHT - TIME_BLOODSUCKER_DAY_WARN) + warn_daylight(1,"Solar Flares will bombard the station with dangerous UV in [TIME_BLOODSUCKER_DAY_WARN / 60] minutes. Prepare to seek cover in a coffin or closet.") // time2text <-- use Help On + give_home_power() // Give VANISHING ACT power to all vamps with a lair! + + // Part 2: Night Ending + while(time_til_cycle > TIME_BLOODSUCKER_DAY_FINAL_WARN) + sleep(10) + if(cancel_me) + return + //sleep(TIME_BLOODSUCKER_DAY_WARN - TIME_BLOODSUCKER_DAY_FINAL_WARN) + message_admins("BLOODSUCKER NOTICE: Daylight beginning in [TIME_BLOODSUCKER_DAY_FINAL_WARN] seconds.)") + warn_daylight(2,"Solar Flares are about to bombard the station! You have [TIME_BLOODSUCKER_DAY_FINAL_WARN] seconds to find cover!",\ + "In [TIME_BLOODSUCKER_DAY_FINAL_WARN / 10], your master will be at risk of a Solar Flare. Make sure they find cover!") + + // (FINAL LIL WARNING) + while(time_til_cycle > 5) + sleep(10) + if (cancel_me) + return + //sleep(TIME_BLOODSUCKER_DAY_FINAL_WARN - 50) + warn_daylight(3,"Seek cover, for Sol rises!") + + // Part 3: Night Ending + while (time_til_cycle > 0) + sleep(10) + if (cancel_me) + return + //sleep(50) + warn_daylight(4,"Solar flares bombard the station with deadly UV light!
Stay in cover for the next [TIME_BLOODSUCKER_DAY / 60] minutes or risk Final Death!",\ + "Solar flares bombard the station with UV light!") + + // Part 4: Day + amDay = TRUE + message_admins("BLOODSUCKER NOTICE: Daylight Beginning (Lasts for [TIME_BLOODSUCKER_DAY / 60] minutes.)") + time_til_cycle = TIME_BLOODSUCKER_DAY + sleep(10) // One second grace period. + //var/daylight_time = TIME_BLOODSUCKER_DAY + var/issued_XP = FALSE + while(time_til_cycle > 0) + punish_vamps() + sleep(TIME_BLOODSUCKER_BURN_INTERVAL) + if (cancel_me) + return + //daylight_time -= TIME_BLOODSUCKER_BURN_INTERVAL + // Issue Level Up! + if(!issued_XP && time_til_cycle <= 15) + issued_XP = TRUE + vamps_rank_up() + + warn_daylight(5,"The solar flare has ended, and the daylight danger has passed...for now.",\ + "The solar flare has ended, and the daylight danger has passed...for now.") + amDay = FALSE + day_end() // Remove VANISHING ACT power from all vamps who have it! Clear Warnings (sunlight, locker protection) + nightime_duration += 100 //Each day makes the night a minute longer. + message_admins("BLOODSUCKER NOTICE: Daylight Ended. Resetting to Night (Lasts for [nightime_duration / 60] minutes.)") + +/obj/effect/sunlight/proc/hud_tick() + set waitfor = FALSE + while(!cancel_me) + // Update all Bloodsucker sunlight huds + for(var/datum/mind/M in SSticker.mode.bloodsuckers) + if(!istype(M) || !istype(M.current)) + continue + var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(istype(bloodsuckerdatum)) + bloodsuckerdatum.update_sunlight(max(0, time_til_cycle), amDay) // This pings all HUDs + sleep(10) + time_til_cycle -- + +/obj/effect/sunlight/proc/warn_daylight(danger_level=0, vampwarn = "", vassalwarn = "") + for(var/datum/mind/M in SSticker.mode.bloodsuckers) + if(!istype(M)) + continue + to_chat(M,vampwarn) + if(M.current) + if(danger_level == 1) + M.current.playsound_local(null, 'sound/chatter/griffin_3.ogg', 50 + danger_level, 1) + else if(danger_level == 2) + M.current.playsound_local(null, 'sound/chatter/griffin_5.ogg', 50 + danger_level, 1) + else if(danger_level == 3) + M.current.playsound_local(null, 'sound/effects/alert.ogg', 75, 1) + else if(danger_level == 4) + M.current.playsound_local(null, 'sound/ambience/ambimystery.ogg', 100, 1) + else if(danger_level == 5) + M.current.playsound_local(null, 'sound/spookoween/ghosty_wind.ogg', 90, 1) + + if(vassalwarn != "") + for(var/datum/mind/M in SSticker.mode.vassals) + if(!istype(M)) + continue + to_chat(M,vassalwarn) + + +/obj/effect/sunlight/proc/punish_vamps() + // Cycle through all vamp antags and check if they're inside a closet. + for(var/datum/mind/M in SSticker.mode.bloodsuckers) + if(!istype(M) || !istype(M.current)) + continue + var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(!istype(bloodsuckerdatum)) + continue + // Closets offer SOME protection + if(istype(M.current.loc, /obj/structure)) + // Coffins offer the BEST protection + if(istype(M.current.loc, /obj/structure/closet/crate/coffin)) + SEND_SIGNAL(M.current, COMSIG_ADD_MOOD_EVENT, "vampsleep", /datum/mood_event/coffinsleep) + continue + else + 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.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) + 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) + 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.updatehealth() + SEND_SIGNAL(M.current, COMSIG_ADD_MOOD_EVENT, "vampsleep", /datum/mood_event/daylight_2) + +/obj/effect/sunlight/proc/day_end() + for(var/datum/mind/M in SSticker.mode.bloodsuckers) + if(!istype(M) || !istype(M.current)) + continue + var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(!istype(bloodsuckerdatum)) + continue + // Reset Warnings + bloodsuckerdatum.warn_sun_locker = FALSE + bloodsuckerdatum.warn_sun_burn = FALSE + // Remove Dawn Powers + for(var/datum/action/bloodsucker/P in bloodsuckerdatum.powers) + if(istype(P, /datum/action/bloodsucker/gohome)) + bloodsuckerdatum.powers -= P + P.Remove(M.current) + +/obj/effect/sunlight/proc/vamps_rank_up() + set waitfor = FALSE + // Cycle through all vamp antags and check if they're inside a closet. + for(var/datum/mind/M in SSticker.mode.bloodsuckers) + if(!istype(M) || !istype(M.current)) + continue + var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(istype(bloodsuckerdatum)) + bloodsuckerdatum.RankUp() // Rank up! Must still be in a coffin to level! + +/obj/effect/sunlight/proc/give_home_power() + // It's late...! Give the "Vanishing Act" gohome power to bloodsuckers. + for(var/datum/mind/M in SSticker.mode.bloodsuckers) + if(!istype(M) || !istype(M.current)) + continue + var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(istype(bloodsuckerdatum) && bloodsuckerdatum.lair && !(locate(/datum/action/bloodsucker/gohome) in bloodsuckerdatum.powers)) + bloodsuckerdatum.BuyPower(new /datum/action/bloodsucker/gohome) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_ui.dm b/code/modules/antagonists/bloodsucker/bloodsucker_ui.dm new file mode 100644 index 00000000..c72ad2ca --- /dev/null +++ b/code/modules/antagonists/bloodsucker/bloodsucker_ui.dm @@ -0,0 +1,110 @@ + + +// For all things visual, such as leveling up + + +// Look up: _vending.dm proc/ui_interact() +// Malf_Modules.dm proc/use() + +/* +/datum/antagonist/bloodsucker/proc/LevelUpMenu() + var/list/dat = list() + dat += "

You have become more ancient.
Direct the path of your blood

" + dat += "
" + // Step One: Decide powers you CAN buy. + for(var/pickedpower in typesof(/datum/action/bloodsucker)) + var/obj/effect/proc_holder/spell/bloodsucker/power = pickedpower + // NAME + dat += "[power.name]" + // COST + dat += "[power.name] Vend" + dat == "
" + var/datum/browser/popup = new(owner.current, "bloodsuckerrank", "Bloodsucker Rank Up") + popup.set_content(dat.Join()) + popup.open() +/datum/antagonist/bloodsucker/Topic(href, href_list) + if(..()) + return +*/ + + +// From browser.dm: /datum/browser/New(nuser, nwindow_id, ntitle = 0, nwidth = 0, nheight = 0, var/atom/nref = null) + + +/* + var/list/dat = list() + dat += "Select use of processing time: (currently #[processing_time] left.)
" + dat += "
" + dat += "Install Module:
" + dat += "The number afterwards is the amount of processing time it consumes.
" + for(var/datum/AI_Module/large/module in possible_modules) + dat += "[module.module_name]\[?\] ([module.cost])
" + for(var/datum/AI_Module/small/module in possible_modules) + dat += "[module.module_name]\[?\] ([module.cost])
" + dat += "
" + if(temp) + dat += "[temp]" + var/datum/browser/popup = new(user, "modpicker", "Malf Module Menu") + popup.set_content(dat.Join()) + popup.open() +*/ + +/* + var/dat = "" + var/datum/bank_account/account + var/mob/living/carbon/human/H + var/obj/item/card/id/C + if(ishuman(user)) + H = user + C = H.get_idcard(TRUE) + if(!C) + dat += "

No ID Card detected!

" + else if (!C.registered_account) + dat += "

No account on registered ID card!

" + if(onstation && C && C.registered_account) + account = C.registered_account + dat += "

Select an item

" + dat += "
" + if(!product_records.len) + dat += "No product loaded!" + else + var/list/display_records = product_records + coin_records + if(extended_inventory) + display_records = product_records + coin_records + hidden_records + dat += "" + for (var/datum/data/vending_product/R in display_records) + var/price_listed = "$[default_price]" + var/is_hidden = hidden_records.Find(R) + if(is_hidden && !extended_inventory) + continue + if(R.custom_price) + price_listed = "$[R.custom_price]" + if(!onstation || account && account.account_job && account.account_job.paycheck_department == payment_department) + price_listed = "FREE" + if(coin_records.Find(R) || is_hidden) + price_listed = "$[R.custom_premium_price ? R.custom_premium_price : extra_price]" + dat += "" + dat += "" + if(R.amount > 0 && ((C && C.registered_account && onstation) || (!onstation && isliving(user)))) + dat += "" + else + dat += "" + dat += "" + dat += "
[sanitize(R.name)] ([price_listed])[R.amount] VendNot Available
" + dat += "
" + if(onstation && C && C.registered_account) + dat += "Balance: $[account.account_balance]" + if(istype(src, /obj/machinery/vending/snack)) + dat += "

Chef's Food Selection

" + dat += "
" + for (var/O in dish_quants) + if(dish_quants[O] > 0) + var/N = dish_quants[O] + dat += "Dispense " + dat += "[capitalize(O)] ($[default_price]): [N]
" + dat += "
" + var/datum/browser/popup = new(user, "vending", (name)) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) + popup.open() +*/ diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm new file mode 100644 index 00000000..ace86b80 --- /dev/null +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -0,0 +1,770 @@ +/datum/team/vampireclan + name = "Clan" // Teravanni, + +/datum/antagonist/bloodsucker + name = "Bloodsucker" + roundend_category = "bloodsuckers" + antagpanel_category = "Bloodsucker" + job_rank = ROLE_BLOODSUCKER + + // NAME + var/vampname // My Dracula name + var/vamptitle // My Dracula title + var/vampreputation // 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. + var/datum/mind/creator // Who made me? For both Vassals AND Bloodsuckers (though Master Vamps won't have one) + // POWERS + var/list/datum/action/powers = list()// Purchased powers + var/poweron_feed = FALSE // Am I feeding? + var/poweron_masquerade = FALSE + // STATS + var/vamplevel = 0 + var/vamplevel_unspent = 1 + var/regenRate = 0.3 // How many points of Brute do I heal per tick? + 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 + 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 + // LISTS + var/static/list/defaultTraits = list (TRAIT_STABLEHEART, TRAIT_NOBREATH, TRAIT_SLEEPIMMUNE, TRAIT_NOCRITDAMAGE, TRAIT_RESISTCOLD, TRAIT_RADIMMUNE, TRAIT_VIRUSIMMUNE, TRAIT_NIGHT_VISION, \ + TRAIT_NOSOFTCRIT, TRAIT_NOHARDCRIT, TRAIT_AGEUSIA, TRAIT_COLDBLOODED, TRAIT_NONATURALHEAL, TRAIT_NOMARROW, TRAIT_NOPULSE, TRAIT_NOCLONE) + // 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) + 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) + AssignStarterPowersAndStats()// Give Powers & Stats + forge_bloodsucker_objectives()// Objectives & Team + update_bloodsucker_icons_added(owner.current, "bloodsucker") // Add Antag HUD + LifeTick() // Run Life Function + . = ..() + + +/datum/antagonist/bloodsucker/on_removal() + SSticker.mode.bloodsuckers -= owner + SSticker.mode.check_cancel_sunlight()// End Sunlight? (if last Vamp) + ClearAllPowersAndStats()// Clear Powers & Stats + clear_bloodsucker_objectives() // Objectives + update_bloodsucker_icons_removed(owner.current)// Clear Antag HUD + . = ..() + + + +/datum/antagonist/bloodsucker/greet() + var/fullname = ReturnFullName(TRUE) + to_chat(owner, "You are [fullname], a bloodsucking vampire!
") + 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) + + 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].
" + + +/datum/antagonist/bloodsucker/farewell() + owner.current.visible_message("[owner.current]'s skin flushes with color, their eyes growing glossier. They look...alive.",\ + "With a snap, your curse has ended. You are no longer a Bloodsucker. You live once more!") + // Refill with Blood + owner.current.blood_volume = max(owner.current.blood_volume,BLOOD_VOLUME_SAFE) + + + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +/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", \ + "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 + "Thoth","Thutmose","Osorkon,","Nofret","Minmotu","Khafra", // Egyptian + "Dio") //lol yes + + else + vampname = 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 + "Nefret","Ankhesenpep") // Egyptian + +/datum/antagonist/bloodsucker/proc/SelectTitle(am_fledgling = 0, forced = FALSE) + // Already have Title + if (!forced && vamptitle != null) + return + // Titles [Master] + if (!am_fledgling) + if (owner.current.gender == MALE) + vamptitle = pick ("Count","Baron","Viscount","Prince","Duke","Tzar","Dreadlord","Lord","Master") + else + vamptitle = 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 + +/datum/antagonist/bloodsucker/proc/SelectReputation(am_fledgling = 0, forced=FALSE) + // Already have Reputation + if (!forced && vampreputation != 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", \ + "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") + else + if (prob(10)) // Gender override + vampreputation = 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",\ + "Unspoiled","Disgraced","Defrocked","Shamed","Meek","Timid","Broken")//,"Fresh") + + +/datum/antagonist/bloodsucker/proc/AmFledgling() + return !vamptitle + +/datum/antagonist/bloodsucker/proc/ReturnFullName(var/include_rep=0) + + var/fullname + // Name First + fullname = (vampname ? vampname : owner.current.name) + // Title + if(vamptitle) + fullname = vamptitle + " " + fullname + // Rep + if(include_rep && vampreputation) + fullname = fullname + " the " + vampreputation + + return fullname + + +/datum/antagonist/bloodsucker/proc/BuyPower(datum/action/bloodsucker/power)//(obj/effect/proc_holder/spell/power) + powers += power + power.Grant(owner.current)// owner.AddSpell(power) + +/datum/antagonist/bloodsucker/proc/AssignStarterPowersAndStats() + // Blood/Rank Counter + add_hud() + update_hud(TRUE) // Set blood value, current rank + // Powers + BuyPower(new /datum/action/bloodsucker/feed) + BuyPower(new /datum/action/bloodsucker/masquerade) + BuyPower(new /datum/action/bloodsucker/veil) + // Traits + for (var/T in defaultTraits) + ADD_TRAIT(owner.current, T, "bloodsucker") + if(HAS_TRAIT(owner.current, TRAIT_TOXINLOVER)) //No slime bonuses here, no thank you + had_toxlover = TRUE + REMOVE_TRAIT(owner.current, TRAIT_TOXINLOVER, "species") + // Traits: Species + if(ishuman(owner.current)) + var/mob/living/carbon/human/H = owner.current + var/datum/species/S = H.dna.species + S.species_traits |= DRINKSBLOOD + // Clear Addictions + owner.current.reagents.addiction_list = list() // Start over from scratch. Lucky you! At least you're not addicted to blood anymore (if you were) + // Stats + if(ishuman(owner.current)) + var/mob/living/carbon/human/H = owner.current + var/datum/species/S = H.dna.species + // Make Changes + S.brutemod *= 0.5 // <-------------------- Start small, but burn mod increases based on rank! + S.coldmod = 0 + S.stunmod *= 0.25 + S.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.") + // Physiology + 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 + CureDisabilities() + +/datum/antagonist/bloodsucker/proc/ClearAllPowersAndStats() + // Blood/Rank Counter + remove_hud() + // Powers + while(powers.len) + var/datum/action/bloodsucker/power = pick(powers) + powers -= power + power.Remove(owner.current) + // owner.RemoveSpell(power) + // Traits + for(var/T in defaultTraits) + REMOVE_TRAIT(owner.current, T, "bloodsucker") + if(had_toxlover == TRUE) + ADD_TRAIT(owner.current, TRAIT_TOXINLOVER, "species") + + // Traits: Species + if(ishuman(owner.current)) + var/mob/living/carbon/human/H = owner.current + H.set_species(H.dna.species.type) + // Stats + if(ishuman(owner.current)) + var/mob/living/carbon/human/H = owner.current + H.set_species(H.dna.species.type) + // 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 + owner.current.setMaxHealth(100) + // Language + owner.current.remove_language(/datum/language/vampiric) + // Soul + if (owner.soulOwner == owner) // Return soul, if *I* own it. + owner.hasSoul = TRUE +//owner.current.hellbound = FALSE + +datum/antagonist/bloodsucker/proc/RankUp() + set waitfor = FALSE + if(!owner || !owner.current) + return + vamplevel_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) + to_chat(owner, "Bloodsucker Tip: If you cannot find or steal a coffin to use, they can be built from wooden planks.
") + +datum/antagonist/bloodsucker/proc/LevelUpPowers() + for(var/datum/action/bloodsucker/power in powers) + power.level_current ++ + +datum/antagonist/bloodsucker/proc/SpendRank() + set waitfor = FALSE + if (vamplevel_unspent <= 0 || !owner || !owner.current || !owner.current.client) + return + ///////// + // Powers + //TODO: Make this into a radial + // Purchase Power Prompt + var/list/options = list() // Taken from gasmask.dm, for Clown Masks. + for(var/pickedpower in typesof(/datum/action/bloodsucker)) + var/datum/action/bloodsucker/power = pickedpower + // If I don't own it, and I'm allowed to buy it. + if(!(locate(power) in powers) && initial(power.bloodsucker_can_buy)) + options[initial(power.name)] = power // TESTING: After working with TGUI, it seems you can use initial() to view the variables inside a path? + options["\[ Not Now \]"] = null + // Abort? + if(options.len > 1) + var/choice = input(owner.current, "You have the opportunity to grow more ancient. 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. + return + if(!istype(owner.current.loc, /obj/structure/closet/crate/coffin)) + to_chat(owner.current, "Return to your coffin to advance your Rank.") + return + if(!choice || !options[choice] || (locate(options[choice]) in powers)) // ADDED: Check to see if you already have this power, due to window stacking. + to_chat(owner.current, "You prevent your blood from thickening just yet, but you may try again later.") + return + // Buy New Powers + var/datum/action/bloodsucker/P = options[choice] + BuyPower(new P) + to_chat(owner.current, "You have learned [initial(P.name)]!") + else + to_chat(owner.current, "You grow more ancient by the night!") + ///////// + // Advance Powers (including new) + LevelUpPowers() + //////// + // Advance Stats + if(ishuman(owner.current)) + var/mob/living/carbon/human/H = owner.current + var/datum/species/S = H.dna.species + S.burnmod *= 0.025 // Slightly more burn damage + S.stunmod *= 0.95 // Slightly less stun time. + S.punchdamagelow += 0.5 + S.punchdamagehigh += 0.5 // NOTE: This affects the hitting power of Brawn. + // More Health + owner.current.setMaxHealth(owner.current.maxHealth + 5) + // Vamp Stats + regenRate += 0.05 // Points of brute healed (starts at 0.3) + feedAmount += 2 // Increase how quickly I munch down vics (15) + maxBloodVolume += 50 // Increase my max blood (600) + ///////// + vamplevel ++ + vamplevel_unspent -- + + // 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, resistence, health, feed rate, regen rate, 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. + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +//This handles the application of antag huds/special abilities +/datum/antagonist/bloodsucker/apply_innate_effects(mob/living/mob_override) + return + +//This handles the removal of antag huds/special abilities +/datum/antagonist/bloodsucker/remove_innate_effects(mob/living/mob_override) + return + +//Assign default team and creates one for one of a kind team antagonists +/datum/antagonist/bloodsucker/create_team(datum/team/team) + return + +// Create Objectives +/datum/antagonist/bloodsucker/proc/forge_bloodsucker_objectives() // Fledgling vampires can have different objectives. + + // TEAM + //clan = new /datum/team/vampireclan(owner) + + + // Lair Objective: Create a Lair + var/datum/objective/bloodsucker/lair/lair_objective = new + lair_objective.owner = owner + lair_objective.generate_objective() + add_objective(lair_objective) + + // Protege Objective + var/datum/objective/bloodsucker/protege/protege_objective = new + protege_objective.owner = owner + protege_objective.generate_objective() + add_objective(protege_objective) + + if (rand(0,1) == 0) + // Heart Thief Objective + var/datum/objective/bloodsucker/heartthief/heartthief_objective = new + heartthief_objective.owner = owner + heartthief_objective.generate_objective() + add_objective(heartthief_objective) + + else + // Solars Objective + var/datum/objective/bloodsucker/solars/solars_objective = new + solars_objective.owner = owner + solars_objective.generate_objective() + add_objective(solars_objective) + + // Survive Objective + var/datum/objective/bloodsucker/survive/survive_objective = new + survive_objective.owner = owner + survive_objective.generate_objective() + add_objective(survive_objective) + + +/datum/antagonist/bloodsucker/proc/add_objective(var/datum/objective/O) + objectives += O + objectives_given += O + +/datum/antagonist/bloodsucker/proc/clear_bloodsucker_objectives() + + var/datum/team/team = get_team() + if(team) + team.remove_member(owner) + + for(var/O in objectives_given) + objectives -= O + qdel(O) + objectives_given = list() // Traitors had this, so I added it. Not sure why. + + +/datum/antagonist/bloodsucker/get_team() + return clan + +//Name shown on antag list +/datum/antagonist/bloodsucker/antag_listing_name() + return ..() + "([ReturnFullName(TRUE)])" + +//Whatever interesting things happened to the antag admins should know about +//Include additional information about antag in this part +/datum/antagonist/bloodsucker/antag_listing_status() + if (owner && owner.AmFinalDeath()) + return "Final Death" + return ..() + + + +//Individual roundend report +/datum/antagonist/bloodsucker/roundend_report() + // Get the default Objectives + var/list/report = list() + + // Vamp Name + report += "
\[[ReturnFullName(TRUE)]\]" + + // Default Report + report += ..() + + // Now list their vassals + if (vassals.len > 0) + report += "Their Vassals were..." + for (var/datum/antagonist/vassal/V in vassals) + if (V.owner) + var/jobname = V.owner.assigned_role ? "the [V.owner.assigned_role]" : "" + report += "[V.owner.name] [jobname]" + + return report.Join("
") + +//Displayed at the start of roundend_category section, default to roundend_category header +/datum/antagonist/bloodsucker/roundend_report_header() + return "Lurking in the darkness, the Bloodsuckers were:
" + + + + + +// 2019 Breakdown of Bloodsuckers: + +// G A M E P L A Y +// +// Bloodsuckers should be inherrently powerful: they never stay dead, and they can hide in plain sight +// better than any other antagonist aboard the station. +// +// However, only elder Bloodsuckers are the powerful creatures of legend. Ranking up as a Bloodsucker +// should impart slight strength and health benefits, as well as powers that can grow over time. But +// their weaknesses should grow as well, and not just to fire. + + +// A B I L I T I E S +// +// * Bloodsuckers can FEIGN LIFE + DEATH. +// Feigning LIFE: +// - Warms up the body +// - Creates a heartbeat +// - Fake blood amount (550) +// Feign DEATH: Not yet done +// - When lying down or sitting, you appear "dead and lifeless" + +// * Bloodsuckers REGENERATE +// - Brute damage heals rather rapidly. Burn damage heals slowly. +// - Healing is reduced when hungry or starved. +// - Burn does not heal when starved. A starved vampire remains "dead" until burns can heal. +// - Bodyparts and organs regrow in Torpor (except for the Heart and Brain). +// +// * Bloodsuckers are IMMORTAL +// - Brute damage cannot destroy them (and it caps very low, so they don't stack too much) +// - Burn damage can only kill them at very high amounts. +// - Removing the head kills the vamp forever. +// - Removing the heart kills the vamp until replaced. +// +// * Bloodsuckers are DEAD +// - They do not breathe. +// - Cold affects them less. +// - They are immune to disease (but can spread it) +// - Food is useless and cause sickness. +// - Nothing can heal the vamp other than his own blood. +// +// * Bloodsuckers are PREDATORS +// - They detect life/heartbeats nearby. +// - They know other predators instantly (Vamps, Werewolves, and alien types) regardless of disguise. +// +// +// +// * Bloodsuckers enter Torpor when DEAD or RESTING in coffin +// - Torpid vampires regenerate their health. Coffins negate cost and speed up the process. +// ** To rest in a coffin, either SLEEP or CLOSE THE LID while you're in it. You will be given a prompt to sleep until healed. Healing in a coffin costs NO blood! +// + + + +// O B J E C T I V E S +// +// +// +// +// 1) GROOM AN HEIR: Find a person with appropriate traits (hair, blood type, gender) to be turned as a Vampire. Before they rise, they must be properly trained. Raise them to great power after their change. +// +// 2) BIBLIOPHILE: Research objects of interest, study items looking for clues of ancient secrets, and hunt down the clues to a Vampiric artifact of horrible power. +// +// 3) CRYPT LORD: Build a terrifying sepulcher to your evil, with servants to lavish upon you in undeath. The trappings of a true crypt lord come at grave cost. +// +// 4) GOURMOND: Oh, to taste all the delicacies the station has to offer! DRINK ## BLOOD FROM VICTIMS WHO LIVE, EAT ## ORGANS FROM VICTIMS WHO LIVE + + +// Vassals +// +// - Loyal to (and In Love With) Master +// - Master can speak to, summon, or punish his Vassals, even while asleep or torpid. +// - Master may have as many Vassals as Rank +// - Vassals see their Master's speech emboldened! + + + + + + + + +// Dev Notes +// +// HEALING: Maybe Vamps metabolize specially? Like, they slowly drip their own blood into their system? +// - Give Vamps their own metabolization proc, perhaps? +// ** shadowpeople.dm has rules for healing. +// +// KILLING: It's almost impossible to track who someone has directly killed. But an Admin could be given +// an easy way to whip a Bloodsucker for cruel behavior, as a RP mechanic but not a punishment. +// ** +// +// HUNGER: Just keep adjusting mob's nutrition to Blood Hunger level. No need to cancel nutrition from eating. +// ** mob.dm /set_nutrition() +// ** snacks.dm / attack() <-- Stop food from doing anything? + +// ORGANS: Liver +// ** life.dm /handle_liver() +// +// CORPSE: Most of these effects likely go away when using "Masquerade" to appear alive. +// ** status_procs.dm /adjust_bodytemperature() +// ** traits.dm /TRAIT_NOBREATH /TRAIT_SLEEPIMMUNE /TRAIT_RESISTCOLD /TRAIT_RADIMMUNE /TRAIT_VIRUSIMMUNE +// * MASQUERADE ON/OFF: /TRAIT_FAKEDEATH (M) +// * /TRAIT_NIGHT_VISION +// * /TRAIT_DEATHCOMA <-- This basically makes you immobile. When using status_procs /fakedeath(), make sure to remove Coma unless we're in Torpor! +// * /TRAIT_NODEATH <--- ??? +// ** species /NOZOMBIE +// * ADD: TRAIT_COLDBLOODED <-- add to carbon/life.dm /natural_bodytemperature_stabilization() +// +// MASQUERADE Appear as human! +// ** examine.dm /examine() <-- Change "blood_volume < BLOOD_VOLUME_SAFE" to a new examine +// +// NOSFERATU ** human.add_trait(TRAIT_DISFIGURED, "insert_vamp_datum_here") <-- Makes you UNKNOWN unless your ID says otherwise. +// STEALTH ** human_helpers.dm /get_visible_name() ** shadowpeople.dm has rules for Light. +// +// FRENZY ** living.dm /update_mobility() (USED TO be update_canmove) +// +// PREDATOR See other Vamps! +// * examine.dm /examine() +// +// WEAKNESSES: -Poor mood in Chapel or near Chaplain. -Stamina damage from Bible + + + + //message_admins("DEBUG3: attempt_cast() [name] / [user_C.handcuffed] ") + + +// TODO: +// +// Death (fire, heart, brain, head) +// Disable Life: BLOOD +// Body Temp +// Spend blood over time (more if imitating life) (none if sleeping in coffin) +// Auto-Heal (brute to 0, fire to 99) (toxin/o2 always 0) +// +// Hud Icons +// UI Blood Counter +// Examine Name (+Masquerade, only "Dead and lifeless" if not standing?) +// +// +// Turn vamps +// Create vassals +// + + +// FIX LIST +// + + +///////////////////////////////////// + + // HUD! // + +/datum/antagonist/bloodsucker/proc/update_bloodsucker_icons_added(datum/mind/m) + var/datum/atom_hud/antag/vamphud = GLOB.huds[ANTAG_HUD_BLOODSUCKER] + vamphud.join_hud(owner.current) + set_antag_hud(owner.current, "bloodsucker") // "bloodsucker" + owner.current.hud_list[ANTAG_HUD].icon = image('icons/mob/hud.dmi', owner.current, "bloodsucker") //Check prepare_huds in mob.dm to see why. + +/datum/antagonist/bloodsucker/proc/update_bloodsucker_icons_removed(datum/mind/m) + var/datum/atom_hud/antag/vamphud = GLOB.huds[ANTAG_HUD_BLOODSUCKER] + vamphud.leave_hud(owner.current) + set_antag_hud(owner.current, null) + +/datum/atom_hud/antag/bloodsucker // from hud.dm in /datums/ Also see data_huds.dm + antag_hud.dm + +/datum/atom_hud/antag/bloodsucker/add_to_single_hud(mob/M, atom/A) + if (!check_valid_hud_user(M,A)) // FULP: This checks if the Mob is a Vassal, and if the Atom is his master OR on his team. + return + ..() + +/datum/atom_hud/antag/bloodsucker/proc/check_valid_hud_user(mob/M, atom/A) // Remember: A is being added to M's hud. Because M's hud is a /antag/vassal hud, this means M is the vassal here. + // Ghost Admins always see Bloodsuckers/Vassals + if (isobserver(M)) + return TRUE + // GOAL: Vassals see their Master and his other Vassals. + // GOAL: Vassals can BE seen by their Bloodsucker and his other Vassals. + // GOAL: Bloodsuckers can see each other. + if (!M || !A || !ismob(A) || !M.mind)// || !A.mind) + return FALSE + var/mob/A_mob = A + if (!A_mob.mind) + return FALSE + // Find Datums: Bloodsucker + var/datum/antagonist/bloodsucker/atom_B = A_mob.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/datum/antagonist/bloodsucker/mob_B = M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + // Check 1) Are we both Bloodsuckers? + if (atom_B && mob_B) + return TRUE + // Find Datums: Vassal + var/datum/antagonist/vassal/atom_V = A_mob.mind.has_antag_datum(ANTAG_DATUM_VASSAL) + 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! + // 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! + // 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 FALSE + + + + ///////////////////////////////////// + + + // BLOOD COUNTER & RANK MARKER ! // + +#define ui_sunlight_display "WEST:6,CENTER-0:0" // 6 pixels to the right, zero tiles & 5 pixels DOWN. +#define ui_blood_display "WEST:6,CENTER-1:0" // 1 tile down +#define ui_vamprank_display "WEST:6,CENTER-2:-5" // 2 tiles down + +/datum/hud + var/obj/screen/bloodsucker/blood_counter/blood_display + var/obj/screen/bloodsucker/rank_counter/vamprank_display + var/obj/screen/bloodsucker/sunlight_counter/sunlight_display + +/datum/antagonist/bloodsucker/proc/add_hud() + return + +/datum/antagonist/bloodsucker/proc/remove_hud() + // No Hud? Get out. + if (!owner.current.hud_used) + return + owner.current.hud_used.blood_display.invisibility = INVISIBILITY_ABSTRACT + owner.current.hud_used.vamprank_display.invisibility = INVISIBILITY_ABSTRACT + owner.current.hud_used.sunlight_display.invisibility = INVISIBILITY_ABSTRACT + +/datum/antagonist/bloodsucker/proc/update_hud(updateRank=FALSE) + // No Hud? Get out. + if(!owner.current.hud_used) + return + // Update Blood Counter + if (owner.current.hud_used.blood_display) + var/valuecolor = "#FF6666" + if(owner.current.blood_volume > BLOOD_VOLUME_SAFE) + valuecolor = "#FFDDDD" + else if(owner.current.blood_volume > BLOOD_VOLUME_BAD) + valuecolor = "#FFAAAA" + owner.current.hud_used.blood_display.update_counter(owner.current.blood_volume, valuecolor) + + // 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) + if(updateRank) // Only change icon on special request. + owner.current.hud_used.vamprank_display.icon_state = (vamplevel_unspent > 0) ? "rank_up" : "rank" + + +/obj/screen/bloodsucker + invisibility = INVISIBILITY_ABSTRACT + +/obj/screen/bloodsucker/proc/clear() + invisibility = INVISIBILITY_ABSTRACT + +/obj/screen/bloodsucker/proc/update_counter(value, valuecolor) + invisibility = 0 // Make Visible + +/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' + name = "Blood Consumed" + icon_state = "blood_display"//"power_display" + screen_loc = ui_blood_display + +/obj/screen/bloodsucker/blood_counter/update_counter(value, valuecolor) + ..() + maptext = "
[round(value,1)]
" + +/obj/screen/bloodsucker/rank_counter + name = "Bloodsucker Rank" + icon = 'icons/mob/actions/bloodsucker.dmi' + icon_state = "rank" + screen_loc = ui_vamprank_display + +/obj/screen/bloodsucker/rank_counter/update_counter(value, valuecolor) + ..() + maptext = "
[round(value,1)]
" + +/obj/screen/bloodsucker/sunlight_counter + icon = 'icons/mob/actions/bloodsucker.dmi' + name = "Solar Flare Timer" + icon_state = "sunlight_night" + screen_loc = ui_sunlight_display + +/datum/antagonist/bloodsucker/proc/update_sunlight(value, amDay = FALSE) + // No Hud? Get out. + if (!owner.current.hud_used) + return + // Update Sun Time + if (owner.current.hud_used.sunlight_display) + var/valuecolor = "#BBBBFF" + 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" + 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]
" + +/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/datum_hunter.dm b/code/modules/antagonists/bloodsucker/datum_hunter.dm new file mode 100644 index 00000000..4f7bd8df --- /dev/null +++ b/code/modules/antagonists/bloodsucker/datum_hunter.dm @@ -0,0 +1,229 @@ +/* +#define HUNTER_SCAN_MIN_DISTANCE 8 +#define HUNTER_SCAN_MAX_DISTANCE 35 +#define HUNTER_SCAN_PING_TIME 20 //5s update time. +/datum/antagonist/vamphunter + name = "Hunter" + roundend_category = "hunters" + antagpanel_category = "Monster Hunter" + job_rank = ROLE_MONSTERHUNTER + var/list/datum/action/powers = list()// Purchased powers + var/list/datum/objective/objectives_given = list() // For removal if needed. + var/datum/martial_art/my_kungfu // Hunters know a lil kung fu. + var/bad_dude = FALSE // Every first hunter spawned is a SHIT LORD. +/datum/antagonist/vamphunter/on_gain() + SSticker.mode.vamphunters |= owner // Add if not already in here (and you might be, if you were picked at round start) + // Hunter Pinpointer + //owner.current.apply_status_effect(/datum/status_effect/agent_pinpointer/hunter_edition) + // Give Hunter Power + var/datum/action/P = new /datum/action/bloodsucker/trackvamp + P.Grant(owner.current) + // Give Hunter Martial Arts + //if (rand(1,3) == 1) + // var/datum/martial_art/pick_type = pick (/datum/martial_art/cqc, /datum/martial_art/krav_maga, /datum/martial_art/cqc, /datum/martial_art/krav_maga, /datum/martial_art/wrestling) // /datum/martial_art/boxing <--- doesn't include grabbing, so don't use! + // my_kungfu = new pick_type //pick (/datum/martial_art/boxing, /datum/martial_art/cqc) // ick_type + // my_kungfu.teach(owner.current, 0) + // Give Hunter Objective + var/datum/objective/bloodsucker/monsterhunter/monsterhunter_objective = new + monsterhunter_objective.owner = owner + monsterhunter_objective.generate_objective() + objectives += monsterhunter_objective + objectives_given += monsterhunter_objective + // Badguy Hunter? (Give him BADGUY objectives) + if (bad_dude) + // Stolen DIRECTLY from datum_traitor.dm + if(prob(15) && !(locate(/datum/objective/download) in objectives) && !(owner.assigned_role in list("Research Director", "Scientist", "Roboticist"))) + var/datum/objective/download/download_objective = new + download_objective.owner = owner + download_objective.gen_amount_goal() + objectives += download_objective + objectives_given += download_objective + else + var/datum/objective/steal/steal_objective = new + steal_objective.owner = owner + steal_objective.find_target() + objectives += steal_objective + objectives_given += steal_objective + . = ..() +/datum/antagonist/vamphunter/on_removal() + SSticker.mode.vamphunters -= owner // Add if not already in here (and you might be, if you were picked at round start) + // Master Pinpointer + //owner.current.remove_status_effect(/datum/status_effect/agent_pinpointer/hunter_edition) + // Take Hunter Power + if (owner.current) + for (var/datum/action/bloodsucker/P in owner.current.actions) + P.Remove(owner.current) + // Take Hunter Martial Arts + //my_kungfu.remove(owner.current) + // Remove Hunter Objectives + for(var/O in objectives_given) + objectives -= O + qdel(O) + objectives_given = list() + . = ..() +/datum/antagonist/vamphunter/greet() + var/vamp_hunter_greet = "You are a fearless Monster Hunter!" + vamp_hunter_greet += "You know there's one or more filthy creature onboard the station, though their identities elude you." + vamp_hunter_greet += "It's your job to root them out, destroy their nests, and save the crew." + vamp_hunter_greet += "Use WHATEVER MEANS NECESSARY to find these creatures...no matter who gets hurt or what you have to destroy to do it." + vamp_hunter_greet += "There are greater stakes at hand than the safety of the station!" + vamp_hunter_greet += "However, security may detain you if they discover your mission..." + antag_memory += "You remember your training:
" + antag_memory += " -Bloodsuckers are weak to fire, or a stake to the heart. Removing their head or heart will also destroy them permanently.
" + antag_memory += " -Wooden stakes can be made from planks, and hardened by a welding tool. Your recipes list has ways of making them even stronger.
" + antag_memory += " -Changelings return to life unless their body is destroyed. Not even decapitation can stop them for long.
" + antag_memory += " -Cultists are weak to the Chaplain's holy water.
" + antag_memory += " -Wizards are notoriously hard to outmatch. Rob or steal whatever weapons you need to destroy them, and shoot before asking questions.

" + if (my_kungfu != null) + vamp_hunter_greet += "Hunter Tip: Use your [my_kungfu.name] techniques to give you an advantage over the enemy.
" + antag_memory += "You remember your training: You are skilled in the [my_kungfu.name] style of combat.
" + to_chat(owner, vamp_hunter_greet) +/datum/antagonist/vamphunter/farewell() + to_chat(owner, "Your hunt has ended: you are no longer a monster hunter!") +// TAKEN FROM: /datum/action/changeling/pheromone_receptors // pheromone_receptors.dm for a version of tracking that Changelings have! +/datum/status_effect/agent_pinpointer/hunter_edition + alert_type = /obj/screen/alert/status_effect/agent_pinpointer/hunter_edition + minimum_range = HUNTER_SCAN_MIN_DISTANCE + tick_interval = HUNTER_SCAN_PING_TIME + duration = 160 // Lasts 10s + range_fuzz_factor = 5//PINPOINTER_EXTRA_RANDOM_RANGE +/obj/screen/alert/status_effect/agent_pinpointer/hunter_edition + name = "Monster Tracking" + desc = "You always know where the hellspawn are." +/datum/status_effect/agent_pinpointer/hunter_edition/on_creation(mob/living/new_owner, ...) + ..() + // Pick target + var/turf/my_loc = get_turf(owner) + var/list/mob/living/carbon/vamps = list() + for(var/datum/mind/M in SSticker.mode.bloodsuckers) + if (!M.current || M.current == owner || !get_turf(M.current) || !get_turf(new_owner)) + continue + var/datum/antagonist/bloodsucker/antag_datum = M.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(!istype(antag_datum)) + continue + var/their_loc = get_turf(M.current) + var/distance = get_dist_euclidian(my_loc, their_loc) + if (distance < HUNTER_SCAN_MAX_DISTANCE) + vamps[M.current] = (HUNTER_SCAN_MAX_DISTANCE ** 2) - (distance ** 2) + // Found one! + if(vamps.len) + scan_target = pickweight(vamps) //Point at a 'random' vamp, biasing heavily towards closer ones. + to_chat(owner, "You detect signs of monsters to the [dir2text(get_dir(my_loc,get_turf(scan_target)))]!") + // Will yield a "?" + else + to_chat(owner, "There are no monsters nearby.") + // Force Point-To Immediately + point_to_target() +/datum/status_effect/agent_pinpointer/hunter_edition/scan_for_target() + // Lose target? Done. Otherwise, scan for target's current position. + if (!scan_target && owner) + owner.remove_status_effect(/datum/status_effect/agent_pinpointer/hunter_edition) + // NOTE: Do NOT run ..(), or else we'll remove our target. +/datum/status_effect/agent_pinpointer/hunter_edition/Destroy() + if (scan_target) + to_chat(owner, "You've lost the trail.") + ..() +*/ + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/* +/datum/action/bloodsucker/trackvamp/ + name = "Track Monster"//"Cellular Emporium" + desc = "Take a moment to look for clues of any nearby monsters.
These creatures are slippery, and often look like the crew." + button_icon = 'icons/mob/actions/bloodsucker.dmi' //This is the file for the BACKGROUND icon + background_icon_state = "vamp_power_off" //And this is the state for the background icon + icon_icon = 'icons/mob/actions/bloodsucker.dmi' //This is the file for the ACTION icon + button_icon_state = "power_hunter" //And this is the state for the action icon + amToggle = FALSE // Action-Related + cooldown = 300 // 10 ticks, 1 second. + bloodcost = 0 +/datum/action/bloodsucker/trackvamp/ActivatePower() + var/mob/living/user = owner + to_chat(user, "You look around, scanning your environment and discerning signs of any filthy, wretched affronts to the natural order.") + if (!do_mob(user,owner,80)) + return + // Add Power + // REMOVED //user.apply_status_effect(/datum/status_effect/agent_pinpointer/hunter_edition) + // We don't track direction anymore! + // Return text indicating direction + display_proximity() + // NOTE: DON'T DEACTIVATE! + //DeactivatePower() +/datum/action/bloodsucker/trackvamp/proc/display_proximity() + // Pick target + var/turf/my_loc = get_turf(owner) + //var/list/mob/living/carbon/vamps = list() + var/best_dist = 9999 + var/mob/living/best_vamp + // Track ALL MONSTERS in Game Mode + var/list/datum/mind/monsters = list() + monsters += SSticker.mode.bloodsuckers + monsters += SSticker.mode.devils + //monsters += SSticker.mode.cult + monsters += SSticker.mode.wizards + monsters += SSticker.mode.apprentices + monsters += SSticker.mode.servants_of_ratvar + //monsters += SSticker.mode.changelings Disabled anyways + // + for(var/datum/mind/M in monsters) + if (!M.current || M.current == owner)// || !get_turf(M.current) || !get_turf(owner)) + continue + for(var/a in M.antag_datums) + var/datum/antagonist/antag_datum = a // var/datum/antagonist/antag_datum = M.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(!istype(antag_datum) || antag_datum.AmFinalDeath()) + continue + var/their_loc = get_turf(M.current) + var/distance = get_dist_euclidian(my_loc, their_loc) + // Found One: Closer than previous/max distance + if (distance < best_dist && distance <= HUNTER_SCAN_MAX_DISTANCE) + best_dist = distance + best_vamp = M.current + break // Stop searching through my antag datums and go to the next guy + // Found one! + if(best_vamp) + var/distString = best_dist <= HUNTER_SCAN_MAX_DISTANCE / 2 ? "somewhere closeby!" : "somewhere in the distance." + //to_chat(owner, "You detect signs of Bloodsuckers to the [dir2text(get_dir(my_loc,get_turf(targetVamp)))]!") + to_chat(owner, "You detect signs of monsters [distString]") + // Will yield a "?" + else + to_chat(owner, "There are no monsters nearby.") +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// From martial.dm +/* +/datum/martial_art/hunter + name = "Hunter-Fu" + id = "MARTIALART_HUNTER" //ID, used by mind/has_martialart + //streak = "" + //max_streak_length = 6 + //current_target + //datum/martial_art/base // The permanent style. This will be null unless the martial art is temporary + //deflection_chance = 0 //Chance to deflect projectiles + //reroute_deflection = FALSE //Delete the bullet, or actually deflect it in some direction? + //block_chance = 0 //Chance to block melee attacks using items while on throw mode. + //restraining = 0 //used in cqc's disarm_act to check if the disarmed is being restrained and so whether they should be put in a chokehold or not + //help_verb + //no_guns = FALSE + //allow_temp_override = TRUE //if this martial art can be overridden by temporary martial arts +/datum/martial_art/hunter/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + return FALSE +/datum/martial_art/hunter/harm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + return FALSE +/datum/martial_art/hunter/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) + return FALSE +/datum/martial_art/hunter/can_use(mob/living/carbon/human/H) + return TRUE +/datum/martial_art/hunter/add_to_streak(element,mob/living/carbon/human/D) + if(D != current_target) + current_target = D + streak = "" + restraining = 0 + streak = streak+element + if(length(streak) > max_streak_length) + streak = copytext(streak,2) + return +/datum/martial_art/hunter/basic_hit(mob/living/carbon/human/A,mob/living/carbon/human/D) + var/damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh) +*/ +*/ diff --git a/code/modules/antagonists/bloodsucker/datum_vassal.dm b/code/modules/antagonists/bloodsucker/datum_vassal.dm new file mode 100644 index 00000000..71ee0bcc --- /dev/null +++ b/code/modules/antagonists/bloodsucker/datum_vassal.dm @@ -0,0 +1,151 @@ +#define VASSAL_SCAN_MIN_DISTANCE 5 +#define VASSAL_SCAN_MAX_DISTANCE 500 +#define VASSAL_SCAN_PING_TIME 20 //2s update time. + + +/datum/antagonist/bloodsucker/proc/attempt_turn_vassal(mob/living/carbon/C) + C.silent = 0 + return SSticker.mode.make_vassal(C,owner) + +/datum/antagonist/bloodsucker/proc/FreeAllVassals() + for (var/datum/antagonist/vassal/V in vassals) + SSticker.mode.remove_vassal(V.owner) + +/datum/antagonist/vassal + name = "Vassal"//WARNING: DO NOT SELECT" // "Vassal" + roundend_category = "vassals" + antagpanel_category = "Bloodsucker" + job_rank = ROLE_BLOODSUCKER + var/datum/antagonist/bloodsucker/master // Who made me? + var/list/datum/action/powers = list()// Purchased powers + var/list/datum/objective/objectives_given = list() // For removal if needed. + +/datum/antagonist/vassal/can_be_owned(datum/mind/new_owner) + // If we weren't created by a bloodsucker, then we cannot be a vassal (assigned from antag panel) + if (!master) + return FALSE + return ..() + +/datum/antagonist/vassal/on_gain() + SSticker.mode.vassals |= owner // Add if not already in here (and you might be, if you were picked at round start) + // Mindslave Add + if(master) + var/datum/antagonist/bloodsucker/B = master.owner.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(B) + B.vassals |= src + owner.enslave_mind_to_creator(master.owner.current) + // Master Pinpointer + owner.current.apply_status_effect(/datum/status_effect/agent_pinpointer/vassal_edition) + // Powers + var/datum/action/bloodsucker/vassal/recuperate/new_Recuperate = new () + new_Recuperate.Grant(owner.current) + powers += new_Recuperate + // Give Vassal Objective + var/datum/objective/bloodsucker/vassal/vassal_objective = new + vassal_objective.owner = owner + vassal_objective.generate_objective() + objectives += vassal_objective + objectives_given += vassal_objective + give_thrall_eyes() + owner.current.grant_language(/datum/language/vampiric) + // Add Antag HUD + update_vassal_icons_added(owner.current, "vassal") + . = ..() + +/datum/antagonist/vassal/proc/give_thrall_eyes() + var/obj/item/organ/eyes/vassal/E = new + E.Insert(owner.current) + +/obj/item/organ/eyes/vassal/ + lighting_alpha = 180 // LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE <--- This is too low a value at 128. We need to SEE what the darkness is so we can hide in it. + see_in_dark = 12 + flash_protect = -1 //These eyes are weaker to flashes, but let you see in the dark + +/datum/antagonist/vassal/proc/remove_thrall_eyes() + var/obj/item/organ/eyes/E = new + E.Insert(owner.current) + +/datum/antagonist/vassal/on_removal() + SSticker.mode.vassals -= owner // Add if not already in here (and you might be, if you were picked at round start) + // Mindslave Remove + if (master && master.owner) + master.vassals -= src + if (owner.enslaved_to == master.owner.current) + owner.enslaved_to = null + // Master Pinpointer + owner.current.remove_status_effect(/datum/status_effect/agent_pinpointer/vassal_edition) + // Powers + while(powers.len) + var/datum/action/power = pick(powers) + powers -= power + power.Remove(owner.current) + // Remove Hunter Objectives + for(var/O in objectives_given) + objectives -= O + qdel(O) + objectives_given = list() + remove_thrall_eyes() + owner.current.remove_language(/datum/language/vampiric) + // Clear Antag HUD + update_vassal_icons_removed(owner.current) + + . = ..() + +/datum/antagonist/vassal/greet() + to_chat(owner, "You are now the mortal servant of [master.owner.current], a bloodsucking vampire!") + to_chat(owner, "The power of [master.owner.current.p_their()] immortal blood compells you to obey [master.owner.current.p_them()] in all things, even offering your own life to prolong theirs.
\ + You are not required to obey any other Bloodsucker, for only [master.owner.current] is your master. The laws of Nanotransen do not apply to you now; only your vampiric master's word must be obeyed.") + // Effects... + owner.current.playsound_local(null, 'sound/magic/mutate.ogg', 100, FALSE, pressure_affected = FALSE) + //owner.store_memory("You became the mortal servant of [master.owner.current], a bloodsucking vampire!") + antag_memory += "You became the mortal servant of [master.owner.current], a bloodsucking vampire!
" + // And to your new Master... + to_chat(master.owner, "[owner.current] has become addicted to your immortal blood. [owner.current.p_they(TRUE)] [owner.current.p_are()] now your undying servant!") + master.owner.current.playsound_local(null, 'sound/magic/mutate.ogg', 100, FALSE, pressure_affected = FALSE) + +/datum/antagonist/vassal/farewell() + owner.current.visible_message("[owner.current]'s eyes dart feverishly from side to side, and then stop. [owner.current.p_they(TRUE)] seem[owner.current.p_s()] calm, \ + like [owner.current.p_they()] [owner.current.p_have()] regained some lost part of [owner.current.p_them()]self.",\ + "With a snap, you are no longer enslaved to [master.owner]! You breathe in heavily, having regained your free will.") + owner.current.playsound_local(null, 'sound/magic/mutate.ogg', 100, FALSE, pressure_affected = FALSE) + // And to your former Master... + //if (master && master.owner) + // to_chat(master.owner, "You feel the bond with your vassal [owner.current] has somehow been broken!") + +/datum/status_effect/agent_pinpointer/vassal_edition + id = "agent_pinpointer" + alert_type = /obj/screen/alert/status_effect/agent_pinpointer/vassal_edition + minimum_range = VASSAL_SCAN_MIN_DISTANCE + tick_interval = VASSAL_SCAN_PING_TIME + duration = -1 // runs out fast + range_fuzz_factor = 0 + +/obj/screen/alert/status_effect/agent_pinpointer/vassal_edition + name = "Blood Bond" + desc = "You always know where your master is." + //icon = 'icons/obj/device.dmi' + //icon_state = "pinon" + +/datum/status_effect/agent_pinpointer/vassal_edition/on_creation(mob/living/new_owner, ...) + ..() + + var/datum/antagonist/vassal/antag_datum = new_owner.mind.has_antag_datum(ANTAG_DATUM_VASSAL) + scan_target = antag_datum?.master?.owner?.current + +/datum/status_effect/agent_pinpointer/vassal_edition/scan_for_target() + // DO NOTHING. We already have our target, and don't wanna do anything from agent_pinpointer + +/datum/antagonist/vassal/proc/update_vassal_icons_added(mob/living/vassal, icontype="vassal") + var/datum/atom_hud/antag/bloodsucker/hud = GLOB.huds[ANTAG_HUD_BLOODSUCKER] + hud.join_hud(vassal) + set_antag_hud(vassal, icontype) // Located in icons/mob/hud.dmi + owner.current.hud_list[ANTAG_HUD].icon = image('icons/mob/hud.dmi', owner.current, "bloodsucker") + +/datum/antagonist/vassal/proc/update_vassal_icons_removed(mob/living/vassal) + var/datum/atom_hud/antag/hud = GLOB.huds[ANTAG_HUD_BLOODSUCKER] + hud.leave_hud(vassal) + set_antag_hud(vassal, null) + +//Displayed at the start of roundend_category section, default to roundend_category header +/*/datum/antagonist/vassal/roundend_report_header() + return "Loyal to their bloodsucking masters, the Vassals were:

"*/ diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_coffin.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_coffin.dm new file mode 100644 index 00000000..19799bc3 --- /dev/null +++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_coffin.dm @@ -0,0 +1,247 @@ + + +// TRAIT_DEATHCOMA - Activate this when you're in your coffin to simulate sleep/death. + + +// Coffins... +// -heal all wounds, and quickly. +// -restore limbs & organs +// + +// Without Coffins... +// - +// -limbs stay lost + + + +// To put to sleep: use owner.current.fakedeath("bloodsucker") but change name to "bloodsucker_coffin" so you continue to stay fakedeath despite healing in the main thread! + + +/datum/antagonist/bloodsucker/proc/ClaimCoffin(obj/structure/closet/crate/claimed) // NOTE: This can be any "closet" that you are resting AND inside of. + // ALREADY CLAIMED + if(claimed.resident) + if(claimed.resident == owner.current) + to_chat(owner, "This is your [src].") + else + to_chat(owner, "This [src] has already been claimed by another.") + return FALSE + // Bloodsucker Learns new Recipes! + owner.teach_crafting_recipe(/datum/crafting_recipe/bloodsucker/vassalrack) + owner.teach_crafting_recipe(/datum/crafting_recipe/bloodsucker/candelabrum) + // This is my Lair + coffin = claimed + lair = get_area(claimed) + // DONE + to_chat(owner, "You have claimed the [claimed] as your place of immortal rest! Your lair is now [lair].") + to_chat(owner, "You have learned new construction recipes to improve your lair.") + to_chat(owner, "Bloodsucker Tip: Find new lair recipes in the misc tab of the Crafting Menu at the bottom of the screen, including the Persuasion Rack for converting crew into Vassals.

") + RunLair() // Start + return TRUE + +// crate.dm +/obj/structure/closet/crate + var/mob/living/resident // This lets bloodsuckers claim any "closet" as a Coffin, so long as they could get into it and close it. This locks it in place, too. + +/obj/structure/closet/crate/coffin + var/pryLidTimer = 250 + can_weld_shut = FALSE + breakout_time = 200 + + +/obj/structure/closet/crate/coffin/blackcoffin + name = "black coffin" + desc = "For those departed who are not so dear." + icon_state = "coffin" + icon = 'icons/obj/vamp_obj.dmi' + can_weld_shut = FALSE + resistance_flags = 0 // Start off with no bonuses. + open_sound = 'sound/bloodsucker/coffin_open.ogg' + close_sound = 'sound/bloodsucker/coffin_close.ogg' + breakout_time = 600 + pryLidTimer = 400 + resistance_flags = NONE + integrity_failure = 70 + armor = list("melee" = 50, "bullet" = 20, "laser" = 30, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 60) + +/obj/structure/closet/crate/coffin/meatcoffin + name = "meat coffin" + desc = "When you're ready to meat your maker, the steaks can never be too high." + icon_state = "meatcoffin" + icon = 'icons/obj/vamp_obj.dmi' + can_weld_shut = FALSE + resistance_flags = 0 // Start off with no bonuses. + open_sound = 'sound/effects/footstep/slime1.ogg' + close_sound = 'sound/effects/footstep/slime1.ogg' + breakout_time = 200 + pryLidTimer = 200 + resistance_flags = NONE + material_drop = /obj/item/reagent_containers/food/snacks/meat/slab + material_drop_amount = 3 + integrity_failure = 40 + armor = list("melee" = 70, "bullet" = 10, "laser" = 10, "energy" = 0, "bomb" = 70, "bio" = 0, "rad" = 0, "fire" = 70, "acid" = 100) + + +/obj/structure/closet/crate/coffin/metalcoffin + name = "metal coffin" + desc = "A big metal sardine can inside of another big metal sardine can, in space." + icon_state = "metalcoffin" + icon = 'icons/obj/vamp_obj.dmi' + can_weld_shut = FALSE + resistance_flags = FIRE_PROOF | LAVA_PROOF + open_sound = 'sound/effects/pressureplate.ogg' + close_sound = 'sound/effects/pressureplate.ogg' + breakout_time = 300 + pryLidTimer = 200 + resistance_flags = NONE + material_drop = /obj/item/stack/sheet/metal + material_drop_amount = 5 + +////////////////////////////////////////////// + +/obj/structure/closet/crate/proc/ClaimCoffin(mob/living/claimant) // NOTE: This can be any "closet" that you are resting AND inside of. + // Bloodsucker Claim + var/datum/antagonist/bloodsucker/bloodsuckerdatum = claimant.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(bloodsuckerdatum) + // Vamp Successfuly Claims Me? + if(bloodsuckerdatum.ClaimCoffin(src)) + resident = claimant + anchored = 1 // No moving this + +/obj/structure/closet/crate/coffin/Destroy() + UnclaimCoffin() + return ..() + +/obj/structure/closet/crate/proc/UnclaimCoffin() + if (resident) + // Vamp Un-Claim + if (resident.mind) + var/datum/antagonist/bloodsucker/bloodsuckerdatum = resident.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if (bloodsuckerdatum && bloodsuckerdatum.coffin == src) + bloodsuckerdatum.coffin = null + bloodsuckerdatum.lair = null + to_chat(resident, "You sense that the link with your coffin, your sacred place of rest, has been brokem! You will need to seek another.") + resident = null // Remove resident. Because this object isnt removed from the game immediately (GC?) we need to give them a way to see they don't have a home anymore. + +/obj/structure/closet/crate/coffin/can_open(mob/living/user) + // You cannot lock in/out a coffin's owner. SORRY. + if (locked) + if(user == resident) + if (welded) + welded = FALSE + update_icon() + //to_chat(user, "You flip a secret latch and unlock [src].") // Don't bother. We know it's unlocked. + locked = FALSE + return 1 + else + playsound(get_turf(src), 'sound/machines/door_locked.ogg', 20, 1) + to_chat(user, "[src] is locked tight from the inside.") + return ..() + +/obj/structure/closet/crate/coffin/close(mob/living/user) + var/turf/Turf = get_turf(src) + var/area/A = get_area(src) + if (!..()) + return FALSE + // Only the User can put themself into Torpor (if you're already in it, you'll start to heal) + if((user in src)) + // Bloodsucker Only + var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(bloodsuckerdatum) + LockMe(user) + Turf = get_turf(user) //we may have moved. adjust as needed... + A = get_area(src) + // Claim? + if(!bloodsuckerdatum.coffin && !resident && (is_station_level(Turf.z) || !A.map_name == "Space")) + switch(alert(user,"Do you wish to claim this as your coffin? [get_area(src)] will be your lair.","Claim Lair","Yes", "No")) + if("Yes") + ClaimCoffin(user) + if (user.AmStaked()) // Stake? No Heal! + to_chat(bloodsuckerdatum.owner.current, "You are staked! Remove the offending weapon from your heart before sleeping.") + return + // Heal + if(bloodsuckerdatum.HandleHealing(0)) // Healing Mult 0 <--- We only want to check if healing is valid! + to_chat(bloodsuckerdatum.owner.current, "You enter the horrible slumber of deathless Torpor. You will heal until you are renewed.") + bloodsuckerdatum.Torpor_Begin() + // Level Up? + bloodsuckerdatum.SpendRank() // Auto-Fails if not appropriate + return TRUE + +/obj/structure/closet/crate/coffin/attackby(obj/item/W, mob/user, params) + // You cannot weld or deconstruct an owned coffin. STILL NOT SORRY. + if (resident != null && user != resident) // Owner can destroy their own coffin. + if(opened) + if(istype(W, cutting_tool)) + to_chat(user, "This is a much more complex mechanical structure than you thought. You don't know where to begin cutting [src].") + return + else if(anchored && istype(W, /obj/item/wrench)) // Can't unanchor unless owner. + to_chat(user, "The coffin won't come unanchored from the floor.") + return + + if(locked && istype(W, /obj/item/crowbar)) + var/pry_time = pryLidTimer * W.toolspeed // Pry speed must be affected by the speed of the tool. + user.visible_message("[user] tries to pry the lid off of [src] with [W].", \ + "You begin prying the lid off of [src] with [W]. This should take about [DisplayTimeText(pry_time)].") + if (!do_mob(user,src,pry_time)) + return + bust_open() + user.visible_message("[user] snaps the door of [src] wide open.", \ + "The door of [src] snaps open.") + return + ..() + + + +/obj/structure/closet/crate/coffin/AltClick(mob/user) + // Distance Check (Inside Of) + if (user in src) // user.Adjacent(src) + LockMe(user, !locked) + +/obj/structure/closet/crate/proc/LockMe(mob/user, inLocked = TRUE) + // Lock + if (user == resident) + if (!broken) + locked = inLocked + to_chat(user, "You flip a secret latch and [locked?"":"un"]lock yourself inside [src].") + else + to_chat(resident, "The secret latch to lock [src] from the inside is broken. You set it back into place...") + if (do_mob(resident, src, 50))//sleep(10) + if (broken) // Spam Safety + to_chat(resident, "You fix the mechanism and lock it.") + broken = FALSE + locked = TRUE + +// Look up recipes.dm OR pneumaticCannon.dm +/datum/crafting_recipe/bloodsucker/blackcoffin + name = "Black Coffin" + result = /obj/structure/closet/crate/coffin/blackcoffin + tools = list(/obj/item/weldingtool, + /obj/item/screwdriver) + reqs = list(/obj/item/stack/sheet/cloth = 1, + /obj/item/stack/sheet/mineral/wood = 5, + /obj/item/stack/sheet/metal = 1) + ///obj/item/stack/packageWrap = 8, + ///obj/item/pipe = 2) + time = 150 + category = CAT_MISC + always_availible = TRUE + +/datum/crafting_recipe/bloodsucker/meatcoffin + name = "Meat Coffin" + result =/obj/structure/closet/crate/coffin/meatcoffin + tools = list(/obj/item/kitchen/knife, + /obj/item/kitchen/rollingpin) + reqs = list(/obj/item/reagent_containers/food/snacks/meat/slab = 5, + /obj/item/restraints/handcuffs/cable = 1) + time = 150 + category = CAT_MISC + always_availible = TRUE + +/datum/crafting_recipe/bloodsucker/metalcoffin + name = "Metal Coffin" + result =/obj/structure/closet/crate/coffin/metalcoffin + tools = list(/obj/item/weldingtool, + /obj/item/screwdriver) + reqs = list(/obj/item/stack/sheet/metal = 5) + time = 100 + category = CAT_MISC + always_availible = TRUE diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm new file mode 100644 index 00000000..0b42648d --- /dev/null +++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_organs.dm @@ -0,0 +1,67 @@ + + +/datum/antagonist/bloodsucker/proc/CheckVampOrgans() + // Do I have any parts that need replacing? + var/obj/item/organ/O + // Heart + O = owner.current.getorganslot(ORGAN_SLOT_HEART) + if(!istype(O, /obj/item/organ/heart/vampheart)) + qdel(O) + var/obj/item/organ/heart/vampheart/H = new + H.Insert(owner.current) + H.Stop() // Now...stop beating! + // Eyes + O = owner.current.getorganslot(ORGAN_SLOT_EYES) + if(!istype(O, /obj/item/organ/eyes/vassal/bloodsucker)) + qdel(O) + var/obj/item/organ/eyes/vassal/bloodsucker/E = new + E.Insert(owner.current) + +/datum/antagonist/bloodsucker/proc/RemoveVampOrgans() + // Heart + var/obj/item/organ/heart/H = new + H.Insert(owner.current) + // Eyes + var/obj/item/organ/eyes/E = new + E.Insert(owner.current) +// HEART: OVERWRITE // +// HEART // +/obj/item/organ/heart/vampheart + beating = 0 + var/fakingit = 0 + +/obj/item/organ/heart/vampheart/prepare_eat() + ..() + // Do cool stuff for eating vamp heart? + +/obj/item/organ/heart/vampheart/Restart() + beating = 0 // DONT run ..(). We don't want to start beating again. + return 0 + +/obj/item/organ/heart/vampheart/Stop() + fakingit = 0 + return ..() + +/obj/item/organ/heart/vampheart/proc/FakeStart() + fakingit = 1 // We're pretending to beat, to fool people. + +/obj/item/organ/heart/vampheart/HeartStrengthMessage() + if(fakingit) + return "a healthy" + return "no" // Bloodsuckers don't have a heartbeat at all when stopped (default is "an unstable") +// EYES // + +/obj/item/organ/eyes/vassal/bloodsucker + flash_protect = 2 //Eye healing isnt working properly + sight_flags = SEE_MOBS // Taken from augmented_eyesight.dm + +/* +// LIVER // +/obj/item/organ/liver/vampliver + // Livers run on_life(), which calls reagents.metabolize() in holder.dm, which calls on_mob_life.dm in the cheam (medicine_reagents.dm) + // Holder also calls reagents.reaction_mob for the moment it happens +/obj/item/organ/liver/vampliver/on_life() + var/mob/living/carbon/C = owner + if(!istype(C)) + return +*/ diff --git a/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm new file mode 100644 index 00000000..9db4cae1 --- /dev/null +++ b/code/modules/antagonists/bloodsucker/items/bloodsucker_stake.dm @@ -0,0 +1,176 @@ + + +// organ_internal.dm -- /obj/item/organ + + + +// Do I have a stake in my heart? +/mob/living/AmStaked() + var/obj/item/bodypart/BP = get_bodypart("chest") + if (!BP) + return FALSE + for(var/obj/item/I in BP.embedded_objects) + if (istype(I,/obj/item/stake/)) + return TRUE + return FALSE +/mob/proc/AmStaked() + return FALSE + + +/mob/living/proc/StakeCanKillMe() + return IsSleeping() || stat >= UNCONSCIOUS || blood_volume <= 0 || HAS_TRAIT(src, TRAIT_DEATHCOMA) // NOTE: You can't go to sleep in a coffin with a stake in you. + + +///obj/item/weapon/melee/stake +/obj/item/stake/ + name = "wooden stake" + desc = "A simple wooden stake carved to a sharp point." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "wood" // Inventory Icon + item_state = "wood" // In-hand Icon + lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' // File for in-hand icon + righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' + attack_verb = list("staked") + slot_flags = ITEM_SLOT_BELT + w_class = WEIGHT_CLASS_SMALL + hitsound = 'sound/weapons/bladeslice.ogg' + force = 6 + throwforce = 10 + embedding = list("embed_chance" = 25, "embedded_fall_chance" = 0.5) // UPDATE 2/10/18 embedding_behavior.dm is how this is handled + //embed_chance = 25 // Look up "is_pointed" to see where we set stakes able to do this. + //embedded_fall_chance = 0.5 // Chance it will fall out. + obj_integrity = 30 + max_integrity = 30 + //embedded_fall_pain_multiplier + var/staketime = 120 // Time it takes to embed the stake into someone's chest. + +/obj/item/stake/basic + name = "wooden stake" + // This exists so Hardened/Silver Stake can't have a welding torch used on them. + +/obj/item/stake/basic/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/weldingtool)) + //if (amWelded) + // to_chat(user, "This stake has already been treated with fire.") + // return + //amWelded = TRUE + // Weld it + var/obj/item/weldingtool/WT = W + if(WT.use(0))//remove_fuel(0,user)) + user.visible_message("[user.name] scorched the pointy end of [src] with the welding tool.", \ + "You scorch the pointy end of [src] with the welding tool.", \ + "You hear welding.") + // 8 Second Timer + if(!do_mob(user, src, 80)) + return + // Create the Stake + qdel(src) + var/obj/item/stake/hardened/new_item = new(usr.loc) + user.put_in_hands(new_item) + else + return ..() + +/obj/item/stake/afterattack(atom/target, mob/user, proximity) + //to_chat(world, "DEBUG: Staking ") + // Invalid Target, or not targetting chest with HARM intent? + if(!iscarbon(target) || check_zone(user.zone_selected) != "chest" || user.a_intent != INTENT_HARM) + return + var/mob/living/carbon/C = target + // Needs to be Down/Slipped in some way to Stake. + if(!C.can_be_staked() || target == user) + to_chat(user, "You cant stake [target] when they are moving moving about! They have to be laying down!") + return + // Oops! Can't. + if(HAS_TRAIT(C, TRAIT_PIERCEIMMUNE)) + to_chat(user, "[target]'s chest resists the stake. It won't go in.") + return + // Make Attempt... + to_chat(user, "You put all your weight into embedding the stake into [target]'s chest...") + playsound(user, 'sound/magic/Demon_consume.ogg', 50, 1) + if(!do_mob(user, C, staketime, 0, 1, extra_checks=CALLBACK(C, /mob/living/carbon/proc/can_be_staked))) // user / target / time / uninterruptable / show progress bar / extra checks + return + // Drop & Embed Stake + user.visible_message("[user.name] drives the [src] into [target]'s chest!", \ + "You drive the [src] into [target]'s chest!") + playsound(get_turf(target), 'sound/effects/splat.ogg', 40, 1) + user.dropItemToGround(src, TRUE) //user.drop_item() // "drop item" doesn't seem to exist anymore. New proc is user.dropItemToGround() but it doesn't seem like it's needed now? + var/obj/item/bodypart/B = C.get_bodypart("chest") // This was all taken from hitby() in human_defense.dm + B.embedded_objects |= src + add_mob_blood(target)//Place blood on the stake + loc = C // Put INSIDE the character + B.receive_damage(w_class * embedding.embedded_impact_pain_multiplier) + if(C.mind) + var/datum/antagonist/bloodsucker/bloodsucker = C.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(bloodsucker) + // If DEAD or TORPID...kill vamp! + if(C.StakeCanKillMe()) // NOTE: This is the ONLY time a staked Torpid vamp dies. + bloodsucker.FinalDeath() + return + else + to_chat(target, "You have been staked! Your powers are useless, your death forever, while it remains in place.") + to_chat(user, "You missed [C.p_their(TRUE)]'s heart! It would be easier if [C.p_they(TRUE)] weren't struggling so much.") + +// Can this target be staked? If someone stands up before this is complete, it fails. Best used on someone stationary. +/mob/living/carbon/proc/can_be_staked() + //return resting || IsKnockdown() || IsUnconscious() || (stat && (stat != SOFT_CRIT || pulledby)) || (has_trait(TRAIT_FAKEDEATH)) || resting || IsStun() || IsFrozen() || (pulledby && pulledby.grab_state >= GRAB_NECK) + return (src.resting || src.lying) + // ABOVE: Taken from update_mobility() in living.dm + +/obj/item/stake/hardened + // Created by welding and acid-treating a simple stake. + name = "hardened stake" + desc = "A hardened wooden stake carved to a sharp point and scorched at the end." + icon_state = "hardened" // Inventory Icon + force = 8 + throwforce = 12 + armour_penetration = 10 + embedding = list("embed_chance" = 50, "embedded_fall_chance" = 0) // UPDATE 2/10/18 embedding_behavior.dm is how this is handled + obj_integrity = 120 + max_integrity = 120 + + staketime = 80 + +/obj/item/stake/hardened/silver + name = "silver stake" + desc = "Polished and sharp at the end. For when some mofo is always trying to iceskate uphill." + icon_state = "silver" // Inventory Icon + item_state = "silver" // In-hand Icon + siemens_coefficient = 1 //flags = CONDUCT // var/siemens_coefficient = 1 // for electrical admittance/conductance (electrocution checks and shit) + force = 9 + armour_penetration = 25 + embedding = list("embed_chance" = 65) // UPDATE 2/10/18 embedding_behavior.dm is how this is handled + obj_integrity = 300 + max_integrity = 300 + + staketime = 60 + +// Convert back to Silver +/obj/item/stake/hardened/silver/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/weldingtool)) + var/obj/item/weldingtool/WT = I + if(WT.use(0))//remove_fuel(0, user)) + var/obj/item/stack/sheet/mineral/silver/newsheet = new (user.loc) + for(var/obj/item/stack/sheet/mineral/silver/S in user.loc) + if(S == newsheet) + continue + if(S.amount >= S.max_amount) + continue + S.attackby(newsheet, user) + to_chat(user, "You melt down the stake and add it to the stack. It now contains [newsheet.amount] sheet\s.") + qdel(src) + else + return ..() + + +// Look up recipes.dm OR pneumaticCannon.dm +/datum/crafting_recipe/silver_stake + name = "Silver Stake" + result = /obj/item/stake/hardened/silver + tools = list(/obj/item/weldingtool) + reqs = list(/obj/item/stack/sheet/mineral/silver = 1, + /obj/item/stake/hardened = 1) + ///obj/item/stack/packageWrap = 8, + ///obj/item/pipe = 2) + time = 80 + category = CAT_WEAPONRY + subcategory = CAT_WEAPON diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm new file mode 100644 index 00000000..946c472f --- /dev/null +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_coffin.dm @@ -0,0 +1,242 @@ + + +// TRAIT_DEATHCOMA - Activate this when you're in your coffin to simulate sleep/death. + + +// Coffins... +// -heal all wounds, and quickly. +// -restore limbs & organs +// + +// Without Coffins... +// - +// -limbs stay lost + + + +// To put to sleep: use owner.current.fakedeath("bloodsucker") but change name to "bloodsucker_coffin" so you continue to stay fakedeath despite healing in the main thread! + + +/datum/antagonist/bloodsucker/proc/ClaimCoffin(obj/structure/closet/crate/claimed) // NOTE: This can be any "closet" that you are resting AND inside of. + // ALREADY CLAIMED + if(claimed.resident) + if(claimed.resident == owner.current) + to_chat(owner, "This is your [src].") + else + to_chat(owner, "This [src] has already been claimed by another.") + return FALSE + // Bloodsucker Learns new Recipes! + owner.teach_crafting_recipe(/datum/crafting_recipe/bloodsucker/vassalrack) + owner.teach_crafting_recipe(/datum/crafting_recipe/bloodsucker/candelabrum) + // This is my Lair + coffin = claimed + lair = get_area(claimed) + // DONE + to_chat(owner, "You have claimed the [claimed] as your place of immortal rest! Your lair is now [lair].") + to_chat(owner, "You have learned new construction recipes to improve your lair.") + to_chat(owner, "Bloodsucker Tip: Find new lair recipes in the misc tab of the Crafting Menu at the bottom of the screen, including the Persuasion Rack for converting crew into Vassals.

") + RunLair() // Start + return TRUE + +// crate.dm +/obj/structure/closet/crate + var/mob/living/resident // This lets bloodsuckers claim any "closet" as a Coffin, so long as they could get into it and close it. This locks it in place, too. + +/obj/structure/closet/crate/coffin + var/pryLidTimer = 250 + can_weld_shut = FALSE + breakout_time = 200 + + +/obj/structure/closet/crate/coffin/blackcoffin + name = "black coffin" + desc = "For those departed who are not so dear." + icon_state = "coffin" + icon = 'icons/obj/vamp_obj.dmi' + can_weld_shut = FALSE + resistance_flags = 0 // Start off with no bonuses. + open_sound = 'sound/bloodsucker/coffin_open.ogg' + close_sound = 'sound/bloodsucker/coffin_close.ogg' + breakout_time = 600 + pryLidTimer = 400 + resistance_flags = NONE + +/obj/structure/closet/crate/coffin/meatcoffin + name = "meat coffin" + desc = "When you're ready to meat your maker, the steaks can never be too high." + icon_state = "meatcoffin" + icon = 'icons/obj/vamp_obj.dmi' + can_weld_shut = FALSE + resistance_flags = 0 // Start off with no bonuses. + open_sound = 'sound/effects/footstep/slime1.ogg' + close_sound = 'sound/effects/footstep/slime1.ogg' + breakout_time = 200 + pryLidTimer = 200 + resistance_flags = NONE + material_drop = /obj/item/reagent_containers/food/snacks/meat/slab + material_drop_amount = 3 + +/obj/structure/closet/crate/coffin/metalcoffin + name = "metal coffin" + desc = "A big metal sardine can inside of another big metal sardine can, in space." + icon_state = "metalcoffin" + icon = 'icons/obj/vamp_obj.dmi' + can_weld_shut = FALSE + resistance_flags = FIRE_PROOF | LAVA_PROOF + open_sound = 'sound/effects/pressureplate.ogg' + close_sound = 'sound/effects/pressureplate.ogg' + breakout_time = 300 + pryLidTimer = 200 + resistance_flags = NONE + material_drop = /obj/item/stack/sheet/metal + material_drop_amount = 5 + +////////////////////////////////////////////// + +/obj/structure/closet/crate/proc/ClaimCoffin(mob/living/claimant) // NOTE: This can be any "closet" that you are resting AND inside of. + // Bloodsucker Claim + var/datum/antagonist/bloodsucker/bloodsuckerdatum = claimant.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(bloodsuckerdatum) + // Vamp Successfuly Claims Me? + if(bloodsuckerdatum.ClaimCoffin(src)) + resident = claimant + anchored = 1 // No moving this + +/obj/structure/closet/crate/coffin/Destroy() + UnclaimCoffin() + return ..() + +/obj/structure/closet/crate/proc/UnclaimCoffin() + if (resident) + // Vamp Un-Claim + if (resident.mind) + var/datum/antagonist/bloodsucker/bloodsuckerdatum = resident.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if (bloodsuckerdatum && bloodsuckerdatum.coffin == src) + bloodsuckerdatum.coffin = null + bloodsuckerdatum.lair = null + to_chat(resident, "You sense that the link with your coffin, your sacred place of rest, has been brokem! You will need to seek another.") + resident = null // Remove resident. Because this object isnt removed from the game immediately (GC?) we need to give them a way to see they don't have a home anymore. + +/obj/structure/closet/crate/coffin/can_open(mob/living/user) + // You cannot lock in/out a coffin's owner. SORRY. + if (locked) + if(user == resident) + if (welded) + welded = FALSE + update_icon() + //to_chat(user, "You flip a secret latch and unlock [src].") // Don't bother. We know it's unlocked. + locked = FALSE + return 1 + else + playsound(get_turf(src), 'sound/machines/door_locked.ogg', 20, 1) + to_chat(user, "[src] is locked tight from the inside.") + return ..() + +/obj/structure/closet/crate/coffin/close(mob/living/user) + var/turf/Turf = get_turf(src) + var/area/A = get_area(src) + if (!..()) + return FALSE + // Only the User can put themself into Torpor (if you're already in it, you'll start to heal) + if((user in src)) + // Bloodsucker Only + var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(bloodsuckerdatum) + LockMe(user) + Turf = get_turf(user) //we may have moved. adjust as needed... + A = get_area(src) + // Claim? + if(!bloodsuckerdatum.coffin && !resident && (is_station_level(Turf.z) || !A.map_name == "Space")) + switch(alert(user,"Do you wish to claim this as your coffin? [get_area(src)] will be your lair.","Claim Lair","Yes", "No")) + if("Yes") + ClaimCoffin(user) + if (user.AmStaked()) // Stake? No Heal! + to_chat(bloodsuckerdatum.owner.current, "You are staked! Remove the offending weapon from your heart before sleeping.") + return + // Heal + if(bloodsuckerdatum.HandleHealing(0)) // Healing Mult 0 <--- We only want to check if healing is valid! + to_chat(bloodsuckerdatum.owner.current, "You enter the horrible slumber of deathless Torpor. You will heal until you are renewed.") + bloodsuckerdatum.Torpor_Begin() + // Level Up? + bloodsuckerdatum.SpendRank() // Auto-Fails if not appropriate + return TRUE + +/obj/structure/closet/crate/coffin/attackby(obj/item/W, mob/user, params) + // You cannot weld or deconstruct an owned coffin. STILL NOT SORRY. + if (resident != null && user != resident) // Owner can destroy their own coffin. + if(opened) + if(istype(W, cutting_tool)) + to_chat(user, "This is a much more complex mechanical structure than you thought. You don't know where to begin cutting [src].") + return + else if(anchored && istype(W, /obj/item/wrench)) // Can't unanchor unless owner. + to_chat(user, "The coffin won't come unanchored from the floor.") + return + + if(locked && istype(W, /obj/item/crowbar)) + var/pry_time = pryLidTimer * W.toolspeed // Pry speed must be affected by the speed of the tool. + user.visible_message("[user] tries to pry the lid off of [src] with [W].", \ + "You begin prying the lid off of [src] with [W]. This should take about [DisplayTimeText(pry_time)].") + if (!do_mob(user,src,pry_time)) + return + bust_open() + user.visible_message("[user] snaps the door of [src] wide open.", \ + "The door of [src] snaps open.") + return + ..() + + + +/obj/structure/closet/crate/coffin/AltClick(mob/user) + // Distance Check (Inside Of) + if (user in src) // user.Adjacent(src) + LockMe(user, !locked) + +/obj/structure/closet/crate/proc/LockMe(mob/user, inLocked = TRUE) + // Lock + if (user == resident) + if (!broken) + locked = inLocked + to_chat(user, "You flip a secret latch and [locked?"":"un"]lock yourself inside [src].") + else + to_chat(resident, "The secret latch to lock [src] from the inside is broken. You set it back into place...") + if (do_mob(resident, src, 50))//sleep(10) + if (broken) // Spam Safety + to_chat(resident, "You fix the mechanism and lock it.") + broken = FALSE + locked = TRUE + +// Look up recipes.dm OR pneumaticCannon.dm +/datum/crafting_recipe/bloodsucker/blackcoffin + name = "Black Coffin" + result = /obj/structure/closet/crate/coffin/blackcoffin + tools = list(/obj/item/weldingtool, + /obj/item/screwdriver) + reqs = list(/obj/item/stack/sheet/cloth = 1, + /obj/item/stack/sheet/mineral/wood = 5, + /obj/item/stack/sheet/metal = 1) + ///obj/item/stack/packageWrap = 8, + ///obj/item/pipe = 2) + time = 150 + category = CAT_MISC + always_availible = TRUE + +/datum/crafting_recipe/bloodsucker/meatcoffin + name = "Meat Coffin" + result =/obj/structure/closet/crate/coffin/meatcoffin + tools = list(/obj/item/kitchen/knife, + /obj/item/kitchen/rollingpin) + reqs = list(/obj/item/reagent_containers/food/snacks/meat/slab = 5, + /obj/item/restraints/handcuffs/cable = 1) + time = 150 + category = CAT_MISC + always_availible = TRUE + +/datum/crafting_recipe/bloodsucker/metalcoffin + name = "Metal Coffin" + result =/obj/structure/closet/crate/coffin/metalcoffin + tools = list(/obj/item/weldingtool, + /obj/item/screwdriver) + reqs = list(/obj/item/stack/sheet/metal = 5) + time = 100 + category = CAT_MISC + always_availible = TRUE diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm new file mode 100644 index 00000000..2cb97457 --- /dev/null +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm @@ -0,0 +1,494 @@ + + +// IDEAS -- +// An object that disguises your coffin while you're in it! +// +// An object that lets your lair itself protect you from sunlight, like a coffin would (no healing tho) + + + +// Hide a random object somewhere on the station: +// var/turf/targetturf = get_random_station_turf() +// var/turf/targetturf = get_safe_random_station_turf() + + + + +// CRYPT OBJECTS +// +// +// PODIUM Stores your Relics +// +// ALTAR Transmute items into sacred items. +// +// PORTRAIT Gaze into your past to: restore mood boost? +// +// BOOKSHELF Discover secrets about crew and locations. Learn languages. Learn marial arts. +// +// BRAZER Burn rare ingredients to gleen insights. +// +// RUG Ornate, and creaks when stepped upon by any humanoid other than yourself and your vassals. +// +// X COFFIN (Handled elsewhere) +// +// X CANDELABRA (Handled elsewhere) +// +// THRONE Your mental powers work at any range on anyone inside your crypt. +// +// MIRROR Find any person +// +// BUST/STATUE Create terror, but looks just like you (maybe just in Examine?) + + +// RELICS +// +// RITUAL DAGGER +// +// SKULL +// +// VAMPIRIC SCROLL +// +// SAINTS BONES +// +// GRIMOIRE + + +// RARE INGREDIENTS +// Ore +// Books (Manuals) + + +// NOTE: Look up AI and Sentient Disease to see how the game handles the selector logo that only one player is allowed to see. We could add hud for vamps to that? +// ALTERNATIVELY, use the Vamp Huds on relics to mark them, but only show to relevant vamps? + + +/obj/structure/bloodsucker + var/mob/living/owner + +/* +/obj/structure/bloodsucker/bloodthrone + name = "wicked throne" + desc = "Twisted metal shards jut from the arm rests. Very uncomfortable looking. It would take a sadistic sort to sit on this jagged piece of furniture." +/obj/structure/bloodsucker/bloodaltar + name = "bloody altar" + desc = "It is marble, lined with basalt, and radiates an unnerving chill that puts your skin on edge." +/obj/structure/bloodsucker/bloodstatue + name = "bloody countenance" + desc = "It looks upsettingly familiar..." +/obj/structure/bloodsucker/bloodportrait + name = "oil portrait" + desc = "A disturbingly familiar face stares back at you. On second thought, the reds don't seem to be painted in oil..." +/obj/structure/bloodsucker/bloodbrazer + name = "lit brazer" + desc = "It burns slowly, but doesn't radiate any heat." +/obj/structure/bloodsucker/bloodmirror + name = "faded mirror" + desc = "You get the sense that the foggy reflection looking back at you has an alien intelligence to it." +*/ + + +/obj/structure/bloodsucker/vassalrack + name = "persuasion rack" + desc = "If this wasn't meant for torture, then someone has some fairly horrifying hobbies." + icon = 'icons/obj/vamp_obj.dmi' + icon_state = "vassalrack" + buckle_lying = FALSE + anchored = FALSE + density = TRUE // Start dense. Once fixed in place, go non-dense. + can_buckle = TRUE + var/useLock = FALSE // So we can't just keep dragging ppl on here. + var/mob/buckled + var/convert_progress = 3 // Resets on each new character to be added to the chair. Some effects should lower it... + var/disloyalty_confirm = FALSE // Command & Antags need to CONFIRM they are willing to lose their role (and will only do it if the Vassal'ing succeeds) + var/disloyalty_offered = FALSE // Has the popup been issued? Don't spam them. + var/convert_cost = 100 + +/obj/structure/bloodsucker/vassalrack/deconstruct(disassembled = TRUE) + new /obj/item/stack/sheet/metal(src.loc, 4) + new /obj/item/stack/rods(loc, 4) + qdel(src) + +/obj/structure/bloodsucker/vassalrack/examine(mob/user) + . = ..() + if((user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) || 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."} + . += {"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."} +/* 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 + You can secure victims to the vassal rack by click dragging the victim onto the rack while it is secured"} */ + +/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 && user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + 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 + var/waspulling = (O == owner.pulling) + var/wasgrabstate = owner.grab_state + // * MOVE! * + O.forceMove(drop_location()) + // PULL TARGET: Restore? + if(waspulling) + owner.start_pulling(O, wasgrabstate, TRUE) + // NOTE: in bs_lunge.dm, we use [target.grabbedby(owner)], which simulates doing a grab action. We don't want that though...we're cutting directly back to where we were in a grab. + // Do Action! + useLock = TRUE + if(do_mob(user, O, 50)) + attach_victim(O,user) + useLock = FALSE + +/obj/structure/bloodsucker/vassalrack/AltClick(mob/user) + if(!has_buckled_mobs() || !isliving(user) || useLock) + return + // Attempt Release (Owner vs Non Owner) + var/mob/living/carbon/C = pick(buckled_mobs) + if(C) + if(user == owner) + unbuckle_mob(C) + else + user_unbuckle_mob(C,user) + +/obj/structure/bloodsucker/vassalrack/proc/attach_victim(mob/living/M, mob/living/user) + // Standard Buckle Check + if(!buckle_mob(M)) // force=TRUE)) + return + // Attempt Buckle + user.visible_message("[user] straps [M] into the rack, immobilizing them.", \ + "You secure [M] tightly in place. They won't escape you now.") + + playsound(src.loc, 'sound/effects/pop_expl.ogg', 25, 1) + //M.forceMove(drop_location()) <--- CANT DO! This cancels the buckle_mob() we JUST did (even if we foced the move) + M.setDir(2) + density = TRUE + var/matrix/m180 = matrix(M.transform) + m180.Turn(180)//90)//180 + animate(M, transform = m180, time = 2) + M.pixel_y = -2 //M.get_standard_pixel_y_offset(120)//180) + update_icon() + // Torture Stuff + convert_progress = 2 // Goes down unless you start over. + disloyalty_confirm = FALSE // New guy gets the chance to say NO if he's special. + disloyalty_offered = FALSE // Prevents spamming torture window. + +/obj/structure/bloodsucker/vassalrack/user_unbuckle_mob(mob/living/M, mob/user) + // Attempt Unbuckle + if(!user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + 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.") + else + M.visible_message("[user] tries to pull [M] rack!",\ + "[user] attempts to release you from the rack!") // For sound if not seen --> "You hear a squishy wet noise.") + if(!do_mob(user, M, 100)) + return + // Did the time. Now try to do it. + ..() + unbuckle_mob(M) + +/obj/structure/bloodsucker/vassalrack/unbuckle_mob(mob/living/buckled_mob, force = FALSE) + if(!..()) + return + var/matrix/m180 = matrix(buckled_mob.transform) + m180.Turn(180)//-90)//180 + animate(buckled_mob, transform = m180, time = 2) + buckled_mob.pixel_y = buckled_mob.get_standard_pixel_y_offset(180) + src.visible_message(text("[buckled_mob][buckled_mob.stat==DEAD?"'s corpse":""] slides off of the rack.")) + density = FALSE + buckled_mob.AdjustKnockdown(30) + update_icon() + useLock = FALSE // Failsafe + +/obj/structure/bloodsucker/vassalrack/attackby(obj/item/W, mob/user, params) + if(has_buckled_mobs()) // Attack w/weapon vs guy standing there? Don't do an attack. + attack_hand(user) + return FALSE + return ..() + +/obj/structure/bloodsucker/vassalrack/attack_hand(mob/user) + //. = ..() // Taken from sacrificial altar in divine.dm + //if(.) + // return + // Go away. Torturing. + if(useLock) + return + var/datum/antagonist/bloodsucker/bloodsuckerdatum = 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) + 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].") + 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")) + if("Yes") + owner = user + density = FALSE + anchored = TRUE + return //No, you cant move this ever again + // No One Home + if(!has_buckled_mobs()) + return + // CHECK TWO: Am I a non-bloodsucker? + var/mob/living/carbon/C = pick(buckled_mobs) + if(!istype(bloodsuckerdatum)) + // 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) + unbuckle_mob(C) + useLock = FALSE // Failsafe + return + // Just torture the boy + torture_victim(user, C) + +/obj/structure/bloodsucker/vassalrack/proc/torture_victim(mob/living/user, mob/living/target) + // Check Bloodmob/living/M, force = FALSE, check_loc = TRUE + 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(count_vassals(user.mind)*5 > bloodsucker_level) + 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 + // Step Two: Break mindshielding/antag (on approve) + // Step Three: Blood Ritual + // Conversion Process + if(convert_progress > 0) + to_chat(user, "You prepare to initiate [target] into your service.") + if(!do_torture(user,target)) + to_chat(user, "The ritual has been interrupted!") + else + convert_progress -- // Ouch. Stop. Don't. + // All done! + if(convert_progress <= 0) + // FAIL: Can't be Vassal + if(!SSticker.mode.can_make_vassal(target, user, display_warning=FALSE) || HAS_TRAIT(target, TRAIT_MINDSHIELD)) // If I'm an unconvertable Antag ONLY + to_chat(user, "[target] doesn't respond to your persuasion. It doesn't appear they can be converted to follow you, they either have a mindshield or their external loyalties are too difficult for you to break.\[ALT+click to release\]") + convert_progress ++ // Pop it back up some. Avoids wasting Blood on a lost cause. + // SUCCESS: All done! + else + if(RequireDisloyalty(target)) + to_chat(user, "[target] has external loyalties! [target.p_they(TRUE)] will require more persuasion to break [target.p_them()] to your will!") + else + to_chat(user, "[target] looks ready for the Dark Communion.") + // Still Need More Persuasion... + else + to_chat(user, "[target] could use [convert_progress == 1?"a little":"some"] more persuasion.") + useLock = FALSE + return + // Check: Mindshield & Antag + if(!disloyalty_confirm && RequireDisloyalty(target)) + if(!do_disloyalty(user,target)) + to_chat(user, "The ritual has been interrupted!") + else if (!disloyalty_confirm) + to_chat(user, "[target] refuses to give into your persuasion. Perhaps a little more?") + else + to_chat(user, "[target] looks ready for the Dark Communion.") + 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].") + useLock = FALSE + return + var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + bloodsuckerdatum.AddBloodVolume(-convert_cost) + target.add_mob_blood(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)) + to_chat(user, "The ritual has been interrupted!") + useLock = FALSE + return + // Convert to Vassal! + if(bloodsuckerdatum && bloodsuckerdatum.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!") + // 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. + 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) + 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 + // Get Bodypart + var/target_string = "" + var/obj/item/bodypart/BP = null + if(iscarbon(target)) + var/mob/living/carbon/C = target + BP = pick(C.bodyparts) + if(BP) + target_string += BP.name + // Get Weapon + var/obj/item/I = user.get_active_held_item() + if(!istype(I)) + I = user.get_inactive_held_item() + // Create Strings + var/method_string = I?.attack_verb?.len ? pick(I.attack_verb) : pick("harmed","tortured","wrenched","twisted","scoured","beaten","lashed","scathed") + var/weapon_string = I ? I.name : pick("bare hands","hands","fingers","fists") + // Weapon Bonus + SFX + if(I) + torture_time -= I.force / 4 + torture_dmg_brute += I.force / 4 + //torture_dmg_burn += I. + if(I.sharpness == IS_SHARP) + torture_time -= 1 + else if(I.sharpness == IS_SHARP_ACCURATE) + torture_time -= 2 + if(istype(I, /obj/item/weldingtool)) + var/obj/item/weldingtool/welder = I + welder.welding = TRUE + torture_time -= 5 + torture_dmg_burn += 5 + I.play_tool_sound(target) + torture_time = max(50, torture_time * 10) // Minimum 5 seconds. + // Now run process. + if(!do_mob(user, target, torture_time * mult)) + return FALSE + // SUCCESS + if(I) + playsound(loc, I.hitsound, 30, 1, -1) + I.play_tool_sound(target) + target.visible_message("[user] has [method_string] [target]'s [target_string] with [user.p_their()] [weapon_string]!", \ + "[user] has [method_string] your [target_string] with [user.p_their()] [weapon_string]!") + if(!target.is_muzzled()) + target.emote("scream") + target.Jitter(5) + target.apply_damages(brute = torture_dmg_brute, burn = torture_dmg_burn, def_zone = (BP ? BP.body_zone : null)) // take_overall_damage(6,0) + return TRUE + +/obj/structure/bloodsucker/vassalrack/proc/do_disloyalty(mob/living/user, mob/living/target) + + // OFFER YES/NO NOW! + spawn(10) + if(useLock && target && target.client) // Are we still torturing? Did we cancel? Are they still here? + to_chat(user, "[target] has been given the opportunity for servitude. You await their decision...") + var/alert_text = "You are being tortured! Do you want to give in and pledge your undying loyalty to [user]?" + /* if(HAS_TRAIT(target, TRAIT_MINDSHIELD)) + alert_text += "\n\nYou will no longer be loyal to the station!" + if(SSticker.mode.AmValidAntag(target.mind)) */ + alert_text += "\n\nYou will not lose your current objectives, but they come second to the will of your new master!" + switch(alert(target, alert_text,"THE HORRIBLE PAIN! WHEN WILL IT END?!","Yes, Master!", "NEVER!")) + if("Yes, Master!") + disloyalty_accept(target) + else + disloyalty_refuse(target) + if(!do_torture(user,target, 2)) + return FALSE + + // NOTE: We only remove loyalties when we're CONVERTED! + return TRUE + +/obj/structure/bloodsucker/vassalrack/proc/RequireDisloyalty(mob/living/target) + return SSticker.mode.AmValidAntag(target.mind) //|| HAS_TRAIT(target, TRAIT_MINDSHIELD) + +/obj/structure/bloodsucker/vassalrack/proc/disloyalty_accept(mob/living/target) + // FAILSAFE: Still on the rack? + if(!(locate(target) in buckled_mobs)) + return + // NOTE: You can say YES after torture. It'll apply to next time. + disloyalty_confirm = TRUE + /*if(HAS_TRAIT(target, TRAIT_MINDSHIELD)) + to_chat(target, "You give in to the will of your torturer. If they are successful, you will no longer be loyal to the station!") +*/ +/obj/structure/bloodsucker/vassalrack/proc/disloyalty_refuse(mob/living/target) + // FAILSAFE: Still on the rack? + if(!(locate(target) in buckled_mobs)) + return + // Failsafe: You already said YES. + if(disloyalty_confirm) + return + to_chat(target, "You refuse to give in! You will not break!") + + +/obj/structure/bloodsucker/vassalrack/proc/remove_loyalties(mob/living/target) + // Find Mind Implant & Destroy + if(HAS_TRAIT(target, TRAIT_MINDSHIELD)) + for(var/obj/item/implant/I in target.implants) + if(I.type == /obj/item/implant/mindshield) + I.removed(target,silent=TRUE) + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/obj/structure/bloodsucker/candelabrum + name = "candelabrum" + desc = "It burns slowly, but doesn't radiate any heat." + icon = 'icons/obj/vamp_obj.dmi' + icon_state = "candelabrum" + light_color = "#66FFFF"//LIGHT_COLOR_BLUEGREEN // lighting.dm + light_power = 3 + light_range = 0 // to 2 + density = FALSE + anchored = FALSE + var/lit = FALSE +///obj/structure/bloodsucker/candelabrum/is_hot() // candle.dm + //return FALSE + +/obj/structure/bloodsucker/candelabrum/Destroy() + STOP_PROCESSING(SSobj, src) + +/obj/structure/bloodsucker/candelabrum/update_icon() + icon_state = "candelabrum[lit ? "_lit" : ""]" + +/obj/structure/bloodsucker/candelabrum/examine(mob/user) + . = ..() + if((user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) || 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) + . += {"This is a magical candle which drains at the sanity of the fools who havent yet accepted your master, as long as it is active.\n + You can turn it on and off by clicking on it while you are next to it"} */ + +/obj/structure/bloodsucker/candelabrum/attack_hand(mob/user) + var/datum/antagonist/bloodsucker/V = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) //I wish there was a better way to do this + var/datum/antagonist/vassal/T = user.mind.has_antag_datum(ANTAG_DATUM_VASSAL) + if(istype(V) || istype(T)) + toggle() + +/obj/structure/bloodsucker/candelabrum/AltClick(mob/user) + var/datum/antagonist/bloodsucker/V = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + // Bloodsuckers can turn their candles on from a distance. SPOOOOKY. + if(istype(V)) + toggle() + +/obj/structure/bloodsucker/candelabrum/proc/toggle(mob/user) + lit = !lit + if(lit) + set_light(2, 3, "#66FFFF") + START_PROCESSING(SSobj, src) + else + set_light(0) + STOP_PROCESSING(SSobj, src) + update_icon() + +/obj/structure/bloodsucker/candelabrum/process() + 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) + var/datum/antagonist/bloodsucker/V = H.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if(V || 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) +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// OTHER THINGS TO USE: HUMAN BLOOD. /obj/effect/decal/cleanable/blood + +/obj/item/restraints/legcuffs/beartrap/bloodsucker diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm new file mode 100644 index 00000000..dbda3785 --- /dev/null +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_lair.dm @@ -0,0 +1,85 @@ + + +// Created by claiming a Coffin. + + + +// THINGS TO SPAWN: +// +// /obj/effect/decal/cleanable/cobweb && /obj/effect/decal/cleanable/cobweb/cobweb2 +// /obj/effect/decal/cleanable/generic +// /obj/effect/decal/cleanable/dirt/dust <-- Pretty cool, just stains the tile itself. +// /obj/effect/decal/cleanable/blood/old + +/* +/area/ + // All coffins assigned to this area + var/list/obj/structure/closet/crate/laircoffins = new list() +// Called by Coffin when an area is claimed as a vamp's lair +/area/proc/ClaimAsLair(/obj/structure/closet/crate/inClaimant) + set waitfor = FALSE // Don't make on_gain() wait for this function to finish. This lets this code run on the side. + laircoffins += laircoffins + sleep() + // Cancel! + if (laircoffins.len == 0) + return + */ + +/datum/antagonist/bloodsucker/proc/RunLair() + set waitfor = FALSE // Don't make on_gain() wait for this function to finish. This lets this code run on the side. + while(!AmFinalDeath() && coffin && lair) + // WAit 2 min and Repeat + sleep(120) + // Coffin Moved SOMEHOW? + if(lair != get_area(coffin)) + if(coffin) + coffin.UnclaimCoffin() + //lair = get_area(coffin) + break // DONE + var/list/turf/area_turfs = get_area_turfs(lair) + // Create Dirt etc. + var/turf/T_Dirty = pick(area_turfs) + if(T_Dirty && !T_Dirty.density) + // Default: Dirt + // CHECK: Cobweb already there? + //if (!locate(var/obj/effect/decal/cleanable/cobweb) in T_Dirty) // REMOVED! Cleanables don't stack. + // STEP ONE: COBWEBS + // CHECK: Wall to North? + var/turf/check_N = get_step(T_Dirty, NORTH) + if(istype(check_N, /turf/closed/wall)) + // CHECK: Wall to West? + var/turf/check_W = get_step(T_Dirty, WEST) + if(istype(check_W, /turf/closed/wall)) + new /obj/effect/decal/cleanable/cobweb (T_Dirty) + // CHECK: Wall to East? + var/turf/check_E = get_step(T_Dirty, EAST) + if(istype(check_E, /turf/closed/wall)) + new /obj/effect/decal/cleanable/cobweb/cobweb2 (T_Dirty) + // STEP TWO: DIRT + new /obj/effect/decal/cleanable/dirt (T_Dirty) + // Find Animals in Area + /* if(rand(0,2) == 0) + var/mobCount = 0 + var/mobMax = CLAMP(area_turfs.len / 25, 1, 4) + for (var/turf/T in area_turfs) + if(!T) continue + var/mob/living/simple_animal/SA = locate() in T + if(SA) + mobCount ++ + if (mobCount >= mobMax) // Already at max + break + Spawn One + if(mobCount < mobMax) + Seek Out Location + while(area_turfs.len > 0) + var/turf/T = pick(area_turfs) // We use while&pick instead of a for/loop so it's random, rather than from the top of the list. + if(T && !T.density) + var/mob/living/simple_animal/SA = /mob/living/simple_animal/mouse // pick(/mob/living/simple_animal/mouse,/mob/living/simple_animal/mouse,/mob/living/simple_animal/mouse, /mob/living/simple_animal/hostile/retaliate/bat) //prob(300) /mob/living/simple_animal/mouse, + new SA (T) + break + area_turfs -= T*/ + // NOTE: area_turfs is now cleared out! + if(coffin) + coffin.UnclaimCoffin() + // Done (somehow) + lair = null diff --git a/code/modules/antagonists/bloodsucker/powers/bs_brawn.dm b/code/modules/antagonists/bloodsucker/powers/bs_brawn.dm new file mode 100644 index 00000000..49aada36 --- /dev/null +++ b/code/modules/antagonists/bloodsucker/powers/bs_brawn.dm @@ -0,0 +1,174 @@ + + +/datum/action/bloodsucker/targeted/brawn + name = "Brawn"//"Cellular Emporium" + desc = "Snap restraints with ease, or deal terrible damage with your bare hands." + button_icon_state = "power_strength" + bloodcost = 10 + cooldown = 130 + target_range = 1 + power_activates_immediately = TRUE + message_Trigger = ""//"Whom will you subvert to your will?" + must_be_capacitated = TRUE + can_be_immobilized = TRUE + bloodsucker_can_buy = TRUE + // Level Up + var/upgrade_canLocker = FALSE + var/upgrade_canDoor = FALSE + +/datum/action/bloodsucker/targeted/brawn/CheckCanUse(display_error) + . = ..() + if(!.) + return + . = TRUE + // Break Out of Restraints! (And then cancel) + if(CheckBreakRestraints()) + //PowerActivatedSuccessfully() // PAY COST! BEGIN COOLDOWN!DEACTIVATE! + . = FALSE //return FALSE + // Throw Off Attacker! (And then cancel) + if(CheckEscapePuller()) + //PowerActivatedSuccessfully() // PAY COST! BEGIN COOLDOWN!DEACTIVATE! + . = FALSE //return FALSE + /*if(CheckBreakLocker()) + .= FALSE */ + // Did we successfuly use power to BREAK CUFFS and/or ESCAPE PULLER and/or escape from a locker? + // Then PAY COST! + if(. == FALSE) + PowerActivatedSuccessfully() // PAY COST! BEGIN COOLDOWN!DEACTIVATE! + + // NOTE: We use . = FALSE so that we can break cuffs AND throw off our attacker in one use! + //return TRUE +/datum/action/bloodsucker/targeted/brawn/CheckValidTarget(atom/A) + return isliving(A) || istype(A, /obj/machinery/door) + +/datum/action/bloodsucker/targeted/brawn/CheckCanTarget(atom/A, display_error) + // DEFAULT CHECKS (Distance) + if(!..()) // Disable range notice for Brawn. + return FALSE + // Must outside Closet to target anyone! + if(!isturf(owner.loc)) + return FALSE + // Check: Self + if(A == owner) + return FALSE + // Target Type: Living + if(isliving(A)) + return TRUE + // Target Type: Door + else if(istype(A, /obj/machinery/door)) + return TRUE + return ..() // yes, FALSE! You failed if you got here! BAD TARGET + +/datum/action/bloodsucker/targeted/brawn/FireTargetedPower(atom/A) + // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. + var/mob/living/carbon/target = A + var/mob/living/user = owner + // Target Type: Mob + if(isliving(target)) + var/mob/living/carbon/user_C = user + var/hitStrength = user_C.dna.species.punchdamagehigh * 1.3 + 5 + // Knockdown! + 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(6 + powerlevel) >= 6 && target.stat <= UNCONSCIOUS) + target.Unconscious(40) + // Attack! + playsound(get_turf(target), 'sound/weapons/punch4.ogg', 60, 1, -1) + user.do_attack_animation(target, ATTACK_EFFECT_SMASH) + var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(target.zone_selected)) + target.apply_damage(hitStrength, BRUTE, affecting) + // Knockback + var/send_dir = get_dir(owner, target) + var/turf/T = get_ranged_target_turf(target, send_dir, powerlevel) + owner.newtonian_move(send_dir) // Bounce back in 0 G + target.throw_at(T, powerlevel, TRUE, owner) //new /datum/forced_movement(target, get_ranged_target_turf(target, send_dir, (hitStrength / 4)), 1, FALSE) + // Target Type: Door + else if(istype(target, /obj/machinery/door)) + var/obj/machinery/door/D = target + playsound(get_turf(usr), 'sound/machines/airlock_alien_prying.ogg', 40, 1, -1) + to_chat(user, "You prepare to tear open [D].") + if(do_mob(usr,target,25)) + if (D.Adjacent(user)) + to_chat(user, "You tear open the [D].") + user.Stun(10) + user.do_attack_animation(D, ATTACK_EFFECT_SMASH) + playsound(get_turf(D), 'sound/effects/bang.ogg', 30, 1, -1) + D.open(2) // open(2) is like a crowbar or jaws of life. + // Target Type: Closet + +/datum/action/bloodsucker/targeted/brawn/proc/CheckBreakRestraints() + if(!iscarbon(owner)) // || !owner.restrained() + return FALSE + // (NOTE: Just like biodegrade.dm, we only remove one thing per use // + // Destroy Cuffs + var/mob/living/carbon/user_C = owner + //message_admins("DEBUG3: attempt_cast() [name] / [user_C.handcuffed] ") + if(user_C.handcuffed) + var/obj/O = user_C.get_item_by_slot(SLOT_HANDCUFFED) + if(istype(O)) + //user_C.visible_message("[user_C] attempts to remove [O]!", \ + // "You snap [O] like it's nothing!") + user_C.clear_cuffs(O,TRUE) + playsound(get_turf(usr), 'sound/effects/grillehit.ogg', 80, 1, -1) + return TRUE +/* Doesnt work + // Destroy Straightjacket + if(ishuman(owner)) + var/mob/living/carbon/human/user_H = owner + if(user_H.wear_suit && user_H.wear_suit.breakouttime) + var/obj/item/clothing/suit/straight_jacket/S = user_H.get_item_by_slot(ITEM_SLOT_ICLOTHING) + if(istype(S)) + user_C.visible_message("[user_C] attempts to remove [S]!", \ + "You rip through [S] like it's nothing!") + user_C.clear_cuffs(S,TRUE) + playsound(get_turf(usr), 'sound/effects/grillehit.ogg', 80, 1, -1) + return TRUE */ + // Destroy Leg Cuffs + if(user_C.legcuffed) + var/obj/O = user_C.get_item_by_slot(SLOT_LEGCUFFED) + if(istype(O)) + //user_C.visible_message("[user_C] attempts to remove [O]!", \ + // "You snap [O] like it's nothing!") + user_C.clear_cuffs(O,TRUE) + playsound(get_turf(usr), 'sound/effects/grillehit.ogg', 80, 1, -1) + return TRUE + return FALSE + +/datum/action/bloodsucker/targeted/brawn/proc/CheckEscapePuller() + if(!owner.pulledby)// || owner.pulledby.grab_state <= GRAB_PASSIVE) + return FALSE + var/mob/M = owner.pulledby + var/pull_power = M.grab_state + playsound(get_turf(M), 'sound/effects/woodhit.ogg', 75, 1, -1) + // Knock Down (if Living) + if (isliving(M)) + var/mob/living/L = M + L.Knockdown(pull_power * 10 + 20) + // Knock Back (before Knockdown, which probably cancels pull) + var/send_dir = get_dir(owner, M) + var/turf/T = get_ranged_target_turf(M, send_dir, pull_power) + owner.newtonian_move(send_dir) // Bounce back in 0 G + M.throw_at(T, pull_power, TRUE, owner, FALSE) // Throw distance based on grab state! Harder grabs punished more aggressively. + // /proc/log_combat(atom/user, atom/target, what_done, atom/object=null, addition=null) + log_combat(owner, M, "used Brawn power") + owner.visible_message("[owner] tears free of [M]'s grasp!", \ + "You shrug off [M]'s grasp!") + owner.pulledby = null // It's already done, but JUST IN CASE. + return TRUE +/* Doesnt work +/datum/action/bloodsucker/targeted/brawn/proc/CheckBreakLocker() + if(!istype(owner.loc, /obj/structure/closet)) + return FALSE + playsound(get_turf(owner), 'sound/machines/airlock_alien_prying.ogg', 40, 1, -1) + if(do_mob(owner ,target, 25)) + var/obj/structure/closet/C = owner.loc + to_chat(owner, "You prepare to tear open the [C].") + owner.do_attack_animation(C, ATTACK_EFFECT_SMASH) + playsound(get_turf(C), 'sound/effects/bang.ogg', 30, 1, -1) + C.bust_open() + return TRUE +*/ diff --git a/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm b/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm new file mode 100644 index 00000000..a8e34cb2 --- /dev/null +++ b/code/modules/antagonists/bloodsucker/powers/bs_cloak.dm @@ -0,0 +1,56 @@ + +/datum/action/bloodsucker/cloak + name = "Cloak of Darkness" + desc = "Blend into the shadows and become invisible to the untrained eye." + button_icon_state = "power_cloak" + bloodcost = 5 + cooldown = 50 + bloodsucker_can_buy = TRUE + amToggle = TRUE + warn_constant_cost = TRUE + + var/light_min = 0.5 // If lum is above this, no good. + +/datum/action/bloodsucker/cloak/CheckCanUse(display_error) + . = ..() + if(!.) + return + // Must be Dark + var/turf/T = owner.loc + if(istype(T) && T.get_lumcount() > light_min) + to_chat(owner, "This area is not dark enough to blend in") + return FALSE + return TRUE + +/datum/action/bloodsucker/cloak/ActivatePower() + var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/mob/living/user = owner + var/was_running = (user.m_intent == MOVE_INTENT_RUN) + if(was_running) + user.toggle_move_intent() + ADD_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness") + while(bloodsuckerdatum && ContinueActive(user) || user.m_intent == MOVE_INTENT_RUN) + // Pay Blood Toll (if awake) + owner.alpha = max(0, owner.alpha - min(75, 20 + 15 * level_current)) + bloodsuckerdatum.AddBloodVolume(-0.2) + sleep(5) // Check every few ticks that we haven't disabled this power + // Return to Running (if you were before) + if(was_running && user.m_intent != MOVE_INTENT_RUN) + user.toggle_move_intent() + +/datum/action/bloodsucker/cloak/ContinueActive(mob/living/user, mob/living/target) + if (!..()) + return FALSE + if(user.stat == !CONSCIOUS) // Must be CONSCIOUS + to_chat(owner, "Your cloak failed due to you falling unconcious! ") + return FALSE + var/turf/T = owner.loc // Must be DARK + if(istype(T) && T.get_lumcount() > light_min) + to_chat(owner, "Your cloak failed due to there being too much light!") + return FALSE + return TRUE + +/datum/action/bloodsucker/cloak/DeactivatePower(mob/living/user = owner, mob/living/target) + ..() + REMOVE_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness") + user.alpha = 255 diff --git a/code/modules/antagonists/bloodsucker/powers/bs_feed.dm b/code/modules/antagonists/bloodsucker/powers/bs_feed.dm new file mode 100644 index 00000000..7c4cf46e --- /dev/null +++ b/code/modules/antagonists/bloodsucker/powers/bs_feed.dm @@ -0,0 +1,324 @@ + + +/datum/action/bloodsucker/feed + name = "Feed" + desc = "Draw the heartsblood of living victims in your grasp.
None/Passive: Feed silently and unnoticed by your victim.
Aggressive: Subdue your target quickly." + button_icon_state = "power_feed" + + bloodcost = 0 + cooldown = 30 + amToggle = TRUE + bloodsucker_can_buy = TRUE + can_be_staked = TRUE + cooldown_static = TRUE + + var/notice_range = 2 // Distance before silent feeding is noticed. + var/mob/living/feed_target // So we can validate more than just the guy we're grappling. + var/target_grappled = FALSE // If you started grappled, then ending it will end your Feed. + +/datum/action/bloodsucker/feed/CheckCanUse(display_error) + . = ..() + if(!.) + return + // Wearing mask + var/mob/living/L = owner + if (L.is_mouth_covered()) + if (display_error) + to_chat(owner, "You cannot feed with your mouth covered! Remove your mask.") + return FALSE + // Find my Target! + if (!FindMyTarget(display_error)) // Sets feed_target within after Validating + return FALSE + // Not in correct state + // DONE! + return TRUE + +/datum/action/bloodsucker/feed/proc/ValidateTarget(mob/living/target, display_error) // Called twice: validating a subtle victim, or validating your grapple victim. + // Bloodsuckers + Animals MUST be grabbed aggressively! + if (!owner.pulling || target == owner.pulling && owner.grab_state < GRAB_AGGRESSIVE) + // NOTE: It's OKAY that we are checking if(!target) below, AFTER animals here. We want passive check vs animal to warn you first, THEN the standard warning. + // Animals: + if (isliving(target) && !iscarbon(target)) + if (display_error) + to_chat(owner, "Lesser beings require a tighter grip.") + return FALSE + // Bloodsuckers: + else if (iscarbon(target) && target.mind && target.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + if (display_error) + to_chat(owner, "Other Bloodsuckers will not fall for your subtle approach.") + return FALSE + // Must have Target + if (!target) // || !ismob(target) + if (display_error) + to_chat(owner, "You must be next to or grabbing a victim to feed from them.") + return FALSE + // Not even living! + if (!isliving(target) || issilicon(target)) + if (display_error) + to_chat(owner, "You may only feed from living beings.") + return FALSE + if (target.blood_volume <= 0) + if (display_error) + to_chat(owner, "Your victim has no blood to take.") + return FALSE + if (ishuman(target)) + var/mob/living/carbon/human/H = target + if(NOBLOOD in H.dna.species.species_traits)// || owner.get_blood_id() != target.get_blood_id()) + if (display_error) + to_chat(owner, "Your victim's blood is not suitable for you to take.") + return FALSE + return TRUE + +// If I'm not grabbing someone, find me someone nearby. +/datum/action/bloodsucker/feed/proc/FindMyTarget(display_error) + // Default + feed_target = null + target_grappled = FALSE + // If you are pulling a mob, that's your target. If you don't like it, then release them. + if (owner.pulling && ismob(owner.pulling)) + // Check grapple target Valid + if (!ValidateTarget(owner.pulling, display_error)) // Grabbed targets display error. + return FALSE + target_grappled = TRUE + feed_target = owner.pulling + return TRUE + // Find Targets + var/list/mob/living/seen_targets = view(1, owner) + var/list/mob/living/seen_mobs = list() + for(var/mob/living/M in seen_targets) + if (isliving(M) && M != owner) + seen_mobs += M + // None Seen! + if (seen_mobs.len == 0) + if (display_error) + to_chat(owner, "You must be next to or grabbing a victim to feed from them.") + return FALSE + // Check Valids... + var/list/targets_valid = list() + var/list/targets_dead = list() + for(var/mob/living/M in seen_mobs) + // Check adjecent Valid target + if (M != owner && ValidateTarget(M, display_error = FALSE)) // Do NOT display errors. We'll be doing this again in CheckCanUse(), which will rule out grabbed targets. + // Prioritize living, but remember dead as backup + if (M.stat < DEAD) + targets_valid += M + else + targets_dead += M + // No Living? Try dead. + if (targets_valid.len == 0 && targets_dead.len > 0) + targets_valid = targets_dead + // No Targets + if (targets_valid.len == 0) + // Did I see targets? Then display at least one error + if (seen_mobs.len > 1) + if (display_error) + to_chat(owner, "None of these are valid targets to feed from subtly.") + else + ValidateTarget(seen_mobs[1], display_error) + return FALSE + // Too Many Targets + //else if (targets.len > 1) + // if (display_error) + // to_chat(owner, "You are adjecent to too many witnesses. Either grab your victim or move away.") + // return FALSE + // One Target! + else + feed_target = pick(targets_valid)//targets[1] + return TRUE + +/datum/action/bloodsucker/feed/ActivatePower() + // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up Activate(), so Deactivate() can happen after. + var/mob/living/target = feed_target // Stored during CheckCanUse(). Can be a grabbed OR adjecent character. + var/mob/living/user = owner + var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + // Am I SECRET or LOUD? It stays this way the whole time! I must END IT to try it the other way. + var/amSilent = (!target_grappled || owner.grab_state <= GRAB_PASSIVE) // && iscarbon(target) // Non-carbons (animals) not passive. They go straight into aggressive. + // Initial Wait + var/feed_time = (amSilent ? 45 : 25) - (2.5 * level_current) + feed_time = max(15, feed_time) + if (amSilent) + 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) + to_chat(user, "Your feeding was interrupted.") + //DeactivatePower(user,target) + return + // Put target to Sleep (Bloodsuckers are immune to their own bite's sleep effect) + if (!amSilent) + ApplyVictimEffects(target) // Sleep, paralysis, immobile, unconscious, and mute + if(target.stat <= UNCONSCIOUS) + sleep(1) + // Wait, then Cancel if Invalid + if (!ContinueActive(user,target)) // Cancel. They're gone. + //DeactivatePower(user,target) + return + // Pull Target Close + if (!target.density) // Pull target to you if they don't take up space. + target.Move(user.loc) + // Broadcast Message + if (amSilent) + //if (!iscarbon(target)) + // user.visible_message("[user] shifts [target] closer to [user.p_their()] mouth.", \ + // "You secretly slip your fangs into [target]'s flesh.", \ + // vision_distance = 2, ignored_mobs=target) // Only people who AREN'T the target will notice this action. + //else + 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. + // Warn Feeder about Witnesses... + var/was_unnoticed = TRUE + for(var/mob/living/M in viewers(notice_range, owner)) + if(M != owner && M != target && iscarbon(M) && M.mind && !M.has_unlimited_silicon_privilege && !M.eye_blind && !M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + was_unnoticed = FALSE + break + if (was_unnoticed) + to_chat(user, "You think no one saw you...") + else + to_chat(user, "Someone may have noticed...") + + else // /atom/proc/visible_message(message, self_message, blind_message, vision_distance, ignored_mobs) + user.visible_message("[user] closes [user.p_their()] mouth around [target]'s neck!", \ + "You sink your fangs into [target]'s neck.") + // My mouth is full! + ADD_TRAIT(user, TRAIT_MUTE, "bloodsucker_feed") + + // Begin Feed Loop + var/warning_target_inhuman = FALSE + var/warning_target_dead = FALSE + var/warning_full = FALSE + var/warning_target_bloodvol = 99999 + var/amount_taken = 0 + var/blood_take_mult = amSilent ? 0.3 : 1 // Quantity to take per tick, based on Silent or not. + var/was_alive = target.stat < DEAD && ishuman(target) + // Activate Effects + //target.add_trait(TRAIT_MUTE, "bloodsucker_victim") // <----- Make mute a power you buy? + + // FEEEEEEEEED!!! // + bloodsuckerdatum.poweron_feed = TRUE + while (bloodsuckerdatum && target && active) + //user.mobility_flags &= ~MOBILITY_MOVE // user.canmove = 0 // Prevents spilling blood accidentally. + + // Abort? A bloody mistake. + if (!do_mob(user, target, 20, 0, 0, extra_checks=CALLBACK(src, .proc/ContinueActive, user, target))) + // May have disabled Feed during do_mob + if (!active || !ContinueActive(user, target)) + break + + if (amSilent) + to_chat(user, "Your feeding has been interrupted...but [target.p_they()] didn't seem to notice you.") + else + to_chat(user, "Your feeding has been interrupted!") + user.visible_message("[user] is ripped from [target]'s throat. [target.p_their(TRUE)] blood sprays everywhere!", \ + "Your teeth are ripped from [target]'s throat. [target.p_their(TRUE)] blood sprays everywhere!") + + // Deal Damage to Target (should have been more careful!) + if (iscarbon(target)) + var/mob/living/carbon/C = target + C.bleed(15) + playsound(get_turf(target), 'sound/effects/splat.ogg', 40, 1) + if (ishuman(target)) + var/mob/living/carbon/human/H = target + H.bleed_rate += 5 + target.add_splatter_floor(get_turf(target)) + user.add_mob_blood(target) // Put target's blood on us. The donor goes in the ( ) + target.add_mob_blood(target) + target.take_overall_damage(10,0) + target.emote("scream") + + // Killed Target? + if (was_alive) + CheckKilledTarget(user,target) + + return + + /////////////////////////////////////////////////////////// + // Handle Feeding! User & Victim Effects (per tick) + bloodsuckerdatum.HandleFeeding(target, blood_take_mult) + amount_taken += amSilent ? 0.3 : 1 + if (!amSilent) + ApplyVictimEffects(target) // Sleep, paralysis, immobile, unconscious, and mute + if (amount_taken > 5 && target.stat < DEAD && ishuman(target)) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "drankblood", /datum/mood_event/drankblood) // GOOD // in bloodsucker_life.dm + + /////////////////////////////////////////////////////////// + // Not Human? + if (!ishuman(target)) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "drankblood", /datum/mood_event/drankblood_bad) // BAD // in bloodsucker_life.dm + if (!warning_target_inhuman) + to_chat(user, "You recoil at the taste of a lesser lifeform.") + warning_target_inhuman = TRUE + // Dead Blood? + if (target.stat >= DEAD) + if (ishuman(target)) + SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "drankblood", /datum/mood_event/drankblood_dead) // BAD // in bloodsucker_life.dm + if (!warning_target_dead) + 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) + 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 (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) + to_chat(user, "Your victim's blood volume is dangerously low.") + else if (target.blood_volume <= BLOOD_VOLUME_SAFE && warning_target_bloodvol > BLOOD_VOLUME_SAFE) + to_chat(user, "Your victim's blood is at an unsafe level.") + warning_target_bloodvol = target.blood_volume // If we had a warning to give, it's been given by now. + // Done? + if (target.blood_volume <= 0) + to_chat(user, "You have bled your victim dry.") + 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. + + // DONE! + //DeactivatePower(user,target) + if (amSilent) + to_chat(user, "You slowly release [target]'s wrist." + (target.stat == 0 ? " [target.p_their(TRUE)] face lacks expression, like you've already been forgotten." : "")) + else + user.visible_message("[user] unclenches their teeth from [target]'s neck.", \ + "You retract your fangs and release [target] from your bite.") + + // /proc/log_combat(atom/user, atom/target, what_done, atom/object=null, addition=null) + log_combat(owner, target, "fed on blood", addition="(and took [amount_taken] blood)") + + // Killed Target? + if (was_alive) + CheckKilledTarget(user,target) + + +/datum/action/bloodsucker/feed/proc/CheckKilledTarget(mob/living/user, mob/living/target) + // Bad Vampire. 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 + +/datum/action/bloodsucker/feed/ContinueActive(mob/living/user, mob/living/target) + return ..() && target && (!target_grappled || user.pulling == target)// 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) + // Bloodsuckers not affected by "the Kiss" of another vampire + if (!target.mind || !target.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + target.Unconscious(50,0) + target.Knockdown(40 + 5 * level_current,1) + // NOTE: THis is based on level of power! + if (ishuman(target)) + target.adjustStaminaLoss(5, forced = TRUE)// Base Stamina Damage + +/datum/action/bloodsucker/feed/DeactivatePower(mob/living/user = owner, mob/living/target) + ..() // activate = FALSE + var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + // No longer Feeding + if (bloodsuckerdatum) + bloodsuckerdatum.poweron_feed = FALSE + feed_target = null + // My mouth is no longer full + REMOVE_TRAIT(owner, TRAIT_MUTE, "bloodsucker_feed") + // Let me move immediately + user.update_canmove() diff --git a/code/modules/antagonists/bloodsucker/powers/bs_fortitude.dm b/code/modules/antagonists/bloodsucker/powers/bs_fortitude.dm new file mode 100644 index 00000000..3305504c --- /dev/null +++ b/code/modules/antagonists/bloodsucker/powers/bs_fortitude.dm @@ -0,0 +1,54 @@ + + + + +/datum/action/bloodsucker/fortitude + name = "Fortitude"//"Cellular Emporium" + desc = "Withstand egregious physical wounds and walk away from attacks that would stun, pierce, and dismember lesser beings. You cannot run while active." + button_icon_state = "power_fortitude" + bloodcost = 5 + cooldown = 80 + bloodsucker_can_buy = TRUE + amToggle = TRUE + warn_constant_cost = TRUE + + var/this_resist // So we can raise and lower your brute resist based on what your level_current WAS. + +/datum/action/bloodsucker/fortitude/ActivatePower() + var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + var/mob/living/user = owner + to_chat(user, "Your flesh, skin, and muscles become as steel.") + // Traits & Effects + ADD_TRAIT(user, TRAIT_PIERCEIMMUNE, "fortitude") + ADD_TRAIT(user, TRAIT_NODISMEMBER, "fortitude") + ADD_TRAIT(user, TRAIT_STUNIMMUNE, "fortitude") + ADD_TRAIT(user, TRAIT_NORUNNING, "fortitude") + if (ishuman(owner)) + var/mob/living/carbon/human/H = owner + this_resist = max(0.3, 0.7 - level_current * 0.1) + H.physiology.brute_mod *= this_resist//0.5 + H.physiology.burn_mod *= this_resist//0.5 + // Stop Running (Taken from /datum/quirk/nyctophobia in negative.dm) + var/was_running = (user.m_intent == MOVE_INTENT_RUN) + if(was_running) + user.toggle_move_intent() + while(bloodsuckerdatum && ContinueActive(user) || user.m_intent == MOVE_INTENT_RUN) + // 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. + sleep(20) // Check every few ticks that we haven't disabled this power + // Return to Running (if you were before) + if(was_running && user.m_intent != MOVE_INTENT_RUN) + user.toggle_move_intent() + +/datum/action/bloodsucker/fortitude/DeactivatePower(mob/living/user = owner, mob/living/target) + ..() + // Restore Traits & Effects + REMOVE_TRAIT(user, TRAIT_PIERCEIMMUNE, "fortitude") + REMOVE_TRAIT(user, TRAIT_NODISMEMBER, "fortitude") + REMOVE_TRAIT(user, TRAIT_STUNIMMUNE, "fortitude") + REMOVE_TRAIT(user, TRAIT_NORUNNING, "fortitude") + if (ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.physiology.brute_mod /= this_resist//0.5 + H.physiology.burn_mod /= this_resist//0.5 diff --git a/code/modules/antagonists/bloodsucker/powers/bs_gohome.dm b/code/modules/antagonists/bloodsucker/powers/bs_gohome.dm new file mode 100644 index 00000000..0da9ab5b --- /dev/null +++ b/code/modules/antagonists/bloodsucker/powers/bs_gohome.dm @@ -0,0 +1,115 @@ + + +/datum/action/bloodsucker/gohome + name = "Vanishing Act" + desc = "As dawn aproaches, disperse into mist and return directly to your Lair.
WARNING: You will drop ALL of your possessions if observed by mortals." + button_icon_state = "power_gohome" + background_icon_state_on = "vamp_power_off_oneshot" // Even though this never goes off. + background_icon_state_off = "vamp_power_off_oneshot" + + bloodcost = 25 + cooldown = 99999 // It'll never come back. + amToggle = FALSE + amSingleUse = TRUE + + bloodsucker_can_buy = FALSE // You only get this if you've claimed a lair, and only just before sunrise. + can_use_in_torpor = TRUE + must_be_capacitated = TRUE + can_be_immobilized = TRUE + +/datum/action/bloodsucker/gohome/CheckCanUse(display_error) + . = ..() + if(!.) + return + // Have No Lair (NOTE: You only got this power if you had a lair, so this means it's destroyed) + var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + if (!istype(bloodsuckerdatum) || !bloodsuckerdatum.coffin) + if (display_error) + to_chat(owner, "Your coffin has been destroyed!") + return FALSE + return TRUE + +/datum/action/bloodsucker/gohome/ActivatePower() + var/mob/living/carbon/user = owner + var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + // IMPORTANT: Check for lair at every step! It might get destroyed. + to_chat(user, "You focus on separating your consciousness from your physical form...") + // STEP ONE: Flicker Lights + for(var/obj/machinery/light/L in view(3, get_turf(owner))) // /obj/machinery/light/proc/flicker(var/amount = rand(10, 20)) + L.flicker(5) + playsound(get_turf(owner), 'sound/effects/singlebeat.ogg', 20, 1) + sleep(50) + for(var/obj/machinery/light/L in view(3, get_turf(owner))) // /obj/machinery/light/proc/flicker(var/amount = rand(10, 20)) + L.flicker(5) + playsound(get_turf(owner), 'sound/effects/singlebeat.ogg', 40, 1) + sleep(50) + for(var/obj/machinery/light/L in view(6, get_turf(owner))) // /obj/machinery/light/proc/flicker(var/amount = rand(10, 20)) + L.flicker(5) + playsound(get_turf(owner), 'sound/effects/singlebeat.ogg', 60, 1) + // ( STEP TWO: Lights OFF? ) + // CHECK: Still have Coffin? + if (!istype(bloodsuckerdatum) || !bloodsuckerdatum.coffin) + to_chat(user, "Your coffin has been destroyed! You no longer have a destination.") + return FALSE + if (!owner) + return + // SEEN?: (effects ONLY if there are witnesses! Otherwise you just POOF) + // NOTE: Stolen directly from statue.dm, thanks guys! + var/am_seen = FALSE // Do Effects (seen by anyone) + var/drop_item = FALSE // Drop Stuff (seen by non-vamp) + if (isturf(owner.loc)) // Only check if I'm not in a Locker or something. + // A) Check for Darkness (we can just leave) + var/turf/T = get_turf(user) + if(T && T.lighting_object && T.get_lumcount()>= 0.1) + // B) Check for Viewers + for(var/mob/living/M in viewers(owner)) + if(M != owner && isliving(M) && M.mind && !M.has_unlimited_silicon_privilege && !M.eye_blind) // M.client <--- add this in after testing! + am_seen = TRUE + if (!M.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + drop_item = TRUE + break + // LOSE CUFFS + if(user.handcuffed) + var/obj/O = user.handcuffed + user.dropItemToGround(O) + if(user.legcuffed) + var/obj/O = user.legcuffed + user.dropItemToGround(O) + // SEEN! + if (drop_item) + // DROP: Clothes, held items, and cuffs etc + // NOTE: Taken from unequip_everything() in inventory.dm. We need to + // *force* all items to drop, so we had to just gut the code out of it. + var/list/items = list() + items |= user.get_equipped_items() + for(var/I in items) + user.dropItemToGround(I,TRUE) + for(var/obj/item/I in owner.held_items) // drop_all_held_items() + user.dropItemToGround(I, TRUE) + if (am_seen) + // POOF EFFECTS + playsound(get_turf(owner), 'sound/magic/summon_karp.ogg', 60, 1) + var/datum/effect_system/steam_spread/puff = new /datum/effect_system/steam_spread/() + puff.effect_type = /obj/effect/particle_effect/smoke/vampsmoke + puff.set_up(3, 0, get_turf(owner)) + puff.start() + // TELEPORT: Move to Coffin & Close it! + do_teleport(owner, bloodsuckerdatum.coffin, no_effects = TRUE, forced = TRUE, channel = TELEPORT_CHANNEL_QUANTUM) // in teleport.dm? + // SLEEP + user.resting = TRUE + //user.Unconscious(30,0) + user.Stun(30,1) + // CLOSE LID: If fail, force me in. + if (!bloodsuckerdatum.coffin.close(owner)) + bloodsuckerdatum.coffin.insert(owner) // Puts me inside. + // The following was taken from close() proc in closets.dm + // (but we had to do it this way because there is no way to force entry) + playsound(bloodsuckerdatum.coffin.loc, bloodsuckerdatum.coffin.close_sound, 15, 1, -3) + bloodsuckerdatum.coffin.opened = FALSE + bloodsuckerdatum.coffin.density = TRUE + bloodsuckerdatum.coffin.update_icon() + // Lock Coffin + bloodsuckerdatum.coffin.LockMe(owner) + // ( STEP FIVE: Create animal at prev location? ) + //var/mob/living/simple_animal/SA = /mob/living/simple_animal/hostile/retaliate/bat // pick(/mob/living/simple_animal/mouse,/mob/living/simple_animal/mouse,/mob/living/simple_animal/mouse, /mob/living/simple_animal/hostile/retaliate/bat) //prob(300) /mob/living/simple_animal/mouse, + //new SA (owner.loc) diff --git a/code/modules/antagonists/bloodsucker/powers/bs_haste.dm b/code/modules/antagonists/bloodsucker/powers/bs_haste.dm new file mode 100644 index 00000000..9a653a38 --- /dev/null +++ b/code/modules/antagonists/bloodsucker/powers/bs_haste.dm @@ -0,0 +1,86 @@ + + +// Level 1: Speed to location +// Level 2: Dodge Bullets +// Level 3: Stun People Passed + +/datum/action/bloodsucker/targeted/haste + name = "Immortal Haste" + desc = "Dash somewhere with supernatural speed. Those nearby may be knocked away, stunned, or left empty-handed." + button_icon_state = "power_speed" + bloodcost = 6 + cooldown = 150 + target_range = 15 + power_activates_immediately = TRUE + message_Trigger = ""//"Whom will you subvert to your will?" + bloodsucker_can_buy = TRUE + must_be_capacitated = TRUE + +/datum/action/bloodsucker/targeted/haste/CheckCanUse(display_error) + . = ..() + if(!.) + return + // Being Grabbed + if(owner.pulledby && owner.pulledby.grab_state >= GRAB_AGGRESSIVE) + if(display_error) + to_chat(owner, "You're being grabbed!") + return FALSE + if(!owner.has_gravity(owner.loc)) //We dont want people to be able to use this to fly around in space + if(display_error) + to_chat(owner, "You cant dash while floating!") + return FALSE + return TRUE + +/datum/action/bloodsucker/targeted/haste/CheckValidTarget(atom/A) + return isturf(A) || A.loc != owner.loc // Anything will do, if it's not me or my square + +/datum/action/bloodsucker/targeted/haste/CheckCanTarget(atom/A, display_error) + // DEFAULT CHECKS (Distance) + if (!..()) + return FALSE + // Check: Range + //if (!(A in view(target_range, get_turf(owner)))) + // return FALSE + return TRUE + +/datum/action/bloodsucker/targeted/haste/FireTargetedPower(atom/A) + // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. + var/mob/living/user = owner + var/turf/T = isturf(A) ? A : get_turf(A) + // Pulled? Not anymore. + owner.pulledby = null + // Step One: Heatseek toward Target's Turf + walk_to(owner, T, 0, 0.01, 20) // NOTE: this runs in the background! to cancel it, you need to use walk(owner.current,0), or give them a new path. + playsound(get_turf(owner), 'sound/weapons/punchmiss.ogg', 25, 1, -1) + var/safety = 20 + while(get_turf(owner) != T && safety > 0 && !(isliving(target) && target.Adjacent(owner))) + user.canmove = FALSE //Dont move while doing the thing, or itll break + safety -- + // Did I get knocked down? + if(owner && owner.incapacitated(ignore_restraints=TRUE, ignore_grab=TRUE))// owner.incapacitated()) + // We're gonna cancel. But am I on the ground? Spin me! + if(user.resting) + var/send_dir = get_dir(owner, T) + new /datum/forced_movement(owner, get_ranged_target_turf(owner, send_dir, 1), 1, FALSE) + owner.spin(10) + break + // Spin/Stun people we pass. + //var/mob/living/newtarget = locate(/mob/living) in oview(1, owner) + var/list/mob/living/foundtargets = list() + for(var/mob/living/newtarget in oview(1, owner)) + if (newtarget && newtarget != target && !(newtarget in foundtargets))//!newtarget.IsKnockdown()) + if (rand(0, 5) < level_current) + playsound(get_turf(newtarget), "sound/weapons/punch[rand(1,4)].ogg", 15, 1, -1) + newtarget.Knockdown(10 + level_current * 5) + if(newtarget.IsStun()) + newtarget.spin(10,1) + if (rand(0,4)) + newtarget.drop_all_held_items() + foundtargets += newtarget + sleep(1) + if(user) + user.update_canmove() //Let the poor guy move again + +/datum/action/bloodsucker/targeted/haste/DeactivatePower(mob/living/user = owner, mob/living/target) + ..() // activate = FALSE + user.update_canmove() diff --git a/code/modules/antagonists/bloodsucker/powers/bs_lunge.dm b/code/modules/antagonists/bloodsucker/powers/bs_lunge.dm new file mode 100644 index 00000000..2a6cf285 --- /dev/null +++ b/code/modules/antagonists/bloodsucker/powers/bs_lunge.dm @@ -0,0 +1,83 @@ +// Level 1: Grapple level 2 +// Level 2: Grapple 3 from Behind +// Level 3: Grapple 3 from Shadows +/datum/action/bloodsucker/targeted/lunge + name = "Predatory Lunge" + desc = "Spring at your target and aggressively grapple them without warning. Attacks from concealment or the rear may even knock them down." + button_icon_state = "power_lunge" + bloodcost = 10 + cooldown = 300 + target_range = 3 + power_activates_immediately = TRUE + message_Trigger = ""//"Whom will you subvert to your will?" + must_be_capacitated = TRUE + bloodsucker_can_buy = TRUE + +/datum/action/bloodsucker/targeted/lunge/CheckCanUse(display_error) + if(!..(display_error))// DEFAULT CHECKS + return FALSE + // Being Grabbed + if(owner.pulledby && owner.pulledby.grab_state >= GRAB_AGGRESSIVE) + if(display_error) + to_chat(owner, "You're being grabbed!") + return FALSE + if(!owner.has_gravity(owner.loc))//TODO figure out how to check if theyre able to move while in nograv + if(display_error) + to_chat(owner, "You cant lunge while floating!") + return FALSE + return TRUE + +/datum/action/bloodsucker/targeted/lunge/CheckValidTarget(atom/A) + return isliving(A) + +/datum/action/bloodsucker/targeted/lunge/CheckCanTarget(atom/A, display_error) + // Check: Self + if(target == owner) + return FALSE + // Check: Range + //if (!(target in view(target_range, get_turf(owner)))) + // if (display_error) + // to_chat(owner, "Your victim is too far away.") + // return FALSE + // DEFAULT CHECKS (Distance) + if(!..()) + return FALSE + // Check: Turf + var/mob/living/L = A + if(!isturf(L.loc)) + return FALSE + return TRUE + +/datum/action/bloodsucker/targeted/lunge/FireTargetedPower(atom/A) + // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. + var/mob/living/carbon/target = A + var/turf/T = get_turf(target) + // Clear Vars + owner.pulling = null + // Will we Knock them Down? + var/do_knockdown = !is_A_facing_B(target,owner) || owner.alpha <= 0 || istype(owner.loc, /obj/structure/closet) + // CAUSES: Target has their back to me, I'm invisible, or I'm in a Closet + // Step One: Heatseek toward Target's Turf + + walk_towards(owner, T, 0.1, 10) // NOTE: this runs in the background! to cancel it, you need to use walk(owner.current,0), or give them a new path. + addtimer(CALLBACK(owner, .proc/_walk, 0), 2 SECONDS) + if(get_turf(owner) != T && !(isliving(target) && target.Adjacent(owner)) && owner.incapacitated() && owner.resting) + var/send_dir = get_dir(owner, T) + new /datum/forced_movement(owner, get_ranged_target_turf(owner, send_dir, 1), 1, FALSE) + owner.spin(10) + // Step Two: Check if I'm at/adjectent to Target's CURRENT turf (not original...that was just a destination) + sleep(1) + if(target.Adjacent(owner)) + // LEVEL 2: If behind target, mute or unconscious! + if(do_knockdown) // && level_current >= 1) + target.Knockdown(15 + 10 * level_current,1) + target.adjustStaminaLoss(40 + 10 * level_current) + // Cancel Walk (we were close enough to contact them) + walk(owner, 0) + target.Stun(10,1) //Without this the victim can just walk away + target.grabbedby(owner) // Taken from mutations.dm under changelings + target.grippedby(owner, instant = TRUE) //instant aggro grab + +/datum/action/bloodsucker/targeted/lunge/DeactivatePower(mob/living/user = owner, mob/living/target) + ..() // activate = FALSE + user.update_canmove() diff --git a/code/modules/antagonists/bloodsucker/powers/bs_masquerade.dm b/code/modules/antagonists/bloodsucker/powers/bs_masquerade.dm new file mode 100644 index 00000000..6ee17b30 --- /dev/null +++ b/code/modules/antagonists/bloodsucker/powers/bs_masquerade.dm @@ -0,0 +1,97 @@ + + + +// WITHOUT THIS POWER: +// +// - Mid-Blood: SHOW AS PALE +// - Low-Blood: SHOW AS DEAD +// - No Heartbeat +// - Examine shows actual blood +// - Thermal homeostasis (ColdBlooded) + + + +// WITH THIS POWER: +// - Normal body temp -- remove Cold Blooded (return on deactivate) +// - + + +/datum/action/bloodsucker/masquerade + name = "Masquerade" + desc = "Feign the vital signs of a mortal, and escape both casual and medical notice as the monster you truly are." + button_icon_state = "power_human" + bloodcost = 10 + cooldown = 50 + amToggle = TRUE + bloodsucker_can_buy = TRUE + warn_constant_cost = TRUE + can_use_in_torpor = TRUE // Masquerade is maybe the only one that can do this. It stops your healing. + cooldown_static = TRUE + +// NOTE: Firing off vulgar powers disables your Masquerade! + +/*/datum/action/bloodsucker/masquerade/CheckCanUse(display_error) + if(!..(display_error))// DEFAULT CHECKS + return FALSE + // DONE! + return TRUE +*/ + + +/datum/action/bloodsucker/masquerade/ActivatePower() + + var/mob/living/user = owner + var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + + to_chat(user, "Your heart beats falsely within your lifeless chest. You may yet pass for a mortal.") + to_chat(user, "Your vampiric healing is halted while imitating life.") + + + // Remove ColdBlooded & Hard/SoftCrit + REMOVE_TRAIT(user, TRAIT_COLDBLOODED, "bloodsucker") + REMOVE_TRAIT(user, TRAIT_NOHARDCRIT, "bloodsucker") + REMOVE_TRAIT(user, TRAIT_NOSOFTCRIT, "bloodsucker") + var/obj/item/organ/heart/vampheart/H = user.getorganslot(ORGAN_SLOT_HEART) + + // WE ARE ALIVE! // + bloodsuckerdatum.poweron_masquerade = TRUE + while(bloodsuckerdatum && ContinueActive(user)) + + // HEART + if (istype(H)) + H.FakeStart() + + // PASSIVE (done from LIFE) + // Don't Show Pale/Dead on low blood + // Don't vomit food + // Don't Heal + + // Pay Blood Toll (if awake) + if (user.stat == CONSCIOUS) + bloodsuckerdatum.AddBloodVolume(-0.2) + + sleep(20) // Check every few ticks that we haven't disabled this power + + +/datum/action/bloodsucker/masquerade/ContinueActive(mob/living/user) + // Disable if unable to use power anymore. + //if (user.stat == DEAD || user.blood_volume <= 0) // not conscious or soft critor uncon, just dead + // return FALSE + return ..() // Active, and still Antag + + +/datum/action/bloodsucker/masquerade/DeactivatePower(mob/living/user = owner, mob/living/target) + ..() // activate = FALSE + + var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + bloodsuckerdatum.poweron_masquerade = FALSE + + ADD_TRAIT(user, TRAIT_COLDBLOODED, "bloodsucker") + ADD_TRAIT(user, TRAIT_NOHARDCRIT, "bloodsucker") + ADD_TRAIT(user, TRAIT_NOSOFTCRIT, "bloodsucker") + + // HEART + var/obj/item/organ/heart/H = user.getorganslot(ORGAN_SLOT_HEART) + H.Stop() + + to_chat(user, "Your heart beats one final time, while your skin dries out and your icy pallor returns.") diff --git a/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm b/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm new file mode 100644 index 00000000..94bc0e11 --- /dev/null +++ b/code/modules/antagonists/bloodsucker/powers/bs_mesmerize.dm @@ -0,0 +1,114 @@ + +// * MEZMERIZE +// LOVE: Target falls in love with you. Being harmed directly causes them harm if they see it? +// STAY: Target will do everything they can to stand in the same place. +// FOLLOW: Target follows you, spouting random phrases from their history (or maybe Poly's or NPC's vocab?) +// ATTACK: Target finds a nearby non-Bloodsucker victim to attack. + +/datum/action/bloodsucker/targeted/mesmerize + name = "Mesmerize" + desc = "Dominate the mind of a mortal who can see your eyes." + button_icon_state = "power_mez" + bloodcost = 30 + cooldown = 200 + target_range = 1 + power_activates_immediately = FALSE + message_Trigger = "Whom will you subvert to your will?" + must_be_capacitated = TRUE + bloodsucker_can_buy = TRUE + +/datum/action/bloodsucker/targeted/mesmerize/CheckCanUse(display_error) + . = ..() + if(!.) + return + if (!owner.getorganslot(ORGAN_SLOT_EYES)) + if (display_error) + to_chat(owner, "You have no eyes with which to mesmerize.") + return FALSE + // Check: Eyes covered? + var/mob/living/L = owner + if (istype(L) && L.is_eyes_covered() || !isturf(owner.loc)) + if (display_error) + to_chat(owner, "Your eyes are concealed from sight.") + return FALSE + return TRUE + +/datum/action/bloodsucker/targeted/mesmerize/CheckValidTarget(atom/A) + return iscarbon(A) + +/datum/action/bloodsucker/targeted/mesmerize/CheckCanTarget(atom/A,display_error) + // Check: Self + if (A == owner) + return FALSE + var/mob/living/carbon/target = A // We already know it's carbon due to CheckValidTarget() + // Bloodsucker + if (target.mind && target.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) + if (display_error) + to_chat(owner, "Bloodsuckers are immune to [src].") + return FALSE + // Dead/Unconscious + if (target.stat > CONSCIOUS) + if (display_error) + to_chat(owner, "Your victim is not [(target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH))?"alive":"conscious"].") + return FALSE + // Check: Target has eyes? + if (!target.getorganslot(ORGAN_SLOT_EYES)) + if (display_error) + to_chat(owner, "They have no eyes!") + return FALSE + // Check: Target blind? + if (target.eye_blind > 0) + if (display_error) + to_chat(owner, "Your victim's eyes are glazed over. They cannot perceive you.") + return FALSE + // Check: Target See Me? (behind wall) + if (!(owner in view(target_range, get_turf(target)))) + // Sub-Check: GET CLOSER + //if (!(owner in range(target_range, get_turf(target))) + // if (display_error) + // to_chat(owner, "You're too far from your victim.") + if (display_error) + to_chat(owner, "You're too far outside your victim's view.") + return FALSE + // Check: Facing target? + if (!is_A_facing_B(owner,target)) // in unsorted.dm + if (display_error) + to_chat(owner, "You must be facing your victim.") + return FALSE + // Check: Target facing me? + if (!target.resting && !is_A_facing_B(target,owner)) + if (display_error) + to_chat(owner, "Your victim must be facing you to see into your eyes.") + return FALSE + return TRUE + +/datum/action/bloodsucker/targeted/mesmerize/FireTargetedPower(atom/A) + // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. + var/mob/living/carbon/target = A + var/mob/living/user = owner + + if(istype(target)) + target.Stun(40) //Utterly useless without this, its okay since there are so many checks to go through + target.silent = 45 //Shhhh little lamb + target.apply_status_effect(STATUS_EFFECT_MESMERIZE, 45) //So you cant rotate with combat mode, plus fancy status alert + + if(do_mob(user, target, 40, 0, TRUE, extra_checks=CALLBACK(src, .proc/ContinueActive, user, target))) + PowerActivatedSuccessfully() // PAY COST! BEGIN COOLDOWN! + var/power_time = 90 + level_current * 12 + target.silent = power_time + 20 + target.apply_status_effect(STATUS_EFFECT_MESMERIZE, 100 + level_current * 15) + to_chat(user, "[target] is fixed in place by your hypnotic gaze.") + target.Stun(power_time) + //target.silent += power_time / 10 // Silent isn't based on ticks. + target.next_move = world.time + power_time // <--- Use direct change instead. We want an unmodified delay to their next move // target.changeNext_move(power_time) // check click.dm + target.notransform = TRUE // <--- Fuck it. We tried using next_move, but they could STILL resist. We're just doing a hard freeze. + spawn(power_time) + if(istype(target)) + target.notransform = FALSE + // They Woke Up! (Notice if within view) + if(istype(user) && target.stat == CONSCIOUS && (target in view(10, get_turf(user))) ) + to_chat(user, "[target] has snapped out of their trance.") + + +/datum/action/bloodsucker/targeted/mesmerize/ContinueActive(mob/living/user, mob/living/target) + return ..() && CheckCanUse() && CheckCanTarget(target) diff --git a/code/modules/antagonists/bloodsucker/powers/bs_trespass.dm b/code/modules/antagonists/bloodsucker/powers/bs_trespass.dm new file mode 100644 index 00000000..c650a6af --- /dev/null +++ b/code/modules/antagonists/bloodsucker/powers/bs_trespass.dm @@ -0,0 +1,124 @@ + + +/datum/action/bloodsucker/targeted/trespass + name = "Trespass" + desc = "Become mist and advance two tiles in one direction, ignoring all obstacles except for walls. Useful for skipping past doors and barricades." + button_icon_state = "power_tres" + + bloodcost = 10 + cooldown = 60 + amToggle = FALSE + //target_range = 2 + + bloodsucker_can_buy = TRUE + must_be_capacitated = FALSE + can_be_immobilized = TRUE + + var/turf/target_turf // We need to decide where we're going based on where we clicked. It's not actually the tile we clicked. + +/datum/action/bloodsucker/targeted/trespass/CheckCanUse(display_error) + . = ..() + if(!.) + return + if(owner.notransform || !get_turf(owner)) + return FALSE + + return TRUE + + +/datum/action/bloodsucker/targeted/trespass/CheckValidTarget(atom/A) + // Can't target my tile + if (A == get_turf(owner) || get_turf(A) == get_turf(owner)) + return FALSE + + return TRUE // All we care about is destination. Anything you click is fine. + + +/datum/action/bloodsucker/targeted/trespass/CheckCanTarget(atom/A, display_error) + // NOTE: Do NOT use ..()! We don't want to check distance or anything. + + // Get clicked tile + var/final_turf = isturf(A) ? A : get_turf(A) + + // Are either tiles WALLS? + var/turf/from_turf = get_turf(owner) + var/this_dir // = get_dir(from_turf, target_turf) + for (var/i=1 to 2) + // Keep Prev Direction if we've reached final turf + if (from_turf != final_turf) + this_dir = get_dir(from_turf, final_turf) // Recalculate dir so we don't overshoot on a diagonal. + from_turf = get_step(from_turf, this_dir) + // ERROR! Wall! + if (iswallturf(from_turf)) + if (display_error) + var/wallwarning = (i == 1) ? "in the way" : "at your destination" + to_chat(owner, "There is a solid wall [wallwarning].") + return FALSE + // Done + target_turf = from_turf + + return TRUE + + +/datum/action/bloodsucker/targeted/trespass/FireTargetedPower(atom/A) + // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. + + // Find target turf, at or below Atom + var/mob/living/carbon/user = owner + var/turf/my_turf = get_turf(owner) + + user.visible_message("[user]'s form dissipates into a cloud of mist!", \ + "You disspiate into formless mist.") + + + // Effect Origin + playsound(get_turf(owner), 'sound/magic/summon_karp.ogg', 60, 1) + var/datum/effect_system/steam_spread/puff = new /datum/effect_system/steam_spread/() + puff.effect_type = /obj/effect/particle_effect/smoke/vampsmoke + puff.set_up(3, 0, my_turf) + puff.start() + + var/mist_delay = max(5, 20 - level_current * 2.5) // Level up and do this faster. + + // Freeze Me + user.next_move = world.time + mist_delay + user.Stun(mist_delay, ignore_canstun = TRUE) + user.notransform = TRUE + user.density = 0 + var/invis_was = user.invisibility + user.invisibility = INVISIBILITY_MAXIMUM + + // LOSE CUFFS + if(user.handcuffed) + var/obj/O = user.handcuffed + user.dropItemToGround(O) + if(user.legcuffed) + var/obj/O = user.legcuffed + user.dropItemToGround(O) + + // Wait... + sleep(mist_delay / 2) + + // Move & Freeze + if (isturf(target_turf)) + do_teleport(owner, target_turf, no_effects=TRUE, channel = TELEPORT_CHANNEL_QUANTUM) // in teleport.dm? + user.next_move = world.time + mist_delay / 2 + user.Stun(mist_delay / 2, ignore_canstun = TRUE) + + // Wait... + sleep(mist_delay / 2) + + // Un-Hide & Freeze + user.dir = get_dir(my_turf, target_turf) + user.next_move = world.time + mist_delay / 2 + user.Stun(mist_delay / 2, ignore_canstun = TRUE) + user.notransform = FALSE + user.density = 1 + user.invisibility = invis_was + + // Effect Destination + playsound(get_turf(owner), 'sound/magic/summon_karp.ogg', 60, 1) + puff = new /datum/effect_system/steam_spread/() + puff.effect_type = /obj/effect/particle_effect/smoke/vampsmoke + puff.set_up(3, 0, target_turf) + puff.start() diff --git a/code/modules/antagonists/bloodsucker/powers/bs_veil.dm b/code/modules/antagonists/bloodsucker/powers/bs_veil.dm new file mode 100644 index 00000000..0c83cc2d --- /dev/null +++ b/code/modules/antagonists/bloodsucker/powers/bs_veil.dm @@ -0,0 +1,163 @@ + +/datum/action/bloodsucker/veil + name = "Veil of Many Faces" + desc = "Disguise yourself in the illusion of another identity." + button_icon_state = "power_veil" + bloodcost = 15 + cooldown = 100 + amToggle = TRUE + bloodsucker_can_buy = TRUE + warn_constant_cost = TRUE + + // Outfit Vars + var/list/original_items = list() + + // Identity Vars + var/prev_gender + var/prev_skin_tone + var/prev_hair_style + var/prev_facial_hair_style + var/prev_hair_color + var/prev_facial_hair_color + var/prev_underwear + var/prev_undie_color + var/prev_undershirt + var/prev_shirt_color + var/prev_socks + var/prev_socks_color + var/prev_disfigured + var/list/prev_features // For lizards and such + + +/datum/action/bloodsucker/veil/CheckCanUse(display_error) + . = ..() + if(!.) + return + + return TRUE + + +/datum/action/bloodsucker/veil/ActivatePower() + + cast_effect() // POOF + + //if (blahblahblah) + // Disguise_Outfit() + + Disguise_FaceName() + + +/datum/action/bloodsucker/veil/proc/Disguise_Outfit() + + // Step One: Back up original items + + + + +/datum/action/bloodsucker/veil/proc/Disguise_FaceName() + + // Change Name/Voice + var/mob/living/carbon/human/H = owner + H.name_override = H.dna.species.random_name(H.gender) + H.name = H.name_override + H.SetSpecialVoice(H.name_override) + to_chat(owner, "You mystify the air around your person. Your identity is now altered.") + + // Store Prev Appearance + prev_gender = H.gender + prev_skin_tone = H.skin_tone + prev_hair_style = H.hair_style + prev_facial_hair_style = H.facial_hair_style + prev_hair_color = H.hair_color + prev_facial_hair_color = H.facial_hair_color + prev_underwear = H.underwear + prev_undie_color = H.undie_color + prev_undershirt = H.undershirt + prev_shirt_color = H.shirt_color + prev_socks = H.socks + prev_socks_color = H.socks_color + //prev_eye_color + prev_disfigured = HAS_TRAIT(H, TRAIT_DISFIGURED) // I was disfigured! //prev_disabilities = H.disabilities + prev_features = H.dna.features + + // Change Appearance, not randomizing clothes colour, itll just be janky + H.gender = pick(MALE, FEMALE) + H.skin_tone = random_skin_tone() + H.hair_style = random_hair_style(H.gender) + H.facial_hair_style = pick(random_facial_hair_style(H.gender),"Shaved") + H.hair_color = random_short_color() + H.facial_hair_color = H.hair_color + H.underwear = random_underwear(H.gender) + H.undershirt = random_undershirt(H.gender) + H.socks = random_socks(H.gender) + //H.eye_color = random_eye_color() + REMOVE_TRAIT(H, TRAIT_DISFIGURED, null) // + H.dna.features = random_features() + + // Apply Appearance + H.update_body() // Outfit and underware, also body. + //H.update_mutant_bodyparts() // Lizard tails etc + H.update_hair() + H.update_body_parts() + + // Wait here til we deactivate power or go unconscious + var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) + while (ContinueActive(owner) && istype(bloodsuckerdatum))//active && owner && owner.stat == CONSCIOUS) + bloodsuckerdatum.AddBloodVolume(-0.2) + sleep(10) + + // Wait for a moment if you fell unconscious... + if (owner && owner.stat > CONSCIOUS) + sleep(50) + + +/datum/action/bloodsucker/veil/DeactivatePower(mob/living/user = owner, mob/living/target) + ..() + if (ishuman(user)) + var/mob/living/carbon/human/H = user + + // Revert Identity + H.UnsetSpecialVoice() + H.name_override = null + H.name = H.real_name + + // Revert Appearance + H.gender = prev_gender + H.skin_tone = prev_skin_tone + H.hair_style = prev_hair_style + H.facial_hair_style = prev_facial_hair_style + H.hair_color = prev_hair_color + H.facial_hair_color = prev_facial_hair_color + H.underwear = prev_underwear + H.undie_color = prev_undie_color + H.undershirt = prev_undershirt + H.shirt_color = prev_shirt_color + H.socks = prev_socks + H.socks_color = prev_socks_color + + //H.disabilities = prev_disabilities // Restore HUSK, CLUMSY, etc. + if (prev_disfigured) + ADD_TRAIT(H, TRAIT_DISFIGURED, "husk") // NOTE: We are ASSUMING husk. // H.status_flags |= DISFIGURED // Restore "Unknown" disfigurement + H.dna.features = prev_features + // Apply Appearance + H.update_body() // Outfit and underware, also body. + H.update_hair() + H.update_body_parts() // Body itself, maybe skin color? + cast_effect() // POOF + + // CAST EFFECT // // General effect (poof, splat, etc) when you cast. Doesn't happen automatically! +/datum/action/bloodsucker/veil/proc/cast_effect() + // Effect + playsound(get_turf(owner), 'sound/magic/smoke.ogg', 20, 1) + var/datum/effect_system/steam_spread/puff = new /datum/effect_system/steam_spread/() + puff.effect_type = /obj/effect/particle_effect/smoke/vampsmoke + puff.set_up(3, 0, get_turf(owner)) + puff.attach(owner) // OPTIONAL + puff.start() + owner.spin(8, 1) // Spin around like a loon. + +/obj/effect/particle_effect/smoke/vampsmoke + opaque = FALSE + lifetime = 0 +/obj/effect/particle_effect/smoke/vampsmoke/fade_out(frames = 6) + ..(frames) diff --git a/code/modules/antagonists/bloodsucker/powers/v_recuperate.dm b/code/modules/antagonists/bloodsucker/powers/v_recuperate.dm new file mode 100644 index 00000000..6b8795ea --- /dev/null +++ b/code/modules/antagonists/bloodsucker/powers/v_recuperate.dm @@ -0,0 +1,38 @@ +/datum/action/bloodsucker/vassal/recuperate + name = "Sanguine Recuperation" + desc = "Slowly heal brute damage while active. This process is exhausting, and requires some of your tainted blood." + button_icon_state = "power_recup" + amToggle = TRUE + bloodcost = 5 + cooldown = 100 + +/datum/action/bloodsucker/vassal/recuperate/CheckCanUse(display_error) + . = ..() + if(!.) + return + if (owner.stat >= DEAD) + return FALSE + return TRUE + +/datum/action/bloodsucker/vassal/recuperate/ActivatePower() + to_chat(owner, "Your muscles clench and your skin crawls as your master's immortal blood knits your wounds and gives you stamina.") + var/mob/living/carbon/C = owner + var/mob/living/carbon/human/H + if(ishuman(owner)) + H = owner + while(ContinueActive(owner)) + C.adjustBruteLoss(-1.5) + C.adjustFireLoss(-0.5) + C.adjustToxLoss(-2, forced = TRUE) + C.blood_volume -= 0.2 + C.adjustStaminaLoss(-15) + // Stop Bleeding + if(istype(H) && H.bleed_rate > 0 && rand(20) == 0) + H.bleed_rate -- + C.Jitter(5) + sleep(10) + // DONE! + //DeactivatePower(owner) + +/datum/action/bloodsucker/vassal/recuperate/ContinueActive(mob/living/user, mob/living/target) + return ..() && user.stat <= DEAD && user.blood_volume > 500 diff --git a/code/modules/clothing/neck/_neck.dm b/code/modules/clothing/neck/_neck.dm index 2070aebb..43b13f40 100644 --- a/code/modules/clothing/neck/_neck.dm +++ b/code/modules/clothing/neck/_neck.dm @@ -65,8 +65,11 @@ var/obj/item/organ/heart/heart = M.getorganslot(ORGAN_SLOT_HEART) var/obj/item/organ/lungs/lungs = M.getorganslot(ORGAN_SLOT_LUNGS) + - if(!(M.stat == DEAD || (HAS_TRAIT(M, TRAIT_FAKEDEATH)))) + if (!do_mob(user,M,60)) // Stethoscope should take a moment to listen + return // FAIL + if(!(M.stat == DEAD || (HAS_TRAIT(M, TRAIT_FAKEDEATH)) || (HAS_TRAIT(M, TRAIT_NOPULSE)))) if(heart && istype(heart)) heart_strength = "an unstable" if(heart.beating) diff --git a/code/modules/crafting/recipes/recipes_misc.dm b/code/modules/crafting/recipes/recipes_misc.dm index 70695466..e76950bb 100644 --- a/code/modules/crafting/recipes/recipes_misc.dm +++ b/code/modules/crafting/recipes/recipes_misc.dm @@ -335,3 +335,41 @@ /obj/item/reagent_containers/food/snacks/grown/coconut = 1) time = 70 category = CAT_MISC + + /datum/crafting_recipe/bloodsucker/vassalrack + name = "Persuasion Rack" + //desc = "For converting crewmembers into loyal Vassals." + result = /obj/structure/bloodsucker/vassalrack + tools = list(/obj/item/weldingtool, + ///obj/item/screwdriver, + /obj/item/wrench + ) + reqs = list(/obj/item/stack/sheet/mineral/wood = 3, + /obj/item/stack/sheet/metal = 2, + /obj/item/restraints/handcuffs/cable = 2, + ///obj/item/storage/belt = 1 + ///obj/item/stack/sheet/animalhide = 1, // /obj/item/stack/sheet/leather = 1, + ///obj/item/stack/sheet/plasteel = 5 + ) + //parts = list(/obj/item/storage/belt = 1 + // ) + + time = 150 + category = CAT_MISC + always_availible = FALSE // Disabled til learned + + + /datum/crafting_recipe/bloodsucker/candelabrum + name = "Candelabrum" + //desc = "For converting crewmembers into loyal Vassals." + result = /obj/structure/bloodsucker/candelabrum + tools = list(/obj/item/weldingtool, + /obj/item/wrench + ) + reqs = list(/obj/item/stack/sheet/metal = 3, + /obj/item/stack/rods = 1, + /obj/item/candle = 1 + ) + time = 100 + category = CAT_MISC + always_availible = FALSE // Disabled til learned diff --git a/code/modules/language/vampiric.dm b/code/modules/language/vampiric.dm new file mode 100644 index 00000000..6da54ce8 --- /dev/null +++ b/code/modules/language/vampiric.dm @@ -0,0 +1,25 @@ +// VAMPIRE LANGUAGE // + +/datum/language/vampiric + name = "Blah-Sucker" + desc = "The native language of the Bloodsucker elders, learned intuitively by Fledglings and as they pass from death into immortality. Thralls are also given the ability to speak this as apart of their conversion ritual." + speech_verb = "growls" + ask_verb = "growls" + exclaim_verb = "snarls" + whisper_verb = "hisses" + key = "b" + space_chance = 40 + default_priority = 90 + icon_state = "bloodsucker" + + flags = TONGUELESS_SPEECH | LANGUAGE_HIDE_ICON_IF_NOT_UNDERSTOOD // Hide the icon next to your text if someone doesn't know this language. + syllables = list( + "luk","cha","no","kra","pru","chi","busi","tam","pol","spu","och", // Start: Vampiric + "umf","ora","stu","si","ri","li","ka","red","ani","lup","ala","pro", + "to","siz","nu","pra","ga","ump","ort","a","ya","yach","tu","lit", + "wa","mabo","mati","anta","tat","tana","prol", + "tsa","si","tra","te","ele","fa","inz", // Start: Romanian + "nza","est","sti","ra","pral","tsu","ago","esch","chi","kys","praz", // Start: Custom + "froz","etz","tzil", + "t'","k'","t'","k'","th'","tz'" + ) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index 051aea93..a1984b03 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -35,6 +35,9 @@ if(bleed_rate < 0) bleed_rate = 0 + + 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/damage_procs.dm b/code/modules/mob/living/carbon/damage_procs.dm index 343f22d7..6faa4406 100644 --- a/code/modules/mob/living/carbon/damage_procs.dm +++ b/code/modules/mob/living/carbon/damage_procs.dm @@ -64,6 +64,8 @@ /mob/living/carbon/adjustBruteLoss(amount, updating_health = TRUE, forced = FALSE) + if (!forced && amount < 0 && HAS_TRAIT(src,TRAIT_NONATURALHEAL)) + return FALSE if(!forced && (status_flags & GODMODE)) return FALSE if(amount > 0) @@ -73,6 +75,8 @@ return amount /mob/living/carbon/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) + if (!forced && amount < 0 && HAS_TRAIT(src,TRAIT_NONATURALHEAL)) //Vamps don't heal naturally. + return FALSE if(!forced && (status_flags & GODMODE)) return FALSE if(amount > 0) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 83e5777a..9dbf731e 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -16,6 +16,13 @@ . = list("*---------*\nThis is [!obscure_name ? name : "Unknown"]!") + var/vampDesc = ReturnVampExamine(user) // Vamps recognize the names of other vamps. + var/vassDesc = ReturnVassalExamine(user) // Vassals recognize each other's marks. + if (vampDesc != "") // If we don't do it this way, we add a blank space to the string...something to do with this --> . += "" + . += vampDesc + if (vassDesc != "") + . += vassDesc + var/list/obscured = check_obscured_slots() var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) @@ -252,7 +259,7 @@ if(DISGUST_LEVEL_DISGUSTED to INFINITY) msg += "[t_He] look[p_s()] extremely disgusted.\n" - if(blood_volume < (BLOOD_VOLUME_SAFE*blood_ratio)) + if(ShowAsPaleExamine()) msg += "[t_He] [t_has] pale skin.\n" if(bleedsuppress) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index e41512df..b22049f4 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1222,6 +1222,8 @@ GLOBAL_LIST_EMPTY(roundstart_races) //////// /datum/species/proc/handle_digestion(mob/living/carbon/human/H) + if(HAS_TRAIT(src, TRAIT_NOHUNGER)) + return //hunger is for BABIES //The fucking TRAIT_FAT mutation is the dumbest shit ever. It makes the code so difficult to work with if(HAS_TRAIT(H, TRAIT_FAT))//I share your pain, past coder. 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 5b039296..b8f260a9 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) //can't farm slime jelly from a dead slime/jelly person indefinitely + 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 @@ -177,6 +177,8 @@ bodies = old_species.bodies /datum/species/jelly/slime/spec_life(mob/living/carbon/human/H) + if((HAS_TRAIT(H, TRAIT_NOMARROW))) + return if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT) if(prob(5)) to_chat(H, "You feel very bloated!") diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index b1c26675..26559b3d 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -673,6 +673,9 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put //used in human and monkey handle_environment() /mob/living/carbon/proc/natural_bodytemperature_stabilization() + if (HAS_TRAIT(src, TRAIT_COLDBLOODED)) + return 0 //Return 0 as your natural temperature. Species proc handle_environment() will adjust your temperature based on this. + var/body_temperature_difference = BODYTEMP_NORMAL - bodytemperature switch(bodytemperature) if(-INFINITY to BODYTEMP_COLD_DAMAGE_LIMIT) //Cold damage limit is 50 below the default, the temperature where you start to feel effects. diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm index 04f859f1..2f133259 100644 --- a/code/modules/mob/living/silicon/login.dm +++ b/code/modules/mob/living/silicon/login.dm @@ -4,4 +4,7 @@ var/datum/antagonist/rev/rev = mind.has_antag_datum(/datum/antagonist/rev) if(rev) rev.remove_revolutionary(TRUE) + var/datum/antagonist/bloodsucker/V = mind.has_antag_datum(/datum/antagonist/bloodsucker) + if(V) + mind.remove_antag_datum(V) ..() diff --git a/code/modules/mob/living/simple_animal/astral.dm b/code/modules/mob/living/simple_animal/astral.dm index 8c261157..23e3b18f 100644 --- a/code/modules/mob/living/simple_animal/astral.dm +++ b/code/modules/mob/living/simple_animal/astral.dm @@ -28,6 +28,7 @@ unsuitable_atmos_damage = 0 minbodytemp = 0 maxbodytemp = 100000 + blood_volume = 0 /mob/living/simple_animal/astral/death() icon_state = "shade_dead" diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index c9b9963d..9c41f0ab 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -14,6 +14,7 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) maxbodytemp = INFINITY minbodytemp = 0 + blood_volume = 0 has_unlimited_silicon_privilege = 1 sentience_type = SENTIENCE_ARTIFICIAL status_flags = NONE //no default canpush diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index a5223b47..cfcc0dad 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -33,6 +33,7 @@ initial_language_holder = /datum/language_holder/construct deathmessage = "collapses in a shattered heap." hud_type = /datum/hud/constructs + blood_volume = 0 var/list/construct_spells = list() var/playstyle_string = "You are a generic construct! Your job is to not exist, and you should probably adminhelp this." var/master = null diff --git a/code/modules/mob/living/simple_animal/friendly/cockroach.dm b/code/modules/mob/living/simple_animal/friendly/cockroach.dm index c85890df..26d4691d 100644 --- a/code/modules/mob/living/simple_animal/friendly/cockroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/cockroach.dm @@ -3,6 +3,7 @@ desc = "This station is just crawling with bugs." icon_state = "cockroach" icon_dead = "cockroach" + blood_volume = 50 health = 1 maxHealth = 1 turns_per_move = 5 diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index 193de855..5dbf7556 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -8,6 +8,7 @@ speak_emote = list("clicks") emote_hear = list("clicks.") emote_see = list("clacks.") + blood_volume = 350 speak_chance = 1 turns_per_move = 5 butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 1) diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 97db2047..e1c80050 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -10,6 +10,7 @@ emote_see = list("runs in a circle.", "shakes.") speak_chance = 1 turns_per_move = 5 + blood_volume = 250 see_in_dark = 6 maxHealth = 5 health = 5 diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 20d33a4b..903c3ea3 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -20,6 +20,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians icon_living = "magicOrange" icon_dead = "magicOrange" speed = 0 + blood_volume = 0 a_intent = INTENT_HARM stop_automated_movement = 1 movement_type = FLYING // Immunity to chasms and landmines, etc. diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index 06f1807a..3d411738 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -19,6 +19,7 @@ spacewalk = TRUE stat_attack = UNCONSCIOUS robust_searching = 1 + blood_volume = 0 harm_intent_damage = 10 obj_damage = 50 @@ -42,4 +43,4 @@ var/mob/living/carbon/C = target C.Knockdown(60) C.visible_message("\The [src] knocks down \the [C]!", \ - "\The [src] knocks you down!") \ No newline at end of file + "\The [src] knocks you down!") diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 40ef70cf..ee9d1ddd 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -28,6 +28,7 @@ gold_core_spawnable = HOSTILE_SPAWN del_on_death = 1 loot = list(/obj/effect/decal/cleanable/robot_debris) + blood_volume = 0 do_footstep = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index cca39cfe..d96889cf 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -50,6 +50,7 @@ Difficulty: Normal armour_penetration = 75 melee_damage_lower = 15 melee_damage_upper = 20 + blood_volume = 0 speed = 1 move_to_delay = 11 ranged = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm index 20916c93..51919dad 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/curse_blob.dm @@ -22,6 +22,7 @@ environment_smash = ENVIRONMENT_SMASH_NONE sentience_type = SENTIENCE_BOSS layer = LARGE_MOB_LAYER + blood_volume = 0 var/doing_move_loop = FALSE var/mob/living/set_target var/timerid diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm index b6aabb7d..c518cbe0 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/bat.dm @@ -6,6 +6,7 @@ icon_dead = "bat_dead" icon_gib = "bat_dead" turns_per_move = 1 + blood_volume = 250 response_help = "brushes aside" response_disarm = "flails at" response_harm = "hits" diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm index 32e1c4d0..bfe83491 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm @@ -31,6 +31,7 @@ movement_type = FLYING pressure_resistance = 300 gold_core_spawnable = NO_SPAWN //too spooky for science + blood_volume = 0 var/ghost_hair_style var/ghost_hair_color var/mutable_appearance/ghost_hair diff --git a/code/modules/mob/living/simple_animal/hostile/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/skeleton.dm index d0ae01f4..48b69a1f 100644 --- a/code/modules/mob/living/simple_animal/hostile/skeleton.dm +++ b/code/modules/mob/living/simple_animal/hostile/skeleton.dm @@ -12,6 +12,7 @@ emote_see = list("rattles") a_intent = INTENT_HARM maxHealth = 40 + blood_volume = 0 health = 40 speed = 1 harm_intent_damage = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index f38d77cd..1e1fa9d4 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -18,6 +18,7 @@ maxHealth = 50000 health = 50000 healable = 0 + blood_volume = 0 harm_intent_damage = 10 obj_damage = 100 diff --git a/code/modules/mob/living/simple_animal/hostile/stickman.dm b/code/modules/mob/living/simple_animal/hostile/stickman.dm index 7a86870a..fa5cb151 100644 --- a/code/modules/mob/living/simple_animal/hostile/stickman.dm +++ b/code/modules/mob/living/simple_animal/hostile/stickman.dm @@ -13,6 +13,7 @@ response_disarm = "shoves" response_harm = "hits" speed = 0 + blood_volume = 0 stat_attack = UNCONSCIOUS robust_searching = 1 environment_smash = ENVIRONMENT_SMASH_NONE diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 754ef004..64ffa147 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -31,6 +31,7 @@ loot = list(/obj/item/ectoplasm) del_on_death = TRUE initial_language_holder = /datum/language_holder/construct + blood_volume = 0 /mob/living/simple_animal/shade/death() deathmessage = "lets out a contented sigh as [p_their()] form unwinds." diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 36041b02..f8e799e5 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -4,7 +4,8 @@ health = 20 maxHealth = 20 gender = PLURAL //placeholder - + blood_volume = 550 //How much blud it has for bloodsucking + status_flags = CANPUSH var/icon_living = "" diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index 86e8d1ea..9671f35e 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -5,6 +5,7 @@ pass_flags = PASSTABLE ventcrawler = VENTCRAWLER_ALWAYS gender = NEUTER + blood_volume = 0 //until someone reworks for them to have slime jelly var/is_adult = 0 var/docile = 0 faction = list("slime","neutral") diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index be050560..b24c56fd 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -367,6 +367,9 @@ 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. + to_chat(src, "You find yourself unable to run.") + return FALSE m_intent = MOVE_INTENT_RUN if(hud_used && hud_used.static_inventory) for(var/obj/screen/mov_intent/selector in hud_used.static_inventory) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 8e4cd260..2ca5e541 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -176,7 +176,7 @@ new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, bloodtype_to_color(H.dna.blood_type)) else new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, bloodtype_to_color()) - if(iscarbon(L)) + if(iscarbon(L) && !HAS_TRAIT(L, TRAIT_NOMARROW)) var/mob/living/carbon/C = L C.bleed(damage) else diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index c6aa800d..3177df66 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -612,6 +612,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 b4378afc..f9ad023d 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -356,6 +356,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 8c2ea019..01f02da0 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -30,7 +30,7 @@ if(iscarbon(L)) var/mob/living/carbon/C = L var/blood_id = C.get_blood_id() - if((blood_id == "blood" || blood_id == "jellyblood") && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits)))) + if((HAS_TRAIT(C, TRAIT_NOMARROW) || blood_id == "blood" || blood_id == "jellyblood") && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits)))) C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM * C.blood_ratio) // we don't care about bloodtype here, we're just refilling the mob @@ -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 @@ -1128,6 +1130,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.25 ..() diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index fe35981b..36d73f0d 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -106,9 +106,31 @@ update_pack_name() else return ..() + +/obj/item/reagent_containers/blood/attack(mob/M, mob/user, def_zone) + if(user.a_intent == INTENT_HELP && reagents.total_volume > 0) + if (user != M) + to_chat(user, "You force [M] to drink from the [src]") + user.visible_message("[user] forces [M] to drink from the [src].") + if(!do_mob(user, M, 50)) + return + else + if(!do_mob(user, M, 10)) + return + to_chat(user, "You take a sip from the [src].") + user.visible_message("[user] puts the [src] up to their mouth.") + if(reagents.total_volume <= 0) // Safety: In case you spam clicked the blood bag on yourself, and it is now empty (below will divide by zero) + return + var/gulp_size = 5 + var/fraction = min(gulp_size / reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction) //checkLiked(fraction, M) // Blood isn't food, sorry. + reagents.trans_to(M, gulp_size) + playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) + ..() + /obj/item/reagent_containers/blood/bluespace name = "bluespace blood pack" desc = "Contains blood used for transfusion, this one has been made with bluespace technology to hold much more blood. Must be attached to an IV drip." icon_state = "bsbloodpack" - volume = 600 //its a blood bath! \ No newline at end of file + volume = 600 //its a blood bath! diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm index 1113f11e..ad9e73f4 100644 --- a/code/modules/research/nanites/nanite_programs/healing.dm +++ b/code/modules/research/nanites/nanite_programs/healing.dm @@ -95,7 +95,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 diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm index e84cd518..097a132a 100644 --- a/code/modules/surgery/organs/heart.dm +++ b/code/modules/surgery/organs/heart.dm @@ -55,6 +55,11 @@ update_icon() return 1 +/obj/item/organ/heart/proc/HeartStrengthMessage() + if(beating) + return "a healthy" + return "an unstable" + /obj/item/organ/heart/prepare_eat() var/obj/S = ..() S.icon_state = "[icon_base]-off" diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 8a6bdd92..864d5cda 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -23,6 +23,7 @@ /datum/language/aphasia, /datum/language/slime, /datum/language/xenocommon, + /datum/language/vampiric, )) healing_factor = STANDARD_ORGAN_HEALING*5 //Fast!! decay_factor = STANDARD_ORGAN_DECAY/2 diff --git a/config/game_options.txt b/config/game_options.txt index 994ab780..bb5a0752 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -92,6 +92,7 @@ PROBABILITY SECRET_EXTENDED 0 PROBABILITY DEVIL 0 PROBABILITY DEVIL_AGENTS 0 PROBABILITY CLOWNOPS 0 +PROBABILITY BLOODSUCKER 3 PROBABILITY WEREWOLF 1 ## You probably want to keep sandbox off by default for secret and random. @@ -116,6 +117,7 @@ CONTINUOUS CHANGELING CONTINUOUS WIZARD #CONTINUOUS MONKEY #CONTINUOUS WEREWOLF +CONTINUOUS BLOODSUCKER ##Note: do not toggle continuous off for these modes, as they have no antagonists and would thus end immediately! diff --git a/icons/misc/language.dmi b/icons/misc/language.dmi index dcd10a51b7de8d976b5b93b640da1c2c68bb41a6..6f6f2546d53c39bfac54b5d830cc8ea1898c0730 100644 GIT binary patch literal 4889 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 bI^h2Sd&i>l<-R%Z00000NkvXXu0mjfG>Q;w diff --git a/icons/misc/mark_icons.dmi b/icons/misc/mark_icons.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1d8472752b08a949fc90e555e66a388cd355fe25 GIT binary patch literal 433 zcmV;i0Z#sjP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWLJp@xj55`5_3}_Y&2!@=|!oPxYQ~u zxca#$xcGW<0RUN!C)X3M)gk}@0P;yhK~zYI?UlU^!Y~kppAl17jFFyfK!E zJ`%sGUpa{Ok@!{pDhEW>_7ew0)pp7O)xQf^@&dq$EhnFS@^k0FWPAvr6F&g>wKhMB bHwU-_pX_t)TAC;~00000NkvXXu0mjfG)uP& literal 0 HcmV?d00001 diff --git a/icons/mob/actions/bloodsucker.dmi b/icons/mob/actions/bloodsucker.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6e1dff1b1f7570a5a81c90baa77f32b7fe26e554 GIT binary patch literal 16840 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 literal 14922 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 diff --git a/icons/mob/inhands/weapons/melee_righthand.dmi b/icons/mob/inhands/weapons/melee_righthand.dmi index 0612e31b974fe73582d554aeeba0c8ca1adc7225..2391514d2be90340fc7824afce71e47e7f8995db 100644 GIT binary patch delta 2391 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 diff --git a/icons/obj/stake.dmi b/icons/obj/stake.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8738e5eacfaeff53710f021ba4c1d1d4f412197d GIT binary patch literal 853 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 literal 0 HcmV?d00001 diff --git a/sound/bloodsucker/BloodsuckerAlert.ogg b/sound/bloodsucker/BloodsuckerAlert.ogg new file mode 100644 index 0000000000000000000000000000000000000000..686f15bb711eae7f062f530453bf9ff42abfc0cc GIT binary patch literal 218645 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�l8GPyI#u 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
  • W_eO@b4Zr#4y}T=C86YD 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 as`5~*RL6Gms#0UyaI+b&xRW&98T$wA*=|Pw literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 161d6211..9d8a5f4f 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -558,6 +558,8 @@ #include "code\game\gamemodes\game_mode.dm" #include "code\game\gamemodes\objective.dm" #include "code\game\gamemodes\objective_items.dm" +#include "code\game\gamemodes\bloodsucker\bloodsucker.dm" +#include "code\game\gamemodes\bloodsucker\hunter.dm" #include "code\game\gamemodes\brother\traitor_bro.dm" #include "code\game\gamemodes\changeling\changeling.dm" #include "code\game\gamemodes\changeling\traitor_chan.dm" @@ -1224,6 +1226,32 @@ #include "code\modules\antagonists\blob\blob\blobs\node.dm" #include "code\modules\antagonists\blob\blob\blobs\resource.dm" #include "code\modules\antagonists\blob\blob\blobs\shield.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_flaws.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_integration.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_life.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_objectives.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_powers.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_sunlight.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_ui.dm" +#include "code\modules\antagonists\bloodsucker\datum_bloodsucker.dm" +#include "code\modules\antagonists\bloodsucker\datum_hunter.dm" +#include "code\modules\antagonists\bloodsucker\datum_vassal.dm" +#include "code\modules\antagonists\bloodsucker\items\bloodsucker_organs.dm" +#include "code\modules\antagonists\bloodsucker\items\bloodsucker_stake.dm" +#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_coffin.dm" +#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_crypt.dm" +#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_lair.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_cloak.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_feed.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_fortitude.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_gohome.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_haste.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_lunge.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_masquerade.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_mesmerize.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_trespass.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_veil.dm" +#include "code\modules\antagonists\bloodsucker\powers\v_recuperate.dm" #include "code\modules\antagonists\brainwashing\brainwashing.dm" #include "code\modules\antagonists\brother\brother.dm" #include "code\modules\antagonists\changeling\cellular_emporium.dm" @@ -1913,6 +1941,7 @@ #include "code\modules\language\ratvarian.dm" #include "code\modules\language\slime.dm" #include "code\modules\language\swarmer.dm" +#include "code\modules\language\vampiric.dm" #include "code\modules\language\xenocommon.dm" #include "code\modules\library\lib_codex_gigas.dm" #include "code\modules\library\lib_items.dm"