Review fixes and tweaks
This commit is contained in:
@@ -1,55 +0,0 @@
|
||||
|
||||
|
||||
|
||||
// For blood packs, etc. that need new functions for when they're used.
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// RECIPES: When crafting objects in craft.dm, we now record who made the item.
|
||||
///atom/movable
|
||||
// var/mob/crafter // Who made me? (via Craft skill) Used by Bloodsucker crypt furniture to know who gets to use the buildings.
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
// BLOOD BAGS! Add ability to drank em
|
||||
|
||||
|
||||
/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)
|
||||
user.visible_message("<span class='userdanger'>[user] forces [M] to drink from the [src].</span>", \
|
||||
"<span class='notice'>You put the [src] up to [M]'s mouth.</span>")
|
||||
if (!do_mob(user, M, 50))
|
||||
return
|
||||
else
|
||||
if (!do_mob(user, M, 10))
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] puts the [src] up to their mouth.</span>", \
|
||||
"<span class='notice'>You take a sip from the [src].</span>")
|
||||
|
||||
// Safety: In case you spam clicked the blood bag on yourself, and it is now empty (below will divide by zero)
|
||||
if (reagents.total_volume <= 0)
|
||||
return
|
||||
|
||||
// Taken from drinks.dm //
|
||||
var/gulp_size = 5
|
||||
var/fraction = min(gulp_size / reagents.total_volume, 1)
|
||||
//checkLiked(fraction, M) // Blood isn't food, sorry.
|
||||
reagents.reaction(M, INGEST, fraction)
|
||||
reagents.trans_to(M, gulp_size)
|
||||
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
|
||||
|
||||
..()
|
||||
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
if(istype(W, cutting_tool))
|
||||
to_chat(user, "<span class='notice'>This is a much more complex mechanical structure than you thought. You don't know where to begin cutting [src].</span>")
|
||||
return
|
||||
else if (anchored && istype(W, /obj/item/wrench)) // Can't unanchor unless owner.
|
||||
else if(anchored && istype(W, /obj/item/wrench)) // Can't unanchor unless owner.
|
||||
to_chat(user, "<span class='danger'>The coffin won't come unanchored from the floor.</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -233,13 +233,10 @@
|
||||
//. = ..() // 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)
|
||||
@@ -253,18 +250,15 @@
|
||||
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)
|
||||
@@ -272,26 +266,19 @@
|
||||
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, "<span class='notice'>You don't have enough blood to initiate the Dark Communion with [target].</span>")
|
||||
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, "<span class='notice'>You prepare to initiate [target] into your service.</span>")
|
||||
@@ -314,10 +301,8 @@
|
||||
// Still Need More Persuasion...
|
||||
else
|
||||
to_chat(user, "<span class='notice'>[target] could use [convert_progress == 1?"a little":"some"] more <i>persuasion</i>.</span>")
|
||||
|
||||
useLock = FALSE
|
||||
return
|
||||
|
||||
// Check: Mindshield & Antag
|
||||
if (!disloyalty_confirm && RequireDisloyalty(target))
|
||||
if (!do_disloyalty(user,target))
|
||||
@@ -328,7 +313,6 @@
|
||||
to_chat(user, "<span class='notice'>[target] looks ready for the <b>Dark Communion</b>.</span>")
|
||||
useLock = FALSE
|
||||
return
|
||||
|
||||
// Check: Blood
|
||||
if (user.blood_volume < convert_cost)
|
||||
to_chat(user, "<span class='notice'>You don't have enough blood to initiate the Dark Communion with [target].</span>")
|
||||
@@ -343,11 +327,9 @@
|
||||
to_chat(user, "<span class='danger'><i>The ritual has been interrupted!</i></span>")
|
||||
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, "<span class='danger'><i>The ritual has been interrupted!</i></span>")
|
||||
// useLock = FALSE
|
||||
@@ -358,16 +340,12 @@
|
||||
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
|
||||
@@ -376,7 +354,6 @@
|
||||
BP = pick(C.bodyparts)
|
||||
if (BP)
|
||||
target_string += BP.name
|
||||
|
||||
// Get Weapon
|
||||
var/obj/item/I = user.get_active_held_item()
|
||||
if (!istype(I))
|
||||
@@ -384,7 +361,6 @@
|
||||
// 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
|
||||
@@ -399,33 +375,23 @@
|
||||
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("<span class='danger'>[user] has [method_string] [target]'s [target_string] with [user.p_their()] [weapon_string]!</span>", \
|
||||
"<span class='userdanger'>[user] has [method_string] your [target_string] with [user.p_their()] [weapon_string]!</span>")
|
||||
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!
|
||||
@@ -492,38 +458,47 @@
|
||||
light_power = 3
|
||||
light_range = 0 // to 2
|
||||
density = FALSE
|
||||
anchored = TRUE
|
||||
anchored = FALSE
|
||||
var/lit = FALSE
|
||||
|
||||
///obj/structure/bloodsucker/candelabrum/is_hot() // candle.dm
|
||||
//return FALSE
|
||||
|
||||
/datum/component/nanites/Destroy()
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
|
||||
/obj/structure/bloodsucker/candelabrum/update_icon()
|
||||
icon_state = "candelabrum[lit ? "_lit" : ""]"
|
||||
|
||||
/obj/structure/bloodsucker/candelabrum/attack_hand(mob/user)
|
||||
// Unlight (only a Vamp can light it)
|
||||
var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
|
||||
if (istype(bloodsuckerdatum))
|
||||
lit = !lit
|
||||
if (lit)
|
||||
set_light(2,3,"#66FFFF")
|
||||
to_chat(user, "You wave your hand over the candelabrum. It springs to life.")
|
||||
else
|
||||
set_light(0)
|
||||
update_icon()
|
||||
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.
|
||||
var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)
|
||||
if (istype(bloodsuckerdatum))
|
||||
attack_hand(user)
|
||||
|
||||
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 = 5
|
||||
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "vampcandle", /datum/mood_event/vampcandle)
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
||||
// OTHER THINGS TO USE: HUMAN BLOOD. /obj/effect/decal/cleanable/blood
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
|
||||
/datum/action/bloodsucker/targeted/haste
|
||||
name = "Immortal Haste"
|
||||
desc = "Sprint anywhere in the blink of an eye, slipping past open doors. Those nearby may be knocked away, stunned, or left empty-handed."
|
||||
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 = 30
|
||||
@@ -67,14 +67,16 @@
|
||||
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)
|
||||
newtarget.adjustStaminaLoss(10 + 5 * level_current)
|
||||
newtarget.Stun(5 + level_current * 2)
|
||||
newtarget.adjustStaminaLoss(5 + 3 * level_current)
|
||||
if(newtarget.IsStun())
|
||||
newtarget.spin(10,1)
|
||||
if (rand(0,4))
|
||||
newtarget.drop_all_held_items()
|
||||
foundtargets += newtarget
|
||||
sleep(1)
|
||||
if (user)
|
||||
if(user)
|
||||
user.update_canmove() //Let the poor guy move again
|
||||
|
||||
/datum/action/bloodsucker/targeted/haste/DeactivatePower(mob/living/user = owner, mob/living/target)
|
||||
|
||||
@@ -66,9 +66,10 @@
|
||||
// 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.Paralyze(10,1)
|
||||
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
|
||||
|
||||
|
||||
@@ -107,8 +107,29 @@
|
||||
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, "<span class='notice'>You force [M] to drink from the [src]</span>")
|
||||
user.visible_message("<span class='userdanger'>[user] forces [M] to drink from the [src].</span>")
|
||||
if (!do_mob(user, M, 50))
|
||||
return
|
||||
else
|
||||
if (!do_mob(user, M, 10))
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You take a sip from the [src].</span>")
|
||||
user.visible_message("<span class='notice'>[user] puts the [src] up to their mouth.</span>")
|
||||
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!
|
||||
volume = 600 //its a blood bath!
|
||||
|
||||
Reference in New Issue
Block a user