diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm
index 054bf07f70..23b398605c 100644
--- a/code/game/machinery/_machinery.dm
+++ b/code/game/machinery/_machinery.dm
@@ -95,6 +95,7 @@ Class Procs:
/obj/machinery
name = "machinery"
icon = 'icons/obj/stationobjs.dmi'
+ desc = "Some kind of machine."
verb_say = "beeps"
verb_yell = "blares"
pressure_resistance = 15
diff --git a/code/game/machinery/embedded_controller/access_controller.dm b/code/game/machinery/embedded_controller/access_controller.dm
index c23f4d0ba8..5e0d018554 100644
--- a/code/game/machinery/embedded_controller/access_controller.dm
+++ b/code/game/machinery/embedded_controller/access_controller.dm
@@ -42,6 +42,7 @@
icon = 'icons/obj/airlock_machines.dmi'
icon_state = "access_button_standby"
name = "access button"
+ desc = "A button used for the explicit purpose of opening an airlock."
var/idDoor
var/obj/machinery/door/airlock/door
var/obj/machinery/doorButtons/airlock_controller/controller
@@ -107,6 +108,7 @@
icon = 'icons/obj/airlock_machines.dmi'
icon_state = "access_control_standby"
name = "access console"
+ desc = "A small console that can cycle opening between two airlocks."
var/obj/machinery/door/airlock/interiorAirlock
var/obj/machinery/door/airlock/exteriorAirlock
var/idInterior
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index a979ba6398..102be57f9b 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -6,6 +6,7 @@
icon = 'icons/obj/power.dmi'
icon_state = "light1"
anchored = TRUE
+ desc = "Make dark."
var/on = TRUE
var/area/area = null
var/otherarea = null
diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm
index 39b3760f7e..cedb94b7b3 100644
--- a/code/game/machinery/pipe/pipe_dispenser.dm
+++ b/code/game/machinery/pipe/pipe_dispenser.dm
@@ -2,6 +2,7 @@
name = "pipe dispenser"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "pipe_d"
+ desc = "Dispenses countless types of pipes. Very useful if you need pipes."
density = TRUE
anchored = TRUE
var/wait = 0
@@ -108,6 +109,7 @@
name = "disposal pipe dispenser"
icon = 'icons/obj/stationobjs.dmi'
icon_state = "pipe_d"
+ desc = "Dispenses pipes that will ultimately be used to move trash around."
density = TRUE
anchored = TRUE
@@ -183,6 +185,7 @@ Nah
icon = 'icons/obj/stationobjs.dmi'
icon_state = "pipe_d"
density = TRUE
+ desc = "Dispenses pipes that will move beings around."
anchored = TRUE
/obj/machinery/pipedispenser/disposal/transit_tube/attack_hand(mob/user)
diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm
index b84de7cf18..e9f0f76bc9 100644
--- a/code/game/machinery/porta_turret/portable_turret.dm
+++ b/code/game/machinery/porta_turret/portable_turret.dm
@@ -12,6 +12,7 @@
layer = OBJ_LAYER
invisibility = INVISIBILITY_OBSERVER //the turret is invisible if it's inside its cover
density = TRUE
+ desc = "A covered turret that shoots at its enemies."
use_power = IDLE_POWER_USE //this turret uses and requires power
idle_power_usage = 50 //when inactive, this turret takes up constant 50 Equipment power
active_power_usage = 300 //when active, this turret takes up constant 300 Equipment power
@@ -552,6 +553,7 @@
base_icon_state = "syndie"
faction = "syndicate"
emp_vunerable = 0
+ desc = "A ballistic machine gun auto-turret."
/obj/machinery/porta_turret/syndicate/energy
icon_state = "standard_stun"
@@ -560,6 +562,7 @@
stun_projectile_sound = 'sound/weapons/taser.ogg'
lethal_projectile = /obj/item/projectile/beam/laser/heavylaser
lethal_projectile_sound = 'sound/weapons/lasercannonfire.ogg'
+ desc = "An energy blaster auto-turret."
/obj/machinery/porta_turret/syndicate/setup()
return
diff --git a/code/game/machinery/porta_turret/portable_turret_construct.dm b/code/game/machinery/porta_turret/portable_turret_construct.dm
index 1dbdc52b1e..7eace08636 100644
--- a/code/game/machinery/porta_turret/portable_turret_construct.dm
+++ b/code/game/machinery/porta_turret/portable_turret_construct.dm
@@ -12,6 +12,7 @@
name = "turret frame"
icon = 'icons/obj/turrets.dmi'
icon_state = "turret_frame"
+ desc = "An unfinished covered turret frame."
density = TRUE
var/build_step = PTURRET_UNSECURED //the current step in the building process
var/finish_name = "turret" //the name applied to the product turret
diff --git a/code/game/machinery/telecomms/computers/logbrowser.dm b/code/game/machinery/telecomms/computers/logbrowser.dm
index 92a4edfcd2..590c8d03a5 100644
--- a/code/game/machinery/telecomms/computers/logbrowser.dm
+++ b/code/game/machinery/telecomms/computers/logbrowser.dm
@@ -3,6 +3,7 @@
/obj/machinery/computer/telecomms/server
name = "telecommunications server monitoring console"
icon_screen = "comm_logs"
+ desc = "Has full access to all details and record of the telecommunications network it's monitoring."
var/screen = 0 // the screen number:
var/list/servers = list() // the servers located by the computer
diff --git a/code/game/machinery/telecomms/computers/telemonitor.dm b/code/game/machinery/telecomms/computers/telemonitor.dm
index bccbfd96fd..cb3ae78e72 100644
--- a/code/game/machinery/telecomms/computers/telemonitor.dm
+++ b/code/game/machinery/telecomms/computers/telemonitor.dm
@@ -8,6 +8,7 @@
/obj/machinery/computer/telecomms/monitor
name = "telecommunications monitoring console"
icon_screen = "comm_monitor"
+ desc = "Monitors the details of the telecommunications network it's synced with."
var/screen = 0 // the screen number:
var/list/machinelist = list() // the machines located by the computer
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 0f59d00ab8..83d29457f6 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -4,6 +4,7 @@
suffix = "\[3\]"
icon_state = "walkietalkie"
item_state = "walkietalkie"
+ desc = "A basic handheld radio that communicates with local telecommunication networks."
dog_fashion = /datum/dog_fashion/back
var/on = TRUE // 0 for off
var/last_transmission
diff --git a/code/game/objects/items/shooting_range.dm b/code/game/objects/items/shooting_range.dm
index 28d4d13967..c8249024f8 100644
--- a/code/game/objects/items/shooting_range.dm
+++ b/code/game/objects/items/shooting_range.dm
@@ -41,7 +41,7 @@
/obj/item/target/syndicate
icon_state = "target_s"
- desc = "A shooting target that looks like a syndicate scum."
+ desc = "A shooting target that looks like syndicate scum."
hp = 2600
/obj/item/target/alien
diff --git a/code/game/objects/items/signs.dm b/code/game/objects/items/signs.dm
index c492b752f0..350daa0fc3 100644
--- a/code/game/objects/items/signs.dm
+++ b/code/game/objects/items/signs.dm
@@ -1,7 +1,7 @@
/obj/item/picket_sign
icon_state = "picket"
name = "blank picket sign"
- desc = "It's blank"
+ desc = "It's blank."
force = 5
w_class = WEIGHT_CLASS_BULKY
attack_verb = list("bashed","smacked")
diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm
index b5417e8f8e..435bc64c41 100644
--- a/code/game/objects/items/storage/fancy.dm
+++ b/code/game/objects/items/storage/fancy.dm
@@ -17,6 +17,7 @@
icon = 'icons/obj/food/containers.dmi'
icon_state = "donutbox6"
name = "donut box"
+ desc = "Mmm. Donuts."
resistance_flags = FLAMMABLE
var/icon_type = "donut"
var/spawn_type = null
diff --git a/code/game/objects/items/storage/secure.dm b/code/game/objects/items/storage/secure.dm
index ef65f2dac3..4d56b6a8e8 100644
--- a/code/game/objects/items/storage/secure.dm
+++ b/code/game/objects/items/storage/secure.dm
@@ -25,6 +25,7 @@
w_class = WEIGHT_CLASS_NORMAL
max_w_class = WEIGHT_CLASS_SMALL
max_combined_w_class = 14
+ desc = "This shouldn't exist. If it does, create an issue report."
/obj/item/storage/secure/examine(mob/user)
..()
@@ -177,6 +178,7 @@
icon_opened = "safe0"
icon_locking = "safeb"
icon_sparking = "safespark"
+ desc = "Excellent for securing things away from grubby hands."
force = 8
w_class = WEIGHT_CLASS_GIGANTIC
max_w_class = 8
diff --git a/code/game/objects/items/vending_items.dm b/code/game/objects/items/vending_items.dm
index b062c39ee5..e84295f8ed 100644
--- a/code/game/objects/items/vending_items.dm
+++ b/code/game/objects/items/vending_items.dm
@@ -5,6 +5,7 @@
icon = 'icons/obj/vending_restock.dmi'
icon_state = "refill_snack"
item_state = "restock_unit"
+ desc = "A vending machine restock cart."
lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
flags_1 = CONDUCT_1
diff --git a/code/game/objects/structures/ai_core.dm b/code/game/objects/structures/ai_core.dm
index 709d86d4d7..d01cd5a191 100644
--- a/code/game/objects/structures/ai_core.dm
+++ b/code/game/objects/structures/ai_core.dm
@@ -4,6 +4,7 @@
name = "\improper AI core"
icon = 'icons/mob/ai.dmi'
icon_state = "0"
+ desc = "The framework for an artificial intelligence core."
max_integrity = 500
var/state = 0
var/datum/ai_laws/laws = new()
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index 9889d07b90..a5173a5f80 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -6,6 +6,7 @@
anchored = FALSE
density = TRUE
max_integrity = 200
+ desc = "The mechanical framework for an airlock."
var/state = 0
var/mineral = null
var/typetext = ""
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index 6aa338f047..c1b6c56bf5 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -6,6 +6,7 @@
//trees
/obj/structure/flora/tree
name = "tree"
+ desc = "A large tree."
density = TRUE
pixel_x = -16
layer = FLY_LAYER
@@ -40,6 +41,7 @@
/obj/structure/flora/tree/pine
name = "pine tree"
+ desc = "A coniferous pine tree."
icon = 'icons/obj/flora/pinetrees.dmi'
icon_state = "pine_1"
@@ -49,6 +51,7 @@
/obj/structure/flora/tree/pine/xmas
name = "xmas tree"
+ desc = "A wondrous decorated Christmas tree."
icon_state = "pine_c"
/obj/structure/flora/tree/pine/xmas/Initialize()
@@ -57,10 +60,12 @@
/obj/structure/flora/tree/dead
icon = 'icons/obj/flora/deadtrees.dmi'
+ desc = "A dead tree. How it died, you know not."
icon_state = "tree_1"
/obj/structure/flora/tree/palm
icon = 'icons/misc/beach2.dmi'
+ desc = "A tree straight from the tropics."
icon_state = "palm1"
/obj/structure/flora/tree/palm/Initialize()
@@ -98,6 +103,7 @@
//grass
/obj/structure/flora/grass
name = "grass"
+ desc = "A patch of overgrown grass."
icon = 'icons/obj/flora/snowflora.dmi'
gender = PLURAL //"this is grass" not "this is a grass"
@@ -127,6 +133,7 @@
//bushes
/obj/structure/flora/bush
name = "bush"
+ desc = "Some type of shrub."
icon = 'icons/obj/flora/snowflora.dmi'
icon_state = "snowbush1"
anchored = TRUE
@@ -139,6 +146,7 @@
/obj/structure/flora/ausbushes
name = "bush"
+ desc = "Some kind of plant."
icon = 'icons/obj/flora/ausflora.dmi'
icon_state = "firstbush_1"
@@ -256,6 +264,7 @@
name = "potted plant"
icon = 'icons/obj/flora/plants.dmi'
icon_state = "plant-01"
+ desc = "A little bit of nature contained in a pot."
layer = ABOVE_MOB_LAYER
w_class = WEIGHT_CLASS_HUGE
force = 10
@@ -365,6 +374,7 @@
/obj/structure/flora/junglebush
name = "bush"
+ desc = "A wild plant that is found in jungles."
icon = 'icons/obj/flora/jungleflora.dmi'
icon_state = "busha"
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 02f6d784df..3d7e9be21a 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -1,6 +1,7 @@
/obj/structure/girder
name = "girder"
icon_state = "girder"
+ desc = "A large structural assembly made out of metal; It requires a layer of metal before it can be considered a wall."
anchored = TRUE
density = TRUE
layer = BELOW_OBJ_LAYER
diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm
index ffc62ac127..1c2c0c326e 100644
--- a/code/game/objects/structures/transit_tubes/station.dm
+++ b/code/game/objects/structures/transit_tubes/station.dm
@@ -7,6 +7,7 @@
/obj/structure/transit_tube/station
name = "station tube station"
icon_state = "closed_station0"
+ desc = "The lynchpin of the transit system."
exit_delay = 1
enter_delay = 2
tube_construction = /obj/structure/c_transit_tube/station
diff --git a/code/game/objects/structures/transit_tubes/transit_tube.dm b/code/game/objects/structures/transit_tubes/transit_tube.dm
index 10d883d392..e409eb533b 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube.dm
@@ -3,6 +3,7 @@
name = "transit tube"
icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi'
icon_state = "straight"
+ desc = "A transit tube for moving things around."
density = TRUE
layer = LOW_ITEM_LAYER
anchored = TRUE
diff --git a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm
index a1f7bcc8de..62e46e49dd 100644
--- a/code/game/objects/structures/transit_tubes/transit_tube_construction.dm
+++ b/code/game/objects/structures/transit_tubes/transit_tube_construction.dm
@@ -1,158 +1,159 @@
-// transit tube construction
-
-// normal transit tubes
-/obj/structure/c_transit_tube
- name = "unattached transit tube"
- icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi'
- icon_state = "straight"
+// transit tube construction
+
+// normal transit tubes
+/obj/structure/c_transit_tube
+ name = "unattached transit tube"
+ icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi'
+ icon_state = "straight"
+ desc = "An unattached segment of transit tube."
density = FALSE
- layer = LOW_ITEM_LAYER //same as the built tube
+ layer = LOW_ITEM_LAYER //same as the built tube
anchored = FALSE
- var/flipped = 0
- var/build_type = /obj/structure/transit_tube
- var/flipped_build_type
- var/base_icon
-
-/obj/structure/c_transit_tube/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to rotate it clockwise.")
-
-/obj/structure/c_transit_tube/proc/tube_rotate()
- setDir(turn(dir, -90))
-
-/obj/structure/c_transit_tube/proc/tube_flip()
- if(flipped_build_type)
- flipped = !flipped
- var/cur_flip = initial(flipped) ? !flipped : flipped
- if(cur_flip)
- build_type = flipped_build_type
- else
- build_type = initial(build_type)
- icon_state = "[base_icon][flipped]"
- else
- setDir(turn(dir, 180))
-
-// disposals-style flip and rotate verbs
-/obj/structure/c_transit_tube/verb/rotate()
- set name = "Rotate Tube"
- set category = "Object"
- set src in view(1)
-
- if(usr.incapacitated())
- return
-
- tube_rotate()
-
-/obj/structure/c_transit_tube/AltClick(mob/user)
- ..()
- if(user.incapacitated())
- to_chat(user, "You can't do that right now!")
- return
- if(!in_range(src, user))
- return
- tube_rotate()
-
-/obj/structure/c_transit_tube/verb/flip()
- set name = "Flip"
- set category = "Object"
- set src in view(1)
-
- if(usr.incapacitated())
- return
- tube_flip()
-
-
-/obj/structure/c_transit_tube/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/wrench))
- to_chat(user, "You start attaching the [name]...")
- add_fingerprint(user)
- playsound(src.loc, I.usesound, 50, 1)
- if(do_after(user, 40*I.toolspeed, target = src))
- if(QDELETED(src))
- return
- to_chat(user, "You attach the [name].")
- var/obj/structure/transit_tube/R = new build_type(loc, dir)
- transfer_fingerprints_to(R)
- qdel(src)
- else
- return ..()
-
-// transit tube station
-/obj/structure/c_transit_tube/station
- name = "unattached through station"
- icon_state = "closed_station0"
- build_type = /obj/structure/transit_tube/station
- flipped_build_type = /obj/structure/transit_tube/station/flipped
- base_icon = "closed_station"
-
-/obj/structure/c_transit_tube/station/flipped
- icon_state = "closed_station1"
- flipped = 1
- build_type = /obj/structure/transit_tube/station/flipped
- flipped_build_type = /obj/structure/transit_tube/station
-
-
-// reverser station, used for the terminus
-/obj/structure/c_transit_tube/station/reverse
- name = "unattached terminus station"
- icon_state = "closed_terminus0"
- build_type = /obj/structure/transit_tube/station/reverse
- flipped_build_type = /obj/structure/transit_tube/station/reverse/flipped
- base_icon = "closed_terminus"
-
-/obj/structure/c_transit_tube/station/reverse/flipped
- icon_state = "closed_terminus1"
- flipped = 1
- build_type = /obj/structure/transit_tube/station/reverse/flipped
- flipped_build_type = /obj/structure/transit_tube/station/reverse
-
-
-/obj/structure/c_transit_tube/crossing
- icon_state = "crossing"
- build_type = /obj/structure/transit_tube/crossing
-
-
-/obj/structure/c_transit_tube/diagonal
- icon_state = "diagonal"
- build_type = /obj/structure/transit_tube/diagonal
-
-/obj/structure/c_transit_tube/diagonal/crossing
- icon_state = "diagonal_crossing"
- build_type = /obj/structure/transit_tube/diagonal/crossing
-
-
-/obj/structure/c_transit_tube/curved
- icon_state = "curved0"
- build_type = /obj/structure/transit_tube/curved
- flipped_build_type = /obj/structure/transit_tube/curved/flipped
- base_icon = "curved"
-
-/obj/structure/c_transit_tube/curved/flipped
- icon_state = "curved1"
- build_type = /obj/structure/transit_tube/curved/flipped
- flipped_build_type = /obj/structure/transit_tube/curved
- flipped = 1
-
-
-/obj/structure/c_transit_tube/junction
- icon_state = "junction0"
- build_type = /obj/structure/transit_tube/junction
- flipped_build_type = /obj/structure/transit_tube/junction/flipped
- base_icon = "junction"
-
-
-/obj/structure/c_transit_tube/junction/flipped
- icon_state = "junction1"
- flipped = 1
- build_type = /obj/structure/transit_tube/junction/flipped
- flipped_build_type = /obj/structure/transit_tube/junction
-
-
-//transit tube pod
-//see station.dm for the logic
-/obj/structure/c_transit_tube_pod
- name = "unattached transit tube pod"
- icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi'
- icon_state = "pod"
+ var/flipped = 0
+ var/build_type = /obj/structure/transit_tube
+ var/flipped_build_type
+ var/base_icon
+
+/obj/structure/c_transit_tube/examine(mob/user)
+ ..()
+ to_chat(user, "Alt-click to rotate it clockwise.")
+
+/obj/structure/c_transit_tube/proc/tube_rotate()
+ setDir(turn(dir, -90))
+
+/obj/structure/c_transit_tube/proc/tube_flip()
+ if(flipped_build_type)
+ flipped = !flipped
+ var/cur_flip = initial(flipped) ? !flipped : flipped
+ if(cur_flip)
+ build_type = flipped_build_type
+ else
+ build_type = initial(build_type)
+ icon_state = "[base_icon][flipped]"
+ else
+ setDir(turn(dir, 180))
+
+// disposals-style flip and rotate verbs
+/obj/structure/c_transit_tube/verb/rotate()
+ set name = "Rotate Tube"
+ set category = "Object"
+ set src in view(1)
+
+ if(usr.incapacitated())
+ return
+
+ tube_rotate()
+
+/obj/structure/c_transit_tube/AltClick(mob/user)
+ ..()
+ if(user.incapacitated())
+ to_chat(user, "You can't do that right now!")
+ return
+ if(!in_range(src, user))
+ return
+ tube_rotate()
+
+/obj/structure/c_transit_tube/verb/flip()
+ set name = "Flip"
+ set category = "Object"
+ set src in view(1)
+
+ if(usr.incapacitated())
+ return
+ tube_flip()
+
+
+/obj/structure/c_transit_tube/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/wrench))
+ to_chat(user, "You start attaching the [name]...")
+ add_fingerprint(user)
+ playsound(src.loc, I.usesound, 50, 1)
+ if(do_after(user, 40*I.toolspeed, target = src))
+ if(QDELETED(src))
+ return
+ to_chat(user, "You attach the [name].")
+ var/obj/structure/transit_tube/R = new build_type(loc, dir)
+ transfer_fingerprints_to(R)
+ qdel(src)
+ else
+ return ..()
+
+// transit tube station
+/obj/structure/c_transit_tube/station
+ name = "unattached through station"
+ icon_state = "closed_station0"
+ build_type = /obj/structure/transit_tube/station
+ flipped_build_type = /obj/structure/transit_tube/station/flipped
+ base_icon = "closed_station"
+
+/obj/structure/c_transit_tube/station/flipped
+ icon_state = "closed_station1"
+ flipped = 1
+ build_type = /obj/structure/transit_tube/station/flipped
+ flipped_build_type = /obj/structure/transit_tube/station
+
+
+// reverser station, used for the terminus
+/obj/structure/c_transit_tube/station/reverse
+ name = "unattached terminus station"
+ icon_state = "closed_terminus0"
+ build_type = /obj/structure/transit_tube/station/reverse
+ flipped_build_type = /obj/structure/transit_tube/station/reverse/flipped
+ base_icon = "closed_terminus"
+
+/obj/structure/c_transit_tube/station/reverse/flipped
+ icon_state = "closed_terminus1"
+ flipped = 1
+ build_type = /obj/structure/transit_tube/station/reverse/flipped
+ flipped_build_type = /obj/structure/transit_tube/station/reverse
+
+
+/obj/structure/c_transit_tube/crossing
+ icon_state = "crossing"
+ build_type = /obj/structure/transit_tube/crossing
+
+
+/obj/structure/c_transit_tube/diagonal
+ icon_state = "diagonal"
+ build_type = /obj/structure/transit_tube/diagonal
+
+/obj/structure/c_transit_tube/diagonal/crossing
+ icon_state = "diagonal_crossing"
+ build_type = /obj/structure/transit_tube/diagonal/crossing
+
+
+/obj/structure/c_transit_tube/curved
+ icon_state = "curved0"
+ build_type = /obj/structure/transit_tube/curved
+ flipped_build_type = /obj/structure/transit_tube/curved/flipped
+ base_icon = "curved"
+
+/obj/structure/c_transit_tube/curved/flipped
+ icon_state = "curved1"
+ build_type = /obj/structure/transit_tube/curved/flipped
+ flipped_build_type = /obj/structure/transit_tube/curved
+ flipped = 1
+
+
+/obj/structure/c_transit_tube/junction
+ icon_state = "junction0"
+ build_type = /obj/structure/transit_tube/junction
+ flipped_build_type = /obj/structure/transit_tube/junction/flipped
+ base_icon = "junction"
+
+
+/obj/structure/c_transit_tube/junction/flipped
+ icon_state = "junction1"
+ flipped = 1
+ build_type = /obj/structure/transit_tube/junction/flipped
+ flipped_build_type = /obj/structure/transit_tube/junction
+
+
+//transit tube pod
+//see station.dm for the logic
+/obj/structure/c_transit_tube_pod
+ name = "unattached transit tube pod"
+ icon = 'icons/obj/atmospherics/pipes/transit_tube.dmi'
+ icon_state = "pod"
anchored = FALSE
density = FALSE
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 6503acf6d3..c4a0d48dde 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -1,370 +1,371 @@
-/* Windoor (window door) assembly -Nodrak
- * Step 1: Create a windoor out of rglass
- * Step 2: Add r-glass to the assembly to make a secure windoor (Optional)
- * Step 3: Rotate or Flip the assembly to face and open the way you want
- * Step 4: Wrench the assembly in place
- * Step 5: Add cables to the assembly
- * Step 6: Set access for the door.
- * Step 7: Screwdriver the door to complete
- */
-
-
-/obj/structure/windoor_assembly
- icon = 'icons/obj/doors/windoor.dmi'
-
- name = "windoor Assembly"
- icon_state = "l_windoor_assembly01"
+/* Windoor (window door) assembly -Nodrak
+ * Step 1: Create a windoor out of rglass
+ * Step 2: Add r-glass to the assembly to make a secure windoor (Optional)
+ * Step 3: Rotate or Flip the assembly to face and open the way you want
+ * Step 4: Wrench the assembly in place
+ * Step 5: Add cables to the assembly
+ * Step 6: Set access for the door.
+ * Step 7: Screwdriver the door to complete
+ */
+
+
+/obj/structure/windoor_assembly
+ icon = 'icons/obj/doors/windoor.dmi'
+
+ name = "windoor Assembly"
+ icon_state = "l_windoor_assembly01"
+ desc = "A small glass and wire assembly for windoors."
anchored = FALSE
density = FALSE
- dir = NORTH
-
- var/ini_dir
- var/obj/item/electronics/airlock/electronics = null
- var/created_name = null
-
- //Vars to help with the icon's name
- var/facing = "l" //Does the windoor open to the left or right?
+ dir = NORTH
+
+ var/ini_dir
+ var/obj/item/electronics/airlock/electronics = null
+ var/created_name = null
+
+ //Vars to help with the icon's name
+ var/facing = "l" //Does the windoor open to the left or right?
var/secure = FALSE //Whether or not this creates a secure windoor
- var/state = "01" //How far the door assembly has progressed
- CanAtmosPass = ATMOS_PASS_PROC
-
-/obj/structure/windoor_assembly/examine(mob/user)
- ..()
- to_chat(user, "Alt-click to rotate it clockwise.")
-
-/obj/structure/windoor_assembly/New(loc, set_dir)
- ..()
- if(set_dir)
- dir = set_dir
- ini_dir = dir
- air_update_turf(1)
-
-/obj/structure/windoor_assembly/Destroy()
+ var/state = "01" //How far the door assembly has progressed
+ CanAtmosPass = ATMOS_PASS_PROC
+
+/obj/structure/windoor_assembly/examine(mob/user)
+ ..()
+ to_chat(user, "Alt-click to rotate it clockwise.")
+
+/obj/structure/windoor_assembly/New(loc, set_dir)
+ ..()
+ if(set_dir)
+ dir = set_dir
+ ini_dir = dir
+ air_update_turf(1)
+
+/obj/structure/windoor_assembly/Destroy()
density = FALSE
- air_update_turf(1)
- return ..()
-
-/obj/structure/windoor_assembly/Move()
- var/turf/T = loc
- ..()
- setDir(ini_dir)
- move_update_air(T)
-
-/obj/structure/windoor_assembly/update_icon()
- icon_state = "[facing]_[secure ? "secure_" : ""]windoor_assembly[state]"
-
+ air_update_turf(1)
+ return ..()
+
+/obj/structure/windoor_assembly/Move()
+ var/turf/T = loc
+ ..()
+ setDir(ini_dir)
+ move_update_air(T)
+
+/obj/structure/windoor_assembly/update_icon()
+ icon_state = "[facing]_[secure ? "secure_" : ""]windoor_assembly[state]"
+
/obj/structure/windoor_assembly/CanPass(atom/movable/mover, turf/target)
- if(istype(mover) && mover.checkpass(PASSGLASS))
- return 1
- if(get_dir(loc, target) == dir) //Make sure looking at appropriate border
- return !density
- if(istype(mover, /obj/structure/window))
- var/obj/structure/window/W = mover
- if(!valid_window_location(loc, W.ini_dir))
- return FALSE
- else if(istype(mover, /obj/structure/windoor_assembly))
- var/obj/structure/windoor_assembly/W = mover
- if(!valid_window_location(loc, W.ini_dir))
- return FALSE
- else if(istype(mover, /obj/machinery/door/window) && !valid_window_location(loc, mover.dir))
- return FALSE
- return 1
-
-/obj/structure/windoor_assembly/CanAtmosPass(turf/T)
- if(get_dir(loc, T) == dir)
- return !density
- else
- return 1
-
-/obj/structure/windoor_assembly/CheckExit(atom/movable/mover as mob|obj, turf/target)
- if(istype(mover) && mover.checkpass(PASSGLASS))
- return 1
- if(get_dir(loc, target) == dir)
- return !density
- else
- return 1
-
-
-/obj/structure/windoor_assembly/attackby(obj/item/W, mob/user, params)
- //I really should have spread this out across more states but thin little windoors are hard to sprite.
- add_fingerprint(user)
- switch(state)
- if("01")
- if(istype(W, /obj/item/weldingtool) && !anchored )
- var/obj/item/weldingtool/WT = W
- if (WT.remove_fuel(0,user))
- user.visible_message("[user] disassembles the windoor assembly.", "You start to disassemble the windoor assembly...")
- playsound(loc, 'sound/items/welder2.ogg', 50, 1)
-
- if(do_after(user, 40*W.toolspeed, target = src))
- if(!src || !WT.isOn()) return
- to_chat(user, "You disassemble the windoor assembly.")
- var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5)
- RG.add_fingerprint(user)
- if(secure)
- var/obj/item/stack/rods/R = new (get_turf(src), 4)
- R.add_fingerprint(user)
- qdel(src)
- else
- return
-
- //Wrenching an unsecure assembly anchors it in place. Step 4 complete
- if(istype(W, /obj/item/wrench) && !anchored)
- for(var/obj/machinery/door/window/WD in loc)
- if(WD.dir == dir)
- to_chat(user, "There is already a windoor in that location!")
- return
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor...")
-
- if(do_after(user, 40*W.toolspeed, target = src))
- if(!src || anchored)
- return
- for(var/obj/machinery/door/window/WD in loc)
- if(WD.dir == dir)
- to_chat(user, "There is already a windoor in that location!")
- return
- to_chat(user, "You secure the windoor assembly.")
+ if(istype(mover) && mover.checkpass(PASSGLASS))
+ return 1
+ if(get_dir(loc, target) == dir) //Make sure looking at appropriate border
+ return !density
+ if(istype(mover, /obj/structure/window))
+ var/obj/structure/window/W = mover
+ if(!valid_window_location(loc, W.ini_dir))
+ return FALSE
+ else if(istype(mover, /obj/structure/windoor_assembly))
+ var/obj/structure/windoor_assembly/W = mover
+ if(!valid_window_location(loc, W.ini_dir))
+ return FALSE
+ else if(istype(mover, /obj/machinery/door/window) && !valid_window_location(loc, mover.dir))
+ return FALSE
+ return 1
+
+/obj/structure/windoor_assembly/CanAtmosPass(turf/T)
+ if(get_dir(loc, T) == dir)
+ return !density
+ else
+ return 1
+
+/obj/structure/windoor_assembly/CheckExit(atom/movable/mover as mob|obj, turf/target)
+ if(istype(mover) && mover.checkpass(PASSGLASS))
+ return 1
+ if(get_dir(loc, target) == dir)
+ return !density
+ else
+ return 1
+
+
+/obj/structure/windoor_assembly/attackby(obj/item/W, mob/user, params)
+ //I really should have spread this out across more states but thin little windoors are hard to sprite.
+ add_fingerprint(user)
+ switch(state)
+ if("01")
+ if(istype(W, /obj/item/weldingtool) && !anchored )
+ var/obj/item/weldingtool/WT = W
+ if (WT.remove_fuel(0,user))
+ user.visible_message("[user] disassembles the windoor assembly.", "You start to disassemble the windoor assembly...")
+ playsound(loc, 'sound/items/welder2.ogg', 50, 1)
+
+ if(do_after(user, 40*W.toolspeed, target = src))
+ if(!src || !WT.isOn()) return
+ to_chat(user, "You disassemble the windoor assembly.")
+ var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5)
+ RG.add_fingerprint(user)
+ if(secure)
+ var/obj/item/stack/rods/R = new (get_turf(src), 4)
+ R.add_fingerprint(user)
+ qdel(src)
+ else
+ return
+
+ //Wrenching an unsecure assembly anchors it in place. Step 4 complete
+ if(istype(W, /obj/item/wrench) && !anchored)
+ for(var/obj/machinery/door/window/WD in loc)
+ if(WD.dir == dir)
+ to_chat(user, "There is already a windoor in that location!")
+ return
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor...")
+
+ if(do_after(user, 40*W.toolspeed, target = src))
+ if(!src || anchored)
+ return
+ for(var/obj/machinery/door/window/WD in loc)
+ if(WD.dir == dir)
+ to_chat(user, "There is already a windoor in that location!")
+ return
+ to_chat(user, "You secure the windoor assembly.")
anchored = TRUE
- if(secure)
- name = "secure anchored windoor assembly"
- else
- name = "anchored windoor assembly"
-
- //Unwrenching an unsecure assembly un-anchors it. Step 4 undone
- else if(istype(W, /obj/item/wrench) && anchored)
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor...")
-
- if(do_after(user, 40*W.toolspeed, target = src))
- if(!src || !anchored)
- return
- to_chat(user, "You unsecure the windoor assembly.")
+ if(secure)
+ name = "secure anchored windoor assembly"
+ else
+ name = "anchored windoor assembly"
+
+ //Unwrenching an unsecure assembly un-anchors it. Step 4 undone
+ else if(istype(W, /obj/item/wrench) && anchored)
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor...")
+
+ if(do_after(user, 40*W.toolspeed, target = src))
+ if(!src || !anchored)
+ return
+ to_chat(user, "You unsecure the windoor assembly.")
anchored = FALSE
- if(secure)
- name = "secure windoor assembly"
- else
- name = "windoor assembly"
-
- //Adding plasteel makes the assembly a secure windoor assembly. Step 2 (optional) complete.
- else if(istype(W, /obj/item/stack/sheet/plasteel) && !secure)
- var/obj/item/stack/sheet/plasteel/P = W
- if(P.get_amount() < 2)
- to_chat(user, "You need more plasteel to do this!")
- return
- to_chat(user, "You start to reinforce the windoor with plasteel...")
-
- if(do_after(user,40, target = src))
- if(!src || secure || P.get_amount() < 2)
- return
-
- P.use(2)
- to_chat(user, "You reinforce the windoor.")
+ if(secure)
+ name = "secure windoor assembly"
+ else
+ name = "windoor assembly"
+
+ //Adding plasteel makes the assembly a secure windoor assembly. Step 2 (optional) complete.
+ else if(istype(W, /obj/item/stack/sheet/plasteel) && !secure)
+ var/obj/item/stack/sheet/plasteel/P = W
+ if(P.get_amount() < 2)
+ to_chat(user, "You need more plasteel to do this!")
+ return
+ to_chat(user, "You start to reinforce the windoor with plasteel...")
+
+ if(do_after(user,40, target = src))
+ if(!src || secure || P.get_amount() < 2)
+ return
+
+ P.use(2)
+ to_chat(user, "You reinforce the windoor.")
secure = TRUE
- if(anchored)
- name = "secure anchored windoor assembly"
- else
- name = "secure windoor assembly"
-
- //Adding cable to the assembly. Step 5 complete.
- else if(istype(W, /obj/item/stack/cable_coil) && anchored)
- user.visible_message("[user] wires the windoor assembly.", "You start to wire the windoor assembly...")
-
- if(do_after(user, 40, target = src))
- if(!src || !anchored || src.state != "01")
- return
- var/obj/item/stack/cable_coil/CC = W
- if(!CC.use(1))
- to_chat(user, "You need more cable to do this!")
- return
- to_chat(user, "You wire the windoor.")
- state = "02"
- if(secure)
- name = "secure wired windoor assembly"
- else
- name = "wired windoor assembly"
- else
- return ..()
-
- if("02")
-
- //Removing wire from the assembly. Step 5 undone.
- if(istype(W, /obj/item/wirecutters))
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly...")
-
- if(do_after(user, 40*W.toolspeed, target = src))
- if(!src || state != "02")
- return
-
- to_chat(user, "You cut the windoor wires.")
- new/obj/item/stack/cable_coil(get_turf(user), 1)
- state = "01"
- if(secure)
- name = "secure anchored windoor assembly"
- else
- name = "anchored windoor assembly"
-
- //Adding airlock electronics for access. Step 6 complete.
- else if(istype(W, /obj/item/electronics/airlock))
- if(!user.drop_item())
- return
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly...")
- W.loc = src
-
- if(do_after(user, 40, target = src))
- if(!src || electronics)
- W.loc = src.loc
- return
- to_chat(user, "You install the airlock electronics.")
- name = "near finished windoor assembly"
- electronics = W
- else
- W.loc = loc
-
- //Screwdriver to remove airlock electronics. Step 6 undone.
- else if(istype(W, /obj/item/screwdriver))
- if(!electronics)
- return
-
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly...")
-
- if(do_after(user, 40*W.toolspeed, target = src))
- if(!src || !electronics)
- return
- to_chat(user, "You remove the airlock electronics.")
- name = "wired windoor assembly"
- var/obj/item/electronics/airlock/ae
- ae = electronics
- electronics = null
- ae.loc = loc
-
- else if(istype(W, /obj/item/pen))
- var/t = stripped_input(user, "Enter the name for the door.", name, created_name,MAX_NAME_LEN)
- if(!t)
- return
- if(!in_range(src, usr) && loc != usr)
- return
- created_name = t
- return
-
-
-
- //Crowbar to complete the assembly, Step 7 complete.
- else if(istype(W, /obj/item/crowbar))
- if(!electronics)
- to_chat(usr, "The assembly is missing electronics!")
- return
- usr << browse(null, "window=windoor_access")
- playsound(loc, W.usesound, 100, 1)
- user.visible_message("[user] pries the windoor into the frame.", "You start prying the windoor into the frame...")
-
- if(do_after(user, 40*W.toolspeed, target = src))
-
- if(loc && electronics)
-
+ if(anchored)
+ name = "secure anchored windoor assembly"
+ else
+ name = "secure windoor assembly"
+
+ //Adding cable to the assembly. Step 5 complete.
+ else if(istype(W, /obj/item/stack/cable_coil) && anchored)
+ user.visible_message("[user] wires the windoor assembly.", "You start to wire the windoor assembly...")
+
+ if(do_after(user, 40, target = src))
+ if(!src || !anchored || src.state != "01")
+ return
+ var/obj/item/stack/cable_coil/CC = W
+ if(!CC.use(1))
+ to_chat(user, "You need more cable to do this!")
+ return
+ to_chat(user, "You wire the windoor.")
+ state = "02"
+ if(secure)
+ name = "secure wired windoor assembly"
+ else
+ name = "wired windoor assembly"
+ else
+ return ..()
+
+ if("02")
+
+ //Removing wire from the assembly. Step 5 undone.
+ if(istype(W, /obj/item/wirecutters))
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly...")
+
+ if(do_after(user, 40*W.toolspeed, target = src))
+ if(!src || state != "02")
+ return
+
+ to_chat(user, "You cut the windoor wires.")
+ new/obj/item/stack/cable_coil(get_turf(user), 1)
+ state = "01"
+ if(secure)
+ name = "secure anchored windoor assembly"
+ else
+ name = "anchored windoor assembly"
+
+ //Adding airlock electronics for access. Step 6 complete.
+ else if(istype(W, /obj/item/electronics/airlock))
+ if(!user.drop_item())
+ return
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly...")
+ W.loc = src
+
+ if(do_after(user, 40, target = src))
+ if(!src || electronics)
+ W.loc = src.loc
+ return
+ to_chat(user, "You install the airlock electronics.")
+ name = "near finished windoor assembly"
+ electronics = W
+ else
+ W.loc = loc
+
+ //Screwdriver to remove airlock electronics. Step 6 undone.
+ else if(istype(W, /obj/item/screwdriver))
+ if(!electronics)
+ return
+
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly...")
+
+ if(do_after(user, 40*W.toolspeed, target = src))
+ if(!src || !electronics)
+ return
+ to_chat(user, "You remove the airlock electronics.")
+ name = "wired windoor assembly"
+ var/obj/item/electronics/airlock/ae
+ ae = electronics
+ electronics = null
+ ae.loc = loc
+
+ else if(istype(W, /obj/item/pen))
+ var/t = stripped_input(user, "Enter the name for the door.", name, created_name,MAX_NAME_LEN)
+ if(!t)
+ return
+ if(!in_range(src, usr) && loc != usr)
+ return
+ created_name = t
+ return
+
+
+
+ //Crowbar to complete the assembly, Step 7 complete.
+ else if(istype(W, /obj/item/crowbar))
+ if(!electronics)
+ to_chat(usr, "The assembly is missing electronics!")
+ return
+ usr << browse(null, "window=windoor_access")
+ playsound(loc, W.usesound, 100, 1)
+ user.visible_message("[user] pries the windoor into the frame.", "You start prying the windoor into the frame...")
+
+ if(do_after(user, 40*W.toolspeed, target = src))
+
+ if(loc && electronics)
+
density = TRUE //Shouldn't matter but just incase
- to_chat(user, "You finish the windoor.")
-
- if(secure)
- var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(loc)
- if(facing == "l")
- windoor.icon_state = "leftsecureopen"
- windoor.base_state = "leftsecure"
- else
- windoor.icon_state = "rightsecureopen"
- windoor.base_state = "rightsecure"
- windoor.setDir(dir)
+ to_chat(user, "You finish the windoor.")
+
+ if(secure)
+ var/obj/machinery/door/window/brigdoor/windoor = new /obj/machinery/door/window/brigdoor(loc)
+ if(facing == "l")
+ windoor.icon_state = "leftsecureopen"
+ windoor.base_state = "leftsecure"
+ else
+ windoor.icon_state = "rightsecureopen"
+ windoor.base_state = "rightsecure"
+ windoor.setDir(dir)
windoor.density = FALSE
-
- if(electronics.one_access)
- windoor.req_one_access = electronics.accesses
- else
- windoor.req_access = electronics.accesses
- windoor.electronics = electronics
- electronics.loc = windoor
- if(created_name)
- windoor.name = created_name
- qdel(src)
- windoor.close()
-
-
- else
- var/obj/machinery/door/window/windoor = new /obj/machinery/door/window(loc)
- if(facing == "l")
- windoor.icon_state = "leftopen"
- windoor.base_state = "left"
- else
- windoor.icon_state = "rightopen"
- windoor.base_state = "right"
- windoor.setDir(dir)
+
+ if(electronics.one_access)
+ windoor.req_one_access = electronics.accesses
+ else
+ windoor.req_access = electronics.accesses
+ windoor.electronics = electronics
+ electronics.loc = windoor
+ if(created_name)
+ windoor.name = created_name
+ qdel(src)
+ windoor.close()
+
+
+ else
+ var/obj/machinery/door/window/windoor = new /obj/machinery/door/window(loc)
+ if(facing == "l")
+ windoor.icon_state = "leftopen"
+ windoor.base_state = "left"
+ else
+ windoor.icon_state = "rightopen"
+ windoor.base_state = "right"
+ windoor.setDir(dir)
windoor.density = FALSE
-
- windoor.req_access = electronics.accesses
- windoor.electronics = electronics
- electronics.loc = windoor
- if(created_name)
- windoor.name = created_name
- qdel(src)
- windoor.close()
-
-
- else
- return ..()
-
- //Update to reflect changes(if applicable)
- update_icon()
-
-
-//Rotates the windoor assembly clockwise
-/obj/structure/windoor_assembly/verb/revrotate()
- set name = "Rotate Windoor Assembly"
- set category = "Object"
- set src in oview(1)
- if(usr.stat || !usr.canmove || usr.restrained())
- return
- if(anchored)
- to_chat(usr, "[src] cannot be rotated while it is fastened to the floor!")
- return FALSE
-
- var/target_dir = turn(dir, 270)
-
- if(!valid_window_location(loc, target_dir))
- to_chat(usr, "[src] cannot be rotated in that direction!")
- return FALSE
-
- setDir(target_dir)
-
- ini_dir = dir
- update_icon()
- return TRUE
-
-/obj/structure/windoor_assembly/AltClick(mob/user)
- ..()
- if(user.incapacitated())
- to_chat(user, "You can't do that right now!")
- return
- if(!in_range(src, user))
- return
- else
- revrotate()
-
-//Flips the windoor assembly, determines whather the door opens to the left or the right
-/obj/structure/windoor_assembly/verb/flip()
- set name = "Flip Windoor Assembly"
- set category = "Object"
- set src in oview(1)
- if(usr.stat || !usr.canmove || usr.restrained())
- return
-
- if(facing == "l")
- to_chat(usr, "The windoor will now slide to the right.")
- facing = "r"
- else
- facing = "l"
- to_chat(usr, "The windoor will now slide to the left.")
-
- update_icon()
- return
+
+ windoor.req_access = electronics.accesses
+ windoor.electronics = electronics
+ electronics.loc = windoor
+ if(created_name)
+ windoor.name = created_name
+ qdel(src)
+ windoor.close()
+
+
+ else
+ return ..()
+
+ //Update to reflect changes(if applicable)
+ update_icon()
+
+
+//Rotates the windoor assembly clockwise
+/obj/structure/windoor_assembly/verb/revrotate()
+ set name = "Rotate Windoor Assembly"
+ set category = "Object"
+ set src in oview(1)
+ if(usr.stat || !usr.canmove || usr.restrained())
+ return
+ if(anchored)
+ to_chat(usr, "[src] cannot be rotated while it is fastened to the floor!")
+ return FALSE
+
+ var/target_dir = turn(dir, 270)
+
+ if(!valid_window_location(loc, target_dir))
+ to_chat(usr, "[src] cannot be rotated in that direction!")
+ return FALSE
+
+ setDir(target_dir)
+
+ ini_dir = dir
+ update_icon()
+ return TRUE
+
+/obj/structure/windoor_assembly/AltClick(mob/user)
+ ..()
+ if(user.incapacitated())
+ to_chat(user, "You can't do that right now!")
+ return
+ if(!in_range(src, user))
+ return
+ else
+ revrotate()
+
+//Flips the windoor assembly, determines whather the door opens to the left or the right
+/obj/structure/windoor_assembly/verb/flip()
+ set name = "Flip Windoor Assembly"
+ set category = "Object"
+ set src in oview(1)
+ if(usr.stat || !usr.canmove || usr.restrained())
+ return
+
+ if(facing == "l")
+ to_chat(usr, "The windoor will now slide to the right.")
+ facing = "r"
+ else
+ facing = "l"
+ to_chat(usr, "The windoor will now slide to the left.")
+
+ update_icon()
+ return
diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm
index 4722991309..80329f20a1 100644
--- a/code/game/shuttle_engines.dm
+++ b/code/game/shuttle_engines.dm
@@ -12,6 +12,7 @@
/obj/structure/shuttle/engine
name = "engine"
+ desc = "A bluespace engine used to make shuttles move."
density = TRUE
anchored = TRUE
var/engine_power = 1
@@ -81,18 +82,21 @@
M.alter_engines(mod)
/obj/structure/shuttle/engine/heater
- name = "heater"
+ name = "engine heater"
icon_state = "heater"
+ desc = "Directs energy into compressed particles in order to power engines."
engine_power = 0 // todo make these into 2x1 parts
/obj/structure/shuttle/engine/platform
- name = "platform"
+ name = "engine platform"
icon_state = "platform"
+ desc = "A platform for engine components."
engine_power = 0
/obj/structure/shuttle/engine/propulsion
name = "propulsion engine"
icon_state = "propulsion"
+ desc = "A standard reliable bluespace engine used by many forms of shuttles."
opacity = 1
/obj/structure/shuttle/engine/propulsion/left
@@ -105,6 +109,7 @@
/obj/structure/shuttle/engine/propulsion/burst
name = "burst engine"
+ desc = "An engine that releases a large bluespace burst to propel it."
/obj/structure/shuttle/engine/propulsion/burst/cargo
state = ENGINE_UNWRENCHED
@@ -119,14 +124,16 @@
icon_state = "burst_r"
/obj/structure/shuttle/engine/router
- name = "router"
+ name = "engine router"
icon_state = "router"
+ desc = "Redirects around energized particles in engine structures."
/obj/structure/shuttle/engine/large
name = "engine"
opacity = 1
icon = 'icons/obj/2x2.dmi'
icon_state = "large_engine"
+ desc = "A very large bluespace engine used to propel very large ships."
bound_width = 64
bound_height = 64
appearance_flags = 0
@@ -136,6 +143,7 @@
opacity = 1
icon = 'icons/obj/3x3.dmi'
icon_state = "huge_engine"
+ desc = "An extremely large bluespace engine used to propel extremely large ships."
bound_width = 96
bound_height = 96
- appearance_flags = 0
\ No newline at end of file
+ appearance_flags = 0
diff --git a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
index 7ef6cf2142..dbe1343667 100644
--- a/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
+++ b/code/modules/atmospherics/machinery/components/binary_devices/valve.dm
@@ -5,7 +5,7 @@ It's like a regular ol' straight pipe, but you can turn it on and off.
/obj/machinery/atmospherics/components/binary/valve
icon_state = "mvalve_map"
name = "manual valve"
- desc = "A pipe valve"
+ desc = "A pipe with a valve that can be used to disable flow of gas through it."
can_unwrench = TRUE
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
index c777e5fe17..2b5a94ef64 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm
@@ -1,6 +1,7 @@
/obj/machinery/atmospherics/components/trinary/filter
name = "gas filter"
icon_state = "filter_off"
+ desc = "Very useful for filtering gasses."
density = FALSE
can_unwrench = TRUE
var/on = FALSE
diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
index cb515ec75f..1fb8b072c6 100644
--- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
+++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm
@@ -4,6 +4,7 @@
name = "gas mixer"
can_unwrench = TRUE
+ desc = "Very useful for mixing gasses."
var/on = FALSE
diff --git a/code/modules/atmospherics/machinery/other/zvent.dm b/code/modules/atmospherics/machinery/other/zvent.dm
index 3490c972d9..d12c6196ec 100644
--- a/code/modules/atmospherics/machinery/other/zvent.dm
+++ b/code/modules/atmospherics/machinery/other/zvent.dm
@@ -5,6 +5,7 @@
icon_state = "vent_map"
density = FALSE
anchored=1
+ desc = "This may be needed some day."
var/on = FALSE
var/volume_rate = 800
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index db3bcd3538..87106d65b4 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -283,7 +283,7 @@
/obj/item/clothing/head/crown/fancy
name = "magnificent crown"
- desc = "A crown worn by only the highest emperors of the land."
+ desc = "A crown worn by only the highest emperors of the land space."
icon_state = "fancycrown"
/obj/item/clothing/head/scarecrow_hat
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 17d626b3a0..ae5f5c2fbb 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -1,320 +1,323 @@
-/* Library Items
- *
- * Contains:
- * Bookcase
- * Book
- * Barcode Scanner
- */
-
-/*
- * Bookcase
- */
-
-/obj/structure/bookcase
- name = "bookcase"
- icon = 'icons/obj/library.dmi'
- icon_state = "bookempty"
- anchored = FALSE
- density = TRUE
- opacity = 0
- resistance_flags = FLAMMABLE
- max_integrity = 200
- armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0)
- var/state = 0
- var/list/allowed_books = list(/obj/item/book, /obj/item/spellbook, /obj/item/storage/book) //Things allowed in the bookcase
-
-
-/obj/structure/bookcase/Initialize(mapload)
- . = ..()
- if(!mapload)
- return
- state = 2
- icon_state = "book-0"
- anchored = TRUE
- for(var/obj/item/I in loc)
- if(istype(I, /obj/item/book))
- I.loc = src
- update_icon()
-
-
-/obj/structure/bookcase/attackby(obj/item/I, mob/user, params)
- switch(state)
- if(0)
- if(istype(I, /obj/item/wrench))
- playsound(loc, I.usesound, 100, 1)
- if(do_after(user, 20*I.toolspeed, target = src))
- to_chat(user, "You wrench the frame into place.")
- anchored = TRUE
- state = 1
- if(istype(I, /obj/item/crowbar))
- playsound(loc, I.usesound, 100, 1)
- if(do_after(user, 20*I.toolspeed, target = src))
- to_chat(user, "You pry the frame apart.")
- deconstruct(TRUE)
-
- if(1)
- if(istype(I, /obj/item/stack/sheet/mineral/wood))
- var/obj/item/stack/sheet/mineral/wood/W = I
- if(W.get_amount() >= 2)
- W.use(2)
- to_chat(user, "You add a shelf.")
- state = 2
- icon_state = "book-0"
- if(istype(I, /obj/item/wrench))
- playsound(loc, I.usesound, 100, 1)
- to_chat(user, "You unwrench the frame.")
- anchored = FALSE
- state = 0
-
- if(2)
- if(is_type_in_list(I, allowed_books))
- if(!user.drop_item())
- return
- I.loc = src
- update_icon()
- else if(istype(I, /obj/item/storage/bag/books))
- var/obj/item/storage/bag/books/B = I
- for(var/obj/item/T in B.contents)
- if(istype(T, /obj/item/book) || istype(T, /obj/item/spellbook))
- B.remove_from_storage(T, src)
- to_chat(user, "You empty \the [I] into \the [src].")
- update_icon()
- else if(istype(I, /obj/item/pen))
- var/newname = stripped_input(user, "What would you like to title this bookshelf?")
- if(!newname)
- return
- else
- name = ("bookcase ([sanitize(newname)])")
- else if(istype(I, /obj/item/crowbar))
- if(contents.len)
- to_chat(user, "You need to remove the books first!")
- else
- playsound(loc, I.usesound, 100, 1)
- to_chat(user, "You pry the shelf out.")
- new /obj/item/stack/sheet/mineral/wood(loc, 2)
- state = 1
- icon_state = "bookempty"
- else
- return ..()
-
-
-/obj/structure/bookcase/attack_hand(mob/user)
- if(contents.len)
- var/obj/item/book/choice = input("Which book would you like to remove from the shelf?") as null|obj in contents
- if(choice)
- if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
- return
- if(ishuman(user))
- if(!user.get_active_held_item())
- user.put_in_hands(choice)
- else
- choice.loc = get_turf(src)
- update_icon()
-
-
-/obj/structure/bookcase/deconstruct(disassembled = TRUE)
- new /obj/item/stack/sheet/mineral/wood(loc, 4)
- for(var/obj/item/book/B in contents)
- B.forceMove(get_turf(src))
- qdel(src)
-
-
-/obj/structure/bookcase/update_icon()
- if(contents.len < 5)
- icon_state = "book-[contents.len]"
- else
- icon_state = "book-5"
-
-
-/obj/structure/bookcase/manuals/medical
- name = "medical manuals bookcase"
-
-/obj/structure/bookcase/manuals/medical/New()
- ..()
- new /obj/item/book/manual/medical_cloning(src)
- update_icon()
-
-
-/obj/structure/bookcase/manuals/engineering
- name = "engineering manuals bookcase"
-
-/obj/structure/bookcase/manuals/engineering/New()
- ..()
- new /obj/item/book/manual/wiki/engineering_construction(src)
- new /obj/item/book/manual/engineering_particle_accelerator(src)
- new /obj/item/book/manual/wiki/engineering_hacking(src)
- new /obj/item/book/manual/wiki/engineering_guide(src)
- new /obj/item/book/manual/engineering_singularity_safety(src)
- new /obj/item/book/manual/robotics_cyborgs(src)
- update_icon()
-
-
-/obj/structure/bookcase/manuals/research_and_development
- name = "\improper R&D manuals bookcase"
-
-/obj/structure/bookcase/manuals/research_and_development/New()
- ..()
- new /obj/item/book/manual/research_and_development(src)
- update_icon()
-
-
-/*
- * Book
- */
-/obj/item/book
- name = "book"
- icon = 'icons/obj/library.dmi'
- icon_state ="book"
- throw_speed = 1
- throw_range = 5
- w_class = WEIGHT_CLASS_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever)
- attack_verb = list("bashed", "whacked", "educated")
- resistance_flags = FLAMMABLE
- var/dat //Actual page content
- var/due_date = 0 //Game time in 1/10th seconds
- var/author //Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
- var/unique = 0 //0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified
- var/title //The real name of the book.
- var/window_size = null // Specific window size for the book, i.e: "1920x1080", Size x Width
-
-/obj/item/book/attack_self(mob/user)
- if(is_blind(user))
- to_chat(user, "As you are trying to read, you suddenly feel very stupid!")
- return
- if(ismonkey(user))
- to_chat(user, "You skim through the book but can't comprehend any of it.")
- return
- if(dat)
- user << browse("Penned by [author].
" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
- user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.")
- onclose(user, "book")
- else
- to_chat(user, "This book is completely blank!")
-
-
-/obj/item/book/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/pen))
- if(is_blind(user))
- to_chat(user, " As you are trying to write on the book, you suddenly feel very stupid!")
- return
- if(unique)
- to_chat(user, "These pages don't seem to take the ink well! Looks like you can't modify it.")
- return
- var/choice = input("What would you like to change?") in list("Title", "Contents", "Author", "Cancel")
- switch(choice)
- if("Title")
- var/newtitle = reject_bad_text(stripped_input(usr, "Write a new title:"))
- if (length(newtitle) > 20)
- to_chat(usr, "That title won't fit on the cover!")
- return
- if(!newtitle)
- to_chat(usr, "That title is invalid.")
- return
- else
- name = newtitle
- title = newtitle
- if("Contents")
- var/content = stripped_input(usr, "Write your book's contents (HTML NOT allowed):","","",8192)
- if(!content)
- to_chat(usr, "The content is invalid.")
- return
- else
- dat += content
- if("Author")
- var/newauthor = stripped_input(usr, "Write the author's name:")
- if(!newauthor)
- to_chat(usr, "The name is invalid.")
- return
- else
- author = newauthor
- else
- return
-
- else if(istype(I, /obj/item/barcodescanner))
- var/obj/item/barcodescanner/scanner = I
- if(!scanner.computer)
- to_chat(user, "[I]'s screen flashes: 'No associated computer found!'")
- else
- switch(scanner.mode)
- if(0)
- scanner.book = src
- to_chat(user, "[I]'s screen flashes: 'Book stored in buffer.'")
- if(1)
- scanner.book = src
- scanner.computer.buffer_book = name
- to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Book title stored in associated computer buffer.'")
- if(2)
- scanner.book = src
- for(var/datum/borrowbook/b in scanner.computer.checkouts)
- if(b.bookname == name)
- scanner.computer.checkouts.Remove(b)
- to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Book has been checked in.'")
- return
- to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'")
- if(3)
- scanner.book = src
- for(var/obj/item/book in scanner.computer.inventory)
- if(book == src)
- to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Title already present in inventory, aborting to avoid duplicate entry.'")
- return
- scanner.computer.inventory.Add(src)
- to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'")
-
- else if(istype(I, /obj/item/kitchen/knife) || istype(I, /obj/item/wirecutters))
- to_chat(user, "You begin to carve out [title]...")
- if(do_after(user, 30, target = src))
- to_chat(user, "You carve out the pages from [title]! You didn't want to read it anyway.")
- var/obj/item/storage/book/B = new
- B.name = src.name
- B.title = src.title
- B.icon_state = src.icon_state
- if(user.is_holding(src))
- qdel(src)
- user.put_in_hands(B)
- return
- else
- B.loc = src.loc
- qdel(src)
- return
- return
- else
- ..()
-
-
-/*
- * Barcode Scanner
- */
-/obj/item/barcodescanner
- name = "barcode scanner"
- icon = 'icons/obj/library.dmi'
- icon_state ="scanner"
- throw_speed = 3
- throw_range = 5
- w_class = WEIGHT_CLASS_TINY
- var/obj/machinery/computer/libraryconsole/bookmanagement/computer //Associated computer - Modes 1 to 3 use this
- var/obj/item/book/book //Currently scanned book
- var/mode = 0 //0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory
-
-/obj/item/barcodescanner/attack_self(mob/user)
- mode += 1
- if(mode > 3)
- mode = 0
- to_chat(user, "[src] Status Display:")
- var/modedesc
- switch(mode)
- if(0)
- modedesc = "Scan book to local buffer."
- if(1)
- modedesc = "Scan book to local buffer and set associated computer buffer to match."
- if(2)
- modedesc = "Scan book to local buffer, attempt to check in scanned book."
- if(3)
- modedesc = "Scan book to local buffer, attempt to add book to general inventory."
- else
- modedesc = "ERROR"
- to_chat(user, " - Mode [mode] : [modedesc]")
- if(computer)
- to_chat(user, "Computer has been associated with this unit.")
- else
- to_chat(user, "No associated computer found. Only local scans will function properly.")
- to_chat(user, "\n")
\ No newline at end of file
+/* Library Items
+ *
+ * Contains:
+ * Bookcase
+ * Book
+ * Barcode Scanner
+ */
+
+/*
+ * Bookcase
+ */
+
+/obj/structure/bookcase
+ name = "bookcase"
+ icon = 'icons/obj/library.dmi'
+ icon_state = "bookempty"
+ desc = "A great place for storing knowledge."
+ anchored = FALSE
+ density = TRUE
+ opacity = 0
+ resistance_flags = FLAMMABLE
+ max_integrity = 200
+ armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 0)
+ var/state = 0
+ var/list/allowed_books = list(/obj/item/book, /obj/item/spellbook, /obj/item/storage/book) //Things allowed in the bookcase
+
+
+/obj/structure/bookcase/Initialize(mapload)
+ . = ..()
+ if(!mapload)
+ return
+ state = 2
+ icon_state = "book-0"
+ anchored = TRUE
+ for(var/obj/item/I in loc)
+ if(istype(I, /obj/item/book))
+ I.loc = src
+ update_icon()
+
+
+/obj/structure/bookcase/attackby(obj/item/I, mob/user, params)
+ switch(state)
+ if(0)
+ if(istype(I, /obj/item/wrench))
+ playsound(loc, I.usesound, 100, 1)
+ if(do_after(user, 20*I.toolspeed, target = src))
+ to_chat(user, "You wrench the frame into place.")
+ anchored = TRUE
+ state = 1
+ if(istype(I, /obj/item/crowbar))
+ playsound(loc, I.usesound, 100, 1)
+ if(do_after(user, 20*I.toolspeed, target = src))
+ to_chat(user, "You pry the frame apart.")
+ deconstruct(TRUE)
+
+ if(1)
+ if(istype(I, /obj/item/stack/sheet/mineral/wood))
+ var/obj/item/stack/sheet/mineral/wood/W = I
+ if(W.get_amount() >= 2)
+ W.use(2)
+ to_chat(user, "You add a shelf.")
+ state = 2
+ icon_state = "book-0"
+ if(istype(I, /obj/item/wrench))
+ playsound(loc, I.usesound, 100, 1)
+ to_chat(user, "You unwrench the frame.")
+ anchored = FALSE
+ state = 0
+
+ if(2)
+ if(is_type_in_list(I, allowed_books))
+ if(!user.drop_item())
+ return
+ I.loc = src
+ update_icon()
+ else if(istype(I, /obj/item/storage/bag/books))
+ var/obj/item/storage/bag/books/B = I
+ for(var/obj/item/T in B.contents)
+ if(istype(T, /obj/item/book) || istype(T, /obj/item/spellbook))
+ B.remove_from_storage(T, src)
+ to_chat(user, "You empty \the [I] into \the [src].")
+ update_icon()
+ else if(istype(I, /obj/item/pen))
+ var/newname = stripped_input(user, "What would you like to title this bookshelf?")
+ if(!newname)
+ return
+ else
+ name = ("bookcase ([sanitize(newname)])")
+ else if(istype(I, /obj/item/crowbar))
+ if(contents.len)
+ to_chat(user, "You need to remove the books first!")
+ else
+ playsound(loc, I.usesound, 100, 1)
+ to_chat(user, "You pry the shelf out.")
+ new /obj/item/stack/sheet/mineral/wood(loc, 2)
+ state = 1
+ icon_state = "bookempty"
+ else
+ return ..()
+
+
+/obj/structure/bookcase/attack_hand(mob/user)
+ if(contents.len)
+ var/obj/item/book/choice = input("Which book would you like to remove from the shelf?") as null|obj in contents
+ if(choice)
+ if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
+ return
+ if(ishuman(user))
+ if(!user.get_active_held_item())
+ user.put_in_hands(choice)
+ else
+ choice.loc = get_turf(src)
+ update_icon()
+
+
+/obj/structure/bookcase/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/mineral/wood(loc, 4)
+ for(var/obj/item/book/B in contents)
+ B.forceMove(get_turf(src))
+ qdel(src)
+
+
+/obj/structure/bookcase/update_icon()
+ if(contents.len < 5)
+ icon_state = "book-[contents.len]"
+ else
+ icon_state = "book-5"
+
+
+/obj/structure/bookcase/manuals/medical
+ name = "medical manuals bookcase"
+
+/obj/structure/bookcase/manuals/medical/New()
+ ..()
+ new /obj/item/book/manual/medical_cloning(src)
+ update_icon()
+
+
+/obj/structure/bookcase/manuals/engineering
+ name = "engineering manuals bookcase"
+
+/obj/structure/bookcase/manuals/engineering/New()
+ ..()
+ new /obj/item/book/manual/wiki/engineering_construction(src)
+ new /obj/item/book/manual/engineering_particle_accelerator(src)
+ new /obj/item/book/manual/wiki/engineering_hacking(src)
+ new /obj/item/book/manual/wiki/engineering_guide(src)
+ new /obj/item/book/manual/engineering_singularity_safety(src)
+ new /obj/item/book/manual/robotics_cyborgs(src)
+ update_icon()
+
+
+/obj/structure/bookcase/manuals/research_and_development
+ name = "\improper R&D manuals bookcase"
+
+/obj/structure/bookcase/manuals/research_and_development/New()
+ ..()
+ new /obj/item/book/manual/research_and_development(src)
+ update_icon()
+
+
+/*
+ * Book
+ */
+/obj/item/book
+ name = "book"
+ icon = 'icons/obj/library.dmi'
+ icon_state ="book"
+ desc = "Crack it open, inhale the musk of its pages, and learn something new."
+ throw_speed = 1
+ throw_range = 5
+ w_class = WEIGHT_CLASS_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever)
+ attack_verb = list("bashed", "whacked", "educated")
+ resistance_flags = FLAMMABLE
+ var/dat //Actual page content
+ var/due_date = 0 //Game time in 1/10th seconds
+ var/author //Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
+ var/unique = 0 //0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified
+ var/title //The real name of the book.
+ var/window_size = null // Specific window size for the book, i.e: "1920x1080", Size x Width
+
+/obj/item/book/attack_self(mob/user)
+ if(is_blind(user))
+ to_chat(user, "As you are trying to read, you suddenly feel very stupid!")
+ return
+ if(ismonkey(user))
+ to_chat(user, "You skim through the book but can't comprehend any of it.")
+ return
+ if(dat)
+ user << browse("Penned by [author].
" + "[dat]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
+ user.visible_message("[user] opens a book titled \"[title]\" and begins reading intently.")
+ onclose(user, "book")
+ else
+ to_chat(user, "This book is completely blank!")
+
+
+/obj/item/book/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/pen))
+ if(is_blind(user))
+ to_chat(user, " As you are trying to write on the book, you suddenly feel very stupid!")
+ return
+ if(unique)
+ to_chat(user, "These pages don't seem to take the ink well! Looks like you can't modify it.")
+ return
+ var/choice = input("What would you like to change?") in list("Title", "Contents", "Author", "Cancel")
+ switch(choice)
+ if("Title")
+ var/newtitle = reject_bad_text(stripped_input(usr, "Write a new title:"))
+ if (length(newtitle) > 20)
+ to_chat(usr, "That title won't fit on the cover!")
+ return
+ if(!newtitle)
+ to_chat(usr, "That title is invalid.")
+ return
+ else
+ name = newtitle
+ title = newtitle
+ if("Contents")
+ var/content = stripped_input(usr, "Write your book's contents (HTML NOT allowed):","","",8192)
+ if(!content)
+ to_chat(usr, "The content is invalid.")
+ return
+ else
+ dat += content
+ if("Author")
+ var/newauthor = stripped_input(usr, "Write the author's name:")
+ if(!newauthor)
+ to_chat(usr, "The name is invalid.")
+ return
+ else
+ author = newauthor
+ else
+ return
+
+ else if(istype(I, /obj/item/barcodescanner))
+ var/obj/item/barcodescanner/scanner = I
+ if(!scanner.computer)
+ to_chat(user, "[I]'s screen flashes: 'No associated computer found!'")
+ else
+ switch(scanner.mode)
+ if(0)
+ scanner.book = src
+ to_chat(user, "[I]'s screen flashes: 'Book stored in buffer.'")
+ if(1)
+ scanner.book = src
+ scanner.computer.buffer_book = name
+ to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Book title stored in associated computer buffer.'")
+ if(2)
+ scanner.book = src
+ for(var/datum/borrowbook/b in scanner.computer.checkouts)
+ if(b.bookname == name)
+ scanner.computer.checkouts.Remove(b)
+ to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Book has been checked in.'")
+ return
+ to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'")
+ if(3)
+ scanner.book = src
+ for(var/obj/item/book in scanner.computer.inventory)
+ if(book == src)
+ to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Title already present in inventory, aborting to avoid duplicate entry.'")
+ return
+ scanner.computer.inventory.Add(src)
+ to_chat(user, "[I]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'")
+
+ else if(istype(I, /obj/item/kitchen/knife) || istype(I, /obj/item/wirecutters))
+ to_chat(user, "You begin to carve out [title]...")
+ if(do_after(user, 30, target = src))
+ to_chat(user, "You carve out the pages from [title]! You didn't want to read it anyway.")
+ var/obj/item/storage/book/B = new
+ B.name = src.name
+ B.title = src.title
+ B.icon_state = src.icon_state
+ if(user.is_holding(src))
+ qdel(src)
+ user.put_in_hands(B)
+ return
+ else
+ B.loc = src.loc
+ qdel(src)
+ return
+ return
+ else
+ ..()
+
+
+/*
+ * Barcode Scanner
+ */
+/obj/item/barcodescanner
+ name = "barcode scanner"
+ icon = 'icons/obj/library.dmi'
+ icon_state ="scanner"
+ desc = "A fabulous tool if you need to scan a barcode."
+ throw_speed = 3
+ throw_range = 5
+ w_class = WEIGHT_CLASS_TINY
+ var/obj/machinery/computer/libraryconsole/bookmanagement/computer //Associated computer - Modes 1 to 3 use this
+ var/obj/item/book/book //Currently scanned book
+ var/mode = 0 //0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory
+
+/obj/item/barcodescanner/attack_self(mob/user)
+ mode += 1
+ if(mode > 3)
+ mode = 0
+ to_chat(user, "[src] Status Display:")
+ var/modedesc
+ switch(mode)
+ if(0)
+ modedesc = "Scan book to local buffer."
+ if(1)
+ modedesc = "Scan book to local buffer and set associated computer buffer to match."
+ if(2)
+ modedesc = "Scan book to local buffer, attempt to check in scanned book."
+ if(3)
+ modedesc = "Scan book to local buffer, attempt to add book to general inventory."
+ else
+ modedesc = "ERROR"
+ to_chat(user, " - Mode [mode] : [modedesc]")
+ if(computer)
+ to_chat(user, "Computer has been associated with this unit.")
+ else
+ to_chat(user, "No associated computer found. Only local scans will function properly.")
+ to_chat(user, "\n")
diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm
index 99127cd595..dc48bbae2d 100644
--- a/code/modules/library/lib_machines.dm
+++ b/code/modules/library/lib_machines.dm
@@ -20,6 +20,7 @@
icon_screen = "library"
icon_keyboard = null
circuit = /obj/item/circuitboard/computer/libraryconsole
+ desc = "Checked out books MUST be returned on time."
var/screenstate = 0
var/title
var/category = "Any"
@@ -161,6 +162,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
// It's December 25th, 2014, and this is STILL here, and it's STILL relevant. Kill me
/obj/machinery/computer/libraryconsole/bookmanagement
name = "book inventory management console"
+ desc = "Librarian's command station."
var/arcanecheckout = 0
screenstate = 0 // 0 - Main Menu, 1 - Inventory, 2 - Checked Out, 3 - Check Out a Book
verb_say = "beeps"
@@ -498,6 +500,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
name = "scanner control interface"
icon = 'icons/obj/library.dmi'
icon_state = "bigscanner"
+ desc = "It servers the purpose of scanning stuff."
anchored = TRUE
density = TRUE
var/obj/item/book/cache // Last scanned book
@@ -554,6 +557,7 @@ GLOBAL_LIST(cachedbooks) // List of our cached book datums
name = "book binder"
icon = 'icons/obj/library.dmi'
icon_state = "binder"
+ desc = "Only intended for binding paper products."
anchored = TRUE
density = TRUE
var/busy = FALSE
diff --git a/code/modules/mining/machine_stacking.dm b/code/modules/mining/machine_stacking.dm
index 96589fb575..0c9bcdc170 100644
--- a/code/modules/mining/machine_stacking.dm
+++ b/code/modules/mining/machine_stacking.dm
@@ -4,6 +4,7 @@
name = "stacking machine console"
icon = 'icons/obj/machines/mining_machines.dmi'
icon_state = "console"
+ desc = "Controls a stacking machine... in theory."
density = FALSE
anchored = TRUE
var/obj/machinery/mineral/stacking_machine/machine = null
@@ -60,6 +61,7 @@
name = "stacking machine"
icon = 'icons/obj/machines/mining_machines.dmi'
icon_state = "stacker"
+ desc = "A machine that automatically stacks acquired materials. Controlled by a nearby console."
density = TRUE
anchored = TRUE
var/obj/machinery/mineral/stacking_unit_console/CONSOLE
@@ -90,4 +92,4 @@
var/obj/item/stack/sheet/out = new inp.type()
out.amount = stack_amt
unload_mineral(out)
- storage.amount -= stack_amt
\ No newline at end of file
+ storage.amount -= stack_amt
diff --git a/code/modules/research/message_server.dm b/code/modules/research/message_server.dm
index 650eebba1a..0cef65c07c 100644
--- a/code/modules/research/message_server.dm
+++ b/code/modules/research/message_server.dm
@@ -67,6 +67,7 @@ GLOBAL_LIST_INIT(message_servers, list())
icon = 'icons/obj/machines/research.dmi'
icon_state = "server"
name = "Messaging Server"
+ desc = "A machine that attempts to gather the secret knowledge of the universe."
density = TRUE
anchored = TRUE
use_power = IDLE_POWER_USE
diff --git a/code/modules/shuttle/computer.dm b/code/modules/shuttle/computer.dm
index 8384e978e5..47ceaef99e 100644
--- a/code/modules/shuttle/computer.dm
+++ b/code/modules/shuttle/computer.dm
@@ -1,5 +1,6 @@
/obj/machinery/computer/shuttle
name = "shuttle console"
+ desc = "A shuttle control computer."
icon_screen = "shuttle"
icon_keyboard = "tech_key"
light_color = LIGHT_COLOR_CYAN
diff --git a/code/modules/shuttle/ferry.dm b/code/modules/shuttle/ferry.dm
index 5b27e562f3..07103088d1 100644
--- a/code/modules/shuttle/ferry.dm
+++ b/code/modules/shuttle/ferry.dm
@@ -1,5 +1,6 @@
/obj/machinery/computer/shuttle/ferry
name = "transport ferry console"
+ desc = "A console that controls the transport ferry."
circuit = /obj/item/circuitboard/computer/ferry
shuttleId = "ferry"
possible_destinations = "ferry_home;ferry_away"
diff --git a/code/modules/shuttle/syndicate.dm b/code/modules/shuttle/syndicate.dm
index ac1339d33e..4574e62bd1 100644
--- a/code/modules/shuttle/syndicate.dm
+++ b/code/modules/shuttle/syndicate.dm
@@ -2,6 +2,7 @@
/obj/machinery/computer/shuttle/syndicate
name = "syndicate shuttle terminal"
+ desc = "The terminal used to control the syndicate transport shuttle."
circuit = /obj/item/circuitboard/computer/syndicate_shuttle
icon_screen = "syndishuttle"
icon_keyboard = "syndie_key"
@@ -13,6 +14,7 @@
/obj/machinery/computer/shuttle/syndicate/recall
name = "syndicate shuttle recall terminal"
+ desc = "Use this if your friends left you behind."
possible_destinations = "syndicate_away"
@@ -27,6 +29,7 @@
/obj/machinery/computer/shuttle/syndicate/drop_pod
name = "syndicate assault pod control"
+ desc = "Controls the drop pod's launch system."
icon = 'icons/obj/terminals.dmi'
icon_state = "dorm_available"
light_color = LIGHT_COLOR_BLUE