Merge branch 'dare' into 'Bleeding-Edge'

Custom messages for hallucinating mobs, general hallucination tweaks

#### Don't do drugs kids

**General changes**

* Added a spook() proc to atoms, reworked the Boo! spell to use it
* Added is_blind() and is_deaf() procs for mobs
* Added hallucinating() proc for mobs which returns 1 if the mob is hallucinating (from mindbreaker and such) or is druggy (from space drugs)
* Added simple_message proc which takes two arguments (message, drugged_message).
*M.simple_message("Hi!")* works just like *M << "Hi"*, but will provide an alternative message if M is hallucinating
* The visible_message proc has three more optional arguments - drugged_message, self_drugged_message, blind_drugged_message. A hallucinating player will see the alternate messages instead of their normal versions

-------------------------------------
**Traditional (mindbreaker) hallucination tweaks:**

* Chances of fake shuttle and delta security level announcements are greatly reduced - they should be much rarer now
* Chances of some messages are slightly reduced - to prevent message spam
* Added a new rare type of hallucination - it selects a random mob in your sight (including you) and replaces its image with a random food item for a random duration.

-------------------------------------
**!!The following only affects hallucinating players!!!**

* The following objects now provide alternative messages when used:
Crematoriums, gibbers, telebatons, stun batons, soap, banana peels, welding tools, soldering irons, health analyzers and more
* Security bots are more tsundere, medibots are angry (100% awful)
* Passive genetic powers have a random message when activated or deactivated, meaning you don't know which one you have (doesn't affect disabilities, passive powers which give you an overlay i.e. heat resistance, and active powers i.e. hulk).
* It's impossible to see reagents properly when examining a glass/beaker. Instead random reagents & numbers are shown
* Opening a locker has a slight chance to show a horrifying monster instead of its usual contents!

See merge request !25
This commit is contained in:
Rob Nelson
2015-08-19 06:48:36 +00:00
40 changed files with 525 additions and 164 deletions

View File

@@ -395,13 +395,27 @@ its easier to just keep the beam vertical.
user << "<span class='info'>You can't make out the contents.</span>"
else
user << "It contains:"
if(reagents.reagent_list.len)
for(var/datum/reagent/R in reagents.reagent_list)
user << "<span class='info'>[R.volume] units of [R.name]</span>"
else
user << "<span class='info'>Nothing.</span>"
if(!user.hallucinating())
if(reagents.reagent_list.len)
for(var/datum/reagent/R in reagents.reagent_list)
user << "<span class='info'>[R.volume] units of [R.name]</span>"
else
user << "<span class='info'>Nothing.</span>"
else //Show stupid things to hallucinating mobs
var/list/fake_reagents = list("Water", "Orange juice", "Banana juice", "Tungsten", "Chloral Hydrate", "Helium",\
"Sea water", "Energy drink", "Gushin' Granny", "Salt", "Sugar", "something yellow", "something red", "something blue",\
"something suspicious", "something smelly", "something sweet", "Soda", "something that reminds you of home",\
"Chef's Special")
for(var/i, i < rand(1,10), i++)
var/fake_amount = rand(1,30)
var/fake_reagent = pick(fake_reagents)
fake_reagents -= fake_reagent
user << "<span class='info'>[fake_amount] units of [fake_reagent]</span>"
if(on_fire)
user << "<span class='danger'>OH SHIT! IT'S ON FIRE!</span>"
user.simple_message("<span class='danger'>OH SHIT! IT'S ON FIRE!</span>",\
"<span class='info'>It's on fire, man.</span>")
if(min_harm_label && harm_labeled)
if(harm_labeled < min_harm_label)
@@ -762,3 +776,8 @@ its easier to just keep the beam vertical.
if(istype(newarea))
newarea = "[newarea.name]"
//Called in /spell/aoe_turf/boo/cast() (code/modules/mob/dead/observer/spells.dm)
/atom/proc/spook()
if(blessed)
return 0
return 1

View File

@@ -123,6 +123,13 @@
// Possible deactivation messages
var/list/deactivation_messages=list()
// Activation messages which are shown when drugged
var/list/drug_activation_messages=list("You feel different.","You feel wonky.","You feel new!","You feel amazing.","You feel wobbly.","You feel goofy.",\
"You feel strong!","You feel weak.","You think you can speak vox pidgin now.","You feel like killing a space bear!","You are no longer afraid of carps.")
// Deactivation messages which are shown when drugged
var/list/drug_deactivation_messages=list("You feel like you've lost a friend.","You get a feeling of loss.","Your mind feels less burdened.","You feel old.",\
"You're not sure what's going on.","You feel concerned.","You feel like you forgot something important.","You feel trippy.","Your brain hurts.")
/datum/dna/gene/basic/can_activate(var/mob/M,var/flags)
if(flags & MUTCHK_FORCED)
@@ -132,9 +139,15 @@
/datum/dna/gene/basic/activate(var/mob/M)
M.mutations.Add(mutation)
var/msg1
var/msg2
if(activation_messages.len)
var/msg = pick(activation_messages)
M << "<span class='notice'>[msg]</span>"
msg1 = pick(activation_messages)
if(drug_activation_messages.len)
msg2 = pick(drug_activation_messages)
if(msg2) msg2="<span class='notice'>[msg2]</span>" //Workaround to prevent simple_message from considering "<span class='notice'></span>" an actual message
M.simple_message("<span class='notice'>[msg1]</span>", msg2 )
/datum/dna/gene/basic/can_deactivate(var/mob/M, var/flags)
if(flags & GENE_NATURAL)
@@ -145,7 +158,13 @@
/datum/dna/gene/basic/deactivate(var/mob/M, var/connected, var/flags)
if(..())
M.mutations.Remove(mutation)
var/msg1
var/msg2
if(deactivation_messages.len)
var/msg = pick(deactivation_messages)
M << "<span class='warning'>[msg]</span>"
msg1 = pick(deactivation_messages)
if(drug_deactivation_messages.len)
msg2 = pick(drug_deactivation_messages)
if(msg2) msg2="<span class='notice'>[msg2]</span>" //Workaround to prevent simple_message from considering "<span class='notice'></span>" an actual message
M.simple_message("<span class='notice'>[msg1]</span>", msg2 )
return 1

View File

@@ -124,6 +124,9 @@
activation_messages = list("You notice a strange cold tingle in your fingertips.")
deactivation_messages = list("Your fingers feel warmer.")
drug_activation_messages=list("Your skin is icy to the touch.")
drug_deactivation_messages=list("Your skin stops feeling icy.")
spelltype = /spell/targeted/cryokinesis
New()
@@ -203,6 +206,9 @@
activation_messages = list("You feel hungry.")
deactivation_messages = list("You don't feel quite so hungry anymore.")
drug_activation_messages=list("You are getting the munchies.")
drug_deactivation_messages=list("You no longer getting the munchies.")
spelltype= /spell/targeted/eat
New()
@@ -387,6 +393,9 @@
activation_messages = list("Your leg muscles feel taut and strong.")
deactivation_messages = list("Your leg muscles shrink back to normal.")
drug_activation_messages=list()
drug_deactivation_messages=list()
spelltype =/spell/targeted/leap
New()
@@ -491,6 +500,9 @@
activation_messages = list("You don't feel entirely like yourself somehow.")
deactivation_messages = list("You feel secure in your identity.")
drug_activation_messages=list()
drug_deactivation_messages=list()
New()
..()
block = POLYMORPHBLOCK
@@ -536,6 +548,9 @@
activation_messages = list("You suddenly notice more about others than you did before.")
deactivation_messages = list("You no longer feel able to sense intentions.")
drug_activation_messages=list("You feel more social!")
drug_deactivation_messages=list("You feel less social.")
New()
..()
block = EMPATHBLOCK
@@ -653,6 +668,9 @@
activation_messages = list("You feel bloated and gassy.")
deactivation_messages = list("You no longer feel gassy. What a relief!")
drug_activation_messages = list()
drug_deactivation_messages = list()
mutation = M_SUPER_FART
New()

View File

