-
-
Notifications
You must be signed in to change notification settings - Fork 444
/
Copy pathbloodsucker_integration.dm
130 lines (118 loc) · 5.89 KB
/
bloodsucker_integration.dm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
* OVERWRITES
*/
/datum/species/jelly/slime/spec_life(mob/living/carbon/human/user)
// Prevents Slimeperson 'gaming
if(IS_BLOODSUCKER(user))
return
. = ..()
// Used when analyzing a Bloodsucker, Masquerade will hide brain traumas
/mob/living/carbon/get_traumas()
if(!mind)
return ..()
var/datum/antagonist/bloodsucker/bloodsuckerdatum = IS_BLOODSUCKER(src)
if(bloodsuckerdatum && HAS_TRAIT(src, TRAIT_MASQUERADE))
return
. = ..()
// Used to keep track of how much Blood we've drank so far
/mob/living/get_status_tab_items()
. = ..()
if(mind)
var/datum/antagonist/bloodsucker/bloodsuckerdatum = mind.has_antag_datum(/datum/antagonist/bloodsucker)
if(bloodsuckerdatum)
. += ""
. += "Current Frenzy Enter: [FRENZY_THRESHOLD_ENTER + bloodsuckerdatum.humanity_lost * 10]"
. += "Current Frenzy Leave: [FRENZY_THRESHOLD_EXIT + bloodsuckerdatum.humanity_lost * 10]"
. += "Blood Drank: [bloodsuckerdatum.total_blood_drank]"
if(bloodsuckerdatum.has_task)
. += "Task Blood Drank: [bloodsuckerdatum.task_blood_drank]"
// INTEGRATION: Adding Procs and Datums to existing "classes" //
/mob/living/proc/HaveBloodsuckerBodyparts(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, span_warning("Without a heart, you are incapable of [displaymessage]."))
return FALSE
if(!get_bodypart(BODY_ZONE_HEAD))
if(displaymessage != "")
to_chat(src, span_warning("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, span_warning("Without a brain, you are incapable of [displaymessage]."))
return FALSE
return TRUE
// EXAMINING
/mob/living/carbon/proc/return_vamp_examine(mob/living/viewer)
if(!mind || !viewer.mind)
return ""
// Target must be a Vamp
var/datum/antagonist/bloodsucker/bloodsuckerdatum = mind.has_antag_datum(/datum/antagonist/bloodsucker)
if(!bloodsuckerdatum)
return ""
// Viewer is Target's Vassal?
if(viewer.mind.has_antag_datum(/datum/antagonist/vassal) in bloodsuckerdatum.vassals)
var/returnString = "\[<span class='warning'><EM>This is your Master!</EM></span>\]"
var/returnIcon = "[icon2html('icons/mob/vampiric.dmi', world, "bloodsucker")]"
returnString += "\n"
return returnIcon + returnString
// Viewer not a Vamp AND not the target's vassal?
if(!viewer.mind.has_antag_datum((/datum/antagonist/bloodsucker)) && !(viewer in bloodsuckerdatum.vassals))
if(!(HAS_TRAIT(viewer, TRAIT_BLOODSUCKER_HUNTER) && bloodsuckerdatum.broke_masquerade))
return ""
// Default String
var/returnString = "\[<span class='warning'><EM>[bloodsuckerdatum.return_full_name(1)]</EM></span>\]"
var/returnIcon = "[icon2html('icons/mob/vampiric.dmi', world, "bloodsucker")]"
// In Disguise (Veil)?
//if (name_override != null)
// returnString += "<span class='suicide'> ([real_name] in disguise!) </span>"
//returnString += "\n" Don't need spacers. Using . += "" in examine.dm does this on its own.
return returnIcon + returnString
/mob/living/carbon/human/proc/ReturnVassalExamine(mob/living/viewer)
if(!mind || !viewer.mind)
return ""
// Target must be a Vassal
var/datum/antagonist/vassal/vassaldatum = mind.has_antag_datum(/datum/antagonist/vassal)
if(!vassaldatum)
return ""
// Default String
var/returnString = "\[<span class='warning'>"
var/returnIcon = ""
// Vassals and Bloodsuckers recognize eachother, while Monster Hunters can see Vassals.
if(IS_BLOODSUCKER(viewer) || IS_VASSAL(viewer) || IS_MONSTERHUNTER(viewer))
// Am I Viewer's Vassal?
if(vassaldatum?.master.owner == viewer.mind)
returnString += "This [dna.species.name] bears YOUR mark!"
returnIcon = "[icon2html('icons/mob/vampiric.dmi', world, "vassal")]"
// Am I someone ELSE'S Vassal?
else if(IS_BLOODSUCKER(viewer) || IS_MONSTERHUNTER(viewer))
returnString += "This [dna.species.name] bears the mark of <span class='boldwarning'>[vassaldatum.master.return_full_name(vassaldatum.master.owner.current,TRUE)][vassaldatum.master.broke_masquerade ? " who has broken the Masquerade" : ""]</span>"
returnIcon = "[icon2html('icons/mob/vampiric.dmi', world, "vassal_grey")]"
// Are you serving the same master as I am?
else if(viewer.mind.has_antag_datum(/datum/antagonist/vassal) in vassaldatum?.master.vassals)
returnString += "[p_they(TRUE)] bears the mark of your Master"
returnIcon = "[icon2html('icons/mob/vampiric.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/mob/vampiric.dmi', world, "vassal_grey")]"
else
return ""
returnString += "</span>\]" // \n" Don't need spacers. Using . += "" in examine.dm does this on its own.
return returnIcon + returnString
/// Am I "pale" when examined? - Bloodsuckers on Masquerade will hide this.
/mob/living/carbon/human/proc/ShowAsPaleExamine(mob/living/user, blood_volume)
if(!mind)
return BLOODSUCKER_SHOW_BLOOD
var/datum/antagonist/bloodsucker/bloodsuckerdatum = mind.has_antag_datum(/datum/antagonist/bloodsucker)
// Not a Bloodsucker?
if(!bloodsuckerdatum)
return BLOODSUCKER_SHOW_BLOOD
// Blood level too low to be hidden?
if(blood_volume <= BLOOD_VOLUME_BAD(user) || bloodsuckerdatum.frenzied)
return BLOODSUCKER_SHOW_BLOOD
// Special check: Nosferatu will always be Pale Death
if(HAS_TRAIT(src, TRAIT_MASQUERADE))
return BLOODSUCKER_HIDE_BLOOD
return BLOODSUCKER_SHOW_BLOOD
// 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 // && !(bodytemperature <= get_temperature() + 2)