Skip to content

Commit

Permalink
stuff, log in desc
Browse files Browse the repository at this point in the history
fixed veil power not changing identity
fixed gohome power
fixed sol not putting bloodsuckers to sleep
fixed some malkavian clan things
fixed new coffins not opening
fixed the masquerade status alert not having a background
fixed runtime errors
fixed lunge ability
slightly adjusted the persuasion rack's bloodsucker description
the persuasion rack can no longer be walked over when secured
securing/unsecuring a bloodsucker building plays the ratchet sfx
removed the constant moodlet for bloodsuckers
bloodsuckers cant use the momento mori anymore
using targeted powers changes your mouse icon
lunging onto a dead person removes all their chest organs
  • Loading branch information
mrmanlikesbt committed Dec 22, 2024
1 parent 6c88297 commit 6951f0f
Show file tree
Hide file tree
Showing 34 changed files with 288 additions and 171 deletions.
2 changes: 1 addition & 1 deletion beestation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -1988,10 +1988,10 @@
#include "code\modules\antagonists\bloodsucker\powers\targeted\lunge.dm"
#include "code\modules\antagonists\bloodsucker\powers\targeted\mesmerize.dm"
#include "code\modules\antagonists\bloodsucker\powers\targeted\trespass.dm"
#include "code\modules\antagonists\bloodsucker\powers\tremere\_tremere.dm"
#include "code\modules\antagonists\bloodsucker\powers\tremere\auspex.dm"
#include "code\modules\antagonists\bloodsucker\powers\tremere\dominate.dm"
#include "code\modules\antagonists\bloodsucker\powers\tremere\thaumaturgey.dm"
#include "code\modules\antagonists\bloodsucker\powers\tremere\tremere_base.dm"
#include "code\modules\antagonists\bloodsucker\powers\vassal\distress.dm"
#include "code\modules\antagonists\bloodsucker\powers\vassal\recuperate.dm"
#include "code\modules\antagonists\bloodsucker\powers\vassal\vassal_fold.dm"
Expand Down
2 changes: 1 addition & 1 deletion code/__DEFINES/bloodsuckers.dm
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
///Uncomment this to enable testing of Bloodsucker features (such as vassalizing people with a mind instead of a client).
//#define BLOODSUCKER_TESTING
#define BLOODSUCKER_TESTING

/**
* Blood-level defines
Expand Down
2 changes: 1 addition & 1 deletion code/controllers/subsystem/sunlight.dm
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ SUBSYSTEM_DEF(sunlight)
vampire_warning_message = "<span class='danger'>Solar Flares will bombard the station with dangerous UV radiation in [TIME_BLOODSUCKER_DAY_WARN / 60] minutes. <b>Prepare to seek cover in a coffin or closet.</b></span>"
)
if(TIME_BLOODSUCKER_DAY_FINAL_WARN)
message_admins("BLOODSUCKER NOTICE: Daylight beginning in [TIME_BLOODSUCKER_DAY_FINAL_WARN] seconds.)")
message_admins("BLOODSUCKER NOTICE: Daylight beginning in [TIME_BLOODSUCKER_DAY_FINAL_WARN] seconds.")
warn_daylight(
danger_level = DANGER_LEVEL_SECOND_WARNING,
vampire_warning_message = "<span class='danger'>Solar Flares are about to bombard the station! You have [TIME_BLOODSUCKER_DAY_FINAL_WARN] seconds to find cover!</span>",
Expand Down
26 changes: 12 additions & 14 deletions code/datums/brain_damage/special.dm
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@

///When the trauma is removed from a mob.
/datum/brain_trauma/special/bluespace_prophet/phobetor/on_lose(silent)
for(var/obj/effect/client_image_holder/phobetor/phobetor_tears as anything in created_firsts)
for(var/obj/effect/hallucination/simple/phobetor/phobetor_tears as anything in created_firsts)
qdel(phobetor_tears)

/datum/brain_trauma/special/bluespace_prophet/phobetor/on_life(seconds_per_tick, times_fired)
Expand All @@ -293,8 +293,8 @@
if(!second_tear)
return

var/obj/effect/client_image_holder/phobetor/first = new(first_tear, owner)
var/obj/effect/client_image_holder/phobetor/second = new(second_tear, owner)
var/obj/effect/hallucination/simple/phobetor/first = new(first_tear, owner)
var/obj/effect/hallucination/simple/phobetor/second = new(second_tear, owner)

first.linked_to = second
first.seer = owner
Expand All @@ -308,7 +308,7 @@
second.name += " ([get_area(first)])"

// Delete Next Portal if it's time (it will remove its partner)
var/obj/effect/client_image_holder/phobetor/first_on_the_stack = created_firsts[1]
var/obj/effect/hallucination/simple/phobetor/first_on_the_stack = created_firsts[1]
if(created_firsts.len && world.time >= first_on_the_stack.created_on + first_on_the_stack.exist_length)
var/targetGate = first_on_the_stack
created_firsts -= targetGate
Expand Down Expand Up @@ -356,32 +356,33 @@
* The phobetor tears created by the Brain trauma.
*/

