Creep fluff completely rewritten (#42675)

* hang in there!

* Apply suggestions from code review - rewrite P1

Co-Authored-By: tralezab <40974010+tralezab@users.noreply.github.com>

* most creep > obsessed - rewrite P2

* removes creep_inlove, last edit to greet
This commit is contained in:
tralezab
2019-02-08 08:26:41 -08:00
committed by moo
parent 7acd3a4f47
commit 46e3894bb2
11 changed files with 77 additions and 86 deletions

View File

@@ -58,7 +58,7 @@
#define ANTAG_HUD_CLOCKWORK 22
#define ANTAG_HUD_BROTHER 23
#define ANTAG_HUD_HIVE 24
#define ANTAG_HUD_CREEP 25
#define ANTAG_HUD_OBSESSED 25
// Notification action types
#define NOTIFY_JUMP "jump"

View File

@@ -28,7 +28,7 @@
#define ROLE_BRAINWASHED "Brainwashed Victim"
#define ROLE_OVERTHROW "Syndicate Mutineer"
#define ROLE_HIVE "Hivemind Host"
#define ROLE_CREEP "Creep"
#define ROLE_OBSESSED "Obsessed"
#define ROLE_SENTIENCE "Sentience Potion Spawn"
#define ROLE_MIND_TRANSFER "Mind Transfer Potion"
#define ROLE_POSIBRAIN "Posibrain"
@@ -53,7 +53,7 @@ GLOBAL_LIST_INIT(special_roles, list(
ROLE_CULTIST = /datum/game_mode/cult,
ROLE_BLOB,
ROLE_NINJA,
ROLE_CREEP,
ROLE_OBSESSED,
ROLE_MONKEY = /datum/game_mode/monkey,
ROLE_REVENANT,
ROLE_ABDUCTOR,

View File

@@ -37,7 +37,6 @@
#define STATUS_EFFECT_GOOD_MUSIC /datum/status_effect/good_music
#define STATUS_EFFECT_REGENERATIVE_CORE /datum/status_effect/regenerative_core
#define STATUS_EFFECT_CREEP /datum/status_effect/creep //you feel fuckin great around your obsession
/////////////
// DEBUFFS //

View File

@@ -1,22 +1,22 @@
/datum/brain_trauma/special/creep
name = "Erotomania"
/datum/brain_trauma/special/obsessed
name = "Psychotic Schizophrenia"
desc = "Patient has a subtype of delusional disorder, becoming irrationally attached to someone."
scan_desc = "erotomaniac delusions"
scan_desc = "psychotic schizophrenic delusions"
gain_text = "If you see this message, make a github issue report. The trauma initialized wrong."
lose_text = "<span class='warning'>You no longer feel so attached.</span>"
lose_text = "<span class='warning'>The voices in your head fall silent.</span>"
can_gain = TRUE
random_gain = FALSE
resilience = TRAUMA_RESILIENCE_SURGERY
var/mob/living/obsession
var/datum/objective/spendtime/attachedcreepobj
var/datum/antagonist/creep/antagonist
var/datum/objective/spendtime/attachedobsessedobj
var/datum/antagonist/obsessed/antagonist
var/viewing = FALSE //it's a lot better to store if the owner is watching the obsession than checking it twice between two procs
var/total_time_creeping = 0 //just for roundend fun
var/time_spent_away = 0
var/obsession_hug_count = 0
/datum/brain_trauma/special/creep/on_gain()
/datum/brain_trauma/special/obsessed/on_gain()
//setup, linking, etc//
if(!obsession)//admins didn't set one
@@ -24,17 +24,16 @@
if(!obsession)//we didn't find one
lose_text = ""
qdel(src)
gain_text = "<span class='warning'>You feel a strange attachment to [obsession].</span>"
owner.apply_status_effect(STATUS_EFFECT_INLOVE, obsession)
owner.mind.add_antag_datum(/datum/antagonist/creep)
antagonist = owner.mind.has_antag_datum(/datum/antagonist/creep)
gain_text = "<span class='warning'>You hear a sickening, raspy voice in your head. It wants one small task of you...</span>"
owner.mind.add_antag_datum(/datum/antagonist/obsessed)
antagonist = owner.mind.has_antag_datum(/datum/antagonist/obsessed)
antagonist.trauma = src
..()
//antag stuff//
antagonist.forge_objectives(obsession.mind)
antagonist.greet()
/datum/brain_trauma/special/creep/on_life()
/datum/brain_trauma/special/obsessed/on_life()
if(!obsession || obsession.stat == DEAD)
viewing = FALSE//important, makes sure you no longer stutter when happy if you murdered them while viewing
return
@@ -50,12 +49,12 @@
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "creeping", /datum/mood_event/creeping, obsession.name)
total_time_creeping += 20
time_spent_away = 0
if(attachedcreepobj)//if an objective needs to tick down, we can do that since traumas coexist with the antagonist datum
attachedcreepobj.timer -= 20 //mob subsystem ticks every 2 seconds(?), remove 20 deciseconds from the timer. sure, that makes sense.
if(attachedobsessedobj)//if an objective needs to tick down, we can do that since traumas coexist with the antagonist datum
attachedobsessedobj.timer -= 20 //mob subsystem ticks every 2 seconds(?), remove 20 deciseconds from the timer. sure, that makes sense.
else
out_of_view()
/datum/brain_trauma/special/creep/proc/out_of_view()
/datum/brain_trauma/special/obsessed/proc/out_of_view()
time_spent_away += 20
if(time_spent_away > 1800) //3 minutes
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "creeping", /datum/mood_event/notcreepingsevere, obsession.name)
@@ -63,10 +62,9 @@
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "creeping", /datum/mood_event/notcreeping, obsession.name)
/datum/brain_trauma/special/creep/on_lose()
..()
owner.remove_status_effect(STATUS_EFFECT_INLOVE)
owner.mind.remove_antag_datum(/datum/antagonist/creep)
owner.mind.remove_antag_datum(/datum/antagonist/obsessed)
/datum/brain_trauma/special/creep/on_say(message)
/datum/brain_trauma/special/obsessed/on_say(message)
if(!viewing)
return message
var/choked_up
@@ -78,11 +76,11 @@
return ""
return message
/datum/brain_trauma/special/creep/on_hug(mob/living/hugger, mob/living/hugged)
/datum/brain_trauma/special/obsessed/on_hug(mob/living/hugger, mob/living/hugged)
if(hugged == obsession)
obsession_hug_count++
/datum/brain_trauma/special/creep/proc/social_interaction()
/datum/brain_trauma/special/obsessed/proc/social_interaction()
var/fail = FALSE //whether you can finish a sentence while doing it
owner.stuttering = max(3, owner.stuttering)
owner.blur_eyes(10)
@@ -106,7 +104,7 @@
return fail
/datum/brain_trauma/special/creep/proc/find_obsession()
/datum/brain_trauma/special/obsessed/proc/find_obsession()
var/chosen_victim
var/list/possible_targets = list()
var/list/viable_minds = list()

