mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-12 07:33:34 +01:00
Merge branch 'master' into PAIN
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
var/buckle_lying = -1 //bed-like behaviour, forces mob.lying = buckle_lying if != -1 //except -1 actually means "rotate 90 degrees to the left" as it is used by 1*buckle_lying.
|
||||
var/buckle_requires_restraints = 0 //require people to be handcuffed before being able to buckle. eg: pipes
|
||||
var/mob/living/buckled_mob = null
|
||||
var/buckle_offset = 0
|
||||
|
||||
|
||||
//Interaction
|
||||
|
||||
@@ -440,8 +440,7 @@ steam.start() -- spawns the effect
|
||||
var/obj/chemholder
|
||||
|
||||
Destroy()
|
||||
qdel(chemholder)
|
||||
chemholder = null
|
||||
QDEL_NULL(chemholder)
|
||||
return ..()
|
||||
|
||||
New()
|
||||
|
||||
@@ -162,6 +162,8 @@
|
||||
G.endurance -= damage_to_do
|
||||
G.CheckEndurance()
|
||||
return
|
||||
else if(I.sharp)
|
||||
damage_to_do = I.force * 3 // wirecutter: 6->18, knife 10->30, hatchet 12->36
|
||||
if(I.damtype != STAMINA)
|
||||
endurance -= damage_to_do
|
||||
CheckEndurance()
|
||||
|
||||
@@ -198,3 +198,27 @@
|
||||
/obj/item/weapon/gun/energy/kinetic_accelerator = 1,
|
||||
/obj/item/pizzabox = 3,
|
||||
)
|
||||
|
||||
/obj/effect/spawner/lootdrop/three_course_meal
|
||||
name = "three course meal spawner"
|
||||
lootcount = 3
|
||||
lootdoubles = FALSE
|
||||
var/soups = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/beetsoup,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/stew,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/hotchili,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/nettlesoup,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/meatballsoup)
|
||||
var/salads = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/herbsalad,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/validsalad,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/aesirsalad)
|
||||
var/mains = list(
|
||||
/obj/item/weapon/reagent_containers/food/snacks/enchiladas,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/stewedsoymeat,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/bigbiteburger,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/superbiteburger)
|
||||
|
||||
/obj/effect/spawner/lootdrop/three_course_meal/New()
|
||||
loot = list(pick(soups) = 1,pick(salads) = 1,pick(mains) = 1)
|
||||
. = ..()
|
||||
|
||||
@@ -558,3 +558,10 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
|
||||
|
||||
/obj/item/proc/is_crutch() //Does an item prop up a human mob and allow them to stand if they are missing a leg/foot?
|
||||
return 0
|
||||
|
||||
// Return true if you don't want regular throw handling
|
||||
/obj/item/proc/override_throw(mob/user, atom/target)
|
||||
return FALSE
|
||||
|
||||
/obj/item/proc/is_equivalent(obj/item/I)
|
||||
return I == src
|
||||
|
||||
@@ -0,0 +1,188 @@
|
||||
//Cardboard cutouts! They're man-shaped and can be colored with a crayon to look like a human in a certain outfit, although it's limited, discolored, and obvious to more than a cursory glance.
|
||||
/obj/item/cardboard_cutout
|
||||
name = "cardboard cutout"
|
||||
desc = "A vaguely humanoid cardboard cutout. It's completely blank."
|
||||
icon = 'icons/obj/cardboard_cutout.dmi'
|
||||
icon_state = "cutout_basic"
|
||||
burn_state = FLAMMABLE
|
||||
w_class = WEIGHT_CLASS_BULKY
|
||||
var/list/possible_appearances = list("Assistant", "Clown", "Mime",
|
||||
"Traitor", "Nuke Op", "Cultist", "Revolutionary", "Wizard", "Shadowling", "Xenomorph", "Swarmer",
|
||||
"Deathsquad Officer", "Ian", "Slaughter Demon",
|
||||
"Laughter Demon", "Xenomorph Maid", "Security Officer", "Terror Spider")
|
||||
var/pushed_over = FALSE //If the cutout is pushed over and has to be righted
|
||||
var/deceptive = FALSE //If the cutout actually appears as what it portray and not a discolored version
|
||||
var/lastattacker = null
|
||||
|
||||
/obj/item/cardboard_cutout/attack_hand(mob/living/user)
|
||||
if(user.a_intent == INTENT_HELP || pushed_over)
|
||||
return ..()
|
||||
user.visible_message("<span class='warning'>[user] pushes over [src]!</span>", "<span class='danger'>You push over [src]!</span>")
|
||||
playsound(src, 'sound/weapons/Genhit.ogg', 50, 1)
|
||||
push_over()
|
||||
|
||||
/obj/item/cardboard_cutout/proc/push_over()
|
||||
name = initial(name)
|
||||
desc = "[initial(desc)] It's been pushed over."
|
||||
icon = initial(icon)
|
||||
icon_state = "cutout_pushed_over"
|
||||
color = initial(color)
|
||||
alpha = initial(alpha)
|
||||
pushed_over = TRUE
|
||||
|
||||
/obj/item/cardboard_cutout/attack_self(mob/living/user)
|
||||
if(!pushed_over)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You right [src].</span>")
|
||||
desc = initial(desc)
|
||||
icon = initial(icon)
|
||||
icon_state = initial(icon_state) //This resets a cutout to its blank state - this is intentional to allow for resetting
|
||||
pushed_over = FALSE
|
||||
|
||||
/obj/item/cardboard_cutout/attackby(obj/item/I, mob/living/user, params)
|
||||
if(istype(I, /obj/item/toy/crayon))
|
||||
change_appearance(I, user)
|
||||
return
|
||||
// Why yes, this does closely resemble mob and object attack code.
|
||||
if(I.flags & NOBLUDGEON)
|
||||
return
|
||||
if(!I.force)
|
||||
playsound(loc, 'sound/weapons/tap.ogg', 20, 1, -1)
|
||||
else if(I.hitsound)
|
||||
playsound(loc, I.hitsound, 20, 1, -1)
|
||||
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
|
||||
if(I.force)
|
||||
user.visible_message("<span class='danger'>[user] has hit \
|
||||
[src] with [I]!</span>", "<span class='danger'>You hit [src] \
|
||||
with [I]!</span>")
|
||||
|
||||
if(prob(I.force))
|
||||
push_over()
|
||||
|
||||
/obj/item/cardboard_cutout/bullet_act(obj/item/projectile/P)
|
||||
visible_message("<span class='danger'>[src] has been hit by [P]!</span>")
|
||||
playsound(src, 'sound/weapons/slice.ogg', 50, 1)
|
||||
if(prob(P.damage))
|
||||
push_over()
|
||||
|
||||
/obj/item/cardboard_cutout/proc/change_appearance(obj/item/toy/crayon/crayon, mob/living/user)
|
||||
if(!crayon || !user)
|
||||
return
|
||||
if(istype(crayon, /obj/item/toy/crayon/spraycan))
|
||||
var/obj/item/toy/crayon/spraycan/can = crayon
|
||||
if(can.capped)
|
||||
to_chat(user, "<span class='warning'>The cap is on [src] remove it first!</span>")
|
||||
return
|
||||
if(pushed_over)
|
||||
to_chat(user, "<span class='warning'>Right [src] first!</span>")
|
||||
return
|
||||
var/new_appearance = input(user, "Choose a new appearance for [src].", "26th Century Deception") as null|anything in possible_appearances
|
||||
if(!new_appearance || !crayon)
|
||||
return
|
||||
if(!do_after(user, 10, FALSE, src, TRUE))
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] gives [src] a new look.</span>", "<span class='notice'>Voila! You give [src] a new look.</span>")
|
||||
alpha = 255
|
||||
icon = initial(icon)
|
||||
if(!deceptive)
|
||||
color = "#FFD7A7"
|
||||
switch(new_appearance)
|
||||
if("Assistant")
|
||||
name = "[pick(first_names_male)] [pick(last_names)]"
|
||||
desc = "A cardboard cutout of an assistant."
|
||||
icon_state = "cutout_greytide"
|
||||
if("Clown")
|
||||
name = pick(clown_names)
|
||||
desc = "A cardboard cutout of a clown. You get the feeling that it should be in a corner."
|
||||
icon_state = "cutout_clown"
|
||||
if("Mime")
|
||||
name = pick(mime_names)
|
||||
desc = "...(A cardboard cutout of a mime.)"
|
||||
icon_state = "cutout_mime"
|
||||
if("Traitor")
|
||||
name = "[pick("Unknown", "Captain")]"
|
||||
desc = "A cardboard cutout of a traitor."
|
||||
icon_state = "cutout_traitor"
|
||||
if("Nuke Op")
|
||||
name = "[pick("Unknown", "COMMS", "Telecomms", "AI", "stealthy op", "STEALTH", "sneakybeaky", "MEDIC", "Medic", "Gonk op")]"
|
||||
desc = "A cardboard cutout of a nuclear operative."
|
||||
icon_state = "cutout_fluke"
|
||||
if("Cultist")
|
||||
name = "Unknown"
|
||||
desc = "A cardboard cutout of a cultist."
|
||||
icon_state = "cutout_cultist"
|
||||
//if("Clockwork Cultist")
|
||||
// name = "[random_name(pick(MALE,FEMALE))]"
|
||||
// desc = "A cardboard cutout of a servant of Ratvar."
|
||||
// icon_state = "cutout_servant"
|
||||
if("Revolutionary")
|
||||
name = "Unknown"
|
||||
desc = "A cardboard cutout of a revolutionary."
|
||||
icon_state = "cutout_viva"
|
||||
if("Wizard")
|
||||
name = "[pick(wizard_first)], [pick(wizard_second)]"
|
||||
desc = "A cardboard cutout of a wizard."
|
||||
icon_state = "cutout_wizard"
|
||||
if("Shadowling")
|
||||
name = "Unknown"
|
||||
desc = "A cardboard cutout of a shadowling."
|
||||
icon_state = "cutout_shadowling"
|
||||
if("Xenomorph")
|
||||
name = "alien hunter ([rand(1, 999)])"
|
||||
desc = "A cardboard cutout of a xenomorph."
|
||||
icon_state = "cutout_fukken_xeno"
|
||||
if(prob(10))
|
||||
alpha = 75 //Spooky sneaking!
|
||||
if("Swarmer")
|
||||
name = "Swarmer ([rand(1, 999)])"
|
||||
desc = "A cardboard cutout of a swarmer."
|
||||
icon_state = "cutout_swarmer"
|
||||
//if("Ash Walker")
|
||||
// name = random_name(pick(MALE,FEMALE),"Unathi")
|
||||
// desc = "A cardboard cutout of an ash walker."
|
||||
// icon_state = "cutout_free_antag"
|
||||
if("Deathsquad Officer")
|
||||
name = pick(commando_names)
|
||||
desc = "A cardboard cutout of a death commando."
|
||||
icon_state = "cutout_deathsquad"
|
||||
if("Ian")
|
||||
name = "Ian"
|
||||
desc = "A cardboard cutout of the HoP's beloved corgi."
|
||||
icon_state = "cutout_ian"
|
||||
if("Slaughter Demon")
|
||||
name = "slaughter demon"
|
||||
desc = "A cardboard cutout of a slaughter demon."
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "daemon"
|
||||
dir = "SOUTH"
|
||||
if("Laughter Demon")
|
||||
name = "laughter demon"
|
||||
desc = "A cardboard cutout of a laughter demon."
|
||||
icon = 'icons/mob/mob.dmi'
|
||||
icon_state = "bowmon"
|
||||
dir = "SOUTH"
|
||||
if("Xenomorph Maid")
|
||||
name = "lusty xenomorph maid ([rand(1, 999)])"
|
||||
desc = "A cardboard cutout of a xenomorph maid."
|
||||
icon_state = "cutout_lusty"
|
||||
if("Security Officer")
|
||||
name = "Private Security Officer"
|
||||
desc = "A cardboard cutout of a private security officer."
|
||||
icon_state = "cutout_ntsec"
|
||||
if("Terror Spider")
|
||||
name = "Gray Terror Spider"
|
||||
desc = "A cardboard cutout of a terror spider."
|
||||
icon = 'icons/mob/terrorspider.dmi'
|
||||
icon_state = "terror_gray"
|
||||
dir = "SOUTH"
|
||||
|
||||
return 1
|
||||
|
||||
/obj/item/cardboard_cutout/setDir()
|
||||
dir = SOUTH
|
||||
|
||||
/obj/item/cardboard_cutout/adaptive //Purchased by Syndicate agents, these cutouts are indistinguishable from normal cutouts but aren't discolored when their appearance is changed
|
||||
deceptive = TRUE
|
||||
@@ -73,7 +73,7 @@
|
||||
temp = pick(graffiti)
|
||||
else
|
||||
temp = href_list["type"]
|
||||
if((usr.restrained() || usr.stat || usr.get_active_hand() != src))
|
||||
if((usr.restrained() || usr.stat || !usr.is_in_active_hand(src)))
|
||||
return
|
||||
drawtype = temp
|
||||
update_window(usr)
|
||||
@@ -147,6 +147,29 @@
|
||||
colour = "#DA00FF"
|
||||
colourName = "purple"
|
||||
|
||||
/obj/item/toy/crayon/random/New()
|
||||
icon_state = pick(list("crayonred", "crayonorange", "crayonyellow", "crayongreen", "crayonblue", "crayonpurple"))
|
||||
switch(icon_state)
|
||||
if("crayonred")
|
||||
colour = "#DA0000"
|
||||
colourName = "red"
|
||||
if("crayonorange")
|
||||
colour = "#FF9300"
|
||||
colourName = "orange"
|
||||
if("crayonyellow")
|
||||
colour = "#FFF200"
|
||||
colourName = "yellow"
|
||||
if("crayongreen")
|
||||
colour = "#A8E61D"
|
||||
colourName = "green"
|
||||
if("crayonblue")
|
||||
colour = "#00B7EF"
|
||||
colourName = "blue"
|
||||
if("crayonpurple")
|
||||
colour = "#DA00FF"
|
||||
colourName = "purple"
|
||||
..()
|
||||
|
||||
/obj/item/toy/crayon/white
|
||||
icon_state = "crayonwhite"
|
||||
colour = "#FFFFFF"
|
||||
@@ -167,7 +190,7 @@
|
||||
..()
|
||||
|
||||
/obj/item/toy/crayon/mime/Topic(href,href_list)
|
||||
if((usr.restrained() || usr.stat || usr.get_active_hand() != src))
|
||||
if((usr.restrained() || usr.stat || usr.is_in_active_hand(src)))
|
||||
return
|
||||
if(href_list["color"])
|
||||
if(colour != "#FFFFFF")
|
||||
@@ -195,7 +218,7 @@
|
||||
|
||||
if(href_list["color"])
|
||||
var/temp = input(usr, "Please select colour.", "Crayon colour") as color
|
||||
if((usr.restrained() || usr.stat || usr.get_active_hand() != src))
|
||||
if((usr.restrained() || usr.stat || usr.is_in_active_hand(src)))
|
||||
return
|
||||
colour = temp
|
||||
update_window(usr)
|
||||
@@ -214,7 +237,7 @@
|
||||
|
||||
/obj/item/toy/crayon/spraycan/New()
|
||||
..()
|
||||
name = "NanoTrasen-brand Rapid Paint Applicator"
|
||||
name = "Nanotrasen-brand Rapid Paint Applicator"
|
||||
update_icon()
|
||||
|
||||
/obj/item/toy/crayon/spraycan/attack_self(mob/living/user as mob)
|
||||
|
||||
@@ -74,6 +74,21 @@
|
||||
if(O.trace_chemicals[V] > 0 && !chemtraces.Find(V))
|
||||
chemtraces += V
|
||||
|
||||
/obj/item/weapon/autopsy_scanner/attackby(obj/item/weapon/P, mob/user)
|
||||
if(istype(P, /obj/item/weapon/pen))
|
||||
var/dead_name = input("Insert name of deceased individual")
|
||||
var/dead_rank = input("Insert rank of deceased individual")
|
||||
var/dead_tod = input("Insert time of death")
|
||||
var/dead_cause = input("Insert cause of death")
|
||||
var/dead_chems = input("Insert any chemical traces")
|
||||
var/dead_notes = input("Insert any relevant notes")
|
||||
var/obj/item/weapon/paper/R = new(user.loc)
|
||||
R.name = "Official Coroner's Report - [dead_name]"
|
||||
R.info = "<b>NanoTrasen Science Station Cyberiad - Coroner's Report</b><br><br><b>Name of Deceased:</b> [dead_name]</br><br><b>Rank of Deceased:</b> [dead_rank]<br><br><b>Time of Death:</b> [dead_tod]<br><br><b>Cause of Death:</b> [dead_cause]<br><br><b>Trace Chemicals:</b> [dead_chems]<br><br><b>Additional Coroner's Notes:</b> [dead_notes]<br><br><b>Coroner's Signature:</b> <span class=\"paper_field\">"
|
||||
playsound(loc, 'sound/goonstation/machines/printer_thermal.ogg', 50, 1)
|
||||
sleep(10)
|
||||
user.put_in_hands(R)
|
||||
|
||||
/obj/item/weapon/autopsy_scanner/attack_self(mob/user)
|
||||
if(!wdata.len && !chemtraces.len)
|
||||
return
|
||||
@@ -181,4 +196,4 @@
|
||||
M.visible_message("<span class='warning'>[user] scans the wounds on [M]'s [S] with [src]</span>")
|
||||
|
||||
add_data(S)
|
||||
return 1
|
||||
return 1
|
||||
|
||||
@@ -43,8 +43,7 @@
|
||||
if(active_dummy)
|
||||
eject_all()
|
||||
playsound(get_turf(src), 'sound/effects/pop.ogg', 100, 1, -6)
|
||||
qdel(active_dummy)
|
||||
active_dummy = null
|
||||
QDEL_NULL(active_dummy)
|
||||
to_chat(usr, "<span class='notice'>You deactivate \the [src].</span>")
|
||||
var/obj/effect/overlay/T = new/obj/effect/overlay(get_turf(src))
|
||||
T.icon = 'icons/effects/effects.dmi'
|
||||
|
||||
@@ -39,6 +39,11 @@
|
||||
overcharged = 1
|
||||
overlays += "overcharge"
|
||||
|
||||
/obj/item/device/flash/random/New()
|
||||
..()
|
||||
if(prob(25))
|
||||
broken = 1
|
||||
icon_state = "[initial(icon_state)]burnt"
|
||||
|
||||
/obj/item/device/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something.
|
||||
broken = 1
|
||||
|
||||
@@ -37,6 +37,7 @@ var/global/list/default_medbay_channels = list(
|
||||
var/list/channels = list() //see communications.dm for full list. First channes is a "default" for :h
|
||||
var/subspace_transmission = 0
|
||||
var/syndie = 0//Holder to see if it's a syndicate encrpyed radio
|
||||
var/disable_timer = 0 //How many times this is disabled by EMPs
|
||||
|
||||
var/is_special = 0 //For electropacks mostly, skips Topic() checks
|
||||
|
||||
@@ -599,12 +600,25 @@ var/global/list/default_medbay_channels = list(
|
||||
else return
|
||||
|
||||
/obj/item/device/radio/emp_act(severity)
|
||||
on = 0
|
||||
disable_timer++
|
||||
addtimer(src, "enable_radio", rand(100, 200))
|
||||
|
||||
if(listening)
|
||||
visible_message("<span class='warning'>[src] buzzes violently!</span>")
|
||||
|
||||
broadcasting = 0
|
||||
listening = 0
|
||||
for(var/ch_name in channels)
|
||||
channels[ch_name] = 0
|
||||
..()
|
||||
|
||||
/obj/item/device/radio/proc/enable_radio()
|
||||
if(disable_timer > 0)
|
||||
disable_timer--
|
||||
if(!disable_timer)
|
||||
on = 1
|
||||
|
||||
///////////////////////////////
|
||||
//////////Borg Radios//////////
|
||||
///////////////////////////////
|
||||
|
||||
@@ -162,7 +162,7 @@ var/list/tape_roll_applications = list()
|
||||
breaktape(W, user)
|
||||
|
||||
/obj/item/tape/attack_hand(mob/user as mob)
|
||||
if(user.a_intent == I_HELP && src.allowed(user))
|
||||
if(user.a_intent == INTENT_HELP && src.allowed(user))
|
||||
user.visible_message("<span class=notice>[user] lifts [src], allowing passage.</span>", "<span class=notice>You lift [src], allowing passage.</span>")
|
||||
src.density = 0
|
||||
spawn(200)
|
||||
@@ -174,7 +174,7 @@ var/list/tape_roll_applications = list()
|
||||
breaktape(/obj/item/weapon/wirecutters,user)
|
||||
|
||||
/obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(user.a_intent == I_HELP && ((!can_puncture(W) && src.allowed(user))))
|
||||
if(user.a_intent == INTENT_HELP && ((!can_puncture(W) && src.allowed(user))))
|
||||
to_chat(user, "You can't break the [src] with that!")
|
||||
return
|
||||
user.visible_message("<span class=warning>[user] breaks the [src]!</span>", "<span class=warning>You break the [src]!</span>")
|
||||
|
||||
@@ -37,8 +37,7 @@
|
||||
R.hands.icon_state = "nomod"
|
||||
R.icon_state = "robot"
|
||||
R.module.remove_subsystems_and_actions(R)
|
||||
qdel(R.module)
|
||||
R.module = null
|
||||
QDEL_NULL(R.module)
|
||||
|
||||
R.camera.network.Remove(list("Engineering", "Medical", "Mining Outpost"))
|
||||
R.rename_character(R.real_name, R.get_default_name("Default"))
|
||||
|
||||
@@ -55,7 +55,7 @@ var/global/list/datum/stack_recipe/rod_recipes = list ( \
|
||||
"<span class='notice'>You shape [src] into metal with the welding tool.</span>", \
|
||||
"<span class='italics'>You hear welding.</span>")
|
||||
|
||||
var/replace = user.get_inactive_hand() == src
|
||||
var/replace = user.is_in_inactive_hand(src)
|
||||
use(2)
|
||||
if(get_amount() <= 0 && replace)
|
||||
user.unEquip(src, 1)
|
||||
|
||||
@@ -237,6 +237,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list (
|
||||
new /datum/stack_recipe("folder", /obj/item/weapon/folder),
|
||||
new /datum/stack_recipe("cardboard tube", /obj/item/weapon/c_tube),
|
||||
new /datum/stack_recipe("cardboard box", /obj/structure/closet/cardboard, 4),
|
||||
new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5),
|
||||
)
|
||||
|
||||
/obj/item/stack/sheet/cardboard //BubbleWrap
|
||||
|
||||
@@ -36,6 +36,23 @@
|
||||
/obj/item/stack/attack_self(mob/user)
|
||||
list_recipes(user)
|
||||
|
||||
/obj/item/stack/attack_self_tk(mob/user)
|
||||
list_recipes(user)
|
||||
|
||||
/obj/item/stack/attack_tk(mob/user)
|
||||
if(user.stat || !isturf(loc)) return
|
||||
// Allow remote stack splitting, because telekinetic inventory managing
|
||||
// is really cool
|
||||
if(src in user.tkgrabbed_objects)
|
||||
var/obj/item/stack/F = split(user, 1)
|
||||
F.attack_tk(user)
|
||||
if(src && user.machine == src)
|
||||
spawn(0)
|
||||
interact(user)
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
/obj/item/stack/proc/list_recipes(mob/user, recipes_sublist)
|
||||
if(!recipes)
|
||||
return
|
||||
@@ -107,7 +124,7 @@
|
||||
|
||||
/obj/item/stack/Topic(href, href_list)
|
||||
..()
|
||||
if(usr.incapacitated() || usr.get_active_hand() != src)
|
||||
if(usr.incapacitated() || !usr.is_in_active_hand(src))
|
||||
return 0
|
||||
|
||||
if(href_list["sublist"] && !href_list["make"])
|
||||
@@ -124,6 +141,7 @@
|
||||
|
||||
var/datum/stack_recipe/R = recipes_list[text2num(href_list["make"])]
|
||||
var/multiplier = text2num(href_list["multiplier"])
|
||||
var/atom/creation_loc = (loc == usr) ? usr.loc : loc
|
||||
if(!multiplier)
|
||||
multiplier = 1
|
||||
|
||||
@@ -134,11 +152,11 @@
|
||||
to_chat(usr, "<span class='warning'>You haven't got enough [src] to build \the [R.title]!</span>")
|
||||
return 0
|
||||
|
||||
if(R.one_per_turf && (locate(R.result_type) in usr.loc))
|
||||
if(R.one_per_turf && (locate(R.result_type) in creation_loc))
|
||||
to_chat(usr, "<span class='warning'>There is another [R.title] here!</span>")
|
||||
return 0
|
||||
|
||||
if(R.on_floor && !istype(usr.loc, /turf/simulated))
|
||||
if(R.on_floor && !istype(creation_loc, /turf/simulated))
|
||||
to_chat(usr, "<span class='warning'>\The [R.title] must be constructed on the floor!</span>")
|
||||
return 0
|
||||
|
||||
@@ -150,7 +168,7 @@
|
||||
if(amount < R.req_amount * multiplier)
|
||||
return
|
||||
|
||||
var/atom/O = new R.result_type(usr.loc)
|
||||
var/atom/O = new R.result_type(creation_loc)
|
||||
O.dir = usr.dir
|
||||
if(R.max_res_amount > 1)
|
||||
var/obj/item/stack/new_item = O
|
||||
@@ -215,7 +233,7 @@
|
||||
return max_amount
|
||||
|
||||
/obj/item/stack/proc/split(mob/user, amt)
|
||||
var/obj/item/stack/F = new type(user, amt)
|
||||
var/obj/item/stack/F = new type(loc, amt)
|
||||
F.copy_evidences(src)
|
||||
if(isliving(user))
|
||||
add_fingerprint(user)
|
||||
@@ -224,7 +242,7 @@
|
||||
return F
|
||||
|
||||
/obj/item/stack/attack_hand(mob/user)
|
||||
if(user.get_inactive_hand() == src)
|
||||
if(user.is_in_inactive_hand(src))
|
||||
var/obj/item/stack/F = split(user, 1)
|
||||
user.put_in_hands(F)
|
||||
if(src && usr.machine == src)
|
||||
@@ -241,7 +259,7 @@
|
||||
return 1
|
||||
|
||||
var/to_transfer
|
||||
if(user.get_inactive_hand() == src)
|
||||
if(user.is_in_inactive_hand(src))
|
||||
var/desired = input("How much would you like to transfer from this stack?", "How much?", 1) as null|num
|
||||
if(!desired)
|
||||
return
|
||||
@@ -267,4 +285,4 @@
|
||||
fingerprints = from.fingerprints
|
||||
fingerprintshidden = from.fingerprintshidden
|
||||
fingerprintslast = from.fingerprintslast
|
||||
//TODO bloody overlay
|
||||
//TODO bloody overlay
|
||||
|
||||
@@ -100,6 +100,11 @@
|
||||
turf_type = /turf/simulated/floor/carpet
|
||||
burn_state = FLAMMABLE
|
||||
|
||||
/obj/item/stack/tile/carpet/black
|
||||
name = "black carpet"
|
||||
icon_state = "tile-carpet-black"
|
||||
turf_type = /turf/simulated/floor/carpet/black
|
||||
|
||||
//Plasteel
|
||||
/obj/item/stack/tile/plasteel
|
||||
name = "floor tiles"
|
||||
|
||||
@@ -283,7 +283,7 @@
|
||||
/obj/item/toy/snappop/Crossed(H as mob|obj)
|
||||
if(ishuman(H) || issilicon(H)) //i guess carp and shit shouldn't set them off
|
||||
var/mob/living/carbon/M = H
|
||||
if(issilicon(H) || M.m_intent == "run")
|
||||
if(issilicon(H) || M.m_intent == MOVE_INTENT_RUN)
|
||||
to_chat(M, "<span class='danger'>You step on the snap pop!</span>")
|
||||
pop_burst(2, 0)
|
||||
|
||||
@@ -1276,7 +1276,7 @@ obj/item/toy/cards/deck/syndicate/black
|
||||
|
||||
/obj/item/toy/minigibber
|
||||
name = "miniature gibber"
|
||||
desc = "A miniature recreation of NanoTrasen's famous meat grinder."
|
||||
desc = "A miniature recreation of Nanotrasen's famous meat grinder."
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "minigibber"
|
||||
attack_verb = list("grinded", "gibbed")
|
||||
@@ -1288,8 +1288,7 @@ obj/item/toy/cards/deck/syndicate/black
|
||||
|
||||
if(stored_minature)
|
||||
to_chat(user, "<span class='danger'>\The [src] makes a violent grinding noise as it tears apart the miniature figure inside!</span>")
|
||||
qdel(stored_minature)
|
||||
stored_minature = null
|
||||
QDEL_NULL(stored_minature)
|
||||
playsound(user, 'sound/goonstation/effects/gib.ogg', 20, 1)
|
||||
cooldown = world.time
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ RCD
|
||||
*/
|
||||
/obj/item/weapon/rcd
|
||||
name = "rapid-construction-device (RCD)"
|
||||
desc = "A device used to rapidly build and deconstruct walls and floors."
|
||||
desc = "A device used to rapidly build and deconstruct walls, floors and airlocks."
|
||||
icon = 'icons/obj/tools.dmi'
|
||||
icon_state = "rcd"
|
||||
opacity = 0
|
||||
@@ -68,7 +68,7 @@ RCD
|
||||
if(istype(W, /obj/item/weapon/rcd_ammo))
|
||||
var/obj/item/weapon/rcd_ammo/R = W
|
||||
if((matter + R.ammoamt) > max_matter)
|
||||
to_chat(user, "<span class='notice'>The RCD cant hold any more matter-units.</span>")
|
||||
to_chat(user, "<span class='notice'>The RCD can't hold any more matter-units.</span>")
|
||||
return
|
||||
matter += R.ammoamt
|
||||
user.drop_item()
|
||||
@@ -84,6 +84,9 @@ RCD
|
||||
//Change the mode
|
||||
ui_interact(user)
|
||||
|
||||
/obj/item/weapon/rcd/attack_self_tk(mob/user)
|
||||
ui_interact(user)
|
||||
|
||||
/obj/item/weapon/rcd/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1, var/datum/topic_state/state = inventory_state)
|
||||
ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
@@ -199,7 +202,8 @@ RCD
|
||||
to_chat(user, "Building Wall ...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 20 * toolspeed, target = A))
|
||||
if(!useResource(3, user)) return 0
|
||||
if(!useResource(3, user))
|
||||
return 0
|
||||
activate()
|
||||
var/turf/AT = A
|
||||
AT.ChangeTurf(/turf/simulated/wall)
|
||||
@@ -212,7 +216,10 @@ RCD
|
||||
to_chat(user, "Building Airlock...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 50 * toolspeed, target = A))
|
||||
if(!useResource(10, user)) return 0
|
||||
for(var/obj/machinery/door/airlock/D in A.contents)
|
||||
return 0
|
||||
if(!useResource(10, user))
|
||||
return 0
|
||||
activate()
|
||||
var/obj/machinery/door/airlock/T = new door_type(A)
|
||||
T.name = door_name
|
||||
@@ -233,7 +240,8 @@ RCD
|
||||
to_chat(user, "Deconstructing Wall...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 40 * toolspeed, target = A))
|
||||
if(!useResource(5, user)) return 0
|
||||
if(!useResource(5, user))
|
||||
return 0
|
||||
activate()
|
||||
var/turf/AT = A
|
||||
AT.ChangeTurf(/turf/simulated/floor/plating)
|
||||
@@ -245,7 +253,8 @@ RCD
|
||||
to_chat(user, "Deconstructing Floor...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 50 * toolspeed, target = A))
|
||||
if(!useResource(5, user)) return 0
|
||||
if(!useResource(5, user))
|
||||
return 0
|
||||
activate()
|
||||
var/turf/AT = A
|
||||
AT.ChangeTurf(/turf/space)
|
||||
@@ -257,7 +266,8 @@ RCD
|
||||
to_chat(user, "Deconstructing Airlock...")
|
||||
playsound(loc, 'sound/machines/click.ogg', 50, 1)
|
||||
if(do_after(user, 50 * toolspeed, target = A))
|
||||
if(!useResource(20, user)) return 0
|
||||
if(!useResource(20, user))
|
||||
return 0
|
||||
activate()
|
||||
qdel(A)
|
||||
return 1
|
||||
@@ -361,7 +371,7 @@ RCD
|
||||
|
||||
/obj/item/weapon/rcd/borg/New()
|
||||
..()
|
||||
desc = "A device used to rapidly build and deconstruct walls and floors."
|
||||
desc = "A device used to rapidly build and deconstruct walls, floors and airlocks."
|
||||
canRwall = 1
|
||||
|
||||
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
if(armed)
|
||||
if(istype(AM, /mob/living/carbon) && !istype(AM, /mob/living/carbon/brain))
|
||||
var/mob/living/carbon/C = AM
|
||||
if(C.m_intent != "walk")
|
||||
if(C.m_intent != MOVE_INTENT_WALK)
|
||||
src.visible_message("The [src.name] beeps, \"Running on wet floors is hazardous to your health.\"")
|
||||
explosion(src.loc,-1,0,2)
|
||||
if(ishuman(C))
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
//So this is a workaround. This also makes more sense from an IC standpoint. ~Carn
|
||||
if(user.client && (target in user.client.screen))
|
||||
to_chat(user, "<span class='notice'>You need to take that [target.name] off before cleaning it.</span>")
|
||||
else if(target == user && user.a_intent == I_GRAB && ishuman(target))
|
||||
else if(target == user && user.a_intent == INTENT_GRAB && ishuman(target))
|
||||
var/mob/living/carbon/human/muncher = user
|
||||
if(muncher && muncher.get_species() == "Drask")
|
||||
to_chat(user, "You take a bite of the [src.name]. Delicious!")
|
||||
|
||||
@@ -319,7 +319,7 @@
|
||||
to_chat(user, "<span class='notice'>The instructions on [defib] don't mention how to revive that...</span>")
|
||||
return
|
||||
else
|
||||
if(user.a_intent == I_HARM && !defib.safety)
|
||||
if(user.a_intent == INTENT_HARM && !defib.safety)
|
||||
busy = 1
|
||||
H.visible_message("<span class='danger'>[user] has touched [H.name] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] has touched [H.name] with [src]!</span>")
|
||||
@@ -349,8 +349,7 @@
|
||||
H.key = ghost.key
|
||||
log_runtime(EXCEPTION("Ghost of name [ghost.name] is bound to [H.real_name], but lacks a client. Deleting ghost."), src)
|
||||
|
||||
qdel(ghost)
|
||||
ghost = null
|
||||
QDEL_NULL(ghost)
|
||||
var/tplus = world.time - H.timeofdeath
|
||||
var/tlimit = 1800 //past this much time the patient is unrecoverable (in deciseconds)
|
||||
var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting
|
||||
@@ -461,7 +460,7 @@
|
||||
to_chat(user, "<span class='notice'>This unit is only designed to work on humanoid lifeforms.</span>")
|
||||
return
|
||||
else
|
||||
if(user.a_intent == I_HARM && !safety)
|
||||
if(user.a_intent == INTENT_HARM && !safety)
|
||||
busy = 1
|
||||
H.visible_message("<span class='danger'>[user] has touched [H.name] with [src]!</span>", \
|
||||
"<span class='userdanger'>[user] has touched [H.name] with [src]!</span>")
|
||||
@@ -495,8 +494,7 @@
|
||||
H.key = ghost.key
|
||||
log_runtime(EXCEPTION("Ghost of name [ghost.name] is bound to [H.real_name], but lacks a client. Deleting ghost."), H)
|
||||
|
||||
qdel(ghost)
|
||||
ghost = null
|
||||
QDEL_NULL(ghost)
|
||||
var/tplus = world.time - H.timeofdeath
|
||||
var/tlimit = 1800 //past this much time the patient is unrecoverable (in deciseconds)
|
||||
var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting
|
||||
|
||||
@@ -61,7 +61,7 @@
|
||||
nadeassembly.attack_self(user)
|
||||
return
|
||||
var/newtime = input(usr, "Please set the timer.", "Timer", 10) as num
|
||||
if(user.get_active_hand() == src)
|
||||
if(user.is_in_active_hand(src))
|
||||
newtime = Clamp(newtime, 10, 60000)
|
||||
det_time = newtime
|
||||
to_chat(user, "Timer set for [det_time] seconds.")
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
/obj/item/weapon/flamethrower/afterattack(atom/target, mob/user, flag)
|
||||
if(flag) return // too close
|
||||
// Make sure our user is still holding us
|
||||
if(user && user.get_active_hand() == src)
|
||||
if(user && user.is_in_active_hand(src))
|
||||
var/turf/target_turf = get_turf(target)
|
||||
if(target_turf)
|
||||
var/turflist = getline(user, target_turf)
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
/*/obj/item/weapon/grenade/afterattack(atom/target as mob|obj|turf|area, mob/user as mob)
|
||||
if(istype(target, /obj/item/weapon/storage)) return ..() // Trying to put it in a full container
|
||||
if(istype(target, /obj/item/weapon/gun/grenadelauncher)) return ..()
|
||||
if((user.get_active_hand() == src) && (!active) && (clown_check(user)) && target.loc != src.loc)
|
||||
if((user.is_in_active_hand(src)) && (!active) && (clown_check(user)) && target.loc != src.loc)
|
||||
to_chat(user, "<span class='warning'>You prime the [name]! [det_time/10] seconds!</span>")
|
||||
active = 1
|
||||
icon_state = initial(icon_state) + "_active"
|
||||
|
||||
@@ -104,6 +104,10 @@
|
||||
/obj/item/weapon/restraints/handcuffs/cable/white
|
||||
color = COLOR_WHITE
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/cable/random/New()
|
||||
color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
|
||||
..()
|
||||
|
||||
/obj/item/weapon/restraints/handcuffs/alien
|
||||
icon_state = "handcuffAlien"
|
||||
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
|
||||
//Highlander Style Martial Art
|
||||
// Prevents use of guns, but makes the highlander impervious to ranged attacks. Their bravery in battle shields them from the weapons of COWARDS!
|
||||
|
||||
/datum/martial_art/highlander
|
||||
name = "Highlander Style"
|
||||
deflection_chance = 100
|
||||
no_guns = TRUE
|
||||
no_guns_message = "You'd never stoop so low as to use the weapon of a COWARD!"
|
||||
|
||||
|
||||
//Highlander Claymore
|
||||
// Grants the wielder the Highlander Style Martial Art
|
||||
|
||||
/obj/item/weapon/claymore/highlander
|
||||
name = "Highlander Claymore"
|
||||
desc = "Imbues the wielder with legendary martial prowress and a nigh-unquenchable thirst for glorious battle!"
|
||||
var/datum/martial_art/highlander/style = new
|
||||
|
||||
/obj/item/weapon/claymore/highlander/Destroy()
|
||||
if(ishuman(loc)) //just in case it gets destroyed while in someone's possession, such as due to acid or something?
|
||||
var/mob/living/carbon/human/H = loc
|
||||
style.remove(H)
|
||||
QDEL_NULL(style)
|
||||
return ..()
|
||||
|
||||
/obj/item/weapon/claymore/highlander/equipped(mob/user, slot)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(slot == slot_r_hand || slot == slot_l_hand)
|
||||
if(H.martial_art && H.martial_art != style)
|
||||
style.teach(H, 1)
|
||||
to_chat(H, "<span class='notice'>THERE CAN ONLY BE ONE!</span>")
|
||||
else if(H.martial_art && H.martial_art == style)
|
||||
style.remove(H)
|
||||
var/obj/item/weapon/claymore/highlander/sword = H.is_in_hands(/obj/item/weapon/claymore/highlander)
|
||||
if(sword)
|
||||
//if we have a highlander sword in the other hand, relearn the style from that sword.
|
||||
sword.style.teach(H, 1)
|
||||
|
||||
/obj/item/weapon/claymore/highlander/dropped(mob/user)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
style.remove(H)
|
||||
var/obj/item/weapon/claymore/highlander/sword = H.is_in_hands(/obj/item/weapon/claymore/highlander)
|
||||
if(sword)
|
||||
//if we have a highlander sword in the other hand, relearn the style from that sword.
|
||||
sword.style.teach(H, 1)
|
||||
@@ -159,6 +159,11 @@
|
||||
return 0
|
||||
to_chat(imp_in, "<span class='notice'>Your dusting implant activates!</span>")
|
||||
imp_in.visible_message("<span class = 'warning'>[imp_in] burns up in a flash!</span>")
|
||||
for(var/obj/item/I in imp_in.contents)
|
||||
if(I == src)
|
||||
continue
|
||||
if(I.flags & NODROP)
|
||||
qdel(I)
|
||||
imp_in.dust()
|
||||
|
||||
/obj/item/weapon/implant/dust/emp_act(severity)
|
||||
|
||||
@@ -30,3 +30,11 @@
|
||||
circuitry. As a result neurotoxins can cause massive damage.<HR>
|
||||
Implant Specifics:<BR>"}
|
||||
return dat
|
||||
|
||||
/obj/item/weapon/implantcase/track
|
||||
name = "implant case - 'Tracking'"
|
||||
desc = "A glass case containing a tracking implant."
|
||||
|
||||
/obj/item/weapon/implantcase/track/New()
|
||||
imp = new /obj/item/weapon/implant/tracking(src)
|
||||
..()
|
||||
@@ -40,7 +40,7 @@
|
||||
if(!istype(M))
|
||||
return ..()
|
||||
|
||||
if(user.a_intent != I_HELP)
|
||||
if(user.a_intent != INTENT_HELP)
|
||||
if(user.zone_sel.selecting == "head" || user.zone_sel.selecting == "eyes")
|
||||
if((CLUMSY in user.mutations) && prob(50))
|
||||
M = user
|
||||
|
||||
@@ -1183,9 +1183,9 @@
|
||||
|
||||
/obj/item/weapon/book/manual/faxes
|
||||
name = "A Guide to Faxes"
|
||||
desc = "A NanoTrasen-approved guide to writing faxes"
|
||||
desc = "A Nanotrasen-approved guide to writing faxes"
|
||||
icon_state = "book6"
|
||||
author = "NanoTrasen"
|
||||
author = "Nanotrasen"
|
||||
title = "A Guide to Faxes"
|
||||
dat = {"
|
||||
|
||||
@@ -1213,14 +1213,14 @@
|
||||
<li>Faxes are your main method of communicating with the NAS Trurl, better known as Central Command.</li>
|
||||
<li>Faxes allow personnel on the station to maintain open lines of communication with the NAS Trurl, allowing for vital information to flow both ways.</li>
|
||||
<li>Being written communications, proper grammar, syntax and typography is required, in addition to a signature and, if applicable, a stamp. Failure to sign faxes will lead to an automatic rejection.</li>
|
||||
<li>We at NanoTrasen provide Fax Machines to every Head of Staff, in addition to the Magistrate, NanoTrasen Representative, and Internal Affairs Agents.</li>
|
||||
<li>We at Nanotrasen provide Fax Machines to every Head of Staff, in addition to the Magistrate, Nanotrasen Representative, and Internal Affairs Agents.</li>
|
||||
<li>This means that we trust the recipients of these fax machines to only use them in the proper circumstances (see <B>When to Fax?</B>).</li>
|
||||
|
||||
<h1><a name="when"><B>When to Fax?</B></a></h1><BR>
|
||||
<li>While it is up to the discretion of each individual person to decide when to fax Central Command, there are some simple guidelines on when to do this.</li>
|
||||
<li>Firstly, any situation that can reasonably be solved on-site, <I>should</I> be handled on-site. Knowledge of Standard Operating Procedure is <B>mandatory</B> for everyone with access to a fax machine.</li>
|
||||
<li>Resolving issues on-site not only leads to more expedient problem-solving, it also frees up company resources and provides valuable work experience for all parties involved.</li>
|
||||
<li>This means that you should work with the Heads of Staff concerning personnel and workplace issues, and attempt to resolve situations with them. If, for whatever reason, the relevent Head of Staff is not available or receptive, consider speaking with the Captain and/or NanoTrasen Representative.</li>
|
||||
<li>This means that you should work with the Heads of Staff concerning personnel and workplace issues, and attempt to resolve situations with them. If, for whatever reason, the relevent Head of Staff is not available or receptive, consider speaking with the Captain and/or Nanotrasen Representative.</li>
|
||||
<li>If, for whatever reason, these issues cannot be solved on-site, either due to incompetence or just plain refusal to cooperate, faxing Central Command becomes a viable option.</li>
|
||||
<li>Secondly, station status reports should be sent occasionally, but never at the start of the shift. Remember, we assign personnel to the station. We do not need a repeat of what we just signed off on.</li>
|
||||
<li>Thirdly, staff/departmental evaluations are always welcome, especially in cases of noticeable (in)competence. Just as a brilliant coworker can be rewarded, an incompetent one can be punished.</li>
|
||||
@@ -2487,7 +2487,7 @@
|
||||
<li><a href="#foreword">Foreword</a></li>
|
||||
<li><a href="#cap">Captain</a></li>
|
||||
<li><a href="#hop">Head of Personnel</a></li>
|
||||
<li><a href="#ntrep">NanoTrasen Representative</a></li>
|
||||
<li><a href="#ntrep">Nanotrasen Representative</a></li>
|
||||
<li><a href="#bs">Blueshield Officer</a></li>
|
||||
<li><a href="#ai">AI</a></li>
|
||||
</ol>
|
||||
@@ -2507,9 +2507,9 @@
|
||||
<li>The Captain must keep the Nuclear Authentication Disk on their person at all times or, failing that, in the possession of the Head of Security or Blueshield;</li>
|
||||
<li>The Captain is to attempt to resolve every issue that arises in Command locally before contacting Central Command;</li>
|
||||
<li>The Captain is not permitted to carry their Antique Laser Gun or Space Armor unless there's an immediate emergency that requires attending to;</li>
|
||||
<li>The Captain, despite being in charge of the Cyberiad, is not independent from NanoTrasen. Any attempts to disregard general company policy are to be considered an instant condition for contract termination;</li>
|
||||
<li>The Captain, despite being in charge of the Cyberiad, is not independent from Nanotrasen. Any attempts to disregard general company policy are to be considered an instant condition for contract termination;</li>
|
||||
<li>The Captain may only promote personnel to a Acting Head of Staff position if there is no assigned Head of Staff associated with the Department. Said Acting Head of Staff must be a member of the Department they are to lead. See below for more information on Chain of Command;</li>
|
||||
<li>The Captain may not fire any Head of Staff without reasonable justification (ie, incompetency, criminal activity, or otherwise any action that endangers/compromises the station and/or crew). The Captain may not fire any Central Command VIPs (ie, Blueshield, Magistrate, NanoTrasen Representative) without permission from Central Command, unless they are blatantly acting against the well-being and safety of the crew and station.</li>
|
||||
<li>The Captain may not fire any Head of Staff without reasonable justification (ie, incompetency, criminal activity, or otherwise any action that endangers/compromises the station and/or crew). The Captain may not fire any Central Command VIPs (ie, Blueshield, Magistrate, Nanotrasen Representative) without permission from Central Command, unless they are blatantly acting against the well-being and safety of the crew and station.</li>
|
||||
</ol><BR>
|
||||
|
||||
<h1><a name="hop"><B>Head of Personnel</B></a></h1><BR>
|
||||
@@ -2518,7 +2518,7 @@
|
||||
<li>The Head of Personnel may not give any personnel increased access without authorization from the relevant Head of Staff. This includes the Head of Personnel. In addition, the Head of Personnel may only give Captain-Level access to someone if they are the Acting Captain. This access is to be removed when a proper Captain arrives on the station;</li>
|
||||
<li>The Head of Personnel may not increase any Job Openings unless the relevant Head of Staff approves;</li>
|
||||
<li>The Head of Personnel may not fire any personnel without authorization from the relevant Head of Staff, unless other conditions apply (see Space Law and General Standard Operating Procedure);</li>
|
||||
<li>The Head of Personnel may not promote any personnel to the following Jobs without authorization from Central Command: Barber, Brig Physician, NanoTrasen Representative, Blueshield, Security Pod Pilot, Mechanic and Magistrate; (This is due to them being karma locked. Do not promote people to these positions without approval from the Administrators);</li>
|
||||
<li>The Head of Personnel may not promote any personnel to the following Jobs without authorization from Central Command: Barber, Brig Physician, Nanotrasen Representative, Blueshield, Security Pod Pilot, Mechanic and Magistrate; (This is due to them being karma locked. Do not promote people to these positions without approval from the Administrators);</li>
|
||||
<li>The Head of Personnel is free to utilize paperwork at their discretion. However, during major station emergencies, expediency should take precedence over bureaucracy;</li>
|
||||
<li>The Head of Personnel may not leave their office unmanned if there are personnel waiting in line. Failure to respond to personnel with a legitimate request within ten (10) minutes, either via radio or in person, is to be considered a breach of Standard Operating Procedure;</li>
|
||||
<li>Despite nominally being in charge of Supply, the Head of Personnel should allow the Quartermaster to run the Department, unless they prove themselves to be incompetent/dangerous;</li>
|
||||
@@ -2526,13 +2526,13 @@
|
||||
<li>The Head of Personnel is not permitted to perform Security duty. The Head of Personnel is permitted to carry an Energy Gun, for self-defence only.</li>
|
||||
</ol><BR>
|
||||
|
||||
<h1><a name="ntrep"><B>NanoTrasen Representative</B></a></h1><BR>
|
||||
<h1><a name="ntrep"><B>Nanotrasen Representative</B></a></h1><BR>
|
||||
<ol>
|
||||
<li>The NanoTrasen Representative is to ensure that every Department is following Standard Operating Procedure, up to and including the respective Head of Staff. If a Head of Staff is not available for a Department, the NanoTrasen Representative must ensure that the Captain appoints an Acting Head of Staff for said Department;</li>
|
||||
<li>The NanoTrasen Representative must attempt to resolve any breach of Standard Operating Procedure locally before contacting Central Command. This is an imperative: Standard Operating Procedure should always be followed unless there is a very good reason not to;</li>
|
||||
<li>The NanoTrasen Representative must, together with the Magistrate and Head of Security, ensure that Space Law is being followed and correctly applied;</li>
|
||||
<li>The NanoTrasen Representative may not threaten the use of a fax in order to gain leverage over any personnel, up to and including Command. In addition they may not threaten to fire, or have Central Command, fire anyone, unless they actually possess a demotion note;</li>
|
||||
<li>The NanoTrasen Representative is permitted to carry their Stun-Cane, or a Telescopic Baton if the Stun-Cane is lost.</li>
|
||||
<li>The Nanotrasen Representative is to ensure that every Department is following Standard Operating Procedure, up to and including the respective Head of Staff. If a Head of Staff is not available for a Department, the Nanotrasen Representative must ensure that the Captain appoints an Acting Head of Staff for said Department;</li>
|
||||
<li>The Nanotrasen Representative must attempt to resolve any breach of Standard Operating Procedure locally before contacting Central Command. This is an imperative: Standard Operating Procedure should always be followed unless there is a very good reason not to;</li>
|
||||
<li>The Nanotrasen Representative must, together with the Magistrate and Head of Security, ensure that Space Law is being followed and correctly applied;</li>
|
||||
<li>The Nanotrasen Representative may not threaten the use of a fax in order to gain leverage over any personnel, up to and including Command. In addition they may not threaten to fire, or have Central Command, fire anyone, unless they actually possess a demotion note;</li>
|
||||
<li>The Nanotrasen Representative is permitted to carry their Stun-Cane, or a Telescopic Baton if the Stun-Cane is lost.</li>
|
||||
</ol><BR>
|
||||
|
||||
<h1><a name="bs"><B>Blueshield Officer</B></a></h1><BR>
|
||||
@@ -2547,14 +2547,14 @@
|
||||
<b><i>The following are procedures for AI Maintenance:</i></b><br>
|
||||
<ol>
|
||||
<li>Only the Captain or Research Director may enter the AI Upload to perform Law Changes (see below), and only the Captain, Research Director or Chief Engineer may enter the AI Core to perform a Carding (see below);</li>
|
||||
<li> No Law Changes are to be performed without approval from the Captain and Research Director. The only Lawsets to be used are those provided by NanoTrasen. Failure to legally perform a Law Change is to be considered Sabotage. Command must be informed prior to the Law Change, and all objections must be taken into consideration. If the number of Command personnel opposing the Law Change is greater than the number of Command personnel in favour, the Law Change is not to be done. If the Law Change is performed, the crew is to be immediately informed of the new Law(s);</li>
|
||||
<li> No Law Changes are to be performed without approval from the Captain and Research Director. The only Lawsets to be used are those provided by Nanotrasen. Failure to legally perform a Law Change is to be considered Sabotage. Command must be informed prior to the Law Change, and all objections must be taken into consideration. If the number of Command personnel opposing the Law Change is greater than the number of Command personnel in favour, the Law Change is not to be done. If the Law Change is performed, the crew is to be immediately informed of the new Law(s);</li>
|
||||
<li>The AI may not be Carded unless it it clearly malfunctioning or subverted. However, any member of Command may card it if the AI agrees to it, either at the end of the shift, or due to external circumstances (such as massive damage to the AI Satellite);</li>
|
||||
<li>The AI Upload and Minisat Antechamber Turrets are to be kept on Non-Lethal in Code Green and Code Blue. The AI Core Turrets are to be kept on Lethal at all times. If a legal Law Change or Carding is occurring, the Turrets are to be disabled;</li>
|
||||
<li>If the AI Unit is not malfunctioning or subverted, any attempt at performing an illegal Carding or Law Change is to be responded to with non-lethal force. If the illegal attempts persist, and the perpetrator is demonstrably hostile, lethal force from Command/Security is permitted;</li>
|
||||
<li>Freeform Laws are only to be added if absolutely necessary due to external circumstances (such as major station emergencies). Adding unnecessary Freeform Laws is not permitted. Exception is made if the AI Unit and majority of Command agree to the Freeform Law that is proposed;</li>
|
||||
<li>Any use of the "Purge" Module is to be followed by the upload of a NanoTrasen-approved Lawset immediately. AI Units must be bound to a Lawset at all times.</li>
|
||||
<li>Any use of the "Purge" Module is to be followed by the upload of a Nanotrasen-approved Lawset immediately. AI Units must be bound to a Lawset at all times.</li>
|
||||
</ol><BR>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
"}
|
||||
"}
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
toolspeed = 0.75
|
||||
|
||||
/obj/item/weapon/scissors/attack(mob/living/carbon/M as mob, mob/user as mob)
|
||||
if(user.a_intent != "help")
|
||||
if(user.a_intent != INTENT_HELP)
|
||||
..()
|
||||
return
|
||||
if(!(M in view(1))) //Adjacency test
|
||||
@@ -95,13 +95,12 @@
|
||||
user.visible_message("<span class='notice'>[user] finishes cutting [M]'s hair!</span>")
|
||||
|
||||
/obj/item/weapon/scissors/safety //Totally safe, I assure you.
|
||||
name = "safety scissors"
|
||||
desc = "The blades of the scissors appear to be made of some sort of ultra-strong metal alloy."
|
||||
force = 18 //same as e-daggers
|
||||
var/is_cutting = 0 //to prevent spam clicking this for huge accumulation of losebreath.
|
||||
|
||||
/obj/item/weapon/scissors/safety/attack(mob/living/carbon/M as mob, mob/user as mob)
|
||||
if(user.a_intent != "help")
|
||||
if(user.a_intent != INTENT_HELP)
|
||||
..()
|
||||
return
|
||||
if(!(M in view(1)))
|
||||
|
||||
@@ -317,7 +317,7 @@
|
||||
|
||||
/obj/item/weapon/storage/fancy/rollingpapers
|
||||
name = "rolling paper pack"
|
||||
desc = "A pack of NanoTrasen brand rolling papers."
|
||||
desc = "A pack of Nanotrasen brand rolling papers."
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
icon = 'icons/obj/cigarettes.dmi'
|
||||
icon_state = "cig_paper_pack"
|
||||
|
||||
@@ -478,7 +478,7 @@
|
||||
/obj/item/weapon/storage/attack_self(mob/user as mob)
|
||||
|
||||
//Clicking on itself will empty it, if it has the verb to do that.
|
||||
if(user.get_active_hand() == src)
|
||||
if(user.is_in_active_hand(src))
|
||||
if(src.verbs.Find(/obj/item/weapon/storage/verb/quick_empty))
|
||||
src.quick_empty()
|
||||
return
|
||||
|
||||
@@ -216,3 +216,13 @@
|
||||
B.deity_name = "Success"
|
||||
B.icon_state = "greentext"
|
||||
B.item_state = "greentext"
|
||||
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/cutouts
|
||||
name = "Fortified Artistic Box"
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/cutouts/New()
|
||||
..()
|
||||
for(var/i in 1 to 3)
|
||||
new/obj/item/cardboard_cutout/adaptive(src)
|
||||
new/obj/item/toy/crayon/spraycan(src)
|
||||
@@ -118,7 +118,7 @@
|
||||
|
||||
var/mob/living/L = M
|
||||
|
||||
if(user.a_intent != I_HARM)
|
||||
if(user.a_intent != INTENT_HARM)
|
||||
if(status)
|
||||
user.do_attack_animation(L)
|
||||
baton_stun(L, user)
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
return
|
||||
if(!isliving(target))
|
||||
return
|
||||
if(user.a_intent == I_HARM)
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
if(!..()) return
|
||||
if(!isrobot(target)) return
|
||||
else
|
||||
|
||||
@@ -46,6 +46,18 @@
|
||||
/obj/item/stack/sheet/wood,
|
||||
/obj/item/stack/sheet/wood)
|
||||
|
||||
/obj/item/weapon/table_parts/wood/attackby(obj/item/W, mob/user)
|
||||
if(istype(W, /obj/item/stack/tile/carpet))
|
||||
var/target = /obj/item/weapon/table_parts/fancy
|
||||
if(istype(W, /obj/item/stack/tile/carpet/black))
|
||||
target = /obj/item/weapon/table_parts/fancy/black
|
||||
var/obj/item/stack/S = W
|
||||
if(S.use(1))
|
||||
new target(get_turf(src))
|
||||
qdel(src)
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/obj/item/weapon/table_parts/glass
|
||||
name = "glass table parts"
|
||||
desc = "fragile!"
|
||||
@@ -57,6 +69,17 @@
|
||||
/obj/item/stack/sheet/metal,
|
||||
/obj/item/stack/sheet/metal)
|
||||
|
||||
/obj/item/weapon/table_parts/fancy
|
||||
name = "fancy table parts"
|
||||
desc = "Pretty!"
|
||||
icon_state = "fancy_tableparts"
|
||||
result = /obj/structure/table/wood/fancy
|
||||
|
||||
/obj/item/weapon/table_parts/fancy/black
|
||||
name = "black fancy table parts"
|
||||
icon_state = "black_fancy_tableparts"
|
||||
result = /obj/structure/table/wood/fancy/black
|
||||
|
||||
/obj/item/weapon/rack_parts
|
||||
name = "rack parts"
|
||||
desc = "Parts of a rack."
|
||||
|
||||
@@ -128,7 +128,7 @@ Frequency:
|
||||
if(turfs.len)
|
||||
L["None (Dangerous)"] = pick(turfs)
|
||||
var/t1 = input(user, "Please select a teleporter to lock in on.", "Hand Teleporter") as null|anything in L
|
||||
if(!t1 || (user.get_active_hand() != src || user.stat || user.restrained()))
|
||||
if(!t1 || (user.is_in_active_hand(src) || user.stat || user.restrained()))
|
||||
return
|
||||
if(active_portals >= 3)
|
||||
user.show_message("<span class='notice'>\The [src] is recharging!</span>")
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
src.pixel_y = rand(0, 16)
|
||||
|
||||
/obj/item/weapon/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user)
|
||||
if(!istype(M) || user.a_intent == I_HELP)
|
||||
if(!istype(M) || user.a_intent == INTENT_HELP)
|
||||
return ..()
|
||||
if(user.zone_sel.selecting != "eyes" && user.zone_sel.selecting != "head")
|
||||
return ..()
|
||||
@@ -241,8 +241,7 @@
|
||||
/obj/item/weapon/wirecutters/attack(mob/living/carbon/C, mob/user)
|
||||
if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
|
||||
user.visible_message("<span class='notice'>[user] cuts [C]'s restraints with [src]!</span>")
|
||||
qdel(C.handcuffed)
|
||||
C.handcuffed = null
|
||||
QDEL_NULL(C.handcuffed)
|
||||
if(C.buckled && C.buckled.buckle_requires_restraints)
|
||||
C.buckled.unbuckle_mob(C)
|
||||
C.update_handcuffed()
|
||||
@@ -404,7 +403,7 @@
|
||||
if(!S)
|
||||
return
|
||||
|
||||
if(!(S.status & ORGAN_ROBOT) || user.a_intent != I_HELP || S.open == 2)
|
||||
if(!(S.status & ORGAN_ROBOT) || user.a_intent != INTENT_HELP || S.open == 2)
|
||||
return ..()
|
||||
|
||||
if(!isOn()) //why wasn't this being checked already?
|
||||
|
||||
@@ -1,10 +1,3 @@
|
||||
/////////////////
|
||||
// NEW DEFINES //
|
||||
/////////////////
|
||||
|
||||
/client
|
||||
var/viewingCanvas = 0 //If this is 1, as soon as client /TRIES/ to move the view resets.
|
||||
|
||||
///////////
|
||||
// EASEL //
|
||||
///////////
|
||||
@@ -140,20 +133,4 @@ var/global/list/globalBlankCanvases[AMT_OF_CANVASES]
|
||||
icon = blank
|
||||
user.visible_message("<span class='notice'>[user] cleans the canvas.</span>","<span class='notice'>You clean the canvas.</span>")
|
||||
|
||||
//Examine to enlarge
|
||||
/obj/item/weapon/canvas/examine(mob/user)
|
||||
..(user)
|
||||
if(in_range(user, src) && get_turf(src) && user.client && ishuman(user)) //Let only humans be the robust zoominators. I'm too spooked other mobs trying to use it may get broken huds.
|
||||
if(src.loc == user || get_turf(src) == get_turf(user))
|
||||
to_chat(user, "<span class='notice'>[src] has to be on the ground to focus on it!</span>")
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You focus on \the [src].</span>")
|
||||
user.client.screen = list() //This is because screen objects go way past the view bounds we set, therefore not allowing stretch to fit to zoom in properly.
|
||||
user.client.reset_stretch = winget(user.client, "mapwindow.map", "icon-size") //Remember previous icon-size
|
||||
user.client.view = 3 //Decrease view
|
||||
winset(user.client, "mapwindow.map", "icon-size=0") //Enable stretch-to-fit
|
||||
user.client.viewingCanvas = 1 //Reset everything we just changed as soon as client tries to move
|
||||
else
|
||||
to_chat(user, "<span class='notice'>It is too far away.</span>")
|
||||
|
||||
#undef AMT_OF_CANVASES
|
||||
@@ -193,6 +193,9 @@
|
||||
L[tmpname] = R
|
||||
var/desc = input("Please select a telepad.", "RCS") in L
|
||||
E.pad = L[desc]
|
||||
if(!Adjacent(user))
|
||||
to_chat(user, "<span class='notice'>Unable to teleport, too far from crate.</span>")
|
||||
return
|
||||
playsound(E.loc, E.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>Teleporting [name]...</span>")
|
||||
E.teleporting = 1
|
||||
@@ -204,17 +207,22 @@
|
||||
to_chat(user, "<span class='warning'>Error: User located in container--aborting for safety.</span>")
|
||||
playsound(E.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
|
||||
return
|
||||
if(!(E.rcell && E.rcell.use(E.chargecost)))
|
||||
to_chat(user, "<span class='notice'>Unable to teleport, insufficient charge.</span>")
|
||||
return
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
do_teleport(src, E.pad, 0)
|
||||
E.rcell.use(E.chargecost)
|
||||
to_chat(user, "<span class='notice'>Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.</span>")
|
||||
return
|
||||
else
|
||||
E.rand_x = rand(50,200)
|
||||
E.rand_y = rand(50,200)
|
||||
var/L = locate(E.rand_x, E.rand_y, 6)
|
||||
if(!Adjacent(user))
|
||||
to_chat(user, "<span class='notice'>Unable to teleport, too far from crate.</span>")
|
||||
return
|
||||
playsound(E.loc, E.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>Teleporting [name]...</span>")
|
||||
E.teleporting = 1
|
||||
@@ -226,11 +234,13 @@
|
||||
to_chat(user, "<span class='warning'>Error: User located in container--aborting for safety.</span>")
|
||||
playsound(E.loc, 'sound/machines/buzz-sigh.ogg', 50, 1)
|
||||
return
|
||||
if(!(E.rcell && E.rcell.use(E.chargecost)))
|
||||
to_chat(user, "<span class='notice'>Unable to teleport, insufficient charge.</span>")
|
||||
return
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
do_teleport(src, L)
|
||||
E.rcell.use(E.chargecost)
|
||||
to_chat(user, "<span class='notice'>Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.</span>")
|
||||
return
|
||||
else
|
||||
|
||||
@@ -15,6 +15,9 @@
|
||||
new /obj/item/clothing/shoes/black(src)
|
||||
new /obj/item/clothing/suit/hooded/nun(src)
|
||||
new /obj/item/clothing/suit/hooded/chaplain_hoodie(src)
|
||||
new /obj/item/clothing/suit/hooded/monk(src)
|
||||
new /obj/item/clothing/suit/witchhunter(src)
|
||||
new /obj/item/clothing/head/witchhunter_hat(src)
|
||||
new /obj/item/clothing/suit/holidaypriest(src)
|
||||
new /obj/item/clothing/under/wedding/bride_white(src)
|
||||
new /obj/item/weapon/storage/backpack/cultpack (src)
|
||||
|
||||
@@ -327,7 +327,7 @@
|
||||
new /obj/item/clothing/suit/storage/det_suit(src)
|
||||
new /obj/item/clothing/suit/storage/det_suit/forensics/blue(src)
|
||||
new /obj/item/clothing/suit/storage/det_suit/forensics/red(src)
|
||||
new /obj/item/clothing/gloves/color/black(src)
|
||||
new /obj/item/clothing/gloves/color/black/forensics(src)
|
||||
new /obj/item/clothing/head/det_hat(src)
|
||||
new /obj/item/clothing/shoes/brown(src)
|
||||
new /obj/item/weapon/storage/box/evidence(src)
|
||||
|
||||
@@ -102,6 +102,9 @@
|
||||
L[tmpname] = R
|
||||
var/desc = input("Please select a telepad.", "RCS") in L
|
||||
E.pad = L[desc]
|
||||
if(!Adjacent(user))
|
||||
to_chat(user, "<span class='notice'>Unable to teleport, too far from crate.</span>")
|
||||
return
|
||||
playsound(E.loc, E.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>Teleporting [src.name]...</span>")
|
||||
E.teleporting = 1
|
||||
@@ -109,17 +112,23 @@
|
||||
E.teleporting = 0
|
||||
return
|
||||
E.teleporting = 0
|
||||
if(!(E.rcell && E.rcell.use(E.chargecost)))
|
||||
to_chat(user, "<span class='notice'>Unable to teleport, insufficient charge.</span>")
|
||||
return
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
do_teleport(src, E.pad, 0)
|
||||
E.rcell.use(E.chargecost)
|
||||
to_chat(user, "<span class='notice'>Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.</span>")
|
||||
return
|
||||
|
||||
else
|
||||
E.rand_x = rand(50,200)
|
||||
E.rand_y = rand(50,200)
|
||||
var/L = locate(E.rand_x, E.rand_y, 6)
|
||||
if(!Adjacent(user))
|
||||
to_chat(user, "<span class='notice'>Unable to teleport, too far from crate.</span>")
|
||||
return
|
||||
playsound(E.loc, E.usesound, 50, 1)
|
||||
to_chat(user, "<span class='notice'>Teleporting [src.name]...</span>")
|
||||
E.teleporting = 1
|
||||
@@ -127,11 +136,13 @@
|
||||
E.teleporting = 0
|
||||
return
|
||||
E.teleporting = 0
|
||||
if(!(E.rcell && E.rcell.use(E.chargecost)))
|
||||
to_chat(user, "<span class='notice'>Unable to teleport, insufficient charge.</span>")
|
||||
return
|
||||
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
|
||||
s.set_up(5, 1, src)
|
||||
s.start()
|
||||
do_teleport(src, L)
|
||||
E.rcell.use(E.chargecost)
|
||||
to_chat(user, "<span class='notice'>Teleport successful. [round(E.rcell.charge/E.chargecost)] charge\s left.</span>")
|
||||
return
|
||||
else
|
||||
|
||||
@@ -35,6 +35,44 @@
|
||||
icon_state = "open"
|
||||
layer = SHOWER_OPEN_LAYER
|
||||
|
||||
/obj/structure/curtain/attackby(obj/item/W, mob/user)
|
||||
if(istype(W, /obj/item/toy/crayon))
|
||||
color = input(user, "Choose Color") as color
|
||||
else if(isscrewdriver(W))
|
||||
if(anchored)
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("<span class='warning'>[user] unscrews [src] from the floor.</span>", "<span class='notice'>You start to unscrew [src] from the floor...</span>", "You hear rustling noises.")
|
||||
if(do_after(user, 50 * W.toolspeed, target = src))
|
||||
if(!anchored)
|
||||
return
|
||||
anchored = FALSE
|
||||
to_chat(user, "<span class='notice'>You unscrew [src] from the floor.</span>")
|
||||
else
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("<span class='warning'>[user] screws [src] to the floor.</span>", "<span class='notice'>You start to screw [src] to the floor...</span>", "You hear rustling noises.")
|
||||
if(do_after(user, 50 * W.toolspeed, target = src))
|
||||
if(anchored)
|
||||
return
|
||||
anchored = TRUE
|
||||
to_chat(user, "<span class='notice'>You screw [src] to the floor.</span>")
|
||||
else if(istype(W, /obj/item/weapon/wirecutters))
|
||||
if(!anchored)
|
||||
playsound(loc, W.usesound, 100, 1)
|
||||
user.visible_message("<span class='warning'>[user] cuts apart [src].</span>", "<span class='notice'>You start to cut apart [src].</span>", "You hear cutting.")
|
||||
if(do_after(user, 50 * W.toolspeed, target = src))
|
||||
if(anchored)
|
||||
return
|
||||
to_chat(user, "<span class='notice'>You cut apart [src].</span>")
|
||||
deconstruct()
|
||||
else
|
||||
. = ..()
|
||||
|
||||
/obj/structure/curtain/proc/deconstruct(disassembled = TRUE)
|
||||
new /obj/item/stack/sheet/cloth(loc, 2)
|
||||
new /obj/item/stack/sheet/plastic(loc, 2)
|
||||
new /obj/item/stack/rods(loc, 1)
|
||||
qdel(src)
|
||||
|
||||
/obj/structure/curtain/black
|
||||
name = "black curtain"
|
||||
color = "#222222"
|
||||
@@ -59,4 +97,4 @@
|
||||
color = "#000066"
|
||||
|
||||
#undef SHOWER_OPEN_LAYER
|
||||
#undef SHOWER_CLOSED_LAYER
|
||||
#undef SHOWER_CLOSED_LAYER
|
||||
|
||||
@@ -105,19 +105,21 @@ var/global/list/captain_display_cases = list()
|
||||
var/ue = null
|
||||
var/image/occupant_overlay = null
|
||||
var/obj/item/weapon/airlock_electronics/circuit
|
||||
var/start_showpiece_type = null //add type for items on display
|
||||
|
||||
/obj/structure/displaycase/New()
|
||||
. = ..()
|
||||
if(start_showpiece_type)
|
||||
occupant = new start_showpiece_type(src)
|
||||
update_icon()
|
||||
|
||||
/obj/structure/displaycase/captains_laser
|
||||
name = "captain's display case"
|
||||
desc = "A display case for the captain's antique laser gun. Hooked up with an anti-theft system."
|
||||
burglar_alarm = 1
|
||||
|
||||
/obj/structure/displaycase/captains_laser/New()
|
||||
captain_display_cases += src
|
||||
req_access = list(access_captain)
|
||||
burglar_alarm = 1
|
||||
locked = 1
|
||||
spawn(5)
|
||||
occupant = new /obj/item/weapon/gun/energy/laser/captain(src)
|
||||
update_icon()
|
||||
req_access = list(access_captain)
|
||||
start_showpiece_type = /obj/item/weapon/gun/energy/laser/captain
|
||||
|
||||
/obj/structure/displaycase/Destroy()
|
||||
dump()
|
||||
@@ -259,7 +261,7 @@ var/global/list/captain_display_cases = list()
|
||||
if(W.flags & ABSTRACT)
|
||||
to_chat(user, "<span class='danger'>You can't put this into the case.</span>")
|
||||
return
|
||||
if(user.a_intent == I_HARM)
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
if(locked && !destroyed)
|
||||
src.health -= W.force
|
||||
src.healthcheck()
|
||||
@@ -283,14 +285,14 @@ var/global/list/captain_display_cases = list()
|
||||
update_icon()
|
||||
|
||||
/obj/structure/displaycase/attack_hand(mob/user as mob)
|
||||
if(destroyed || (!locked && user.a_intent == I_HARM))
|
||||
if(destroyed || (!locked && user.a_intent == INTENT_HARM))
|
||||
if(occupant)
|
||||
dump()
|
||||
to_chat(user, "<span class='danger'>You smash your fist into the delicate electronics at the bottom of the case, and deactivate the hover field.</span>")
|
||||
src.add_fingerprint(user)
|
||||
update_icon()
|
||||
else
|
||||
if(user.a_intent == I_HARM)
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.do_attack_animation(src)
|
||||
user.visible_message("<span class='danger'>[user.name] kicks \the [src]!</span>", \
|
||||
@@ -317,8 +319,9 @@ var/global/list/captain_display_cases = list()
|
||||
else
|
||||
to_chat(src, "[bicon(src)] <span class='warning'>\The [src] is empty!</span>")
|
||||
else
|
||||
user.visible_message("[user.name] gently runs his hands over \the [src] in appreciation of its contents.", \
|
||||
"You gently run your hands over \the [src] in appreciation of its contents.", \
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
user.visible_message("[user.name] gently runs \his hands over [src] in appreciation of its contents.", \
|
||||
"You gently run your hands over [src] in appreciation of its contents.", \
|
||||
"You hear someone streaking glass with their greasy hands.")
|
||||
|
||||
#undef DISPLAYCASE_FRAME_CIRCUIT
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
if(do_after(user, digTool.digspeed * hardness, target = src) && src)
|
||||
to_chat(user, "<span class='notice'>You finished digging.</span>")
|
||||
deconstruct(TRUE)
|
||||
else if(user.a_intent != I_HARM)
|
||||
else if(user.a_intent != INTENT_HARM)
|
||||
attack_hand(user)
|
||||
else
|
||||
attacked_by(W, user)
|
||||
|
||||
@@ -102,8 +102,7 @@
|
||||
if(!( A.anchored ))
|
||||
A.forceMove(src)
|
||||
playsound(loc, open_sound, 50, 1)
|
||||
qdel(connected)
|
||||
connected = null
|
||||
QDEL_NULL(connected)
|
||||
else
|
||||
playsound(loc, open_sound, 50, 1)
|
||||
connected = new /obj/structure/m_tray( loc )
|
||||
@@ -118,8 +117,7 @@
|
||||
connected.icon_state = "morguet"
|
||||
connected.dir = dir
|
||||
else
|
||||
qdel(connected)
|
||||
connected = null
|
||||
QDEL_NULL(connected)
|
||||
add_fingerprint(user)
|
||||
update()
|
||||
return
|
||||
@@ -155,8 +153,7 @@
|
||||
A.forceMove(connected.loc)
|
||||
connected.icon_state = "morguet"
|
||||
else
|
||||
qdel(connected)
|
||||
connected = null
|
||||
QDEL_NULL(connected)
|
||||
return
|
||||
|
||||
/obj/structure/morgue/Destroy()
|
||||
@@ -306,8 +303,7 @@
|
||||
if(!( A.anchored ))
|
||||
A.forceMove(src)
|
||||
playsound(loc, open_sound, 50, 1)
|
||||
qdel(connected)
|
||||
connected = null
|
||||
QDEL_NULL(connected)
|
||||
else if(locked == 0)
|
||||
playsound(loc, open_sound, 50, 1)
|
||||
connected = new /obj/structure/c_tray( loc )
|
||||
@@ -321,8 +317,7 @@
|
||||
A.forceMove(connected.loc)
|
||||
connected.icon_state = "cremat"
|
||||
else
|
||||
qdel(connected)
|
||||
connected = null
|
||||
QDEL_NULL(connected)
|
||||
add_fingerprint(user)
|
||||
update()
|
||||
|
||||
@@ -355,8 +350,7 @@
|
||||
A.forceMove(connected.loc)
|
||||
connected.icon_state = "cremat"
|
||||
else
|
||||
qdel(connected)
|
||||
connected = null
|
||||
QDEL_NULL(connected)
|
||||
return
|
||||
|
||||
/obj/structure/crematorium/proc/cremate(mob/user as mob)
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
burntime = 30
|
||||
buildstackamount = 2
|
||||
var/movable = 0 // For mobility checks
|
||||
buckle_offset = -6
|
||||
|
||||
/obj/structure/stool/bed/MouseDrop(atom/over_object)
|
||||
..(over_object, skip_fucking_stool_shit = 1)
|
||||
@@ -36,6 +37,7 @@
|
||||
anchored = 0
|
||||
buildstackamount = 10
|
||||
buildstacktype = /obj/item/stack/sheet/wood
|
||||
buckle_offset = 0
|
||||
|
||||
/obj/structure/stool/bed/dogbed/ian
|
||||
name = "Ian's bed"
|
||||
@@ -139,5 +141,4 @@
|
||||
to_chat(user, "<span class='notice'>You deploy the roller bed.</span>")
|
||||
var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc)
|
||||
R.add_fingerprint(user)
|
||||
qdel(held)
|
||||
held = null
|
||||
QDEL_NULL(held)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
buckle_lying = 0 //you sit in a chair, not lay
|
||||
burn_state = FIRE_PROOF
|
||||
buildstackamount = 1
|
||||
|
||||
buckle_offset = 0
|
||||
var/propelled = 0 // Check for fire-extinguisher-driven chairs
|
||||
|
||||
/obj/structure/stool/bed/chair/New()
|
||||
|
||||
@@ -412,6 +412,35 @@
|
||||
/obj/structure/table/woodentable/poker/narsie_act()
|
||||
return
|
||||
|
||||
/*
|
||||
* Fancy Tables
|
||||
*/
|
||||
|
||||
/obj/structure/table/wood/fancy
|
||||
name = "fancy table"
|
||||
desc = "A standard metal table frame covered with an amazingly fancy, patterned cloth."
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
icon_state = "fancy_table"
|
||||
parts = /obj/item/weapon/table_parts/fancy
|
||||
canSmoothWith = list(/obj/structure/table/wood/fancy, /obj/structure/table/wood/fancy/black)
|
||||
|
||||
/obj/structure/table/wood/fancy/New()
|
||||
icon = 'icons/obj/smooth_structures/fancy_table.dmi' //so that the tables place correctly in the map editor
|
||||
..()
|
||||
|
||||
/obj/structure/table/wood/fancy/black
|
||||
icon_state = "fancy_table_black"
|
||||
parts = /obj/item/weapon/table_parts/fancy/black
|
||||
|
||||
/obj/structure/table/wood/fancy/black/New()
|
||||
..()
|
||||
icon = 'icons/obj/smooth_structures/fancy_table_black.dmi' //so that the tables place correctly in the map editor
|
||||
|
||||
|
||||
/*
|
||||
* Glass Tables
|
||||
*/
|
||||
|
||||
/obj/structure/glasstable_frame
|
||||
name = "glass table frame"
|
||||
desc = "A metal frame for a glass table."
|
||||
|
||||
@@ -120,6 +120,15 @@
|
||||
to_chat(user, "<span class='notice'>You carefully place [I] into the cistern.</span>")
|
||||
return
|
||||
|
||||
/obj/structure/toilet/secret
|
||||
var/secret_type = null
|
||||
|
||||
/obj/structure/toilet/secret/New()
|
||||
. = ..()
|
||||
if(secret_type)
|
||||
var/obj/item/secret = new secret_type(src)
|
||||
secret.desc += " It's a secret!"
|
||||
w_items += secret.w_class
|
||||
|
||||
|
||||
/obj/structure/urinal
|
||||
|
||||
@@ -247,6 +247,9 @@ obj/structure/windoor_assembly/Destroy()
|
||||
if(do_after(user, 40 * W.toolspeed, target = src))
|
||||
|
||||
if(src.loc && src.electronics)
|
||||
for(var/obj/machinery/door/window/WD in loc)
|
||||
if(WD.dir == dir)
|
||||
return
|
||||
|
||||
density = 1 //Shouldn't matter but just incase
|
||||
to_chat(user, "<span class='notice'>You finish the windoor!</span>")
|
||||
|
||||
@@ -133,7 +133,7 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
|
||||
user.say(pick(";RAAAAAAAARGH!", ";HNNNNNNNNNGGGGGGH!", ";GWAAAAAAAARRRHHH!", "NNNNNNNNGGGGGGGGHH!", ";AAAAAAARRRGH!"))
|
||||
user.visible_message("<span class='danger'>[user] smashes through [src]!</span>")
|
||||
destroy()
|
||||
else if(user.a_intent == I_HARM)
|
||||
else if(user.a_intent == INTENT_HARM)
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
playsound(get_turf(src), 'sound/effects/glassknock.ogg', 80, 1)
|
||||
user.visible_message("<span class='warning'>[user.name] bangs against the [src.name]!</span>", \
|
||||
|
||||
Reference in New Issue
Block a user