/obj/effect/client_image_holder/phobetor
/obj/effect/hallucination/simple/phobetor
name = "phobetor tear"
desc = "A subdimensional rip in reality, which gives extra-spacial passage to those who have woken from the sleepless dream."
icon = 'icons/effects/phobetor_tear.dmi'
icon = 'icons/effects/effects.dmi'
icon_state = "phobetor_tear"
image_layer = ABOVE_MOB_LAYER

/// How long this will exist for
var/exist_length = 50 SECONDS
/// The time of this tear's creation
var/created_on
/// The phobetor tear this is linked to
var/obj/effect/client_image_holder/phobetor/linked_to
var/obj/effect/hallucination/simple/phobetor/linked_to
/// The person able to see this tear.
var/mob/living/carbon/seer

/obj/effect/client_image_holder/phobetor/Initialize()
/obj/effect/hallucination/simple/phobetor/Initialize()
. = ..()
created_on = world.time

/obj/effect/client_image_holder/phobetor/Destroy()
/obj/effect/hallucination/simple/phobetor/Destroy()
if(linked_to)
linked_to.linked_to = null
QDEL_NULL(linked_to)
return ..()

/obj/effect/client_image_holder/phobetor/proc/check_location_seen(atom/subject, turf/target_turf)
/obj/effect/hallucination/simple/phobetor/proc/check_location_seen(atom/subject, turf/target_turf)
if(!target_turf)
return FALSE
if(!isturf(target_turf))
Expand All @@ -398,12 +399,9 @@
return TRUE
return FALSE

/obj/effect/client_image_holder/phobetor/attack_hand(mob/living/user, list/modifiers)
/obj/effect/hallucination/simple/phobetor/attack_hand(mob/living/user, list/modifiers)
if(user != seer || !linked_to)
return
if(user.loc != src.loc)
to_chat(user, "Step into the Tear before using it.")
return
for(var/obj/item/implant/tracking/imp in user.implants)
if(imp)
to_chat(user, "<span class='warning'>[imp] gives you the sense that you're being watched.</span>")
Expand Down
67 changes: 22 additions & 45 deletions code/game/objects/structures/bloodsucker_crypt.dm
Original file line number Diff line number Diff line change
Expand Up @@ -20,20 +20,24 @@
. += "<span class='cult'>It is unsecured. Click on [src] while in your lair to secure it in place to get its full potential</span>"
return
. += "<span class='cult'>[bloodsucker_desc]</span>"
if(IS_VASSAL(user) && vassal_desc)
if(IS_VASSAL(user) && vassal_desc != "")
. += "<span class='cult'>[vassal_desc]</span>"
if(IS_CURATOR(user) && curator_desc)
. += "<span class='cult>[curator_desc]</span"
if(IS_CURATOR(user) && curator_desc != "")
. += "<span class='cult>[curator_desc]</span>"