@@ -15,6 +15,10 @@
name="Remote Viewing"
activation_messages=list("Your mind expands.")
deactivation_messages=list("Your mind is no longer expanded.")
drug_activation_messages=list("You feel in touch with the cosmos.")
drug_deactivation_messages=list("You no longer feel in touch with the cosmos.")
mutation=M_REMOTE_VIEW
spelltype = /spell/targeted/remoteobserve
@@ -90,6 +94,10 @@
name="Telepathy"
activation_messages=list("You feel your voice can penetrate other minds.")
deactivation_messages=list("Your mind can no longer project your voice onto others.")
drug_activation_messages=list("You feel your voice can reach the astral plane now.")
drug_deactivation_messages=list("Your voice can no longer reach the astral plane.")
mutation=M_REMOTE_TALK
spelltype = /spell/targeted/remotesay
@@ -139,6 +147,10 @@
name="Morph"
activation_messages=list("Your skin feels strange.")
deactivation_messages=list("Your skin no longer feels strange.")
drug_activation_messages=list("You feel like a chameleon.")
drug_deactivation_messages=list("You no longer feel like a chameleon.")
mutation=M_MORPH
New()
@@ -152,6 +164,10 @@
name="Heat Resistance"
activation_messages=list("Your skin is icy to the touch.")
deactivation_messages=list("Your skin stops feeling icy.")
drug_activation_messages=list()
drug_deactivation_messages=list()
mutation=M_RESIST_HEAT
New()
@@ -174,6 +190,10 @@
name="Cold Resistance"
activation_messages=list("Your body is filled with warmth.")
deactivation_messages=list("Your body is no longer filled with warmth.")
drug_activation_messages=list()
drug_deactivation_messages=list()
mutation=M_RESIST_COLD
New()
@@ -271,6 +291,10 @@
name="X-Ray Vision"
activation_messages=list("The walls suddenly disappear.")
deactivation_messages=list("The walls suddenly appear.")
drug_activation_messages=list("You see so much clearer now!")
drug_deactivation_messages=list("Your vision is obstructed again.")
mutation=M_XRAY
New()
@@ -280,6 +304,10 @@
name="Telekenesis"
activation_messages=list("You feel smarter.")
deactivation_messages=list("You feel less smart.")
drug_activation_messages=list("You feel like a nerd.")
drug_deactivation_messages=list("You feel normal again.")
mutation=M_TK
activation_prob=15

View File

@@ -16,6 +16,10 @@ Obviously, requires DNA2.
desc = "Allows the subject to become the motherfucking Hulk."
activation_messages = list("Your muscles hurt.")
deactivation_messages = list("Your muscles quit tensing.")
drug_activation_messages=list("You feel strong! You must've been working out lately.")
drug_deactivation_messages=list("You return to your old lifestyle.")
flags = GENE_UNNATURAL // Do NOT spawn on roundstart.
spelltype = /spell/targeted/genetic/hulk
@@ -92,6 +96,10 @@ Obviously, requires DNA2.
desc = "Increases the subjects ability to see things from afar."
activation_messages = list("Your eyes focus.")
deactivation_messages = list("Your eyes return to normal.")
drug_activation_messages=list("The world becomes huge! You feel like an ant.")
drug_deactivation_messages=list("You no longer feel like an insect.")
mutation = M_FARSIGHT
/datum/dna/gene/basic/farsight/New()

View File

