Skip to content

Commit

Permalink
More virology symptoms (#467)
Browse files Browse the repository at this point in the history
* Symptoms

* Paranoia

* Conspiracy virus preset

* Conspirological virus is in event now

* Fever can cause dehydration

* fix

* Tweaks to paranoia

* Adjust radio sounds in paranoia

* More sound tweaks

* oops

* Bloody vomit

* Vomit decal can contain more reagents

* Fixes and tweak to paranoia

* Fixes bad cure paths
  • Loading branch information
EgorDinamit authored Nov 22, 2023
1 parent a320849 commit 94d698a
Show file tree
Hide file tree
Showing 13 changed files with 391 additions and 45 deletions.
3 changes: 3 additions & 0 deletions baystation12.dme
Original file line number Diff line number Diff line change
Expand Up @@ -330,8 +330,11 @@
#include "code\datums\disease\advance\symptoms\flesh_eating.dm"
#include "code\datums\disease\advance\symptoms\headache.dm"
#include "code\datums\disease\advance\symptoms\heal.dm"
#include "code\datums\disease\advance\symptoms\itching.dm"
#include "code\datums\disease\advance\symptoms\narcolepsy.dm"
#include "code\datums\disease\advance\symptoms\pain.dm"
#include "code\datums\disease\advance\symptoms\painkiller.dm"
#include "code\datums\disease\advance\symptoms\paranoia.dm"
#include "code\datums\disease\advance\symptoms\sneeze.dm"
#include "code\datums\disease\advance\symptoms\viral.dm"
#include "code\datums\disease\advance\symptoms\vomit.dm"
Expand Down
4 changes: 2 additions & 2 deletions code/datums/disease/advance/_advance.dm
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@
list(/datum/reagent/medicine/meraline, /datum/reagent/medicine/dermaline, /datum/reagent/medicine/hyronalin, /datum/reagent/medicine/peridaxon),
list(/datum/reagent/medicine/dylovene/venaxilin, /datum/reagent/medicine/arithrazine),
list(/datum/reagent/medicine/rezadone),
list(/datum/chemical_reaction/zombiepowder),
list(/datum/chemical_reaction/three_eye)
list(/datum/reagent/toxin/zombie_powder),
list(/datum/reagent/three_eye)
)

/datum/disease/advance/New()
Expand Down
31 changes: 31 additions & 0 deletions code/datums/disease/advance/presets.dm
Original file line number Diff line number Diff line change
Expand Up @@ -42,3 +42,34 @@
name = "Flu"
symptoms += new /datum/symptom/cough
..()

// Paranoia
/datum/disease/advance/paranoia
copy_type = /datum/disease/advance

/datum/disease/advance/paranoia/New()
name = "Paranoia"
symptoms += new /datum/symptom/paranoia
..()

// Conspiracy! Paranoia that spreads and is difficult to notice
/datum/disease/advance/conspiracy
copy_type = /datum/disease/advance

/datum/disease/advance/conspiracy/New()
name = "Conspirological Virus"
symptoms += new /datum/symptom/paranoia
symptoms += new /datum/symptom/viraladaptation
var/datum/symptom/itching/I = new
I.neutered = TRUE
symptoms += I
var/datum/symptom/fever/F = new
F.neutered = TRUE
symptoms += F
var/datum/symptom/sneeze/S = new
S.neutered = TRUE
symptoms += S
var/datum/symptom/cough/C = new
C.neutered = TRUE
symptoms += C
..()
7 changes: 7 additions & 0 deletions code/datums/disease/advance/symptoms/fever.dm
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ Fever
Bonus
Heats up your body.
Causes dehydration.
//////////////////////////////////////
*/
Expand All @@ -28,9 +29,11 @@ Bonus
symptom_delay_min = 5
symptom_delay_max = 10
var/unsafe = FALSE //over the heat threshold
var/dehydrate = FALSE
threshold_descs = list(
"Resistance 5" = "Increases fever intensity, fever can overheat and harm the host.",
"Resistance 10" = "Further increases fever intensity.",
"Stage Speed 8" = "Causes dehydration."
)

/datum/symptom/fever/Start(datum/disease/advance/A)
Expand All @@ -41,6 +44,8 @@ Bonus
unsafe = TRUE
if(A.properties["resistance"] >= 10)
power = 3
if(A.properties["stage_speed"] >= 8)
dehydrate = TRUE