/// This handles bolting down the structure.
/obj/structure/bloodsucker/proc/bolt(mob/user)
to_chat(user, "<span class='danger'>You have secured [src] in place.</span>")
to_chat(user, "<span class='announce'>* Bloodsucker Tip: Examine [src] to understand how it functions!</span>")
user.playsound_local(null, 'sound/items/ratchet.ogg', 70, FALSE, pressure_affected = FALSE)
set_anchored(TRUE)
owner = user

/// This handles unbolting of the structure.
/obj/structure/bloodsucker/proc/unbolt(mob/user)
to_chat(user, "<span class='danger'>You have unsecured [src].</span>")
user.playsound_local(null, 'sound/items/ratchet.ogg', 70, FALSE, pressure_affected = FALSE)
set_anchored(FALSE)
owner = null

/obj/structure/bloodsucker/attackby(obj/item/item, mob/living/user, params)
Expand Down Expand Up @@ -66,7 +70,6 @@
return FALSE
switch(secure_response)
if("Yes")
user.playsound_local(null, 'sound/items/ratchet.ogg', 70, FALSE, pressure_affected = FALSE)
bolt(user)
return FALSE
return FALSE
Expand Down Expand Up @@ -96,8 +99,8 @@
buckle_lying = 180
ghost_desc = "This is a Vassal rack, which allows Bloodsuckers to thrall crewmembers into loyal minions."
bloodsucker_desc = "This is the Vassal rack, which allows you to thrall crewmembers into loyal minions in your service.\n\
Simply click and hold on a victim, and then drag their sprite on the vassal rack. Right-click on the vassal rack to unbuckle them.\n\
To convert into a Vassal, repeatedly click on the persuasion rack. The time required scales with the tool in your off hand. This costs Blood to do.\n\
Simply click and hold on a victim, and then drag their sprite on the vassal rack. Click on the persuasion rack to unbuckle them.\n\
To convert into a Vassal, repeatedly click on the persuasion rack, without being on help intent. The time required scales with the tool in your off hand, (sharp tools are better!). This costs Blood to do.\n\
Vassals can be turned into special ones by continuing to torture them once converted."
vassal_desc = "This is the vassal rack, which allows your master to thrall crewmembers into their minions.\n\
Aid your master in bringing their victims here and keeping them secure.\n\
Expand All @@ -119,16 +122,6 @@
new /obj/item/stack/rods(loc, 4)
qdel(src)

/obj/structure/bloodsucker/vassalrack/bolt()
. = ..()
density = FALSE
anchored = TRUE

/obj/structure/bloodsucker/vassalrack/unbolt()
. = ..()
density = TRUE
anchored = FALSE

/obj/structure/bloodsucker/vassalrack/MouseDrop_T(atom/movable/movable_atom, mob/user)
var/mob/living/living_target = movable_atom
if(!anchored && IS_BLOODSUCKER(user))
Expand All @@ -143,21 +136,9 @@
to_chat(user, "<span class='danger'>You realize that this machine cannot be vassalized, therefore it is useless to buckle them.</span>")
return
if(do_after(user, 5 SECONDS, living_target))
density = FALSE // Temporarily set density to false so the target is actually on the rack
attach_victim(living_target, user)

/// Attempt Release (Owner vs Non Owner)
/obj/structure/bloodsucker/vassalrack/attack_hand(mob/user, modifiers)
. = ..()
if(. == COMPONENT_CANCEL_ATTACK_CHAIN)
return
if(!has_buckled_mobs() || !isliving(user))
return
var/mob/living/carbon/buckled_carbons = pick(buckled_mobs)
if(buckled_carbons)
if(user == owner)
unbuckle_mob(buckled_carbons)
else
user_unbuckle_mob(buckled_carbons, user)
density = TRUE

