Merge branch 'master' into PAIN

This commit is contained in:
FlattestGuitar
2017-06-27 21:18:17 +02:00
318 changed files with 3227 additions and 1101 deletions
+1
View File
@@ -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
+1 -2
View File
@@ -440,8 +440,7 @@ steam.start() -- spawns the effect
var/obj/chemholder
Destroy()
qdel(chemholder)
chemholder = null
QDEL_NULL(chemholder)
return ..()
New()
+2
View File
@@ -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)
. = ..()
+7
View File
@@ -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
+27 -4
View File
@@ -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)
+16 -1
View File
@@ -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'
+5
View File
@@ -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//////////
///////////////////////////////
+2 -2
View File
@@ -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"))
+1 -1
View File
@@ -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
+26 -8
View File
@@ -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"
+3 -4
View File
@@ -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
+18 -8
View File
@@ -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
+1 -1
View File
@@ -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!")
+4 -6
View File
@@ -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)
..()
+1 -1
View File
@@ -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
+17 -17
View File
@@ -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>
"}
"}
+2 -3
View File
@@ -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)
+1 -1
View File
@@ -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>")
+3 -4
View File
@@ -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?
-23
View File
@@ -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
+39 -1
View File
@@ -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
+16 -13
View File
@@ -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)
+6 -12
View File
@@ -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>")
+1 -1
View File
@@ -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>", \