Drug Expansion (#8575)

* adds drugs and means to make them

* nutmeg sprite and hallucination changes

* adjustments + sounds courtesy of serithi

* nit nack paddy wack
This commit is contained in:
Sypsoti
2022-04-29 19:24:16 -05:00
committed by GitHub
parent 60c189933a
commit 661b83e61d
21 changed files with 558 additions and 357 deletions

View File

@@ -5,13 +5,13 @@
//Illicit drugs~
/obj/item/storage/pill_bottle/happy
name = "bottle of Happy pills"
desc = "Highly illegal drug. When you want to see the rainbow."
desc = "A recreational drug. When you want to see the rainbow. Probably not work-approved..."
wrapper_color = COLOR_PINK
starts_with = list(/obj/item/reagent_containers/pill/happy = 7)
/obj/item/storage/pill_bottle/zoom
name = "bottle of Zoom pills"
desc = "Highly illegal drug. Trade brain for speed."
desc = "Probably illegal. Trade brain for speed."
wrapper_color = COLOR_BLUE
starts_with = list(/obj/item/reagent_containers/pill/zoom = 7)
@@ -52,8 +52,8 @@
icon = 'icons/obj/chemical.dmi'
icon_state = "powder"
item_state = "powder"
amount_per_transfer_from_this = 2
possible_transfer_amounts = 2
amount_per_transfer_from_this = 5
possible_transfer_amounts = 5
w_class = ITEMSIZE_TINY
volume = 50
@@ -94,4 +94,36 @@
if(!reagents.total_volume) /// Did we use all of it?
qdel(src)
////// End powder. /////////
////// End powder. ///////////
//////////////////////////////
///// Drugs for loadout///////
/obj/item/storage/pill_bottle/bliss
name = "unlabeled pill bottle"
desc = "A pill bottle with its label suspiciously scratched out."
starts_with = list(/obj/item/reagent_containers/pill/unidentified/bliss = 7)
/obj/item/storage/pill_bottle/snowflake
name = "unlabeled pill bottle"
desc = "A pill bottle with its label suspiciously scratched out."
starts_with = list(/obj/item/reagent_containers/pill/unidentified/snowflake = 7)
/obj/item/storage/pill_bottle/royale
name = "unlabeled pill bottle"
desc = "A pill bottle with its label suspiciously scratched out."
starts_with = list(/obj/item/reagent_containers/pill/unidentified/royale = 7)
/obj/item/storage/pill_bottle/sinkhole
name = "unlabeled pill bottle"
desc = "A pill bottle with its label suspiciously scratched out."
starts_with = list(/obj/item/reagent_containers/pill/unidentified/sinkhole = 7)
/obj/item/storage/pill_bottle/colorspace
name = "unlabeled pill bottle"
desc = "A pill bottle with its label suspiciously scratched out."
starts_with = list(/obj/item/reagent_containers/pill/unidentified/colorspace = 7)
/obj/item/storage/pill_bottle/schnappi
name = "unlabeled pill bottle"
desc = "A pill bottle with its label suspiciously scratched out."
starts_with = list(/obj/item/reagent_containers/pill/unidentified/schnappi = 7)

View File

@@ -545,6 +545,11 @@
desc = "Contains the seeds you need to get a little high."
starts_with = list(/obj/item/seeds/ambrosiavulgarisseed = 7)
/obj/item/storage/box/ambrosia_grown
name = "ambrosia box"
desc = "Contains a little pick-me-up for the long work day."
starts_with = list(/obj/item/reagent_containers/food/snacks/grown/ambrosiavulgaris = 7)
/obj/item/storage/box/ambrosiadeus
name = "ambrosia deus seeds box"
desc = "Contains the seeds you need to get a proper healthy high."

View File

@@ -0,0 +1,35 @@
/datum/gear/contraband
display_name = "ambrosia box"
description = "A box of a familiar plant."
path = /obj/item/storage/box/ambrosia_grown
cost = 1
sort_category = "Contraband"
/datum/gear/contraband/pills
display_name = "unlabeled pill bottle"
description = "A pill bottle of more... recreational sorts."
path = /obj/item/storage/pill_bottle
cost = 2
/datum/gear/contraband/pills/New()
..()
var/drug_type = list()
drug_type["Bliss"] = /obj/item/storage/pill_bottle/bliss
drug_type["Snowflake"] = /obj/item/storage/pill_bottle/snowflake
drug_type["Royale"] = /obj/item/storage/pill_bottle/royale
drug_type["Sinkhole"] = /obj/item/storage/pill_bottle/sinkhole
drug_type["Colorspace"] = /obj/item/storage/pill_bottle/colorspace
drug_type["Schnappi"] = /obj/item/storage/pill_bottle/schnappi
gear_tweaks += new/datum/gear_tweak/path(drug_type)
/datum/gear/contraband/rollingpaper
display_name = "rolling papers"
description = "Paper for rolling various smokeables. Now you just need something to roll up inside..."
path = /obj/item/storage/rollingpapers
cost = 1
/datum/gear/contraband/rollingpaper/New()
..()
var/paperselect = list("rolling papers" = /obj/item/storage/rollingpapers,
"blunt wrappers" = /obj/item/storage/rollingpapers/blunt)
gear_tweaks += new/datum/gear_tweak/path(paperselect)

View File

@@ -1,223 +1,71 @@
/*
Ideas for the subtle effects of hallucination:
Light up oxygen/phoron indicators (done)
Cause health to look critical/dead, even when standing (done)
Characters silently watching you
Brief flashes of fire/space/bombs/c4/dangerous shit (done)
Items that are rare/traitorous/don't exist appearing in your inventory slots (done)
Strange audio (should be rare) (done)
Gunshots/explosions/opening doors/less rare audio (done)
Hallucinations should not be oOoOoOo whacky, that's dumb.
Room for expanding on, but let's not imagine the crew wailing on you for taking some drugs.
*/
/mob/living/carbon
var/image/halimage
var/image/halbody
var/obj/halitem
var/hal_screwyhud = 0 //1 - critical, 2 - dead, 3 - oxygen indicator, 4 - toxin indicator
var/handling_hal = 0
var/hal_crit = 0
var/halmob_action
/mob/living/carbon/proc/handle_hallucinations()
if(handling_hal) return
handling_hal = 1
while(client && hallucination > 20)
sleep(rand(200,500)/(hallucination/25))
var/halpick = rand(1,100)
switch(halpick)
if(0 to 15)
//Screwy HUD
//to_chat(src, "Screwy HUD")
hal_screwyhud = pick(1,2,3,3,4,4)
spawn(rand(100,250))
hal_screwyhud = 0
if(16 to 25)
//Strange items
//to_chat(src, "Traitor Items")
if(!halitem)
halitem = new
var/list/slots_free = list(ui_lhand,ui_rhand)
if(l_hand) slots_free -= ui_lhand
if(r_hand) slots_free -= ui_rhand
if(istype(src,/mob/living/carbon/human))
var/mob/living/carbon/human/H = src
if(!H.belt) slots_free += ui_belt
if(!H.l_store) slots_free += ui_storage1
if(!H.r_store) slots_free += ui_storage2
if(slots_free.len)
halitem.screen_loc = pick(slots_free)
halitem.hud_layerise()
switch(rand(1,6))
if(1) //revolver
halitem.icon = 'icons/obj/gun.dmi'
halitem.icon_state = "revolver"
halitem.name = "Revolver"
if(2) //c4
halitem.icon = 'icons/obj/assemblies.dmi'
halitem.icon_state = "plastic-explosive0"
halitem.name = "Mysterious Package"
if(prob(25))
halitem.icon_state = "c4small_1"
if(3) //sword
halitem.icon = 'icons/obj/weapons.dmi'
halitem.icon_state = "sword1"
halitem.name = "Sword"
if(4) //stun baton
halitem.icon = 'icons/obj/weapons.dmi'
halitem.icon_state = "stunbaton"
halitem.name = "Stun Baton"
if(5) //emag
halitem.icon = 'icons/obj/card.dmi'
halitem.icon_state = "emag"
halitem.name = "Cryptographic Sequencer"
if(6) //flashbang
halitem.icon = 'icons/obj/grenade.dmi'
halitem.icon_state = "flashbang1"
halitem.name = "Flashbang"
if(client) client.screen += halitem
spawn(rand(100,250))
if(client)
client.screen -= halitem
halitem = null
if(26 to 40)
//Flashes of danger
//to_chat(src, "Danger Flash")
if(!halimage)
if(client && hallucination > 20)
var/list/halpick = list()
halpick |= list("messages", "sounds")
if(hallucination > 40)
halpick |= list("goodvoice", "badvoice")
if(hallucination > 65)
halpick |= list("ignoring", "badsounds")
if(hallucination > 80)
halpick |= list("dangerimage")
var/chosenhal = pick(halpick)
if(prob(25))
switch(chosenhal)
if("messages")
var/list/msg_list = list("Everything around you feels like it's breathing...",
"There are such strange patterns everywhere... you can't take your eyes off them.",
"You feel in tune with your surroundings. You're part of them...",
"What was that noise?",
"You feel like something is crawling on you...!")
to_chat(src, "<span class='warning'>[pick(msg_list)]</span>")
if("sounds") /// Relatively harmless sounds to hear.
var/list/soundlist = list('sound/items/bikehorn.ogg', 'sound/items/drink.ogg', 'sound/items/polaroid1.ogg', 'sound/items/lighter_on.ogg',
'sound/machines/vending/vending_cans.ogg', 'sound/weapons/flash.ogg')
src << pick(soundlist)
if("goodvoice")
if(prob(10))
halmob_action = "goodvoice"
mob_hallucinate(src)
if("badvoice")
if(prob(10))
halmob_action = "badvoice"
mob_hallucinate(src)
if("ignoring") /// Paranoid isolation
if(prob(10))
halmob_action = "ignoring"
mob_hallucinate(src)
if("badsounds")
var/list/soundlist = list('sound/hallucinations/serithi/creepy1.ogg', 'sound/hallucinations/serithi/creepy2.ogg','sound/hallucinations/serithi/creepy3.ogg')
src << pick(soundlist)
if("dangerimage") /// Dangers like fire on random tiles.
var/list/possible_points = list()
for(var/turf/simulated/floor/F in view(src,world.view))
possible_points += F
for(var/turf/simulated/floor/F in range(7, src))
if(can_see(src, F, 7))
possible_points += F
if(possible_points.len)
var/turf/simulated/floor/target = pick(possible_points)
switch(rand(1,3))
switch(rand(1,2))
if(1)
//to_chat(src, "Space")
halimage = image('icons/turf/space.dmi',target,"[rand(1,25)]",TURF_LAYER)
if(2)
//to_chat(src, "Fire")
halimage = image('icons/effects/fire.dmi',target,"1",TURF_LAYER)
if(3)
//to_chat(src, "C4")
if(2)
halimage = image('icons/obj/assemblies.dmi',target,"plastic-explosive2",OBJ_LAYER+0.01)
if(client) client.images += halimage
if(client)
client.images += halimage
spawn(rand(10,50)) //Only seen for a brief moment.
if(client) client.images -= halimage
if(client)
client.images -= halimage
halimage = null
if(41 to 65)
//Strange audio
//to_chat(src, "Strange Audio")
switch(rand(1,12))
if(1) src << 'sound/machines/door/old_airlock.ogg'
if(2)
if(prob(50))src << 'sound/effects/Explosion1.ogg'
else src << 'sound/effects/Explosion2.ogg'
if(3) src << 'sound/effects/explosionfar.ogg'
if(4) src << 'sound/effects/Glassbr1.ogg'
if(5) src << 'sound/effects/Glassbr2.ogg'
if(6) src << 'sound/effects/Glassbr3.ogg'
if(7) src << 'sound/machines/twobeep.ogg'
if(8) src << 'sound/machines/door/windowdoor.ogg'
if(9)
//To make it more realistic, I added two gunshots (enough to kill)
src << 'sound/weapons/Gunshot1.ogg'
spawn(rand(10,30))
src << 'sound/weapons/Gunshot2.ogg'
if(10) src << 'sound/weapons/smash.ogg'
if(11)
//Same as above, but with tasers.
src << 'sound/weapons/Taser.ogg'
spawn(rand(10,30))
src << 'sound/weapons/Taser.ogg'
//Rare audio
if(12)
//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',\
'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
src << pick(creepyasssounds)
if(66 to 70)
//Flashes of danger
//to_chat(src, "Danger Flash")
if(!halbody)
var/list/possible_points = list()
for(var/turf/simulated/floor/F in view(src,world.view))
possible_points += F
if(possible_points.len)
var/turf/simulated/floor/target = pick(possible_points)
switch(rand(1,4))
if(1)
halbody = image('icons/mob/human.dmi',target,"husk_l",TURF_LAYER)
if(2,3)
halbody = image('icons/mob/human.dmi',target,"husk_s",TURF_LAYER)
if(4)
halbody = image('icons/mob/alien.dmi',target,"alienother",TURF_LAYER)
// if(5)
// halbody = image('xcomalien.dmi',target,"chryssalid",TURF_LAYER)
if(client) client.images += halbody
spawn(rand(50,80)) //Only seen for a brief moment.
if(client) client.images -= halbody
halbody = null
if(71 to 72)
//Fake death
// src.sleeping_willingly = 1
SetSleeping(20)
hal_crit = 1
hal_screwyhud = 1
spawn(rand(50,100))
// src.sleeping_willingly = 0
SetSleeping(0)
hal_crit = 0
hal_screwyhud = 0
handling_hal = 0
/*obj/machinery/proc/mockpanel(list/buttons,start_txt,end_txt,list/mid_txts)
if(!mocktxt)
mocktxt = ""
var/possible_txt = list("Launch Escape Pods","Self-Destruct Sequence","\[Swipe ID\]","De-Monkify",\
"Reticulate Splines","Plasma","Open Valve","Lockdown","Nerf Airflow","Kill Traitor","Nihilism",\
"OBJECTION!","Arrest Stephen Bowman","Engage Anti-Trenna Defenses","Increase Site Manager IQ","Retrieve Arms",\
"Play Charades","Oxygen","Inject BeAcOs","Ninja Lizards","Limit Break","Build Sentry")
if(mid_txts)
while(mid_txts.len)
var/mid_txt = pick(mid_txts)
mocktxt += mid_txt
mid_txts -= mid_txt
while(buttons.len)
var/button = pick(buttons)
var/button_txt = pick(possible_txt)
mocktxt += "<a href='?src=\ref[src];[button]'>[button_txt]</a><br>"
buttons -= button
possible_txt -= button_txt
return start_txt + mocktxt + end_txt + "</TT></BODY></HTML>"
/proc/check_panel(mob/M)
if (istype(M, /mob/living/carbon/human) || istype(M, /mob/living/silicon/ai))
if(M.hallucination < 15)
return 1
return 0*/
/obj/effect/fake_attacker
/obj/effect/mob_hallucination
icon = null
icon_state = null
name = ""
@@ -226,8 +74,6 @@ Gunshots/explosions/opening doors/less rare audio (done)
anchored = 1
opacity = 0
var/mob/living/carbon/human/my_target = null
var/weapon_name = null
var/obj/item/weap = null
var/image/stand_icon = null
var/image/currentimage = null
var/icon/base = null
@@ -236,45 +82,36 @@ Gunshots/explosions/opening doors/less rare audio (done)
var/image/left
var/image/right
var/image/up
var/collapse
var/image/down
var/halaction
var/health = 100
/obj/effect/fake_attacker/attackby(var/obj/item/P as obj, mob/user as mob)
/obj/effect/mob_hallucination/attackby(var/obj/item/P as obj, mob/user as mob)
step_away(src,my_target,2)
for(var/mob/M in oviewers(world.view,my_target))
to_chat(M, "<font color='red'><B>[my_target] flails around wildly.</B></font>")
my_target.show_message("<font color='red'><B>[src] has been attacked by [my_target] </B></font>", 1) //Lazy.
src.health -= P.force
my_target.show_message("<font color='red'><B>[src] has been attacked by [my_target] </B></font>", 1)
return
/obj/effect/fake_attacker/Crossed(var/mob/M, somenumber)
/obj/effect/mob_hallucination/Crossed(var/mob/M, oldloc)
if(M == my_target)
step_away(src,my_target,2)
if(prob(30))
for(var/mob/O in oviewers(world.view , my_target))
to_chat(O, "<font color='red'><B>[my_target] stumbles around.</B></font>")
/obj/effect/fake_attacker/Initialize()
/obj/effect/mob_hallucination/Initialize()
. = ..()
QDEL_IN(src, 30 SECONDS)
step_away(src,my_target,2)
spawn attack_loop()
START_PROCESSING(SSobj, src)
/obj/effect/fake_attacker/Destroy()
/obj/effect/mob_hallucination/Destroy()
if(my_target)
my_target.hallucinations -= src
STOP_PROCESSING(SSobj, src)
return ..()
/obj/effect/fake_attacker/proc/updateimage()
// qdel(src.currentimage)
/obj/effect/mob_hallucination/proc/updateimage()
if(src.dir == NORTH)
qdel(src.currentimage)
src.currentimage = new /image(up,src)
@@ -289,128 +126,64 @@ Gunshots/explosions/opening doors/less rare audio (done)
src.currentimage = new /image(left,src)
my_target << currentimage
/obj/effect/mob_hallucination/process()
var/mob/living/carbon/human/H = my_target
sleep(rand(5,20))
if(get_dist(src, H) == 0)
step_away(src, H, 2)
if(prob(50) && get_dist(src, H) > 1 && halaction != "ignoring")
src.set_dir(get_dir(src, H))
step_towards(src, H)
updateimage()
else if(prob(5))
if(halaction == "goodvoice")
var/list/msg_list = list("We are all one with the cosmos.", "Wow!", "I'm glad you're here.", "We're safe here.",
"You look amazing!", "I forgive you.", "Everything is taken care of.", "You don't need to worry.", "Follow your bliss.",
"It's all going to turn out just fine.", "The universe understands you.", "The future is all assured.", "You are healing.",
"In a gentle way, you can shake the world...", "Endless opportunities flow from you.", "Keep going!")
if(name != "")
to_chat(H, "<span class='notice'>[name] says, \"[pick(msg_list)]\"</span>")
else
to_chat(H, "<span class='notice'>A hazy figure says, \"[pick(msg_list)]\"</span>")
if(halaction == "badvoice")
var/list/msg_list = list("Your friends are lying.", "You shouldn't have done that.", "Haven't you forgotten something?",
"Mind your own business.", "They were right, you know.", "You aren't supposed to be here.", "We're watching you.", "Don't look at me.",
"You should be ashamed of yourself.", "Get out of here!", "You disgust me.", "The world is closing in.", "It's all your fault.",
"They're coming for you.", "It's only a matter of time.", "You ruined it.", "Nothing you do matters.", "You're wasting their time.",
"It wasn't an accident.")
if(name != "")
to_chat(H, "<span class='warning'>[name] says, \"[pick(msg_list)]\"</span>")
else
to_chat(H, "<span class='warning'>A hazy figure says, \"[pick(msg_list)]\"</span>")
if(halaction == "ignoring")
step_away(src, H, 3)
if(prob(5))
to_chat(H, "<span class='warning'>No one seems to know you're there...</span>")
/obj/effect/fake_attacker/proc/attack_loop()
while(1)
sleep(rand(5,10))
if(src.health < 0)
collapse()
continue
if(get_dist(src,my_target) > 1)
src.set_dir(get_dir(src,my_target))
step_towards(src,my_target)
updateimage()
else
if(prob(15))
if(weapon_name)
my_target << sound(pick('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg'))
my_target.show_message("<font color='red'><B>[my_target] has been attacked with [weapon_name] by [src.name] </B></font>", 1)
my_target.halloss += 8
if(prob(20)) my_target.eye_blurry += 3
if(prob(33))
if(!locate(/obj/effect/overlay) in my_target.loc)
fake_blood(my_target)
else
my_target << sound(pick('sound/weapons/punch1.ogg','sound/weapons/punch2.ogg','sound/weapons/punch3.ogg','sound/weapons/punch4.ogg'))
my_target.show_message("<font color='red'><B>[src.name] has punched [my_target]!</B></font>", 1)
my_target.halloss += 4
if(prob(33))
if(!locate(/obj/effect/overlay) in my_target.loc)
fake_blood(my_target)
if(prob(15))
step_away(src,my_target,2)
/obj/effect/fake_attacker/proc/collapse()
collapse = 1
updateimage()
/proc/fake_blood(var/mob/target)
var/obj/effect/overlay/O = new/obj/effect/overlay(target.loc)
O.name = "blood"
var/image/I = image('icons/effects/blood.dmi',O,"floor[rand(1,7)]",O.dir,1)
target << I
spawn(300)
qdel(O)
return
var/global/list/non_fakeattack_weapons = list(/obj/item/gun/projectile, /obj/item/ammo_magazine/s357,\
/obj/item/gun/energy/crossbow, /obj/item/melee/energy/sword,\
/obj/item/storage/box/syndicate, /obj/item/storage/box/emps,\
/obj/item/cartridge/syndicate, /obj/item/clothing/under/chameleon,\
/obj/item/clothing/shoes/syndigaloshes, /obj/item/card/id/syndicate,\
/obj/item/clothing/mask/gas/voice, /obj/item/clothing/glasses/thermal,\
/obj/item/chameleon, /obj/item/card/emag,\
/obj/item/storage/toolbox/syndicate, /obj/item/aiModule,\
/obj/item/radio/headset/syndicate, /obj/item/plastique,\
/obj/item/powersink, /obj/item/storage/box/syndie_kit,\
/obj/item/toy/syndicateballoon, /obj/item/gun/energy/captain,\
/obj/item/hand_tele, /obj/item/rcd, /obj/item/tank/jetpack,\
/obj/item/clothing/under/rank/captain, /obj/item/aicard,\
/obj/item/clothing/shoes/magboots, /obj/item/blueprints, /obj/item/disk/nuclear,\
/obj/item/clothing/suit/space/void, /obj/item/tank)
/proc/fake_attack(var/mob/living/target)
/proc/mob_hallucinate(var/mob/living/carbon/target)
var/list/possible_clones = new/list()
var/mob/living/carbon/human/clone = null
var/clone_weapon = null
for(var/mob/living/carbon/human/H in living_mob_list)
if(H.stat || H.lying)
continue
possible_clones += H
// clone = H
// break //changed the code a bit. Less randomised, but less work to do. Should be ok, world.contents aren't stored in any particular order.
if(!possible_clones.len)
return
clone = pick(possible_clones)
if(!clone)
return
//var/obj/effect/fake_attacker/F = new/obj/effect/fake_attacker(outside_range(target))
var/obj/effect/fake_attacker/F = new/obj/effect/fake_attacker(target.loc)
if(clone.l_hand)
if(!(locate(clone.l_hand) in non_fakeattack_weapons))
clone_weapon = clone.l_hand.name
F.weap = clone.l_hand
else if (clone.r_hand)
if(!(locate(clone.r_hand) in non_fakeattack_weapons))
clone_weapon = clone.r_hand.name
F.weap = clone.r_hand
var/obj/effect/mob_hallucination/MH = new/obj/effect/mob_hallucination(target.loc)
F.name = clone.name
F.my_target = target
F.weapon_name = clone_weapon
target.hallucinations += F
MH.name = clone.name
MH.my_target = target
target.hallucinations += MH
if(target.halmob_action)
MH.halaction = target.halmob_action
MH.left = image(clone,dir = WEST)
MH.right = image(clone,dir = EAST)
MH.up = image(clone,dir = NORTH)
MH.down = image(clone,dir = SOUTH)
F.left = image(clone,dir = WEST)
F.right = image(clone,dir = EAST)
F.up = image(clone,dir = NORTH)
F.down = image(clone,dir = SOUTH)
// F.base = new /icon(clone.stand_icon)
// F.currentimage = new /image(clone)
/*
F.left = new /icon(clone.stand_icon,dir=WEST)
for(var/icon/i in clone.overlays)
F.left.Blend(i)
F.up = new /icon(clone.stand_icon,dir=NORTH)
for(var/icon/i in clone.overlays)
F.up.Blend(i)
F.down = new /icon(clone.stand_icon,dir=SOUTH)
for(var/icon/i in clone.overlays)
F.down.Blend(i)
F.right = new /icon(clone.stand_icon,dir=EAST)
for(var/icon/i in clone.overlays)
F.right.Blend(i)
target << F.up
*/
F.updateimage()
MH.updateimage()

View File

@@ -345,3 +345,6 @@ GLOBAL_LIST_BOILERPLATE(all_seed_packs, /obj/item/seeds)
/obj/item/seeds/wurmwoad
seed_type = "wurmwoad"
/obj/item/seeds/nutmeg
seed_type = "nutmeg"

View File

@@ -0,0 +1,20 @@
/datum/seed/nutmeg
name = "nutmeg"
seed_name = "nutmeg"
display_name = "nutmeg"
kitchen_tag = "nutmeg"
chems = list("nutriment" = list(1,15), "dmt" = list(1,2))
/datum/seed/nutmeg/New()
..()
set_trait(TRAIT_HARVEST_REPEAT,1)
set_trait(TRAIT_MATURATION,6)
set_trait(TRAIT_PRODUCTION,5)
set_trait(TRAIT_YIELD,3)
set_trait(TRAIT_POTENCY,8)
set_trait(TRAIT_PRODUCT_ICON,"nutmeg")
set_trait(TRAIT_PRODUCT_COLOUR,"#5a382f")
set_trait(TRAIT_PLANT_COLOUR,"#397437")
set_trait(TRAIT_PLANT_ICON,"bush2")
set_trait(TRAIT_IDEAL_LIGHT, 6)
set_trait(TRAIT_WATER_CONSUMPTION, 6)

View File

@@ -19,7 +19,8 @@
children = list(
/datum/lore/codex/page/not_contraband,
/datum/lore/codex/page/contraband_controlled,
/datum/lore/codex/page/contraband_restricted
/datum/lore/codex/page/contraband_restricted,
/datum/lore/codex/page/drug_contraband
)
/datum/lore/codex/page/not_contraband
@@ -29,7 +30,6 @@
<li><b>Blades or other Equipment</b> which the possessor needs in order to fulfil their role onboard the facility, \
such as a kitchen knife for culinary personnel.</li>\
<li><b>Handheld Flashes</b>, which are useful for self-defense, as well as building certain machinery.</li>\
<li><b></b></li>\
</ul>"
/datum/lore/codex/page/contraband_controlled
@@ -41,11 +41,10 @@
<br><br>\
The following objects are 'controlled'.\
<ul>\
<li><b>Recreational Drugs</b>, which includes Ambrosia.</li>\
<li><b>Recreational Drugs</b>, such as Ambrosia.</li>\
<li><b>Non-Lethal Weaponry</b>, for persons not authorized to handle them, such as Security or Command Staff. This includes Stun Batons, Tasers, Pepper-Spray, \
Flashbangs</li>\
<li><b></b></li>\
<li><b></b></li>\
<li><b>Physical Restraints</b>, both makeshift and not.</li>\
</ul>"
/datum/lore/codex/page/contraband_restricted
@@ -61,10 +60,34 @@
<li><b>Lethal Guns</b>, meaning guns which possess the capability to kill someone. Functional ballistic weaponry can be loaded \
with ammunition that is lethal, meaning it falls under this. Energy weapons lacking a lethal mode, such as tasers, do not fall under this. \
Weapons which emit electromagnetic pulses, sometimes called 'Ionic' weapons, are considered lethal, as they are lethal to synthetics.</li>\
<li><b>Narcotic Drugs</b>, such as Mindbreaker.</li>\
<li><b>Illegal Drugs</b>, such as Royale.</li>\
<li><b>Illicit Identification Cards</b>, which includes forgeries, as well as ID cards designed to tamper with electronics.</li>\
</ul>"
/datum/lore/codex/page/drug_contraband
name = "Legal Status of Drugs"
data = "If possession, creation, or distribution of a drug is a corporate or law violation depends entirely on the drug. The legal age for \
recreational use of any legal drug in Vir is 18. The most commonly found drugs and their legal status are as follows: \
<br><ul> \
<li><b>Alcohol - Legal</b>, Use may be restricted in public areas and private properties. A license is required to sell, but not to produce.</li> \
<li><b>Nicotine - Legal</b>, Use is unrestricted in public areas, but may be in private properties. A license is required to sell, but not to produce.</li> \
<li><b>Bliss - Legal</b>, Use is restricted to private residence or licensed controlled environments. A license is required to produce and to sell.</li> \
<li><b>Royale - Illegal</b>, Used in creation of other legal compounds, a license is required to produce or sell for non-recreational use. Possession is otherwise illegal.</li> \
<li><b>Hyperzine - Legal</b>, Use is restricted to private residence or licensed controlled environments. A license is required to produce and to sell. \
NanoTrasen facilities are licensed to distribute for work needs.</li> \
<li><b>Ambrosia - Legal</b>, May be restricted in public areas and private properties. A license is not required to produce, but is required to sell.</li> \
<li><b>Sinkhole - Illegal</b>, Production, possession, and distribution are all illegal in Vir.</li> \
<li><b>Snowflake - Legal</b>, Use is restricted to private residence or licensed controlled environments. A license is required to produce and to sell.</li> \
<li><b>DMT - Legal</b>, Also known as dimethyltryptamine, use is restricted to private residence or licensed controlled environments. A license is not required \
to produce, but is required to sell.</li> \
<li><b>Ayahuasca - Legal</b>, Use is restricted to private residence or licensed controlled environments. NanoTrasen facilities are a licensed controlled environment, \
but restrict use to religious ceremony. A license is not required to produce, but is required to sell.</li> \
<li><b>Colorspace - Legal</b>, Use is restricted to private residence or licensed controlled environments. A license is required to produce and to sell.</li> \
<li><b>Psilocybin - Legal</b>, Use is restricted to private residence or licensed controlled environments. A license is not required to produce, but is required to sell.</li> \
<li><b>Schnappi - Illegal</b>, Production, possession, and distribution are all illegal in Vir.</li> \
<li><b>Mindbreaker - Illegal</b>, Used in creation of other legal compounds, a license is required to produce or sell for non-recreational use. Possession is otherwise illegal.</li> \
</ul>"
/datum/lore/codex/page/corporate_punishments
name = "Punishments (Corporate)"
data = "Violations of Corporate Regulations can be resolved in a wide variety of ways. The Command staff on-board the facility \

View File

@@ -1066,10 +1066,7 @@
if(hallucination)
if(hallucination >= 20 && !(species.flags & (NO_POISON|IS_PLANT|NO_HALLUCINATION)) )
if(prob(3))
fake_attack(src)
if(!handling_hal)
spawn handle_hallucinations() //The not boring kind!
handle_hallucinations()
if(client && prob(5))
client.dir = pick(2,4,8)
spawn(rand(20,50))
@@ -1107,7 +1104,7 @@
if(client || sleeping > 3)
AdjustSleeping(-1)
throw_alert("asleep", /obj/screen/alert/asleep)
if( prob(2) && health && !hal_crit && client )
if( prob(2) && health && client )
spawn(0)
emote("snore")
//CONSCIOUS

View File

@@ -22,7 +22,7 @@
var/max_nutrition = MAX_NUTRITION
var/hallucination = 0 //Directly affects how long a mob will hallucinate for
var/list/atom/hallucinations = list() //A list of hallucinated people that try to attack the mob. See /obj/effect/fake_attacker in hallucinations.dm
var/list/atom/hallucinations = list() //A list of hallucinated people. See hallucinations.dm
var/last_special = 0 //Used by the resist verb, likely used to prevent players from bypassing next_move by logging in/out.
var/base_attack_cooldown = DEFAULT_ATTACK_COOLDOWN

View File

@@ -1,6 +1,6 @@
/obj/machinery/chem_master
name = "ChemMaster 3000"
desc = "Used to seperate and package chemicals in to patches, pills, or bottles. Warranty void if used to create Space Drugs."
desc = "Used to seperate and package chemicals in to patches, pills, or bottles. Warranty void if used to create illicit drugs."
density = 1
anchored = 1
icon = 'icons/obj/chemical.dmi'

View File

@@ -1263,3 +1263,10 @@
result = "fusionnaire"
required_reagents = list("lemonjuice" = 3, "vodka" = 2, "schnapps_pep" = 1, "schnapps_lem" = 1, "rum" = 1, "ice" = 1)
result_amount = 9
/decl/chemical_reaction/instant/drinks/ayahuasca
name = "Ayahuasca"
id = "ayahuasca"
result = "ayahuasca"
required_reagents = list("water" = 1, "dmt" = 2, "honey" = 1)
result_amount = 3

View File

@@ -266,11 +266,18 @@
required_reagents = list("bicaridine" = 1, "iron" = 2, "spidertoxin" = 1)
result_amount = 2
/decl/chemical_reaction/instant/royale
name = "Royale"
id = "royale"
result = "royale"
required_reagents = list("copper" = 1, "phosphorus" = 1, "sulfur" = 1)
result_amount = 3
/decl/chemical_reaction/instant/hyperzine
name = "Hyperzine"
id = "hyperzine"
result = "hyperzine"
required_reagents = list("sugar" = 1, "phosphorus" = 1, "sulfur" = 1)
required_reagents = list("royale" = 1, "sugar" = 1, "phosphorus" = 1)
result_amount = 3
/decl/chemical_reaction/instant/stimm
@@ -550,6 +557,34 @@
required_reagents = list("hydrogen" = 2, "carbon" = 2, "ammonia" = 2)
result_amount = 6
/decl/chemical_reaction/instant/snowflake
name = "Snowflake"
id = "snowflake"
result = "snowflake"
required_reagents = list("frostoil" = 1, "fuel" = 1, "sulfur" = 1)
result_amount = 1
/decl/chemical_reaction/instant/sinkhole
name = "Sinkhole"
id = "sinkhole"
result = "sinkhole"
required_reagents = list("enzyme" = 1, "bicaridine" = 1, "tramadol" = 1)
result_amount = 1
/decl/chemical_reaction/instant/schnappi
name = "Schnappi"
id = "schnappi"
result = "schnappi"
required_reagents = list("ammonia" = 1, "tramadol" = 1, "cleaner" = 1, "potassium" = 1, "phosphorus" = 1, "fuel" = 1)
result_amount = 6
/decl/chemical_reaction/instant/colorspace
name = "Colorspace"
id = "colorspace"
result = "colorspace"
required_reagents = list("hydrogen" = 1, "ethanol" = 1, "silicon" = 1)
result_amount = 1
/* Solidification */
/decl/chemical_reaction/instant/solidification

View File

@@ -328,9 +328,8 @@
/obj/item/reagent_containers/pill/zoom/Initialize()
. = ..()
reagents.add_reagent("impedrezene", 10)
reagents.add_reagent("royale", 10)
reagents.add_reagent("synaptizine", 5)
reagents.add_reagent("hyperzine", 5)
color = reagents.get_color()
/obj/item/reagent_containers/pill/diet
@@ -342,3 +341,39 @@
. = ..()
reagents.add_reagent("lipozine", 2)
color = reagents.get_color()
//// Recreational drugs for loadout
/obj/item/reagent_containers/pill/unidentified
name = "mysterious pill"
desc = "You're not quite sure what's in this..."
icon_state = "pill1"
/obj/item/reagent_containers/pill/unidentified/bliss/Initialize()
. = ..()
reagents.add_reagent("bliss", 10)
color = reagents.get_color()
/obj/item/reagent_containers/pill/unidentified/snowflake/Initialize()
. = ..()
reagents.add_reagent("snowflake", 10)
color = reagents.get_color()
/obj/item/reagent_containers/pill/unidentified/royale/Initialize()
. = ..()
reagents.add_reagent("royale", 5)
color = reagents.get_color()
/obj/item/reagent_containers/pill/unidentified/sinkhole/Initialize()
. = ..()
reagents.add_reagent("sinkhole", 5)
color = reagents.get_color()
/obj/item/reagent_containers/pill/unidentified/colorspace/Initialize()
. = ..()
reagents.add_reagent("colorspace", 10)
color = reagents.get_color()
/obj/item/reagent_containers/pill/unidentified/schnappi/Initialize()
. = ..()
reagents.add_reagent("schnappi", 5)
color = reagents.get_color()

View File

@@ -109,7 +109,6 @@
M.adjustToxLoss(-2)
M.druggy = max(M.druggy, drug_strength)
M.heal_organ_damage(6)
M.adjustOxyLoss(-3)
M.AdjustStunned(-1)
if(prob(5) && prob_proc == TRUE)
@@ -144,7 +143,8 @@
M.druggy = max(M.druggy, 30)
var/effective_dose = dose
if(issmall(M)) effective_dose *= 2
if(issmall(M))
effective_dose *= 2
if(effective_dose < 1 * threshold)
M.apply_effect(3, STUTTER)
M.make_dizzy(5)
@@ -206,6 +206,240 @@
color = "#181818"
high_messages = FALSE
/datum/reagent/drugs/snowflake
name = "Snowflake"
id = "snowflake"
description = "A recreational stimulant refined from frostoil found in certain plants."
taste_description = "metallic and bitter"
overdose = 15
color = "#bbd7eb"
high_message_list = list("You feel euphoric!",
"You feel unstoppable.",
"You just can't seem to stop sniffling...",
"You feel impatient...",
"Your eyes feel a bit dry.")
sober_message_list = list("You feel a bit more sluggish.",
"You feel terrible...",
"You feel pretty dehydrated.")
/datum/reagent/drugs/snowflake/affect_blood(mob/living/carbon/M, alien, removed)
..()
M.add_chemical_effect(CE_PAINKILLER,3)
if(prob(12) && prob_proc == TRUE)
M.emote(pick("shiver", "sniff"))
prob_proc = FALSE
/datum/reagent/drugs/snowflake/overdose(mob/living/carbon/M, alien, removed)
if(prob(35) && prob_proc == TRUE)
M.vomit()
M.adjustToxLoss(5)
M.adjustBrainLoss(1)
..()
/datum/reagent/drugs/royale
name = "Royale"
id = "royale"
description = "A drug used in the process of making Hyperzine. A powerful stimulant on its own, it comes with significant drawbacks and potential for misuse."
taste_description = "something faint and odious"
color = "#dbd4ba"
overdose = 10
high_message_list = list("You feel energized!",
"You're just not going fast enough. Faster!",
"You could out-run the world if you tried.",
"It's almost painful to sit still...",
"Is everything going in slow motion?")
sober_message_list = list("Everything is suddenly... sluggish.",
"You feel like trash, but you can finally sit still...")
/datum/reagent/drugs/royale/affect_blood(mob/living/carbon/M, alien, removed)
..()
if(alien == IS_TAJARA) /// Similar to hyperzine...
removed *= 1.25
if(alien == IS_SLIME)
M.make_jittery(4)
if(dose >= 5)
M.adjust_nutrition(-removed * 2)
if(prob(5) && prob_proc == TRUE)
M.emote(pick("twitch", "blink_r", "shiver"))
M.add_chemical_effect(CE_PAINKILLER, 20) /// With chance of pain numbing...
prob_proc = FALSE
M.add_chemical_effect(CE_SPEEDBOOST, 1) /// And less speed boost.
/datum/reagent/drugs/royale/overdose(mob/living/carbon/M, alien, removed)
if(prob(10) && isturf(M.loc) && !istype(M.loc, /turf/space) && M.canmove && !M.restrained())
for(var/i = 0, i < 4, i++)
step(M, pick(cardinal))
if(prob(5))
M.emote("laugh")
if(prob(5))
M.visible_message("<span class = 'danger'>[M]'s hands flip out and flail everywhere!</span>")
var/obj/item/I = M.get_active_hand()
if(I)
M.drop_item()
M.adjustToxLoss(1)
M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1))
..()
/datum/reagent/drugs/sinkhole
name = "Sinkhole"
id = "sinkhole"
description = "A painkiller and recreational drug that hampers brain function."
taste_description = "a grainy paste"
color = "#462d35"
high_message_list = list("You feel euphoric!",
"You have a strange sense of calm and excitement all at once.",
"You feel... sleepy.",
"You feel dizzy.")
sober_message_list = list("Your thoughts are in a fog...", "You just need to lay down and rest.")
/datum/reagent/drugs/sinkhole/affect_blood(mob/living/carbon/M, alien, removed)
..()
M.add_chemical_effect(CE_PAINKILLER, 40)
M.adjustBrainLoss(0.25)
if(prob(5) && prob_proc == TRUE)
M.emote(pick("shiver", "twitch"))
prob_proc = FALSE
/datum/reagent/drugs/sinkhole/overdose(mob/living/carbon/M, alien, removed)
if(prob(10) && isturf(M.loc) && !istype(M.loc, /turf/space) && M.canmove && !M.restrained())
for(var/i = 0, i < 4, i++)
step(M, pick(cardinal))
M.adjustToxLoss(2)
M.drowsyness = max(M.drowsyness, 10)
M.adjustBrainLoss(pick(0.5, 0.6, 0.7, 0.8, 0.9, 1))
..()
/datum/reagent/drugs/dmt
name = "Dimethyltryptamine"
id = "dmt"
description = "A psychedelic compound found naturally in certain plants."
taste_description = "plastic"
taste_mult = 1.8
color = "#d4bc8e"
high_message_list = list("You feel a sense of belonging.",
"Are you being watched...?",
"The boundaries of the universe feel limitless...")
sober_message_list = list("You feel painfully grounded again.")
/datum/reagent/drugs/dmt/affect_blood(mob/living/carbon/M, alien, removed)
..()
if(alien == IS_TAJARA)
removed *= 1.25
if(prob(15) && prob_proc == TRUE)
M.emote(pick("deathgasp", "sigh", "smile"))
prob_proc = FALSE
var/drug_strength = 30
if(alien == IS_SKRELL)
drug_strength *= 0.8
if(alien == IS_SLIME)
drug_strength *= 1.2
M.druggy = max(M.druggy, 5)
M.hallucination = max(M.hallucination, drug_strength)
/datum/reagent/drugs/ayahuasca
name = "Ayahuasca"
id = "ayahuasca"
description = "A brew of herbs known for religious use and spiritual experience."
taste_description = "strong and bitter herbs"
color = "#5b5f46"
high_message_list = list("You feel at one with the universe.",
"You feel in tune with the vibrations of the cosmos.",
"The spirits are with you...",
"Everything has a harmony, and you are part of it.")
sober_message_list = list("The presence of the spirits fades.",
"You feel grounded once again.")
/datum/reagent/drugs/ayahuasca/affect_blood(mob/living/carbon/M, alien, removed)
if(alien == IS_TAJARA)
removed *= 1.25
..()
if(prob(15) && prob_proc == TRUE)
M.emote(pick("deathgasp", "moan", "smile", "groan"))
prob_proc = FALSE
var/drug_strength = 60
if(alien == IS_SKRELL)
drug_strength *= 0.8
if(alien == IS_SLIME)
drug_strength *= 1.2
M.druggy = max(M.druggy, 10)
M.hallucination = max(M.hallucination, drug_strength)
/datum/reagent/drugs/colorspace
name = "Colorspace"
id = "colorspace"
description = "A psychedelic drug that alters thought and perception."
taste_description = "flavorless paste"
color = "#a7a6a4"
high_message_list = list("The floor is melting...",
"Everything is so much brighter! Wow!",
"Everything is shifting around you.",
"Your skin tickles.")
sober_message_list = list("The world grows still again.", "Colors seem duller.")
/datum/reagent/drugs/colorspace/affect_blood(mob/living/carbon/M, alien, removed)
..()
var/drug_strength = 80
if(alien == IS_SKRELL)
drug_strength *= 0.8
if(alien == IS_SLIME)
drug_strength *= 1.2
M.druggy = max(M.druggy, 15)
M.hallucination = max(M.hallucination, drug_strength)
/datum/reagent/drugs/schnappi
name = "Schnappi"
id = "schnappi"
description = "A dangerous and impure opiate that can cause necrosis in prolonged use."
color = "#0264B4"
taste_description = "a little crocodile" /// Schnee Schnii Schnappi, das kleiner krokodil...
overdose = 15
high_message_list = list("You feel pretty chill.",
"Your skin feels all rough and dry.",
"You feel too chill...!")
sober_message_list = list("You're full of regret...", "Is it finally over?")
/datum/reagent/drugs/schnappi/affect_blood(mob/living/carbon/M, alien, removed)
..()
M.drowsyness = max(M.drowsyness, 5)
M.add_chemical_effect(CE_PAINKILLER, 1)
if(prob(15) && prob_proc == TRUE)
M.adjustToxLoss(2)
prob_proc = FALSE
if(prob(10) && prob_proc == TRUE)
M.visible_message("<span class='warning'>[M] looks dazed!</span>")
M.Stun(5)
M.emote("drool")
prob_proc = FALSE
/datum/reagent/drugs/schnappi/overdose(mob/living/carbon/M, alien, removed)
M.drowsyness = max(M.drowsyness, 10)
if(prob(10))
M.visible_message("<span class='warning'>[M] looks dazed!</span>")
M.Stun(3)
M.emote("drool")
else if(prob(10))
to_chat(M, "<span class ='warning'>Your skin is cracking and bleeding!</span>")
M.adjustBruteLoss(5)
M.adjustToxLoss(1)
M.emote("cry")
else if(prob(10))
M.visible_message("<span class ='warning'>[M] sways and falls over!</span>")
M.adjustToxLoss(10)
M.Weaken(8)
M.emote("faint")
..()
/*///////////////////////////////////////////////////////////////////////////
/// PSYCHIATRIC DRUGS /////
/// /////

View File

@@ -608,7 +608,7 @@
..()
if(prob(5))
M.emote(pick("twitch", "blink_r", "shiver"))
M.add_chemical_effect(CE_SPEEDBOOST, 1)
M.add_chemical_effect(CE_SPEEDBOOST, 3)
/datum/reagent/hyperzine/overdose(var/mob/living/carbon/M, var/alien, var/removed)
..()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@@ -1577,6 +1577,7 @@
#include "code\modules\client\preference_setup\loadout\gear_tweaks.dm"
#include "code\modules\client\preference_setup\loadout\loadout.dm"
#include "code\modules\client\preference_setup\loadout\loadout_accessories.dm"
#include "code\modules\client\preference_setup\loadout\loadout_contraband.dm"
#include "code\modules\client\preference_setup\loadout\loadout_cosmetics.dm"
#include "code\modules\client\preference_setup\loadout\loadout_cyberware.dm"
#include "code\modules\client\preference_setup\loadout\loadout_ears.dm"
@@ -1994,6 +1995,7 @@
#include "code\modules\hydroponics\seedtypes\malanitear.dm"
#include "code\modules\hydroponics\seedtypes\mushrooms.dm"
#include "code\modules\hydroponics\seedtypes\nettles.dm"
#include "code\modules\hydroponics\seedtypes\nutmeg.dm"
#include "code\modules\hydroponics\seedtypes\onion.dm"
#include "code\modules\hydroponics\seedtypes\peanuts.dm"
#include "code\modules\hydroponics\seedtypes\pineapple.dm"

Binary file not shown.

Binary file not shown.

Binary file not shown.