View File

@@ -17,7 +17,7 @@
else if(isobserver(user))
to_chat(user, "<span class='notice'>It is the [family_name] family heirloom, belonging to [owner].</span>")
else
var/datum/antagonist/creep/creeper = user.mind.has_antag_datum(/datum/antagonist/creep)
var/datum/antagonist/obsessed/creeper = user.mind.has_antag_datum(/datum/antagonist/obsessed)
if(creeper && creeper.trauma.obsession == owner)
to_chat(user, "<span class='nicegreen'>This must be [owner]'s family heirloom! It smells just like them...</span>")

View File

@@ -28,7 +28,7 @@ GLOBAL_LIST_INIT(huds, list(
ANTAG_HUD_CLOCKWORK = new/datum/atom_hud/antag(),
ANTAG_HUD_BROTHER = new/datum/atom_hud/antag/hidden(),
ANTAG_HUD_HIVE = new/datum/atom_hud/antag/hidden(),
ANTAG_HUD_CREEP = new/datum/atom_hud/antag/hidden()
ANTAG_HUD_OBSESSED = new/datum/atom_hud/antag/hidden()
))
/datum/atom_hud

View File

@@ -148,16 +148,14 @@
timeout = 1200
/datum/mood_event/notcreeping
description = "<span class='warning'>I sure wish I was around my obsession...</span>\n"
description = "<span class='warning'>The voices are not happy, and they painfully contort my thoughts into getting back on task.</span>\n"
mood_change = -6
timeout = 30
hidden = TRUE
/datum/mood_event/notcreeping/add_effects(name)
description = "<span class='warning'>I sure wish I was around [name]...</span>\n"
/datum/mood_event/notcreepingsevere//not hidden since it's so severe
description = "<span class='boldwarning'>OBSESSIONNNN WHERE ARE YOUUUUUUUUUUUUU?!</span>\n"
description = "<span class='boldwarning'>THEY NEEEEEEED OBSESSIONNNN!!</span>\n"
mood_change = -30
timeout = 30
@@ -166,7 +164,7 @@
for(var/i in 1 to rand(3,5))
unstable += copytext(name, -1)
var/unhinged = uppertext(unstable.Join(""))//example Tinea Luxor > TINEA LUXORRRR (with randomness in how long that slur is)
description = "<span class='boldwarning'>[unhinged] WHERE ARE YOUUUUUUUUUUUUU?!</span>\n"
description = "<span class='boldwarning'>THEY NEEEEEEED [unhinged]!!</span>\n"
/datum/mood_event/idiot_shower
description = "<span class='warning'>I showered with my clothes on, I'm a fucking idiot.</span>\n"