/datum/symptom/fever/Activate(datum/disease/advance/A)
if(!..())
Expand All @@ -51,6 +56,8 @@ Bonus
to_chat(H, SPAN_WARNING(pick("You feel hot.", "You feel like you're burning.")))
else
to_chat(H, SPAN_USERDANGER(pick("You feel too hot.", "You feel like your blood is boiling.")))
if(dehydrate)
H.adjust_hydration(-round(A.stage * 1.5))
SetBodyTemp(H, A)

/**
Expand Down
56 changes: 56 additions & 0 deletions code/datums/disease/advance/symptoms/itching.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
//////////////////////////////////////
Itching
Not noticable or unnoticable.
Resistant.
Increases stage speed.
Little transmissibility.
Low Level.
BONUS
Displays an annoying message!
Should be used for buffing your disease.
//////////////////////////////////////
*/

/datum/symptom/itching
name = "Itching"
desc = "The virus irritates the skin, causing itching."
stealth = 0
resistance = 3
stage_speed = 3
transmittable = 1
level = 1
severity = 1
symptom_delay_min = 5
symptom_delay_max = 25
var/scratch = FALSE
threshold_descs = list(
"Transmission 6" = "Increases frequency of itching.",
"Stage Speed 7" = "The host will scrath itself when itching, causing superficial damage.",
)

/datum/symptom/itching/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["transmittable"] >= 6) //itch more often
symptom_delay_min = 1
symptom_delay_max = 4
if(A.properties["stage_rate"] >= 7) //scratch
scratch = TRUE

/datum/symptom/itching/Activate(datum/disease/advance/A)
if(!..())
return
var/mob/living/carbon/human/M = A.affected_mob
var/picked_bodypart = pick(BP_HEAD, BP_CHEST, BP_L_ARM, BP_R_ARM, BP_L_LEG, BP_R_LEG)
var/obj/item/organ/external/BP = M.get_organ(picked_bodypart)
if(istype(BP) && !BP_IS_ROBOTIC(BP) && !BP_IS_CRYSTAL(BP) && !BP.is_stump())
var/can_scratch = scratch && !M.incapacitated()
var/datum/gender/T = gender_datums[M.get_gender()]
M.visible_message("[can_scratch ? "<span class='warning'>[M] scratches [T.his] [BP.name].</span>" : ""]", "<span class='warning'>Your [BP.name] itches. [can_scratch ? " You scratch it." : ""]</span>")
if(can_scratch)
BP.take_external_damage(rand(1, 2))
76 changes: 76 additions & 0 deletions code/datums/disease/advance/symptoms/narcolepsy.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
/*
//////////////////////////////////////
Narcolepsy
Noticeable.
Lowers resistance
Decreases stage speed tremendously.
Decreases transmittablity tremendously.
Bonus
Causes drowsiness and sleep.
//////////////////////////////////////
*/

/datum/symptom/narcolepsy
name = "Narcolepsy"
desc = "The virus causes a hormone imbalance, making the host sleepy and narcoleptic."
stealth = -1
resistance = -2
stage_speed = -3
transmittable = 0
level = 6
symptom_delay_min = 30
symptom_delay_max = 85
severity = 4
var/yawning = FALSE
threshold_descs = list(
"Stealth 4" = "The symptom remains hidden until active.",
"Transmission 4" = "Causes the host to periodically emit a yawn that spreads the virus in a manner similar to that of a sneeze.",
"Stage Speed 10" = "Causes narcolepsy more often, increasing the chance of the host falling asleep.",
)

/datum/symptom/narcolepsy/Start(datum/disease/advance/A)
if(!..())
return
if(A.properties["stealth"] >= 4)
suppress_warning = TRUE
if(A.properties["transmittable"] >= 4) //yawning (mostly just some copy+pasted code from sneezing, with a few tweaks)
yawning = TRUE
if(A.properties["stage_speed"] >= 10) //act more often
symptom_delay_min = 20
symptom_delay_max = 45