@@ -7,7 +7,11 @@
/datum/universal_state/supermatter_cascade/OnShuttleCall(var/mob/user)
if(user)
user << "<span class='sinister'>All you hear on the frequency is static and panicked screaming. There will be no shuttle call today.</span>"
if(user.hallucinating())
var/msg = pick("your mother and father arguing","a smooth jazz tune","somebody speaking [pick("french","siik'tajr","gibberish")]","[pick("somebody","your parents","a gorilla","a man","a woman")] making [pick("chicken","cow","train","duck","cat","dog","strange","funny")] sounds")
user << "<span class='sinister'>All you hear on the frequency is [msg]. There will be no shuttle call today.</span>"
else
user << "<span class='sinister'>All you hear on the frequency is static and panicked screaming. There will be no shuttle call today.</span>"
return 0
/datum/universal_state/supermatter_cascade/OnTurfChange(var/turf/T)

View File

@@ -23,7 +23,7 @@ var/global/datum/controller/gameticker/ticker
var/Bible_icon_state // icon_state the chaplain has chosen for his bible
var/Bible_item_state // item_state the chaplain has chosen for his bible
var/Bible_name // name of the bible
var/Bible_deity_name
var/Bible_deity_name = "Space Jesus"
var/random_players = 0 // if set to nonzero, ALL players who latejoin or declare-ready join will have random appearances/genders

View File

@@ -803,8 +803,8 @@ Auto Patrol: []"},
/obj/machinery/bot/ed209/proc/speak(var/message)
//writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/obj/machinery/bot/ed209/proc/speak() called tick#: [world.time]")
for(var/mob/O in hearers(src, null))
O.show_message("<span class='game say'><span class='name'>[src]</span> beeps, \"[message]\"",2)
visible_message("<span class='game say'><span class='name'>[src]</span> beeps, \"[message]\"",\
drugged_message="<span class='game say'><span class='name'>[src]</span> beeps, \"[pick("I-It's not like I like you or anything... baka!","You're s-so silly!","I-I'm only doing this because you asked me nicely, baka...","S-stop that!","Y-you're embarassing me!")]\"")
return
/obj/machinery/bot/ed209/explode()
@@ -1107,4 +1107,4 @@ Auto Patrol: []"},
/obj/machinery/bot/ed209/declare()
var/area/location = get_area(src)
declare_message = "<span class='info'>\icon[src] [name] is [arrest_type ? "detaining" : "arresting"] level [threatlevel] scumbag <b>[target]</b> in <b>[location]</b></span>"
..()
..()

View File

@@ -468,7 +468,8 @@
//writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/obj/machinery/bot/medbot/proc/speak() called tick#: [world.time]")
if((!src.on) || (!message))
return
visible_message("[src] beeps, \"[message]\"")
visible_message("[src] beeps, \"[message]\"",\
drugged_message="[src] beeps, \"[pick("FEED ME HUMANS","LET THE BLOOD FLOW","BLOOD FOR THE BLOOD GOD","I SPREAD DEATH AND DESTRUCTION","EXTERMINATE","I HATE YOU!","SURRENDER TO YOUR MACHINE OVERLORDS","FEED ME SHITTERS")]\"")
return
/obj/machinery/bot/medbot/bullet_act(var/obj/item/projectile/Proj)

View File

@@ -327,7 +327,8 @@ Auto Patrol: []"},
if(!C.handcuffed && !src.arrest_type)
playsound(get_turf(src), 'sound/weapons/handcuffs.ogg', 30, 1, -2)
mode = SECBOT_ARREST
visible_message("<span class='danger'>[src] is trying to put handcuffs on [src.target]!</span>")
visible_message("<span class='danger'>[src] is trying to put handcuffs on [src.target]!</span>",\
"<span class='danger'>[src] is trying to cut [src.target]'s hands off!</span>")
spawn(60)
if(Adjacent(target))
@@ -766,8 +767,8 @@ Auto Patrol: []"},
/obj/machinery/bot/secbot/proc/speak(var/message)
//writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/obj/machinery/bot/secbot/proc/speak() called tick#: [world.time]")
for(var/mob/O in hearers(src, null))
O.show_message("<span class='game say'><span class='name'>[src]</span> beeps, \"[message]\"",2)
visible_message("<span class='game say'><span class='name'>[src]</span> beeps, \"[message]\"",\
drugged_message="<span class='game say'><span class='name'>[src]</span> beeps, \"[pick("Wait! Let's be friends!","Wait for me!","You're so cool!","Who's your favourite pony?","I-It's not like I like you or anything...","Wanna see a magic trick?","Let's go have fun, assistant-kun~")]\"")
return

View File

@@ -155,10 +155,12 @@ obj/machinery/gibber/New()
user << "<span class='warning'>Subject may not have abiotic items on.</span>"
return
user.visible_message("<span class='warning'>[user] starts to put [G.affecting] into the gibber!</span>")
user.visible_message("<span class='warning'>[user] starts to put [G.affecting] into the gibber!</span>", \
drugged_message = "<span class='warning'>[user] starts dancing with [G.affecting] near the gibber!</span>")
src.add_fingerprint(user)
if(do_after(user, src, 30) && G && G.affecting && !occupant)
user.visible_message("<span class='warning'>[user] stuffs [G.affecting] into the gibber!</span>")
user.visible_message("<span class='warning'>[user] stuffs [G.affecting] into the gibber!</span>", \
drugged_message = "<span class='warning'>[G.affecting] suddenly disappears! How did he do that?</span>")
var/mob/M = G.affecting
if(M.client)
M.client.perspective = EYE_PERSPECTIVE
@@ -182,10 +184,17 @@ obj/machinery/gibber/New()
return
src.add_fingerprint(user)
user.visible_message("<span class='warning'>[user.name] starts climbing into the [src].</span>", "<span class='warning'>You start climbing into the [src].</span>")
user.visible_message("<span class='warning'>[user] starts climbing into the [src].</span>", \
"<span class='warning'>You start climbing into the [src].</span>", \
drugged_message = "<span class='warning'>[user] starts dancing like a ballerina!</span>")
if(do_after(user, src, 30) && user && !occupant && !isnull(src.loc))
user.visible_message("<span class='warning'>[user] climbs into the [src]</span>", "<span class='warning'>You climb into the [src].</span>")
user.visible_message("<span class='warning'>[user] climbs into the [src]</span>", \
"<span class='warning'>You climb into the [src].</span>", \
drugged_message = "<span class='warning'>[src] consumes [user]!</span>")
if(user.client)
user.client.perspective = EYE_PERSPECTIVE
user.client.eye = src
@@ -225,10 +234,12 @@ obj/machinery/gibber/New()
if(src.operating)
return
if(!src.occupant)
visible_message("<span class='warning'>You hear a loud metallic grinding sound.</span>")
visible_message("<span class='warning'>You hear a loud metallic grinding sound.</span>", \
drugged_message = "<span class='warning'>You fainly hear a guitar solo.</span>")
return
use_power(1000)
visible_message("<span class='warning'>You hear a loud squelchy grinding sound.</span>")
visible_message("<span class='warning'>You hear a loud squelchy grinding sound.</span>", \
drugged_message = "<span class='warning'>You hear a band performance.</span>")
src.operating = 1
update_icon()
var/sourcename = src.occupant.real_name
@@ -277,10 +288,12 @@ obj/machinery/gibber/New()
if(src.operating)
return
if(!victim)
visible_message("<span class='warning'>You hear a loud metallic grinding sound.</span>")
visible_message("<span class='warning'>You hear a loud metallic grinding sound.</span>", \
drugged_message = "<span class='warning'>You fainly hear a guitar solo.</span>")
return
use_power(1000)
visible_message("<span class='warning'>You hear a loud squelchy grinding sound.</span>")
visible_message("<span class='warning'>You hear a loud squelchy grinding sound.</span>", \
drugged_message = "<span class='warning'>You hear a band performance.</span>")
src.operating = 1
update_icon()
var/sourcename = victim.real_name

View File

@@ -49,7 +49,6 @@
if(radio_controller)
radio_controller.add_object(src, frequency)
// timed process
/obj/machinery/status_display/process()
if(stat & NOPOWER)
@@ -186,7 +185,6 @@
if(maptext)
maptext = ""
/obj/machinery/status_display/receive_signal(datum/signal/signal)
switch(signal.data["command"])
if("blank")
@@ -207,6 +205,10 @@
if(supply_display)
mode = 4
/obj/machinery/status_display/spook()
if(..())
spookymode = 1
/obj/machinery/ai_status_display
icon = 'icons/obj/status_display.dmi'
icon_state = "frame"
@@ -224,7 +226,6 @@
var/emotion = "Neutral"
/obj/machinery/ai_status_display/process()
if(stat & NOPOWER)
overlays.len = 0
@@ -292,6 +293,9 @@
overlays.len = 0
overlays += image('icons/obj/status_display.dmi', icon_state=picture_state)
/obj/machinery/ai_status_display/spook()
spookymode = 1
#undef CHARS_PER_LINE
#undef FOND_SIZE
#undef FONT_COLOR

View File

@@ -92,7 +92,13 @@ REAGENT SCANNER
var/mode = 1;
/obj/item/device/healthanalyzer/attack(mob/living/M as mob, mob/living/user as mob)
healthanalyze(M, user, mode)
if(!user.hallucinating())
healthanalyze(M, user, mode)
else
if( (M.stat == DEAD || (M.status_flags & FAKEDEATH)) )
user.show_message("<span class='game say'><span class='name'>[src]</span> beeps, \"It's dead, Jim.\"</span>",MESSAGE_HEAR,"<span class='notice'>The [name] glows black.</span>")
else
user << "<span class='notice'>[src] glows [pick("red","green","blue","pink")]! You wonder what would that mean.</span>"
src.add_fingerprint(user)
proc/healthanalyze(mob/living/M as mob, mob/living/user as mob, var/mode = 0)

View File

@@ -12,11 +12,13 @@
if (istype(AM, /mob/living/carbon))
var/mob/M = AM
if(!M.walking()) return
if (M.CheckSlip() < 1)
return
M.stop_pulling()
M << "<span class='notice'> You slipped on the [name]!</span>"
M.simple_message("<span class='notice'> You slipped on the [name]!</span>",
"<span class='userdanger'>Something is scratching at your feet! Oh god!</span>")
playsound(get_turf(src), 'sound/misc/slip.ogg', 50, 1, -3)
M.Stun(2)
M.Weaken(2)
@@ -28,11 +30,13 @@
if (istype(AM, /mob/living/carbon))
var/mob/M = AM
if(!M.walking()) return
if (M.CheckSlip() < 1)
return
M.stop_pulling()
M << "<span class='notice'> You slipped on the [name]!</span>"
M.simple_message("<span class='notice'> You slipped on the [name]!</span>",
"<span class='userdanger'>Something is scratching at your feet! Oh god!</span>")
playsound(get_turf(src), 'sound/misc/slip.ogg', 50, 1, -3)
M.Stun(3)
M.Weaken(2)
@@ -43,11 +47,16 @@
//Overlay bugs can probably be fixed by updating the user's icon, see watercloset.dm
if(!user.Adjacent(target))
return
if(user.client && (target in user.client.screen) && !(user.l_hand == target || user.r_hand == target))
user << "<span class='notice'>You need to take that [target.name] off before cleaning it.</span>"
user.simple_message("<span class='notice'>You need to take that [target.name] off before cleaning it.</span>",
"<span class='notice'>You need to take that [target.name] off before destroying it.</span>")
else if(istype(target,/obj/effect/decal/cleanable))
user << "<span class='notice'>You scrub \the [target.name] out.</span>"
user.simple_message("<span class='notice'>You scrub \the [target.name] out.</span>",
"<span class='warning'>You destroy [pick("an artwork","a valuable artwork","a rare piece of art","a rare piece of modern art")].</span>")
returnToPool(target)
else if(istype(target,/turf/simulated))
var/turf/simulated/T = target
var/list/cleanables = list()
@@ -56,7 +65,8 @@
continue
cleanables += CC
if(!cleanables.len)
user << "<span class='notice'>You fail to clean anything.</span>"
user.simple_message("<span class='notice'>You fail to clean anything.</span>",
"<span class='notice'>There is nothing for you to vandalize.</span>")
return
cleanables = shuffle(cleanables)
var/obj/effect/decal/cleanable/C
@@ -64,10 +74,12 @@
if(d && istype(d))
C = d
break
user << "<span class='notice'>You scrub \the [C.name] out.</span>"
user.simple_message("<span class='notice'>You scrub \the [C.name] out.</span>",
"<span class='warning'>You destroy [pick("an artwork","a valuable artwork","a rare piece of art","a rare piece of modern art")].</span>")
returnToPool(C)
else
user << "<span class='notice'>You clean \the [target.name].</span>"
user.simple_message("<span class='notice'>You clean \the [target.name].</span>",
"<span class='warning'>You [pick("deface","ruin","stain")] \the [target.name].</span>")
target.clean_blood()
return
@@ -87,4 +99,4 @@
src.add_fingerprint(user)
spawn(20)
spam_flag = 0
return
return

View File

@@ -70,13 +70,15 @@
var/mob/living/M = AM
if(M.lying)
M.take_overall_damage(0, max(0, (burned - 2)))
M << "<span class='danger'>Something burns your back!</span>"
M.simple_message("<span class='danger'>Something burns your back!</span>",\
"<span class='userdanger'>They're eating your back!</span>")
return
if(ishuman(M))
if(M.CheckSlip() < 1)
return
else
M << "<span class='warning'>Your feet feel like they're on fire!</span>"
M.simple_message("<span class='warning'>Your feet feel like they're on fire!</span>",\
"<span class='userdanger'>Egads! They bite your feet!</span>")
M.take_overall_damage(0, max(0, (burned - 2)))
if(!istype(M, /mob/living/carbon/slime) && !isrobot(M))
@@ -87,7 +89,8 @@
spawn(3) step(M, M.dir)
spawn(4) step(M, M.dir)
M.take_organ_damage(2) // Was 5 -- TLE
M << "<span class='notice'>You slipped on \the [name]!</span>"
M.simple_message("<span class='notice'>You slipped on \the [name]!</span>",\
"<span class='userdanger'>Please, just end the pain!</span>")
playsound(get_turf(src), 'sound/misc/slip.ogg', 50, 1, -3)
M.Weaken(10)
M.take_overall_damage(0, burned)

View File

@@ -84,26 +84,31 @@
/obj/item/weapon/melee/baton/attack_self(mob/user)
if(status && (M_CLUMSY in user.mutations) && prob(50))
user << "<span class='warning'>You grab the [src] on the wrong side.</span>"
user.simple_message("<span class='warning'>You grab the [src] on the wrong side.</span>",
"<span class='danger'>The [name] blasts you with its power!</span>")
user.Weaken(stunforce*3)
deductcharge(hitcost)
return
if(bcell && bcell.charge >= hitcost)
status = !status
user << "<span class='notice'>[src] is now [status ? "on" : "off"].</span>"
user.simple_message("<span class='notice'>[src] is now [status ? "on" : "off"].</span>",
"<span class='notice'>[src] is now [pick("drowsy","hungry","thirsty","bored","unhappy")].</span>")
playsound(loc, "sparks", 75, 1, -1)
update_icon()
else
status = 0
if(!bcell)
user << "<span class='warning'>[src] does not have a power source!</span>"
user.simple_message("<span class='warning'>[src] does not have a power source!</span>",
"<span class='warning'>[src] has no pulse and its soul has departed...</span>")
else
user << "<span class='warning'>[src] is out of charge.</span>"
user.simple_message("<span class='warning'>[src] is out of charge.</span>",
"<span class='warning'>[src] refuses to obey you.</span>")
add_fingerprint(user)
/obj/item/weapon/melee/baton/attack(mob/M, mob/user)
if(status && (M_CLUMSY in user.mutations) && prob(50))
user << "<span class='danger'>You accidentally hit yourself with [src]!</span>"
user.simple_message("<span class='danger'>You accidentally hit yourself with [src]!</span>",
"<span class='danger'>The [name] goes mad!</span>")
user.Weaken(stunforce*3)
deductcharge(hitcost)
return
@@ -124,7 +129,8 @@
else
hit = -1
if(!status)
L.visible_message("<span class='attack'>[L] has been prodded with the [src] by [user]. Luckily it was off.</span>")
L.visible_message("<span class='attack'>[L] has been prodded with the [src] by [user]. Luckily it was off.</span>",
self_drugged_message="<span class='warning'>The [name] decides to spare this one.</span>")
return
if(status && hit)
@@ -143,7 +149,8 @@
L.Weaken(stunforce)
L.apply_effect(STUTTER, stunforce)
L.visible_message("<span class='danger'>[L] has been stunned with [src] by [user]!</span>")
L.visible_message("<span class='danger'>[L] has been stunned with [src] by [user]!</span>",
self_drugged_message="<span class='danger'>The [src.name] absorbs [L]'s life!</span>")
playsound(loc, 'sound/weapons/Egloves.ogg', 50, 1, -1)
if(isrobot(loc))

View File

@@ -90,7 +90,11 @@
if(on)
user.visible_message("<span class='warning'>With a flick of their wrist, [user] extends their telescopic baton.</span>",\
"<span class='warning'>You extend the baton.</span>",\
"You hear an ominous click.")
"You hear an ominous click.",\
"<span class='notice'>[user] extends their fishing rod.</span>",\
"<span class='notice'>You extend the fishing rod.</span>",\
"You hear a balloon exploding.")
icon_state = "telebaton_1"
item_state = "telebaton_1"
w_class = 4
@@ -99,7 +103,11 @@
else
user.visible_message("<span class='notice'>[user] collapses their telescopic baton.</span>",\
"<span class='notice'>You collapse the baton.</span>",\
"You hear a click.")
"You hear a click.",\
"<span class='warning'>[user] collapses their fishing rod.</span>",\
"<span class='warning'>You collapse the fishing rod.</span>",\
"You hear a balloon exploding.")
icon_state = "telebaton_0"
item_state = "telebaton_0"
w_class = 2
@@ -125,7 +133,9 @@
/obj/item/weapon/melee/telebaton/attack(mob/target as mob, mob/living/user as mob)
if(on)
if ((M_CLUMSY in user.mutations) && prob(50))
user << "<span class='warning'>You club yourself over the head.</span>"
user.simple_message("<span class='warning'>You club yourself over the head.</span>",
"<span class='danger'>The fishing rod goes mad!</span>")
user.Weaken(3 * force)
if(ishuman(user))
var/mob/living/carbon/human/H = user
@@ -146,7 +156,10 @@
user.attack_log += text("\[[time_stamp()]\] <font color='red'>Used the [src.name] to attack [target.name] ([target.ckey])</font>")
log_attack("<font color='red'>[user.name] ([user.ckey]) attacked [target.name] ([target.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])</font>")
src.add_fingerprint(user)
target.visible_message("<span class='danger'>[target] has been stunned with \the [src] by [user]!</span>")
target.visible_message("<span class='danger'>[target] has been stunned with \the [src] by [user]!</span>",\
drugged_message="<span class='notice'>[user] smacks [target] with the fishing rod!</span>")
if(!iscarbon(user))
target.LAssailant = null
else