/**
* Attempts to buckle target into the vassalrack
Expand All @@ -172,7 +153,6 @@

playsound(loc, 'sound/effects/pop_expl.ogg', 25, 1)
update_appearance(UPDATE_ICON)
density = TRUE

// Set up Torture stuff now
convert_progress = 3
Expand Down Expand Up @@ -208,7 +188,6 @@
if(!.)
return FALSE
visible_message("<span class='danger'>[buckled_mob][buckled_mob.stat == DEAD ? "'s corpse" : ""] slides off of the rack.</span>")
density = FALSE
buckled_mob.Paralyze(2 SECONDS)
update_appearance(UPDATE_ICON)
return TRUE
Expand All @@ -217,21 +196,19 @@
. = ..()
if(!.)
return FALSE
var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(/datum/antagonist/bloodsucker)
// Is there anyone on the rack & If so, are they being tortured?
if(!has_buckled_mobs())
return FALSE

var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(/datum/antagonist/bloodsucker)
var/mob/living/carbon/buckled_carbons = pick(buckled_mobs)
// If I'm not a Bloodsucker, try to unbuckle them.
if(!istype(bloodsuckerdatum))
user_unbuckle_mob(buckled_carbons, user)
return
if(!bloodsuckerdatum.my_clan)
to_chat(user, "<span class='warning'>You can't vassalize people until you enter a Clan (Through your Antagonist UI button)</span>")
user.balloon_alert(user, "join a clan first!")
return

if(user.a_intent == INTENT_HELP)
if(istype(bloodsuckerdatum))
unbuckle_mob(buckled_carbons)
return FALSE
else
user_unbuckle_mob(buckled_carbons, user)
return
/// If I'm not a Bloodsucker, try to unbuckle them.
var/datum/antagonist/vassal/vassaldatum = IS_VASSAL(buckled_carbons)
// Are they our Vassal?
if(vassaldatum && (vassaldatum in bloodsuckerdatum.vassals))
Expand Down Expand Up @@ -424,12 +401,10 @@

/obj/structure/bloodsucker/candelabrum/bolt()
. = ..()
set_anchored(TRUE)
density = TRUE

/obj/structure/bloodsucker/candelabrum/unbolt()
. = ..()
set_anchored(FALSE)
density = FALSE

/obj/structure/bloodsucker/candelabrum/attack_hand(mob/living/user, list/modifiers)
Expand Down Expand Up @@ -526,7 +501,9 @@
if(!anchored)
to_chat(user, "<span class='announce'>[src] is not bolted to the ground!</span>")
return
density = FALSE
. = ..()
density = TRUE
user.visible_message(
"<span class='notice'>[user] sits down on [src].</span>",
"<span class='boldnotice'>You sit down onto [src].</span>",
Expand Down
13 changes: 12 additions & 1 deletion code/game/objects/structures/crates_lockers/crates/coffins.dm
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
azimuth_angle_2 = 180
door_anim_time = 5
door_hinge = 5

/obj/structure/closet/crate/coffin/examine(mob/user)
. = ..()
if(user == resident)
Expand All @@ -25,7 +26,7 @@
/obj/structure/closet/crate/coffin/blackcoffin
name = "black coffin"
desc = "For those departed who are not so dear."
icon_state = "coffin"
icon_state = "blackcoffin"
icon = 'icons/bloodsuckers/vamp_obj.dmi'
open_sound = 'sound/bloodsuckers/coffin_open.ogg'
close_sound = 'sound/bloodsuckers/coffin_close.ogg'
Expand All @@ -35,6 +36,7 @@
material_drop = /obj/item/stack/sheet/iron
material_drop_amount = 2
armor_type = /datum/armor/blackcoffin
door_anim_time = 0

/datum/armor/blackcoffin
melee = 50
Expand All @@ -57,6 +59,10 @@
material_drop = /obj/item/stack/sheet/iron
material_drop_amount = 2
armor_type = /datum/armor/securecoffin
door_anim_angle = 140
azimuth_angle_2 = 180
door_anim_time = 5
door_hinge = 5

/datum/armor/securecoffin
melee = 35
Expand All @@ -79,6 +85,7 @@
material_drop = /obj/item/food/meat/slab/human
material_drop_amount = 3
armor_type = /datum/armor/meatcoffin
door_anim_time = 0

/datum/armor/meatcoffin
melee = 70
Expand All @@ -101,6 +108,10 @@
material_drop = /obj/item/stack/sheet/iron
material_drop_amount = 5
armor_type = /datum/armor/metalcoffin
door_anim_angle = 140
azimuth_angle_2 = 180
door_anim_time = 5
door_hinge = 5

/datum/armor/metalcoffin
melee = 40
Expand Down
2 changes: 1 addition & 1 deletion code/modules/antagonists/bloodsucker/clans/_clan.dm
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@
options[initial(vassaldatums.name)] = vassaldatums

var/datum/radial_menu_choice/option = new
option.image = image(icon = 'icons/bloodsuckers/bloodsucker_icons.dmi', icon_state = initial(vassaldatums.vassal_hud_name))
option.image = image(icon = 'icons/mob/hud.dmi', icon_state = initial(vassaldatums.vassal_hud_name))
option.info = "[initial(vassaldatums.name)] - ["<span class='boldnotice'>[initial(vassaldatums.vassal_description)]</span>"]"
radial_display[initial(vassaldatums.name)] = option

Expand Down
6 changes: 3 additions & 3 deletions code/modules/antagonists/bloodsucker/clans/malkavian.dm
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
var/mob/living/carbon/carbon_owner = bloodsuckerdatum.owner.current
if(istype(carbon_owner))
carbon_owner.gain_trauma(/datum/brain_trauma/mild/hallucinations, TRAUMA_RESILIENCE_ABSOLUTE)
carbon_owner.gain_trauma(/datum/brain_trauma/special/bluespace_prophet, TRAUMA_RESILIENCE_ABSOLUTE)
carbon_owner.gain_trauma(/datum/brain_trauma/special/bluespace_prophet/phobetor, TRAUMA_RESILIENCE_ABSOLUTE)
owner_datum.owner.current.update_sight()

bloodsuckerdatum.owner.current.playsound_local(get_turf(bloodsuckerdatum.owner.current), 'sound/ambience/antag/creepalert.ogg', 80, FALSE, pressure_affected = FALSE, use_reverb = FALSE)
Expand All @@ -32,15 +32,15 @@
var/mob/living/carbon/carbon_owner = bloodsuckerdatum.owner.current
if(istype(carbon_owner))
carbon_owner.cure_trauma_type(/datum/brain_trauma/mild/hallucinations, TRAUMA_RESILIENCE_ABSOLUTE)
carbon_owner.cure_trauma_type(/datum/brain_trauma/special/bluespace_prophet, TRAUMA_RESILIENCE_ABSOLUTE)
carbon_owner.cure_trauma_type(/datum/brain_trauma/special/bluespace_prophet/phobetor, TRAUMA_RESILIENCE_ABSOLUTE)
bloodsuckerdatum.owner.current.update_sight()
return ..()

/datum/bloodsucker_clan/malkavian/handle_clan_life(datum/antagonist/bloodsucker/source)
. = ..()
if(prob(85) || bloodsuckerdatum.owner.current.stat != CONSCIOUS || HAS_TRAIT(bloodsuckerdatum.owner.current, TRAIT_MASQUERADE))
return
var/message = pick(strings("malkavian_revelations.json", "revelations", "fulp_modules/strings/bloodsuckers"))
var/message = pick(strings("malkavian_revelations.json", "revelations", "strings"))
INVOKE_ASYNC(bloodsuckerdatum.owner.current, /atom/movable/proc/say, message, , , , , , CLAN_MALKAVIAN)

/datum/bloodsucker_clan/malkavian/on_favorite_vassal(datum/antagonist/bloodsucker/source, datum/antagonist/vassal/vassaldatum)
Expand Down
Loading

0 comments on commit 6951f0f

Please sign in to comment.