/datum/symptom/narcolepsy/Activate(datum/disease/advance/A)
var/mob/living/M = A.affected_mob
switch(A.stage)
if(1)
if(!suppress_warning && prob(50))
to_chat(M, "<span class='warning'>You feel tired.</span>")
if(2)
if(!suppress_warning && prob(50))
to_chat(M, "<span class='warning'>You feel very tired.</span>")
if(3)
if(!suppress_warning && prob(50))
to_chat(M, "<span class='warning'>You try to focus on staying awake.</span>")
if(M.drowsyness < 70)
M.drowsyness += 5
if(4)
if(!suppress_warning && prob(50))
if(yawning)
to_chat(M, "<span class='warning'>You try and fail to suppress a yawn.</span>")
else
to_chat(M, "<span class='warning'>You nod off for a moment.</span>") //you can't really yawn while nodding off, can you?
M.drowsyness = max(0, M.drowsyness + 10)
if(yawning)
M.emote("yawn")
if(M.CanSpreadAirborneDisease())
A.Spread(6)
if(5)
if(prob(50))
to_chat(M, "<span class='warning'>[pick("So tired...","You feel very sleepy.","You have a hard time keeping your eyes open.","You try to stay awake.")]</span>")
M.drowsyness = max(0, M.drowsyness + 20)
if(yawning)
M.emote("yawn")
if(M.CanSpreadAirborneDisease())
A.Spread(6)
169 changes: 169 additions & 0 deletions code/datums/disease/advance/symptoms/paranoia.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
// List of item types that may be used in activation of the symptom
GLOBAL_LIST_INIT(paranoia_items, list(
/obj/item/card/union,
/obj/item/card/data,
/obj/item/card/emag,
/obj/item/plastique,
/obj/item/aiModule/syndicate,
/obj/item/aiModule/freeform,
/obj/item/shield/energy,
/obj/item/melee/baton,
/obj/item/melee/baton/cattleprod,
/obj/item/melee/energy/sword,
/obj/item/implantcase/adrenalin,
/obj/item/implantcase/explosive,
/obj/item/implanter/uplink,
/obj/item/gun/energy/gun,
/obj/item/gun/energy/gun/nuclear,
/obj/item/gun/energy/captain,
/obj/item/gun/energy/ionrifle/small,
/obj/item/gun/energy/toxgun,
/obj/item/gun/projectile/pistol/military,
/obj/item/gun/projectile/pistol/sec,
/obj/item/gun/projectile/automatic,
/obj/item/pen,
/obj/item/grenade/anti_photon,
/obj/item/grenade/smokebomb,
/obj/item/grenade/empgrenade,
/obj/item/grenade/frag,
/obj/item/grenade/frag/high_yield,
/obj/item/device/uplink_service/fake_ion_storm,
/obj/item/device/powersink,
))

// List of random spooky sounds to play to paranoid people
// The associated list is: list(maximum repeats, minimum delay, maximum delay)
// If no list is associated - treated as single sound instance
GLOBAL_LIST_INIT(paranoia_sounds, list(
"button" = list(3, 1 SECONDS, 3 SECONDS),
'sound/machines/airlock_open.ogg',
'sound/machines/airlock_open_force.ogg',
'sound/machines/airlock_close.ogg',
'sound/machines/airlock_close_force.ogg',
'sound/machines/bolts_up.ogg',
'sound/machines/bolts_down.ogg',
'sound/machines/deniedboop.ogg' = list(5, 1.5 SECONDS, 3 SECONDS),
'sound/effects/walkieon.ogg' = list(2, 2 SECONDS, 4 SECONDS),
'sound/effects/walkietalkie.ogg' = list(6, 1 SECONDS, 6 SECONDS),
'sound/weapons/Laser.ogg' = list(6, 1 SECONDS, 4 SECONDS),
'sound/weapons/lasercannonfire.ogg' = list(3, 2 SECONDS, 6 SECONDS),
'sound/weapons/pulse.ogg' = list(5, 1.5 SECONDS, 5 SECONDS),
'sound/weapons/gunshot/gunshot_strong.ogg' = list(7, 1 SECONDS, 2 SECONDS),
'sound/weapons/gunshot/gunshot_pistol.ogg' = list(7, 1 SECONDS, 2 SECONDS),
'sound/weapons/gunshot/revolver.ogg' = list(6, 1.3 SECONDS, 3 SECONDS),
'sound/weapons/gunshot/gunshot2.ogg' = list(10, 0.1 SECONDS, 0.4 SECONDS),
'sound/weapons/gunshot/gunshot3.ogg' = list(10, 0.1 SECONDS, 0.4 SECONDS),
'sound/weapons/guns/miss1.ogg' = list(5, 0.1 SECONDS, 1 SECONDS),
'sound/weapons/guns/miss2.ogg' = list(5, 0.1 SECONDS, 1 SECONDS),
'sound/weapons/guns/ricochet1.ogg' = list(5, 0.1 SECONDS, 1 SECONDS),
'sound/weapons/guns/ricochet2.ogg' = list(5, 0.1 SECONDS, 1 SECONDS),
// If you don't have infestation PTSD - you aren't a real human,
'sound/weapons/rapidslice.ogg' = list(3, 1 SECONDS, 2 SECONDS),
'sound/weapons/slashmiss.ogg' = list(7, 0.5 SECONDS, 1 SECONDS),
'sound/weapons/alien_claw_flesh1.ogg' = list(5, 0.8 SECONDS, 1.4 SECONDS),
'sound/simple_mob/abominable_infestation/assembler/ambient_1.ogg' = list(3, 2 SECONDS, 4 SECONDS),
'sound/simple_mob/abominable_infestation/broodling/ambient_1.ogg' = list(2, 1 SECONDS, 3 SECONDS),
'sound/simple_mob/abominable_infestation/broodling/ambient_2.ogg' = list(2, 1 SECONDS, 3 SECONDS),
'sound/simple_mob/abominable_infestation/broodling/death.ogg',
'sound/simple_mob/abominable_infestation/eviscerator/attack.ogg' = list(3, 1 SECONDS, 3 SECONDS),
'sound/simple_mob/abominable_infestation/eviscerator/step.ogg' = list(4, 1 SECONDS, 3 SECONDS),
'sound/simple_mob/abominable_infestation/eviscerator/aggro_1.ogg',
'sound/simple_mob/abominable_infestation/eviscerator/aggro_2.ogg',
'sound/simple_mob/abominable_infestation/eviscerator/aggro_3.ogg',
'sound/simple_mob/abominable_infestation/eviscerator/death_1.ogg',
'sound/simple_mob/abominable_infestation/floatfly/fly.ogg',
'sound/simple_mob/abominable_infestation/floatfly/death.ogg',
'sound/simple_mob/abominable_infestation/rhino/step.ogg' = list(3, 2 SECONDS, 4 SECONDS),
'sound/simple_mob/abominable_infestation/rhino/roar.ogg',
))