View File

@@ -63,15 +63,10 @@
special_screen_replace = FALSE
/datum/mood_event/creeping
description = "<span class='greentext'>I'm so close to my obsession and I never want this to end.</span>\n" //creeps get it when they are around their obsession
description = "<span class='greentext'>The voices have released their hooks on my mind! I feel free again!</span>\n" //creeps get it when they are around their obsession
mood_change = 18
timeout = 30
hidden = TRUE
special_screen_obj = "creep_inlove"
special_screen_replace = FALSE
/datum/mood_event/creeping/add_effects(name)
description = "<span class='greentext'>I'm so close to [name] and I NEVER want this to end.</span>\n"
/datum/mood_event/revolution
description = "<span class='nicegreen'>VIVA LA REVOLUTION!</span>\n"

View File

@@ -1,14 +1,14 @@
/datum/antagonist/creep
name = "Creep"
/datum/antagonist/obsessed
name = "Obsessed"
show_in_antagpanel = TRUE
antagpanel_category = "Other"
job_rank = ROLE_CREEP
job_rank = ROLE_OBSESSED
show_name_in_check_antagonists = TRUE
roundend_category = "creeps"
roundend_category = "obsessed"
silent = TRUE //not actually silent, because greet will be called by the trauma anyway.
var/datum/brain_trauma/special/creep/trauma
var/datum/brain_trauma/special/obsessed/trauma
/datum/antagonist/creep/admin_add(datum/mind/new_owner,mob/admin)
/datum/antagonist/obsessed/admin_add(datum/mind/new_owner,mob/admin)
var/mob/living/carbon/C = new_owner.current
if(!istype(C))
to_chat(admin, "[roundend_category] come from a brain trauma, so they need to at least be a carbon!")
@@ -19,32 +19,33 @@
message_admins("[key_name_admin(admin)] made [key_name_admin(new_owner)] into [name].")
log_admin("[key_name(admin)] made [key_name(new_owner)] into [name].")
//PRESTO FUCKIN MAJESTO
C.gain_trauma(/datum/brain_trauma/special/creep)//ZAP
C.gain_trauma(/datum/brain_trauma/special/obsessed)//ZAP
/datum/antagonist/creep/greet()
/datum/antagonist/obsessed/greet()
owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/creepalert.ogg', 100, FALSE, pressure_affected = FALSE)
to_chat(owner, "<span class='boldannounce'>You are the Creep!</span>")
to_chat(owner, "<B>They would call it an obsession. They would call you crazy, because they don't understand your unrequited love.<br>All you know is that you love [trauma.obsession]. And you. will. show them.</B>")
to_chat(owner, "<B>I will surely go insane if I don't spend enough time around [trauma.obsession], but when i'm near them too long it gets too difficult to speak properly, making me look like a CREEP!</B>")
to_chat(owner, "<span class='boldannounce'>The gods would like to remind you that this role, as with all other antags, does not allow you to break ANY server rules, especially Rule 8 (These rules being listed from the \"Rules\" button at the top right of your mind's screen). Feel free to murder and pillage just like any other antag, though.</span>")
to_chat(owner, "<span class='boldannounce'>You are the Obsessed!</span>")
to_chat(owner, "<B>The Voices have reached out to you, and are using you to complete their evil deeds.</B>")
to_chat(owner, "<B>You don't know their connection, but The Voices compel you to stalk [trauma.obsession], forcing them into a state of constant paranoia.</B>")
to_chat(owner, "<B>The Voices will retaliate if you fail to complete your tasks or spend too long away from your target.</B>")
to_chat(owner, "<span class='boldannounce'>This role does NOT enable you to otherwise surpass what's deemed creepy behavior per the rules.</span>")//ironic if you know the history of the antag
owner.announce_objectives()
/datum/antagonist/creep/Destroy()
/datum/antagonist/obsessed/Destroy()
if(trauma)
qdel(trauma)
. = ..()
/datum/antagonist/creep/apply_innate_effects(mob/living/mob_override)
/datum/antagonist/obsessed/apply_innate_effects(mob/living/mob_override)
var/mob/living/M = mob_override || owner.current
update_creep_icons_added(M)
update_obsession_icons_added(M)
/datum/antagonist/creep/remove_innate_effects(mob/living/mob_override)
/datum/antagonist/obsessed/remove_innate_effects(mob/living/mob_override)
var/mob/living/M = mob_override || owner.current
update_creep_icons_removed(M)
update_obsession_icons_removed(M)
/datum/antagonist/creep/proc/forge_objectives(var/datum/mind/obsessionmind)
/datum/antagonist/obsessed/proc/forge_objectives(var/datum/mind/obsessionmind)
var/list/objectives_left = list("spendtime", "polaroid", "hug")
var/datum/objective/assassinate/creep/kill = new
var/datum/objective/assassinate/obsessed/kill = new
kill.owner = owner
kill.target = obsessionmind
var/datum/quirk/family_heirloom/family_heirloom
@@ -94,10 +95,10 @@
for(var/datum/objective/O in objectives)
O.update_explanation_text()
/datum/antagonist/creep/roundend_report_header()
return "<span class='header'>Someone became a creep!</span><br>"
/datum/antagonist/obsessed/roundend_report_header()
return "<span class='header'>Someone became obsessed!</span><br>"
/datum/antagonist/creep/roundend_report()
/datum/antagonist/obsessed/roundend_report()
var/list/report = list()
if(!owner)
@@ -131,14 +132,14 @@
///CREEPY objectives (few chosen per obsession)///
//////////////////////////////////////////////////
/datum/objective/assassinate/creep //just a creepy version of assassinate
/datum/objective/assassinate/obsessed //just a creepy version of assassinate
/datum/objective/assassinate/creep/update_explanation_text()
/datum/objective/assassinate/obsessed/update_explanation_text()
..()
if(target && target.current)
explanation_text = "Murder [target.name], the [!target_role_type ? target.assigned_role : target.special_role]."
else
message_admins("WARNING! [ADMIN_LOOKUPFLW(owner)] creep objectives forged without an obsession!")
message_admins("WARNING! [ADMIN_LOOKUPFLW(owner)] obsessed objectives forged without an obsession!")
explanation_text = "Free Objective"
/datum/objective/assassinate/jealous //assassinate, but it changes the target to someone else in the previous target's department. cool, right?
@@ -175,8 +176,8 @@
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
if(!H.mind)
continue
if(!SSjob.GetJob(H.mind.assigned_role) || H == oldmind.current || H.mind.has_antag_datum(/datum/antagonist/creep))
continue //the jealousy target has to have a job, and not be the obsession or creep.
if(!SSjob.GetJob(H.mind.assigned_role) || H == oldmind.current || H.mind.has_antag_datum(/datum/antagonist/obsessed))
continue //the jealousy target has to have a job, and not be the obsession or obsessed.
all_coworkers += H.mind
//this won't be called often thankfully.
if(H.mind.assigned_role in GLOB.security_positions)
@@ -201,16 +202,16 @@
target = pick(all_coworkers)
return oldmind
/datum/objective/spendtime //spend some time around someone, handled by the creep trauma since that ticks
/datum/objective/spendtime //spend some time around someone, handled by the obsessed trauma since that ticks
name = "spendtime"
var/timer = 1800 //5 minutes
/datum/objective/spendtime/update_explanation_text()
if(timer == initial(timer))//just so admins can mess with it
timer += pick(-600, 0)
var/datum/antagonist/creep/creeper = owner.has_antag_datum(/datum/antagonist/creep)
var/datum/antagonist/obsessed/creeper = owner.has_antag_datum(/datum/antagonist/obsessed)
if(target && target.current && creeper)
creeper.trauma.attachedcreepobj = src
creeper.trauma.attachedobsessedobj = src
explanation_text = "Spend [DisplayTimeText(timer)] around [target.name] while they're alive."
else
explanation_text = "Free Objective"
@@ -227,14 +228,14 @@
..()
if(!hugs_needed)//just so admins can mess with it
hugs_needed = rand(4,6)
var/datum/antagonist/creep/creeper = owner.has_antag_datum(/datum/antagonist/creep)
var/datum/antagonist/obsessed/creeper = owner.has_antag_datum(/datum/antagonist/obsessed)
if(target && target.current && creeper)
explanation_text = "Hug [target.name] [hugs_needed] times while they're alive."
else
explanation_text = "Free Objective"
/datum/objective/hug/check_completion()
var/datum/antagonist/creep/creeper = owner.has_antag_datum(/datum/antagonist/creep)
var/datum/antagonist/obsessed/creeper = owner.has_antag_datum(/datum/antagonist/obsessed)
if(!creeper || !creeper.trauma || !hugs_needed)
return TRUE//free objective
return creeper.trauma.obsession_hug_count >= hugs_needed
@@ -273,12 +274,12 @@
else
explanation_text = "Free Objective"
/datum/antagonist/creep/proc/update_creep_icons_added(var/mob/living/carbon/human/creep)
var/datum/atom_hud/antag/creephud = GLOB.huds[ANTAG_HUD_CREEP]
creephud.join_hud(creep)
set_antag_hud(creep, "creep")
/datum/antagonist/obsessed/proc/update_obsession_icons_added(var/mob/living/carbon/human/obsessed)
var/datum/atom_hud/antag/creephud = GLOB.huds[ANTAG_HUD_OBSESSED]
creephud.join_hud(obsessed)
set_antag_hud(obsessed, "obsessed")
/datum/antagonist/creep/proc/update_creep_icons_removed(var/mob/living/carbon/human/creep)
var/datum/atom_hud/antag/creephud = GLOB.huds[ANTAG_HUD_CREEP]
creephud.leave_hud(creep)
set_antag_hud(creep, null)
/datum/antagonist/obsessed/proc/update_obsession_icons_removed(var/mob/living/carbon/human/obsessed)
var/datum/atom_hud/antag/creephud = GLOB.huds[ANTAG_HUD_OBSESSED]
creephud.leave_hud(obsessed)
set_antag_hud(obsessed, null)