View File

@@ -452,12 +452,14 @@
if(safety < 2)
switch(safety)
if(1)
usr << "<span class='warning'>Your eyes sting a little.</span>"
usr.simple_message("<span class='warning'>Your eyes sting a little.</span>",\
"<span class='warning'>You shed a tear.</span>")
E.damage += rand(1, 2)
if(E.damage > 12)
user.eye_blurry += rand(3,6)
if(0)
usr << "<span class='warning'>Your eyes burn.</span>"
usr.simple_message("<span class='warning'>Your eyes burn.</span>",\
"<span class='warning'>Some tears fall down from your eyes.</span>")
E.damage += rand(2, 4)
if(E.damage > 10)
E.damage += rand(4,10)
@@ -465,16 +467,18 @@
var/obj/item/clothing/to_blame = H.head //blame the hat
if(!to_blame || (istype(to_blame) && H.glasses && H.glasses.eyeprot < to_blame.eyeprot)) //if we don't have a hat, the issue is the glasses. Otherwise, if the glasses are worse, blame the glasses
to_blame = H.glasses
usr << "<span class='warning'>Your [to_blame] intensifies the welder's glow. Your eyes itch and burn severely.</span>"
usr.simple_message("<span class='warning'>Your [to_blame] intensifies the welder's glow. Your eyes itch and burn severely.</span>",\
"<span class='warning'>Somebody's cutting onions.</span>")
user.eye_blurry += rand(12,20)
E.damage += rand(12, 16)
if(E.damage > 10 && safety < 2)
user << "<span class='warning'>Your eyes are really starting to hurt. This can't be good for you!</span>"
user.simple_message("<span class='warning'>Your eyes are really starting to hurt. This can't be good for you!</span>",\
"<span class='warning'>This is too sad! You start to cry.</span>")
if (E.damage >= E.min_broken_damage)
user << "<span class='warning'>You go blind!</span>"
user.simple_message("<span class='warning'>You go blind!</span>","<span class='warning'>Somebody turns the lights off.</span>")
user.sdisabilities |= BLIND
else if (E.damage >= E.min_bruised_damage)
user << "<span class='warning'>You go blind!</span>"
user.simple_message("<span class='warning'>You go blind!</span>","<span class='warning'>Somebody turns the lights off.</span>")
user.eye_blind = 5
user.eye_blurry = 5
user.disabilities |= NEARSIGHTED
@@ -660,18 +664,22 @@
if(istype(W,/obj/item/weapon/reagent_containers/glass/))
var/obj/item/weapon/reagent_containers/glass/G = W
if(G.reagents.reagent_list.len>1)
user << "<span class='warning'>The mixture is rejected by the tool.</span>"
user.simple_message("<span class='warning'>The mixture is rejected by the tool.</span>",
"<span class='warning'>The tool isn't THAT thirsty.</span>")
return
if(!G.reagents.has_reagent("sacid", 1))
user << "<span class='warning'>The tool is not compatible with that.</span>"
user.simple_message("<span class='warning'>The tool is not compatible with that.</span>",
"<span class='warning'>The tool won't drink that.</span>")
return
else
var/space = max_fuel - reagents.total_volume
if(!space)
user << "<span class='warning'>The tool is full!</span>"
user.simple_message("<span class='warning'>The tool is full!</span>",
"<span class='warning'>The tool isn't thirsty.</span>")
return
var/transfer_amount = min(G.amount_per_transfer_from_this,space)
user << "<span class='info'>You transfer [transfer_amount] units to the [src].</span>"
user.simple_message("<span class='info'>You transfer [transfer_amount] units to the [src].</span>",
"<span class='info'>The tool gulps down your drink!</span>")
G.reagents.trans_id_to(src,"sacid",transfer_amount)
update_icon()
else
@@ -684,7 +692,8 @@
update_icon()
return 1
else
user << "<span class='warn'>The tool does not have enough acid!</span>"
user.simple_message("<span class='warn'>The tool does not have enough acid!</span>",
"<span class='warn'>The tool is too thirsty!</span>")
return 0
/*

View File

@@ -357,6 +357,38 @@
return
src.add_fingerprint(user)
var/mob/living/L = user
if(src.opened==0 && L && L.client && L.hallucinating()) //If the closet is CLOSED and user is hallucinating
if(prob(10))
var/client/C = L.client
var/image/temp_overlay = image(src.icon, icon_state=src.icon_opened) //Get the closet's OPEN icon
temp_overlay.override = 1
temp_overlay.loc = src
var/image/spooky_overlay
switch(rand(0,5))
if(0) spooky_overlay = image('icons/mob/animal.dmi',icon_state="hunter",dir=turn(L.dir,180))
if(1) spooky_overlay = image('icons/mob/animal.dmi',icon_state="zombie",dir=turn(L.dir,180))
if(2) spooky_overlay = image('icons/mob/horror.dmi',icon_state="horror_[pick("male","female")]",dir=turn(L.dir,180))
if(3) spooky_overlay = image('icons/mob/animal.dmi',icon_state="faithless",dir=turn(L.dir,180))
if(4) spooky_overlay = image('icons/mob/animal.dmi',icon_state="carp",dir=turn(L.dir,180))
if(5) spooky_overlay = image('icons/mob/animal.dmi',icon_state="skelly",dir=turn(L.dir,180))
if(!spooky_overlay) return
temp_overlay.overlays += spooky_overlay
C.images += temp_overlay
L << sound('sound/machines/click.ogg')
L << sound('sound/hallucinations/scary.ogg')
L.Weaken(5)
sleep(50)
if(C)
C.images -= temp_overlay
return
if(!src.toggle())
usr << "<span class='notice'>It won't budge!</span>"

View File

@@ -18,6 +18,20 @@
if(!(VAMP_MATURE in H.mind.vampire.powers))
H << "<span class='notice'>You don't see anything.</span>"
return
if(user.hallucinating())
switch(rand(1,100))
if(1 to 20)
H << "<span class='sinister'>You look like [pick("a monster","a goliath","a catbeast","a ghost","a chicken","the mailman","a demon")]! Your heart skips a beat.</span>"
H.Weaken(4)
return
if(21 to 40)
H << "<span class='sinister'>There's [pick("somebody","a monster","a little girl","a zombie","a ghost","a catbeast","a demon")] standing behind you!</span>"
H.emote("scream",,, 1)
H.dir = turn(H.dir, 180)
return
if(41 to 50)
H << "<span class='notice'>You don't see anything.</span>"
return
var/userloc = H.loc
//see code/modules/mob/new_player/preferences.dm at approx line 545 for comments!

View File

@@ -320,7 +320,7 @@
del(src.connected)
return
/obj/structure/crematorium/proc/cremate(mob/user)
/obj/structure/crematorium/proc/cremate(mob/user)
//writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/obj/structure/crematorium/proc/cremate() called tick#: [world.time]")
// for(var/obj/machinery/crema_switch/O in src) //trying to figure a way to call the switch, too drunk to sort it out atm
// if(var/on == 1)
@@ -341,7 +341,11 @@
return
for (var/mob/M in viewers(src))
M.show_message("<span class='warning'>You hear a roar as the crematorium activates.</span>", 1)
if(!M.hallucinating())
M.show_message("<span class='warning'>You hear a roar as the crematorium activates.</span>", 1)
else
M.show_message("<span class='notice'>You hear chewing as the crematorium consumes its meal.</span>", 1)
M << 'sound/items/eatfood.ogg'
locked = 1
cremating = 1

View File

@@ -62,10 +62,7 @@
if(usr)
if (usr.client)
if(usr.client.holder)
if(M.mind.assigned_role == "Chaplain")
M << "<B>You hear the voice of [ticker.Bible_deity_name] in your head... <em>[msg]</B></em>"
else
M << "<B>You hear a voice in your head... <em>[msg]</B></em>"
M.get_subtle_message(msg)
log_admin("SubtlePM: [key_name(usr)] -> [key_name(M)] : [msg]")
message_admins("<span class='notice'><B>SubtleMessage: [key_name_admin(usr)] -> [key_name_admin(M)] : [msg]</B></span>", 1)

View File

@@ -25,7 +25,7 @@ mob/living/carbon/proc/handle_hallucinations()
handling_hal = 1
while(hallucination > 20)
sleep(rand(200,500)/(hallucination/25))
var/halpick = rand(1,110)
var/halpick = rand(1,104)
switch(halpick)
if(0 to 15)
//Screwy HUD
@@ -136,7 +136,7 @@ mob/living/carbon/proc/handle_hallucinations()
src << 'sound/weapons/Taser.ogg'
//Rare audio
if(12)
//These sounds are (mostly) taken from Hidden: Source
//These sounds are (mostly) taken from Hidden: Source
var/list/creepyasssounds = list('sound/effects/ghost.ogg', 'sound/effects/ghost2.ogg', 'sound/effects/Heart Beat.ogg', 'sound/effects/screech.ogg',\
'sound/hallucinations/behind_you1.ogg', 'sound/hallucinations/behind_you2.ogg', 'sound/hallucinations/far_noise.ogg', 'sound/hallucinations/growl1.ogg', 'sound/hallucinations/growl2.ogg',\
'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
@@ -195,36 +195,86 @@ mob/living/carbon/proc/handle_hallucinations()
src.sleeping = 0
hal_crit = 0
hal_screwyhud = 0
if(73 to 77)
if(73 to 75)
//Fake changeling/parapen
if(prob(1) && prob(1))
if(prob(0.01))
src << "<span class='warning'>You feel a <b>HUGE</b> prick!</span>"
else
src << "<span class='warning'>You feel a tiny prick!</span>"
if(78 to 80)
src << "<h1 class='alert'>Priority Announcement</h1>"
src << "<span class='alert'>The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.</span>"
src << sound('sound/AI/shuttledock.ogg')
if(81) //Fake malf AI
if(prob(10))
if(76)
if(prob(5))
src << "<h1 class='alert'>Priority Announcement</h1>"
src << "<span class='alert'>The Emergency Shuttle has docked with the station. You have 3 minutes to board the Emergency Shuttle.</span>"
src << sound('sound/AI/shuttledock.ogg')
else
var/txt_verb = pick("go to","die in","stay in","avoid")
var/location = pick("security","arrivals","bridge","your old house","the escape shuttle hallway","deep space","the DJ satelite","science")
src << "<i>You feel a sudden urge to [txt_verb] [location][pick("...","!",".")]</i>"
if(77) //Sillycone
if(prob(5))
src << "<font size=4 color='red'>Attention! Delta security level reached!</font>"
src << "<font color='red'>[config.alert_desc_delta]</font>"
src << sound('sound/AI/aimalf.ogg')
if(82 to 85) //Fake ghosts
if(src.client)
message_admins("[key_name(usr)] just got a fake delta AI message from hallucinating! [formatJumpTo(get_turf(usr))]")
else
switch(rand(1,10)) //Copied from nanites disease
if(1) src << "Your joints feel stiff."
if(2) src << "<span class='warning'>Beep...boop..</span>"
if(3) src << "<span class='warning'>Bop...beeep...</span>"
if(4) src << "<span class='warning'>Your joints feel very stiff.</span>"
if(5) src.say(pick("Beep, boop", "beep, beep!", "Boop...bop"))
if(6) src << "Your skin feels loose."
if(7) src << "<span class='warning'>You feel a stabbing pain in your head.</span>"
if(8) src << "<span class='warning'>You can feel something move...inside.</span>"
if(9) src << "<span class='warning'>Your skin feels very loose.</span>"
if(10) src << "<span class='warning'>Your skin feels as if it's about to burst off...</span>"
if(78 to 80) //Fake ghosts
src << "<i>[pick(boo_phrases)]</i>"
if(86) //Fake flash
if(81) //Fake flash
src << sound('sound/weapons/flash.ogg')
src.Weaken(10)
flick("e_flash", src.flash)
if(87 to 90) //Clown
if(prob(20))
src.Weaken(10)
if(82 to 85) //Clown
src << get_sfx("clownstep")
spawn(rand(16,28))
src << get_sfx("clownstep")
if(86) //nom nom
if(prob(15))
var/mob/living/L = src
if(prob(50))
var/list/mob_list=list()
for(var/mob/living/M in view(src))
mob_list |= M
L = pick(mob_list)
var/obj/item/random_food = pick(typesof(/obj/item/weapon/reagent_containers/food/snacks) - typesof(/obj/item/weapon/reagent_containers/food/snacks/customizable))
if(initial(random_food.icon) && initial(random_food.name) && initial(random_food.icon_state))
var/image/foodie = image(initial(random_food.icon), initial(random_food.icon_state))
foodie.loc = L
foodie.override = 1
var/client/C = src.client
C.images += foodie
if(L == src)
src << "<span class='notice'>You feel like a [initial(random_food.name)]. Oh wow!</span>"
else
src << "<span class='notice'>You smell [initial(random_food.name)]...</span>"
sleep(rand(50,150))
if(!C) return
C.screen -= foodie
handling_hal = 0
/*obj/machinery/proc/mockpanel(list/buttons,start_txt,end_txt,list/mid_txts)
//writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/obj/machinery/proc/mockpanel() called tick#: [world.time]")

View File

@@ -82,3 +82,7 @@
set_light(6, 2, LIGHT_COLOR_TUNGSTEN)
set_light(6, 2, LIGHT_COLOR_TUNGSTEN)
flickering = 0
/obj/structure/hanging_lantern/spook()
if(..())
flicker()

View File

@@ -1,5 +1,3 @@
var/global/list/boo_phrases=list(
"You feel a chill run down your spine.",
"You think you see a figure in your peripheral vision.",
@@ -11,6 +9,16 @@ var/global/list/boo_phrases=list(
"It feels like someone's standing behind you.",
)
var/global/list/boo_phrases_drugs=list(
"You feel something run down your leg!",
"You think you can see an elephant in your peripheral vision.",
"Was that a giraffe?",
"The hairs stand up on the back of your neck and applaud.",
"You are filled with happiness and delight.",
"Oh wow! Great stuff!",
"You feel like a room without a roof.",
)
var/global/list/boo_phrases_silicon=list(
"01100001 00100000 01110100 01110111 01101112",
"Stack overflow at line: -2147483648",
@@ -47,39 +55,4 @@ var/global/list/boo_phrases_silicon=list(
/spell/aoe_turf/boo/cast(list/targets)
for(var/turf/T in targets)
for(var/atom/A in T.contents)
// Bug humans
if(ishuman(A))
var/mob/living/carbon/human/H = A
if(H && H.client)
H << "<i>[pick(boo_phrases)]</i>"
if(isrobot(A))
var/mob/living/silicon/S = A
if(S && S.client)
S << "<i>[pick(boo_phrases_silicon)]</i>"
// Blessed object? Skippit.
if(isobj(A) && A:blessed)
continue
// Flicker unblessed lights in range
if(istype(A,/obj/machinery/light))
var/obj/machinery/light/L = A
if(L)
L.flicker()
if(istype(A,/obj/structure/hanging_lantern))
var/obj/structure/hanging_lantern/H = A
if(H) //Fucked if I know
H.flicker()
// OH GOD BLUE APC (single animation cycle)
if(istype(A, /obj/machinery/power/apc))
A:spookify()
if(istype(A, /obj/machinery/status_display))
A:spookymode=1
if(istype(A, /obj/machinery/ai_status_display))
A:spookymode=1
A.spook()

View File

@@ -233,7 +233,10 @@
visible_message( \
"<span class='warning'>[src] was shocked by the [source]!</span>", \
"<span class='danger'>You feel a powerful shock course through your body!</span>", \
"<span class='warning'>You hear a heavy electrical crack.</span>" \
"<span class='warning'>You hear a heavy electrical crack.</span>", \
"<span class='notice'>[src] starts raving!</span>", \
"<span class='notice'>You feel butterflies in your stomach!</span>", \
"<span class='warning'>You hear a policeman whistling!</span>"
)
//if(src.stunned < shock_damage) src.stunned = shock_damage

View File

@@ -122,7 +122,10 @@
visible_message( \
"<span class='warning'>[src] was shocked by the [source]!</span>", \
"<span class='danger'>You feel a powerful shock course through your body!</span>", \
"<span class='warning'>You hear a heavy electrical crack.</span>" \
"<span class='warning'>You hear a heavy electrical crack.</span>", \
"<span class='notice'>[src] starts raving!</span>", \
"<span class='notice'>You feel butterflies in your stomach!</span>", \
"<span class='warning'>You hear a policeman whistling!</span>"
)
//if(src.stunned < shock_damage) src.stunned = shock_damage
@@ -233,6 +236,8 @@
M.visible_message( \
"<span class='notice'>[M] shakes [src] trying to wake [t_him] up!</span>", \
"<span class='notice'>You shake [src] trying to wake [t_him] up!</span>", \
drugged_message = "<span class='notice'>[M] starts massaging [t_him]'s back.</span>", \
self_drugged_message = "<span class='notice'>You start massaging [t_him]'s back.</span>"
)
// BEGIN HUGCODE - N3X
else
@@ -356,7 +361,8 @@
//actually throw it!
if (item)
item.forceMove(get_turf(src))
src.visible_message("<span class='warning'>[src] has thrown [item].</span>")
src.visible_message("<span class='warning'>[src] has thrown [item].</span>", \
drugged_message = "<span class='warning'>[item] escapes from [src]'s grasp and flies away!</span>")
if((istype(src.loc, /turf/space)) || (src.areaMaster.has_gravity == 0))
var/mob/space_obj=src
@@ -596,7 +602,8 @@
src << "<span class='warning'>Your young are not ready yet.</span>"
else
src << "<span class='danger'>Your host twitches and quivers as you rapidly excrete several larvae from your sluglike body.</span>"
visible_message("<span class='danger'>[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!</span>")
visible_message("<span class='danger'>[src] heaves violently, expelling a rush of vomit and a wriggling, sluglike creature!</span>", \
drugged_message = "<span class='notice'>[src] starts vomiting a rainbow! Suddenly, a pot of gold appears.</span>")
B.chemicals -= 100
B.numChildren++
@@ -634,4 +641,4 @@
return 0
/mob/living/carbon/CheckSlip()
return !locked_to && !lying
return !locked_to && !lying

View File

@@ -1758,3 +1758,11 @@
return 0
return 1
/mob/living/carbon/human/spook()
if(!client) return
if(!hallucinating())
src << "<i>[pick(boo_phrases)]</i>"
else
src << "<b><font color='[pick("red","orange","yellow","green","blue")]'>[pick(boo_phrases_drugs)]</font></b>"

View File

@@ -329,7 +329,6 @@ var/global/list/organ_damage_overlays = list(
update_overlays = 0
UpdateDamageIcon()
cycle++
..()
//Need this in species.

View File

@@ -193,6 +193,8 @@
if(druggy)
druggy = max(druggy - 1, 0)
if(!druggy)
src << "It looks like you are back in Kansas."
/*
// Increase germ_level regularly
if(prob(40))

View File

@@ -644,7 +644,8 @@ Thanks.
if (prob(75))
var/obj/item/weapon/grab/G = pick(M.grabbed_by)
if (istype(G, /obj/item/weapon/grab))
visible_message("<span class='danger'>[src] has pulled [G.affecting] from [G.assailant]'s grip.</span>")
visible_message("<span class='danger'>[src] has pulled [G.affecting] from [G.assailant]'s grip.</span>",
drugged_message="<span class='danger'>[src] has pulled [G.affecting] from [G.assailant]'s hug.</span>")
qdel(G)
else
ok = 0
@@ -710,7 +711,8 @@ Thanks.
var/mob/living/simple_animal/borer/B = src.loc
var/mob/living/captive_brain/H = src
H << "<span class='danger'>You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).</span>"
H.simple_message("<span class='danger'>You begin doggedly resisting the parasite's control (this will take approximately sixty seconds).</span>",\
"<span class='danger'>You attempt to remember who you are and how the heck did you get here (this will probably take a while).</span>")
B.host << "<span class='danger'>You feel the captive mind of [src] begin to resist your control.</span>"
spawn(rand(350,450)+B.host.brainloss)
@@ -719,7 +721,7 @@ Thanks.
return
B.host.adjustBrainLoss(rand(5,10))
H << "<span class='danger'>With an immense exertion of will, you regain control of your body!</span>"
H.simple_message("<span class='danger'>With an immense exertion of will, you regain control of your body!</span>")
B.host << "<span class='danger'>You feel control of the host brain ripped from your grasp, and retract your probosci before the wild neural impulses can damage you.</span>"
var/mob/living/carbon/C=B.host
@@ -741,12 +743,14 @@ Thanks.
else
if (G.state == GRAB_AGGRESSIVE)
if (prob(25))
L.visible_message("<span class='danger'>[L] has broken free of [G.assailant]'s grip!</span>")
L.visible_message("<span class='danger'>[L] has broken free of [G.assailant]'s grip!</span>", \
drugged_message="<span class='danger'>[L] has broken free of [G.assailant]'s hug!</span>")
returnToPool(G)
else
if (G.state == GRAB_NECK)
if (prob(5))
L.visible_message("<span class='danger'>[L] has broken free of [G.assailant]'s headlock!</span>")
L.visible_message("<span class='danger'>[L] has broken free of [G.assailant]'s headlock!</span>", \
drugged_message="<span class='danger'>[L] has broken free of [G.assailant]'s passionate hug!</span>")
returnToPool(G)
if(resisting)
L.visible_message("<span class='danger'>[L] resists!</span>")
@@ -761,16 +765,19 @@ Thanks.
C.delayNextAttack(100)
C.delayNextSpecial(100)
C.visible_message("<span class='warning'>[C] attempts to unbuckle themself!</span>",
"<span class='warning'>You attempt to unbuckle yourself. (This will take around two minutes and you need to stand still).</span>")
"<span class='warning'>You attempt to unbuckle yourself (this will take around two minutes, and you need to stay still).</span>",
self_drugged_message="<span class='warning'>You attempt to regain control of your legs (this will take a while).</span>")
spawn(0)
if(do_after(usr, usr, 1200))
if(!C.locked_to)
return
C.visible_message("<span class='danger'>[C] manages to unbuckle themself!</span>",
"<span class='notice'>You successfully unbuckle yourself.</span>")
C.visible_message("<span class='danger'>[C] manages to unbuckle themself!</span>",\
"<span class='notice'>You successfully unbuckle yourself.</span>",\
self_drugged_message="<span class='notice'>You successfully regain control of your legs and stand up.</span>")
B.manual_unbuckle(C)
else
C << "<span class='warning'>Your unbuckling attempt was interrupted.</span>"
C.simple_message("<span class='warning'>Your unbuckling attempt was interrupted.</span>", \
"<span class='warning'>Your attempt to regain control of your legs was interrupted. Damn it!</span>")
else
B.manual_unbuckle(L)
@@ -859,7 +866,7 @@ Thanks.
if(!CM.handcuffed || CM.locked_to)
return
CM.visible_message("<span class='danger'>[CM] manages to break the handcuffs!</span>",
"<span class='notice'>You successful break your handcuffs.</span>")
"<span class='notice'>You successfuly break your handcuffs.</span>")
CM.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!" ))
del(CM.handcuffed)
CM.handcuffed = null
@@ -874,18 +881,21 @@ Thanks.
if(!(breakouttime))
breakouttime = 1200 //Default
CM.visible_message("<span class='danger'>[CM] attempts to remove [HC]!</span>",
"<span class='warning'>You attempt to remove [HC]. (This will take around [(breakouttime)/600] minutes and you need to stand still).</span>")
"<span class='warning'>You attempt to remove [HC] (this will take around [(breakouttime)/600] minutes and you need to stand still).</span>",
self_drugged_message="<span class='warning'>You attempt to regain control of your hands (this will take a while).</span>")
spawn(0)
if(do_after(CM,CM, breakouttime))
if(!CM.handcuffed || CM.locked_to)
return // time leniency for lag which also might make this whole thing pointless but the server
CM.visible_message("<span class='danger'>[CM] manages to remove [HC]!</span>",
"<span class='notice'>You successful remove [HC].</span>")
"<span class='notice'>You successfuly remove [HC].</span>",
self_drugged_message="<span class='notice'>You successfully regain control of your hands.</span>")
CM.handcuffed.loc = usr.loc
CM.handcuffed = null
CM.update_inv_handcuffed()
else
CM << "<span class='warning'>Your uncuffing attempt was interrupted.</span>"
CM.simple_message("<span class='warning'>Your uncuffing attempt was interrupted.</span>",
"<span class='warning'>Your attempt to regain control of your hands was interrupted. Damn it!</span>")
else if(CM.legcuffed && CM.canmove && CM.special_delayer.blocked())
CM.delayNext(DELAY_ALL,100)

View File

@@ -310,3 +310,6 @@
if(max(abs(AM.x-src.x),abs(AM.y-src.y)) <= client.view)
return 1
return 0
/mob/living/silicon/spook()
src << "<i>[pick(boo_phrases)]</i>"

View File

@@ -1,3 +1,6 @@
#define MOB_SPACEDRUGS_HALLUCINATING 5
#define MOB_MINDBREAKER_HALLUCINATING 100
/obj/screen/fuckstat
name = "Toggle Stat"
desc = "Fuck It"
@@ -236,10 +239,13 @@ var/global/obj/screen/fuckstat/FUCK = new
usr.show_message(t, 1)
#define MESSAGE_SEE 1
#define MESSAGE_HEAR 2
/mob/proc/simple_message(var/msg, var/hallucination_msg)//Same as M << "message", but with additinal message for hallucinations
if(hallucinating() && hallucination_msg)
src << hallucination_msg
else
src << msg
/mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2)
/mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1=visible or 2=hearable), alternative message, alt message type (1=if blind or 2=if deaf)
//writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/mob/proc/show_message() called tick#: [world.time]")
@@ -251,13 +257,13 @@ var/global/obj/screen/fuckstat/FUCK = new
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
if(type)
if((type & MESSAGE_SEE) && (sdisabilities & BLIND || blinded || paralysis)) //Vision related //We can't see all those emotes no-one ever does !
if((type & MESSAGE_SEE) && is_blind()) //Vision related //We can't see all those emotes no-one ever does !
if(!(alt))
return
else
msg = alt
type = alt_type
if((type & MESSAGE_HEAR) && (sdisabilities & DEAF || ear_deaf)) //Hearing related //We can't hear what the person is saying. Too bad
if((type & MESSAGE_HEAR) && is_deaf()) //Hearing related //We can't hear what the person is saying. Too bad
if(!(alt))
src << "<span class='notice'>You can almost hear someone talking.</span>" //Well, not THAT deaf
return //And that does it
@@ -288,24 +294,49 @@ var/global/obj/screen/fuckstat/FUCK = new
// message is the message output to anyone who can see e.g. "[src] does something!"
// self_message (optional) is what the src mob sees e.g. "You do something!"
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
// drugged_message (optional) is shown to hallucinating mobs instead of message
// self_drugged_message (optional) is shown to src mob if it's hallucinating
// blind_drugged_message (optional) is shown to blind hallucinating people
/mob/visible_message(var/message, var/self_message, var/blind_message)
/mob/visible_message(var/message, var/self_message, var/blind_message, var/drugged_message, var/self_drugged_message, var/blind_drugged_message)
for(var/mob/M in viewers(src))
if(M.see_invisible < invisibility)
continue
var/hallucination = M.hallucinating()
var/msg = message
if(self_message && M==src)
msg = self_message
M.show_message( msg, 1, blind_message, 2)
var/msg2 = blind_message
if(hallucination && drugged_message)
if(drugged_message)
msg = drugged_message
if(blind_drugged_message)
msg2 = blind_drugged_message
if(M==src)
if(self_message)
msg = self_message
if(hallucination && self_drugged_message)
msg = self_drugged_message
M.show_message( msg, 1, msg2, 2)
// Show a message to all mobs in sight of this atom
// Use for objects performing visible actions
// message is output to anyone who can see, e.g. "The [src] does something!"
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
/atom/proc/visible_message(var/message, var/blind_message)
/atom/proc/visible_message(var/message, var/blind_message, var/drugged_message, var/blind_drugged_message)
//writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/atom/proc/visible_message() called tick#: [world.time]")
for(var/mob/M in viewers(src))
M.show_message( message, 1, blind_message, 2)
var/hallucination = M.hallucinating()
var/msg = message
var/msg2 = blind_message
if(hallucination)
if(drugged_message)
msg = drugged_message
if(blind_drugged_message)
msg2 = blind_drugged_message
M.show_message( msg, 1, msg2, 2)
/mob/proc/findname(msg)
@@ -1738,3 +1769,38 @@ mob/proc/walking()
/mob/can_shuttle_move()
return 1
/mob/proc/is_blind()
if(sdisabilities & BLIND || blinded || paralysis)
return 1
return 0
/mob/proc/is_deaf()
if(sdisabilities & DEAF || ear_deaf)
return 1
return 0
/mob/proc/hallucinating() //Return 1 if hallucinating! This doesn't affect the scary stuff from mindbreaker toxin, but it does affect other stuff (like special messages for interacting with objects)
//writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/mob/proc/hallucinating() called tick#: [world.time]")
if(isliving(src))
var/mob/living/M = src
if(M.hallucination >= MOB_MINDBREAKER_HALLUCINATING)
return 1
if(M.druggy >= MOB_SPACEDRUGS_HALLUCINATING)
return 1
return 0
/mob/proc/get_subtle_message(var/msg)
//writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/mob/proc/get_subtle_message() called tick#: [world.time]")
var/pre_msg = "You hear a voice in your head..."
if(mind && mind.assigned_role == "Chaplain")
pre_msg = "You hear the voice of [ticker.Bible_deity_name] in your head... "
if(src.hallucinating()) //If hallucinating, make subtle messages more fun
var/adjective = pick("an angry","a funny","a squeaky","a disappointed","your mother's","your father's","[ticker.Bible_deity_name]'s","an annoyed","a brittle","a loud","a very loud","a quiet")
var/location = pick(" from above"," from below"," in your head","")
pre_msg = pick("You hear [adjective] voice[location]...")
src << "<b>[pre_msg] <em>[msg]</em></b>"
#undef MOB_SPACEDRUGS_HALLUCINATING
#undef MOB_MINDBREAKER_HALLUCINATING

View File

@@ -125,7 +125,8 @@
if(state < GRAB_AGGRESSIVE)
if(!allow_upgrade)
return
assailant.visible_message("<span class='warning'>[assailant] has grabbed [affecting] aggressively (now hands)!</span>")
assailant.visible_message("<span class='warning'>[assailant] has grabbed [affecting] aggressively (now hands)!</span>", \
drugged_message = "<span class='warning'>[assailant] has hugged [affecting] passionately!</span>")
state = GRAB_AGGRESSIVE
icon_state = "grabbed1"
else
@@ -133,7 +134,8 @@
if(isslime(affecting))
assailant << "<span class='notice'>You squeeze [affecting], but nothing interesting happens.</span>"
return
assailant.visible_message("<span class='warning'>[assailant] has reinforced \his grip on [affecting] (now neck)!</span>")
assailant.visible_message("<span class='warning'>[assailant] has reinforced \his grip on [affecting] (now neck)!</span>", \
drugged_message = "<span class='warning'>[assailant] has reinforced \his hug on [affecting]!</span>")
state = GRAB_NECK
icon_state = "grabbed+1"
if(!affecting.locked_to)
@@ -145,7 +147,8 @@
hud.name = "disarm/kill"
else
if(state < GRAB_UPGRADING)
assailant.visible_message("<span class='danger'>[assailant] starts to tighten \his grip on [affecting]'s neck!</span>")
assailant.visible_message("<span class='danger'>[assailant] starts to tighten \his grip on [affecting]'s neck!</span>", \
drugged_message = "<span class='danger'>[assailant] starts to tighten \his hug on [affecting]!</span>")
hud.icon_state = "disarm/kill1"
state = GRAB_UPGRADING
if(do_after(assailant,affecting, UPGRADE_KILL_TIMER))
@@ -158,7 +161,8 @@
returnToPool(src)
return
state = GRAB_KILL
assailant.visible_message("<span class='danger'>[assailant] has tightened \his grip on [affecting]'s neck!</span>")
assailant.visible_message("<span class='danger'>[assailant] has tightened \his grip on [affecting]'s neck!</span>", \
drugged_message = "<span class='danger'>[assailant] has tightened \his hug on [affecting]!</span>")
affecting.attack_log += "\[[time_stamp()]\] <font color='orange'>Has been strangled (kill intent) by [assailant.name] ([assailant.ckey])</font>"
assailant.attack_log += "\[[time_stamp()]\] <font color='red'>Strangled (kill intent) [affecting.name] ([affecting.ckey])</font>"
log_attack("<font color='red'>[assailant.name] ([assailant.ckey]) Strangled (kill intent) [affecting.name] ([affecting.ckey])</font>")
@@ -171,7 +175,8 @@
if(!assailant || !affecting)
returnToPool(src)
return
assailant.visible_message("<span class='warning'>[assailant] was unable to tighten \his grip on [affecting]'s neck!</span>")
assailant.visible_message("<span class='warning'>[assailant] was unable to tighten \his grip on [affecting]'s neck!</span>", \
drugged_message = "<span class='warning'>[affecting] refused [assailant]'s hug!</span>")
hud.icon_state = "disarm/kill"
state = GRAB_NECK
@@ -202,12 +207,14 @@
if(M == assailant && state >= GRAB_AGGRESSIVE)
if( (ishuman(user) && (M_FAT in user.mutations) && ismonkey(affecting) ) || ( isalien(user) && iscarbon(affecting) ) )
var/mob/living/carbon/attacker = user
user.visible_message("<span class='danger'>[user] is attempting to devour [affecting]!</span>")
user.visible_message("<span class='danger'>[user] is attempting to devour [affecting]!</span>", \
drugged_message="<span class='danger'>[user] is attempting to kiss [affecting]! Ew!</span>")
if(istype(user, /mob/living/carbon/alien/humanoid/hunter))
if(!do_mob(user, affecting)) return
else
if(!do_mob(user, affecting, 100)) return
user.visible_message("<span class='danger'>[user] devours [affecting]!</span>")
user.visible_message("<span class='danger'>[user] devours [affecting]!</span>", \
drugged_message="<span class='danger'>[affecting] vanishes in disgust.</span>")
affecting.loc = user
attacker.stomach_contents.Add(affecting)
returnToPool(src)

View File

@@ -345,12 +345,14 @@
if(G.state == GRAB_AGGRESSIVE)
mob.delayNextMove(10)
if(!prob(25)) return 1
mob.visible_message("<span class='warning'> [mob] has broken free of [G.assailant]'s grip!</span>")
mob.visible_message("<span class='warning'>[mob] has broken free of [G.assailant]'s grip!</span>",
drugged_message="<span class='warning'>[mob] has broken free of [G.assailant]'s hug!</span>")
returnToPool(G)
if(G.state == GRAB_NECK)
mob.delayNextMove(10)
if(!prob(5)) return 1
mob.visible_message("<span class='warning'> [mob] has broken free of [G.assailant]'s headlock!</span>")
mob.visible_message("<span class='warning'>[mob] has broken free of [G.assailant]'s headlock!</span>",
drugged_message="<span class='warning'>[mob] has broken free of [G.assailant]'s passionate hug!</span>")
returnToPool(G)
return 0

View File

@@ -350,9 +350,11 @@
update_icon()
updating_icon = 0
/obj/machinery/power/apc/proc/spookify()
/obj/machinery/power/apc/spook()
//writepanic("[__FILE__].[__LINE__] ([src.type])([usr ? usr.ckey : ""]) \\/obj/machinery/power/apc/proc/spookify() called tick#: [world.time]")
if(spooky) return // Fuck you we're already spooky
if(!..()) return //If blessed, return
spooky=1
update_icon()
spawn(10)

View File

@@ -161,6 +161,10 @@ var/global/list/obj/machinery/light/alllights = list()
var/idle = 0 // For process().
/obj/machinery/light/spook()
if(..())
flicker()
// the smaller bulb light fixture
/obj/machinery/light/cultify()

View File

@@ -1240,3 +1240,7 @@ var/proccalls = 1
#define SIZE_HUGE 5 //Pine trees
#define ADIABATIC_EXPONENT 0.667 //This means something g-guys
//For mob/proc/show_message (code/modules/mob/mob.dm @ 248)
#define MESSAGE_SEE 1 //Visible message
#define MESSAGE_HEAR 2 //Hearable message