/*
//////////////////////////////////////
Paranoia
Very stealthy.
Reduces resistance.
Increases stage speed.
Reduces transmissibility.
Medium Level.
BONUS
Displays an annoying message!
Should be used for buffing your disease.
//////////////////////////////////////
*/

/datum/symptom/paranoia
name = "Paranoia"
desc = "The virus causes delusional and distrustful behavior in the host."
stealth = 2
resistance = -2
stage_speed = 1
transmittable = -2
level = 5
severity = 1
symptom_delay_min = 2
symptom_delay_max = 90 // They will never know what to trust :)

/datum/symptom/paranoia/Activate(datum/disease/advance/A)
if(!..())
return
if(A.stage <= 3)
return
else
var/mob/living/M = A.affected_mob
var/rand_effect = pick(1, 2, 3)
switch(rand_effect)
// Fake examine message
if(1)
SendFakeExamine(M)
// Fake sound
if(2)
PlayFakeSound(M)

/datum/symptom/paranoia/proc/SendFakeExamine(mob/living/M)
if(M.is_blind())
return
var/list/potential_people = list()
for(var/mob/living/carbon/human/H in view(4, M))
if(H == M)
continue
if(!H.client)
continue
if(H.stat)
continue
if(H.is_invisible_to(M))
continue
potential_people += H
if(!LAZYLEN(potential_people))
return
var/mob/living/carbon/human/H = pick(potential_people)
var/fake_message = "at the void"
if(prob(25) && istype(H.back, /obj/item/storage))
fake_message = "inside \the [H.back.name]"
else
var/obj/item/fake_item = pick(GLOB.paranoia_items)
fake_message = "at \the [initial(fake_item.name)]"
to_chat(M, "<span class='subtle'><b>\The [H]</b> looks [fake_message].</span>")

/datum/symptom/paranoia/proc/PlayFakeSound(mob/living/M)
var/turf/T = get_random_turf_in_range(M, 8, 4)
var/S = pick(GLOB.paranoia_sounds)
var/vol = rand(10, 50)
M.playsound_local(T, S, vol, prob(50))
if(!islist(GLOB.paranoia_sounds[S]))
return
// Epic paranoidal sounds
var/list/params = GLOB.paranoia_sounds[S]
var/repeats = rand(1, params[1])
for(var/i = 1 to repeats)
var/delay = rand(params[2], params[3])
addtimer(CALLBACK(src, .proc/PlayDelayedSound, M, T, S), delay)

/datum/symptom/paranoia/proc/PlayDelayedSound(mob/living/M, turf/T, S, vol)
if(QDELETED(M) || QDELETED(T))
return
var/turf/TT = get_random_turf_in_range(T, 1) // Sound is coming from slightly different place now
M.playsound_local(TT, S, rand(round(vol * 0.75), round(vol * 1.25)), prob(50))
Loading

0 comments on commit 94d698a

Please sign in to comment.