View File

@@ -1,24 +1,24 @@
/datum/round_event_control/creep
name = "Creep Awakening"
typepath = /datum/round_event/creep
/datum/round_event_control/obsessed
name = "Obsession Awakening"
typepath = /datum/round_event/obsessed
max_occurrences = 1
min_players = 20
/datum/round_event/creep
/datum/round_event/obsessed
fakeable = FALSE
/datum/round_event/creep/start()
/datum/round_event/obsessed/start()
for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list))
if(!H.client)
continue
if(H.stat == DEAD)
continue
if(!SSjob.GetJob(H.mind.assigned_role) || H.mind.assigned_role in GLOB.nonhuman_positions) //only station jobs sans nonhuman roles, prevents ashwalkers falling in love with crewmembers they never met
if(!SSjob.GetJob(H.mind.assigned_role) || H.mind.assigned_role in GLOB.nonhuman_positions) //only station jobs sans nonhuman roles, prevents ashwalkers trying to stalk with crewmembers they never met
continue
if(H.mind.has_antag_datum(/datum/antagonist/creep))
if(H.mind.has_antag_datum(/datum/antagonist/obsessed))
continue
if(!H.getorgan(/obj/item/organ/brain))
continue
H.gain_trauma(/datum/brain_trauma/special/creep)
H.gain_trauma(/datum/brain_trauma/special/obsessed)
announce_to_ghosts(H)
break

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 113 KiB