|
38 | 38 | var/mob/living/carbon/human/user = target
|
39 | 39 | var/mob/living/carbon/human/victim = select_target()
|
40 | 40 |
|
41 |
| - user.visible_message(span_danger("[user] bites down on [victim]'s neck!"), vision_distance = COMBAT_MESSAGE_RANGE) |
42 |
| - |
| 41 | + var/datum/antagonist/vampire/vamp_datum = user.mind.has_antag_datum(/datum/antagonist/vampire) |
43 | 42 | var/datum/callback/checks_callback = CALLBACK(src, PROC_REF(can_bite), user, victim)
|
44 |
| - if(!do_after(user, victim, 3 SECONDS, DO_IGNORE_HELD_ITEM|DO_IGNORE_SLOWDOWNS|DO_PUBLIC, extra_checks = checks_callback, display = image('goon/icons/actions.dmi', "bite"))) |
45 |
| - return FALSE |
| 43 | + |
| 44 | + if(vamp_datum.thirst_stage != THIRST_STAGE_BLOODLUST) |
| 45 | + if(!do_after(user, victim, 3 SECONDS, DO_IGNORE_HELD_ITEM|DO_IGNORE_SLOWDOWNS|DO_PUBLIC, extra_checks = checks_callback, display = image('goon/icons/actions.dmi', "bite"))) |
| 46 | + return FALSE |
46 | 47 |
|
47 | 48 | . = ..()
|
48 | 49 |
|
49 | 50 | spawn(-1)
|
| 51 | + user.visible_message(span_danger("<b>[user]</b> bites down on <b>[victim]</b>'s neck."), vision_distance = COMBAT_MESSAGE_RANGE) |
| 52 | + |
50 | 53 | ADD_TRAIT(user, TRAIT_MUTE, ref(src))
|
| 54 | + ADD_TRAIT(victim, TRAIT_MUTE, ref(src)) |
| 55 | + var/obj/item/bodypart/head/head = victim.get_bodypart(BODY_ZONE_HEAD) |
| 56 | + head.create_wound_easy(/datum/wound/neck_bite, 10) |
| 57 | + |
51 | 58 | var/image/succ_image = image('goon/icons/actions.dmi', "blood")
|
52 | 59 | while(TRUE)
|
53 | 60 | if(!can_bite(user, victim))
|
54 | 61 | break
|
55 | 62 |
|
56 | 63 | if(!do_after(user, victim, 1 SECOND, DO_IGNORE_HELD_ITEM|DO_IGNORE_SLOWDOWNS|DO_PUBLIC, extra_checks = checks_callback, display = succ_image))
|
57 |
| - user.visible_message(span_notice("[user] removes [p_their()] teeth from [victim]'s neck.")) |
| 64 | + user.visible_message(span_notice("<b>[user]</b> removes [p_their()] teeth from </b>[victim]</b>'s neck.")) |
58 | 65 | break
|
59 | 66 |
|
60 | 67 | siphon_blood(user, victim)
|
61 | 68 |
|
| 69 | + REMOVE_TRAIT(victim, TRAIT_MUTE, ref(src)) |
62 | 70 | REMOVE_TRAIT(user, TRAIT_MUTE, ref(src))
|
63 | 71 |
|
64 | 72 | /datum/action/cooldown/neck_bite/proc/siphon_blood(mob/living/carbon/human/user, mob/living/carbon/human/victim)
|
65 |
| - user.visible_message(span_danger("[user] siphons blood from [victim]'s neck!"), vision_distance = COMBAT_MESSAGE_RANGE, ignored_mobs = victim) |
| 73 | + user.visible_message(span_danger("<b>[user]</b> siphons blood from <b>[victim]</b>'s neck."), vision_distance = COMBAT_MESSAGE_RANGE, ignored_mobs = victim) |
66 | 74 | if(victim.stat == CONSCIOUS)
|
67 | 75 | to_chat(victim, span_danger("You can feel blood draining from your neck."))
|
68 | 76 |
|
|
74 | 82 | victim.adjustBloodVolume(-VAMPIRE_BLOOD_DRAIN_RATE)
|
75 | 83 | user.adjustBloodVolumeUpTo(VAMPIRE_BLOOD_DRAIN_RATE, BLOOD_VOLUME_NORMAL + 100)
|
76 | 84 |
|
| 85 | + if(user.nutrition < NUTRITION_LEVEL_FULL) |
| 86 | + user.set_nutrition(min(user.nutrition + 10, NUTRITION_LEVEL_FULL)) |
| 87 | + user.satiety = min(user.satiety + 20, MAX_SATIETY) |
| 88 | + |
| 89 | + user.heal_overall_damage(2.5, 2.5, BODYTYPE_ORGANIC) |
| 90 | + |
77 | 91 | var/datum/antagonist/vampire/vamp_datum = user.mind.has_antag_datum(/datum/antagonist/vampire)
|
78 | 92 | vamp_datum.thirst_level.remove_points(VAMPIRE_BLOOD_DRAIN_RATE * VAMPIRE_BLOOD_THIRST_EXCHANGE_COEFF)
|
79 | 93 | vamp_datum.update_thirst_stage()
|
80 | 94 |
|
81 |
| - var/had_victim = vamp_datum.last_victim_ref |
82 |
| - vamp_datum.last_victim_ref = WEAKREF(victim) |
83 |
| - if(!had_victim) |
| 95 | + if(!(WEAKREF(victim) in vamp_datum.past_victim_refs)) |
| 96 | + vamp_datum.past_victim_refs += WEAKREF(victim) |
84 | 97 | var/datum/action/cooldown/blood_track/track = locate() in owner.actions
|
85 | 98 | if(track)
|
86 | 99 | track.build_all_button_icons(UPDATE_BUTTON_STATUS)
|
|
140 | 153 | *error_string_ptr = "You aren't holding anyone."
|
141 | 154 | return null
|
142 | 155 |
|
| 156 | + var/datum/antagonist/vampire/vamp_datum = user.mind.has_antag_datum(/datum/antagonist/vampire) |
| 157 | + |
| 158 | + var/needed_grab = vamp_datum.thirst_stage == THIRST_STAGE_BLOODLUST ? GRAB_AGGRESSIVE : GRAB_NECK |
| 159 | + |
143 | 160 | for(var/obj/item/hand_item/grab/grab in user.active_grabs)
|
144 | 161 | var/mob/living/carbon/human/potential_victim = grab.affecting
|
145 | 162 | if(!ishuman(potential_victim) || ismonkey(potential_victim))
|
146 | 163 | if(ismob(potential_victim) && error_string_ptr)
|
147 | 164 | *error_string_ptr = "You cannot feast on [potential_victim]."
|
148 | 165 | continue
|
149 | 166 |
|
150 |
| - if((grab.current_grab.damage_stage < GRAB_NECK)) |
| 167 | + if((grab.current_grab.damage_stage < needed_grab)) |
151 | 168 | if(error_string_ptr)
|
152 | 169 | *error_string_ptr = "You need a stronger grip on [potential_victim]."
|
153 | 170 | continue
|
|
0 commit comments